PKJtDm$!buildbot-v0.8.8/.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: PKJtD!Gbuildbot-v0.8.8/objects.inv# Sphinx inventory version 2 # Project: Buildbot # Version: 0.8.8 # The remainder of this file is compressed using zlib. x]KwH+8۽ӧg3;[<ƒ]+).D2I"['"_ ]te/!32_DAUP?_)ip7O y*%,ooyM,)hK@|x$UGDQGD ɢݨ|'t;[P+з|ԡr(ߏ+%)s0$3rFJ\_KD!?ѼEU(!($e%XL:/aϭ|E%ik3 O~=XSW[L(I|"@%a[,n գJN ݱ\IR378 `B$a $?F\CyBp|YNCR~55 h{[P^L7$ߒSuM709`xaxe&IYJ ?3pRB`[Džm),n1h%̟ o 7IK8(w0ڦ ʂrmgͿğIl&խ3T^mlTTf?I6]\")66D]5{x Z+Fq0J\4 0dMX?ox™Y^L)4U2V7uL5` S0mb?H|4oZ[;7wZ:UD/x+  nʋڵgڞUQ*}v4L{Ǒܘ9[YSˠK⊥Q5]^ԕkQwnSz 4po1(z}&Gޣt&@VKmeVc|ˣo4Q3X!:P-z򔋈SE@L{ "*jW@h̼k3u?K-bQy״`loS$< %Lυ7 W)R Z.2) dḄ|`ଯEXL= NShtClƧK0u>@6#f&G/f@*Nau@xLw(%4VӰfl-#nU/ ;3]v<=6IW1d&KEbY;Fxn<_~RnVX2PlbFōF{úS oȾID. Fڰ4%"?y)&o&΂!z;dx%˲SBQokۚizE9zB#E0OI%Hz AE:;D?g;ڧ$ڧKo Bs%U} ei`O\XrXB܎WBa%Ih&/vZ  O.#QiC$h!6_/=2bCjԸ@PAحP#Ktdb <rBj2vإhYU][ XU7enP(bֽG{ыTFي> rMb˝;Ħ&Nﵑr&ZHOUUJX8.Re$dי2*vq9ˆYTE)&+L#\>'WLi9d򽿊\khسr<@Тjtᡮ?HF^$Gn&*FoU|W vd4;&TZYoo̥X'B=vV$82!il/y2͆-SrkX<~n7jmS4|T3PD:pzy]Y,~Gtע*סnP3$1*bgE/0&v[DzqS$>Y 9n献bdp9d $^B]&mu*had 9iH=:o Q-[()ѧ+wkG%aD::D8O|HLCB_1?J6>a8wBս$ZZ#)N )&.=h/־w|lTڵǍiY1\L.D8Сn*7t]Cąf؏A` 8=4>DihGvL 𤸆ə>Hom~[Nse AĖL PC߆;w'DHUvJd+E~nE$" N8xT!S8lVE}PMr$n.ݤSXӉîSeVgv0=o.6.TR0ZUs`0/ #vdOʙ _E#5l_!N;yj^Qmn宝[`ury{4lu˱u¹ͥ|R PP-4^j@qa/q'֡{OwRs^kХd2sȭR'u&\aYES"6A|KUυ!kLruX$(.+ ݜJ/heZ_]U#ِ ̡vnLqUw8iHzo.nT'ny#+n? oo]<=>|Xҁ,y.ntIDPcM֊2ڮŽ'Oк8wkόaXݳ6I%CܚF귎r^F2P b^ 3j՝Kw0Z|Ww6<[Up#Ru ~07eS0r>d;Na M+U&*½:݀!1&ҤB>)Tz'#;0c>WVpt[摧<Ȋwy|i߽uQ51qg@ 9H:Ee_yعpޝw \Ff$9 J^̣ F]7%iLvxu9ib#:Vd5OE!;Dj4CSCӢC+;; s6+-czFj% "O cԹ%#)5$.8dԫxeXOZFGv-hDfڏ3?nқNwJcN[2]}£ͫˣMJ"(}F N:xnG54-1Y:OH\fp{'+>˃oa cƩqtt狊SGu}N DӴ^qŘrFs-2娻Rz&ӋG&3SSWNeM'tuU25}nMc쌮9uÙco֦̍/ttq`Mrw7S!u<bE/qV.ZJ3︃mɬcOp`^)=˶qQݍugZ4TŝSxu\as8 T0)+HS*萡󝟮OM IrGG)Y35 K[n_GMQw+)ԩFN&g_@w8ܩ>@9uPl" /:85Yz-o8Inh$ylN"0GwT:kɚ_5N*U-huvtjFȳ[YB:#"eyac JR#r!brVNN-?:!g:mDZ> Y^鐦ݵJj GvGNU{)T0ocU *ΰ|m2JC|3i5"~s V|NAo ih%8PۄOL_#8oQ[zDWh5ZÏ0;Mz޴;v|勫F< hW>Uc.P93#-sP=|O}u"S'u[=JE7:'Y33Q%`qB}K?!0λtr ݤcYoՍ;~nQ=[̪r-"qptY Yrkw[6ztJ7RC}QnSIy$@7UsOB3%( ##4i؃+FymIƩb@K}߮Ly?ã'#s1o'v{>v5 fʈNhQiftlQs6~t;dLH w+:FgZT9(ӽ 9fmdTMLrPKJtD=wp@p@buildbot-v0.8.8/index.html Buildbot 0.8.8 documentation

This is the BuildBot documentation for Buildbot version 0.8.8.

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 quickest way through, 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 from packages of your distribution.)

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 first enter the same sandbox you created before:

cd
cd tmp/buildbot
source sandbox/bin/activate

Install 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

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:

cat master/twistd.log | grep IRC

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 changesource 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 possiblities 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.8.

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-9.0.0 or later on the master, and Twisted-8.1.0 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 easiest way to install Buildbot is using 'pip'. For the master:

pip install buildbot

and for the slave:

pip install buildbot-slave
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 @code{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.8, 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 this 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 :ref: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.

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.

Buildbot uses temporary tables internally to manage large transactions.

MySQL has trouble doing replication with temporary tables, so if you are using a replicated MySQL installation, you may need to handle this situation carefully. The MySQL documentation (http://dev.mysql.com/doc/refman/5.5/en/replication-features-temptables.html) recommends using --replicate-wild-ignore-table to ignore temporary tables that should not be replicated. All Buildbot temporary tables begin with bbtmp_, so an option such as --replicate-wild-ignore-table=bbtmp_.* may help.

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['slavePortnum'] = 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.

slavePortnum 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['slavePortnum'] = "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.

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, slavePortnum, 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['slavePortnum'] 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 buildbot/changes/hgbuildbot.py run as an in-process 'changegroup' hook)
  • HgPoller (polling a remote Mercurial repository)
  • GoogleCodeAtomPoller (polling the commit feed for a GoogleCode Git repository)
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)
  • GitPoller (polling a remote Git repository)
  • GoogleCodeAtomPoller (polling the commit feed for a GoogleCode Git repository)
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:

Mercurial Hook

Since Mercurial is written in Python, the hook script can invoke Buildbot's sendchange function directly, rather than having to spawn an external process. This function delivers the same sort of changes as buildbot sendchange and the various hook scripts in contrib/, so you'll need to add a PBChangeSource to your buildmaster to receive these changes.

To set this up, first choose a Mercurial repository that represents your central official source tree. This will be the same repository that your buildslaves will eventually pull from. Install Buildbot on the machine that hosts this repository, using the same version of Python as Mercurial is using (so that the Mercurial hook can import code from buildbot). Then add the following to the .hg/hgrc file in that repository, replacing the buildmaster hostname/portnumber as appropriate for your buildbot:

[hooks]
changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook

[hgbuildbot]
master = buildmaster.example.org:9987
# .. other hgbuildbot parameters ..

The master configuration key allows to have more than one buildmaster specification. The buildmasters have to be separated by a whitspace or comma (see also 'hg help config'):

master =
    buildmaster.example.org:9987
    buildmaster2.example.org:9989

Note

Mercurial lets you define multiple changegroup hooks by giving them distinct names, like changegroup.foo and changegroup.bar, which is why we use changegroup.buildbot in this example. There is nothing magical about the buildbot suffix in the hook name. The [hgbuildbot] section is special, however, as it is the only section that the buildbot hook pays attention to.)

Also note that this runs as a changegroup hook, rather than as an incoming hook. The changegroup hook is run with multiple revisions at a time (say, if multiple revisions are being pushed to this repository in a single hg push command), whereas the incoming hook is run with just one revision at a time. The hgbuildbot.hook function will only work with the changegroup hook.

Changes' attribute properties has an entry is_merge which is set to true when the change was caused by a merge.

Authentication

If the buildmaster PBChangeSource is configured to require sendchange credentials then you can set these with the auth parameter. When this parameter is not set it defaults to change:changepw, which are the defaults for the user and password values of a PBChangeSource which doesn't require authentication.

[hgbuildbot]
auth = clientname:supersecret
# ...

You can set this parameter in either the global /etc/mercurial/hgrc, your personal ~/.hgrc file or the repository local .hg/hgrc file. But since this value is stored in plain text, you must make sure that it can only be read by those users that need to know the authentication credentials.

Branch Type

The [hgbuildbot] section has two other parameters that you might specify, both of which control the name of the branch that is attached to the changes coming from this hook.

One common branch naming policy for Mercurial repositories is to use Mercurial's built-in branches (the kind created with hg branch and listed with hg branches). This feature associates persistent names with particular lines of descent within a single repository. (note that the buildbot source.Mercurial checkout step does not yet support this kind of branch). To have the commit hook deliver this sort of branch name with the Change object, use branchtype = inrepo, this is the default behavior:

[hgbuildbot]
branchtype = inrepo
# ...

Another approach is for each branch to go into a separate repository, and all the branches for a single project share a common parent directory. For example, you might have /var/repos/PROJECT/trunk/ and /var/repos/PROJECT/release. To use this style, use the branchtype = dirname setting, which simply uses the last component of the repository's enclosing directory as the branch name:

[hgbuildbot]
branchtype = dirname
# ...

Finally, if you want to simply specify the branchname directly, for all changes, use branch = BRANCHNAME. This overrides branchtype:

[hgbuildbot]
branch = trunk
# ...

If you use branch= like this, you'll need to put a separate .hgrc in each repository. If you use branchtype=, you may be able to use the same .hgrc for all your repositories, stored in ~/.hgrc or /etc/mercurial/hgrc.

Compatibility

As twisted needs to hook some signals, and some web servers strictly forbid that, the parameter fork in the [hgbuildbot] section will instruct Mercurial to fork before sending the change request. Then as the created process will be of short life, it is considered as safe to disable the signal restriction in the Apache setting like that WSGIRestrictSignal Off. Refer to the documentation of your web server for other way to do the same.

Resulting Changes

The category parameter sets the category for any changes generated from the hook. Likewise, the project parameter sets the project.

Changes' repository attributes are formed from the Mercurial repo path by stripping strip slashes on the left, then prepending the baseurl. For example, assume the following parameters:

[hgbuildbot]
baseurl = http://hg.myorg.com/repos/
strip = 3
# ...

Then a repopath of /var/repos/myproject/release would have its left 3 slashes stripped, leaving myproject/release, after which the base URL would be prepended, to create http://hg.myorg.com/repos/myproject/release.

The hgbuildbot baseurl value defaults to the value of the same parameter in the web section of the configuration.

Note

older versions of Buildbot created repository strings that did not contain an entire URL. To continue this pattern, set the hgbuildbot baseurl parameter to an empty string:

[hgbuildbot]
baseurl = http://hg.myorg.com/repos/
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:

p4base
The base depot path to watch, without the trailing '/...'.
p4port
The Perforce server to connect to (as host:port).
p4user
The Perforce user.
p4passwd
The Perforce password.
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).
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.
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.
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.
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
a list of the branches to fetch, will default to ['master']
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
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

If you cannot take advantage of post-receive hooks as provided by buildbot/changes/hgbuildbot.py for example, then you can use the 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
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')
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.

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.

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_server, gerrit_user)

see master/docs/examples/repo_gerrit.cfg in the Buildbot distribution for a full example setup 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.

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
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
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

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

codebases
See Configuring Schedulers. Note that fileIsImportant and change_filter 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".

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.

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

    # ...

        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.

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'
                                   )]

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.

keypair_name and security_name allow you to specify different names for these AWS EC2 values. They both default to latent_buildbot_slave.

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 BuildSlave objects. The function should return one of the BuildSlave objects, or None if none of the available slaves should be used. 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'}),
]
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.
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 @code{make check}. 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='clobber' to always build from a clean working copy.

BasicSVN
class buildbot.process.factory.BasicSVN

This class is similar to BasicBuildFactory, 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='update' 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='update' 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.

has_patch patch_level patch_body patch_subdir patch_author patch_comment

These attributes are set if the source stamp was created by a try scheduler.
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.

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:

.. 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:

 @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".

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)', now=Now())])

This is equivalent to:

@renderer
def now(props):
    return time.clock()
ShellCommand(command=['make', Interpolate('TIME=%(kw:now)', 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.
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.
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): this value defaults to False. In any case if fetch fails 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 -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 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/','')]

yields a viewspec with just

//depot/main/... //<p4client>/...

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.
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
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")
                                                ]
                                               )
                     ))
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.
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.

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.

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.
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-11 (aka Visual Studio 2003-2012 and VCExpress9) are supported via calling devenv. VS2012 as well as Windows Driver Kit 8 are supported via the new MsBuild step. 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
  • VS2003
  • VS2005
  • VS2008
  • VS2010
  • VS2012
  • VCExpress9
  • MsBuild

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 MsBuild. 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 MsBuild 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 2010:

from buildbot.steps.VisualStudio import VS2010

f.addStep(
    VS2010(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 "msbuild":

from buildbot.steps.VisualStudio import MsBuild

# Build one project in Release mode for Win32
f.addStep(
    MsBuild(projectfile="trunk.sln", config="Release", platform="Win32",
            workdir="trunk",
            project="tools\\protoc"))

# Build the entire solution in Debug mode for x64
f.addStep(
    MsBuild(projectfile="trunk.sln", config='Debug', platform='x64',
            workdir="trunk"))
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 process.mtrlogobserver.EqConnectionPool subclass of ConnectionPool, which implements an equiality operation that avoids this problem.

Example use:

from buildbot.process.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.

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".

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).

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 SourceStamp`s 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 SourceStamp`s, even if other :class:`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.

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).
/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.

/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:

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
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 httpLoginLink which will be rendered on the WebStatus for unauthenticated users as a link named Login.

authz = Authz(useHttpHeader=True, httpLoginLink='https://buildbot/login')

A configuration example with Apache HTTPD as reverse proxy could look like the following.

authz = Authz(
  useHttpHeader=True,
  httpLoginLink='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.

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 requests to trigger polling. One advantage of this is your buildbot instance can (at start up) poll 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)

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 http://yourbuildbot/change_hook/poller?poller=https%3A%2F%2Famanda.svn.sourceforge.net%2Fsvnroot%2Famanda%2Famanda

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']}}
))
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>'.join([uniline for uniline in 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

(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.
all
Always send mail about builds.

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

    if arg:
        message += "\nFor more details visit:\n"
        message += status.getURLForThing(build) + "\n"

    return message

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']))

GerritStatusPush sends review of the Change back to the Gerrit server, optionally also sending a message when a build is started. reviewCB should return a tuple of message, verified, reviewed. If message is None, no review will be sent. startCB should return a message.

[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

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

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. In the configuration file, a BuildStep object is instantiated, but because steps store state locally while executing, this object cannot be used during builds.

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
Running Commands

To spawn a command in the buildslave, create a RemoteCommand instance in your step's start method and run it with runCommand:

cmd = RemoteCommand(args)
d = self.runCommand(cmd)

To add a LogFile, use addLog. Make sure the log gets closed when it finishes. When giving a Logfile to a RemoteShellCommand, just ask it to close the log when the command completes:

log = self.addLog('output')
cmd.useLog(log, closeWhenFinished=True)
Updating Status

TBD

Capturing Logfiles

Each BuildStep has a collection of logfiles. Each one has a short name, like stdio or warnings. Each LogFile 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.

These LogFiles are stored to disk, so they can be retrieved later.

Each can contain multiple channels, generally limited to three basic ones: stdout, stderr, and headers. For example, when a ShellCommand 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 LogFiles 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.

Each BuildStep contains a mapping (implemented in a Python dictionary) from LogFile name to the actual LogFile objects. Status plugins can get a list of LogFiles to display, for example, a list of HREF links that, when clicked, provide the full contents of the LogFile.

Using LogFiles in custom BuildSteps

The most common way for a custom BuildStep to use a LogFile is to summarize the results of a ShellCommand (after the command has finished running). For example, a compile step with thousands of lines of output might want to create a summary of just the warning messages. If you were doing this from a shell, you would use something like:

grep "warning:" output.log >warnings.log

In a custom BuildStep, you could instead create a warnings LogFile that contained the same text. To do this, you would add code to your createSummary method that pulls lines from the main output log and creates a new LogFile with the results:

def createSummary(self, log):
    warnings = []
    sio = StringIO.StringIO(log.getText())
    for line in sio.readlines():
        if "warning:" in line:
            warnings.append()
    self.addCompleteLog('warnings', "".join(warnings))

This example uses the addCompleteLog method, which creates a new LogFile, puts some text in it, and then closes it, meaning that no further contents will be added. This LogFile will appear in the HTML display under an HREF with the name warnings, since that is the name of the LogFile.

You can also use addHTMLLog to create a complete (closed) LogFile that contains HTML instead of plain text. The normal LogFile will be HTML-escaped if presented through a web page, but the HTML LogFile will not. At the moment this is only used to present a pretty HTML representation of an otherwise ugly exception traceback when something goes badly wrong during the BuildStep.

In contrast, you might want to create a new LogFile at the beginning of the step, and add text to it as the command runs. You can create the LogFile and attach it to the build by calling addLog, which returns the LogFile object. You then add text to this LogFile by calling methods like addStdout and addHeader. When you are done, you must call the finish method so the LogFile can be closed. It may be useful to create and populate a LogFile like this from a LogObserver method - see Adding LogObservers.

The logfiles= argument to ShellCommand (see ShellCommand) creates new LogFiles 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 LogFile by calling addStdout. These secondary LogFiles can be used as the source of a LogObserver just like the normal stdio LogFile.

Reading Logfiles

Once a LogFile has been added to a BuildStep with addLog, addCompleteLog, addHTMLLog, or logfiles={}, your BuildStep can retrieve it by using getLog:

class MyBuildStep(ShellCommand):
    logfiles = @{ "nodelog": "_test/node.log" @}

    def evaluateCommand(self, cmd):
        nodelog = self.getLog("nodelog")
        if "STARTED" in nodelog.getText():
            return SUCCESS
        else:
            return FAILURE
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. You can get a better measure of progress by counting the number of source files compiled or test cases run than by merely tracking the number of bytes that have been written to stdout. This improves the accuracy and the smoothness of the ETA display.

To accomplish this, you will need to attach a LogObserver to one of the log channels, most commonly to the stdio channel but perhaps to another one which tracks a log file. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally. Once the observer has decided that some event has occurred (like a source file being compiled), it can use the setProgress method to tell the BuildStep about the progress that this event represents.

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.

The parser class looks like this:

from buildbot.process.buildstep 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 @code{self.step.setProgress}. This class is specifically measuring progress along the tests metric, in units of test cases (as opposed to other kinds of progress like the output metric, which measures in units of bytes). The Progress-tracking code uses each progress metric separately to come up with an overall completion percentage and an ETA value.

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/setProperty methods. Each takes a string for the name of the property, and returns or accepts an arbitrary 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 start method begins.

BuildStep URLs

Each BuildStep has a collection of links. Like its collection of LogFiles, each link has a name and a target URL. The web status page creates HREFs for each link in the same box as it does for LogFiles, except that the target of the link is the external URL instead of an internal link to a page that shows the contents of the LogFile.

These external links can be used to point at build information hosted on other servers. For example, the test process might produce an intricate description of which tests passed and failed, or some sort of code coverage data in HTML form, or a PNG or GIF image with a graph of memory usage over time. The external link can provide an easy way for users to navigate from the buildbot's status page to these external web sites or file servers. Note that the step itself is responsible for insuring that there will be a document available at the given URL (perhaps by using scp to copy the HTML output to a ~/public_html/ directory on a remote web server). Calling addURL does not magically populate a web server.

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.

In this example, we assume that the make test command causes a collection of HTML files to be created and put somewhere on the coverage.example.org web server, in a filename that incorporates the build number.

class TestWithCodeCoverage(BuildStep):
    command = ["make", "test",
               Interpolate("buildnum=%(prop:buildnumber)s")]

    def createSummary(self, log):
        buildnumber = self.getProperty("buildnumber")
        url = "http://coverage.example.org/builds/%s.html" % buildnumber
        self.addURL("coverage", url)

You might also want to extract the URL from some special message output by the build process itself:

class TestWithCodeCoverage(BuildStep):
    command = ["make", "test",
               Interpolate("buildnum=%(prop:buildnumber)s")]

    def createSummary(self, log):
        output = StringIO(log.getText())
        for line in output.readlines():
            if line.startswith("coverage-url:"):
                url = line[len("coverage-url:"):].strip()
                self.addURL("coverage", url)
                return

Note that a build process which emits both stdout and stderr might cause this line to be split or interleaved between other lines. It might be necessary to restrict the getText call to only stdout with something like this:

output = StringIO("".join([c[1]
                           for c in log.getChunks()
                           if c[0] == LOG_CHANNEL_STDOUT]))

Of course if the build is run under a PTY, then stdout and stderr will be merged before the buildbot ever sees them, so such interleaving will be unavoidable.

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.buildstep 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.

Option 1: The simplest technique is to simply put this text (everything from START to FINISH) 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.

Option 2: 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 everything from START to FINISH 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.

Option 3: 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.

Option 4: Submit the code for inclusion in the Buildbot distribution

Make a fork of buildbot on http://github.com/djmitche/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% :).

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

Finally, the SSH approach needs to connect to a PBListener status port, so it can retrieve and report the results of the build (the PB approach uses the existing connection to retrieve status information, so this step is not necessary). This requires a --masterstatus argument, or a try_masterstatus entry in .buildbot/options, in the form of a HOSTNAME:PORT string.

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
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.

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.

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.

The single exception in naming of functions and methods. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, Buildbot methods should do the same. 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. This point is not applied very consistently in Buildbot, but let's try to be consistent in new code.

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.regrssions) - 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

slavePortnum

The strports specification for the slave (integer inputs are normalized to a string), or None; based on slavePortnum.

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.

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.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

Update the cache with the given key and value, but only if the key is already in 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.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.

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.

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.
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.

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(log, logfileName, activateCallback, closeWhenFinished=False)
Parameters:
  • log -- the LogFile instance to add to.
  • 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, 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.
  • 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.

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, 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.

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.

setStepStatus(status)
Parameters:status (BuildStepStatus) -- step status

This method is called to set the status instance to which the step should report. The default implementation sets step_status.

step_status

The BuildStepStatus object tracking the status of this step.

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 start to implement custom behaviors.

The method returns a Deferred that fires when the step finishes. It fires with a tuple of (result, [extra text]), where result is one of the constants from buildbot.status.builder. The extra text is a list of short strings which should be appended to the Build's text results. For example, a test step may add 17 failures to the Build's status by this mechanism.

The deferred will errback if the step encounters an exception, including an exception on the slave side (or if the slave goes away altogether). Normal build/test failures will not cause an errback.

start()
Returns:None or SKIPPED, optionally via a Deferred.

Begin the step. Subclasses should override this method to do local processing, fire off remote commands, etc. The parent method raises NotImplementedError.

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. This method automatically fails the whole build with an exception. A common idiom is to add failed as an errback on a Deferred:

cmd = RemoteCommand(args)
d = self.runCommand(cmd)
def suceed(_):
    self.finished(results.SUCCESS)
d.addCallback(succeed)
d.addErrback(self.failed)

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.

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.

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.

This method provides a convenient way to summarize the status of the step for status displays:

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.

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.

runCommand(command)
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

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

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

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.

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.

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 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.

  • WithProperties 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.

PKeJtDz//'buildbot-v0.8.8/_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 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 PKeJtD]Y22!buildbot-v0.8.8/_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`PKeJtD9>{>{"buildbot-v0.8.8/_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 PKeJtDؒ  ,buildbot-v0.8.8/_images/runtests-success.pngPNG  IHDR7 ĀgAMA asRGB cHRMz&u0`:pQ< pHYs   vpAg7?jIDATx^wxcy yf<̙9g>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^|#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`PKeJtD cc+buildbot-v0.8.8/_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; ]> 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== PKeJtD }\$buildbot-v0.8.8/_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 PKJtD4E 4E ,buildbot-v0.8.8/.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"ubXdeveloper/cls-buildfactoryqkh)ql}qm(hUh}qn(h]h]h]h]h]uh]qohX BuildFactoryqpqq}qr(hX BuildFactoryqsh hlubah!h"ubXmanual/introductionqth)qu}qv(hUh}qw(h]h]h]h]h]uh]qxhX Introductionqyqz}q{(hX Introductionq|h huubah!h"ubXtutorial/furtherq}h)q~}q(hUh}q(h]h]h]h]h]uh]qhXFurther Readingqq}q(hXFurther Readingqh h~ubah!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"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 IRenderableqq}q(hX IRenderableqh hubah!h"ubXdeveloper/styleqh)q}q(hUh}q(h]h]h]h]h]uh]qhXBuildbot Coding Styleqq}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 tutorialq允q}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 Factoriesqq}q(hXBuild Factoriesqh hubah!h"ubXdeveloper/utilsqh)q}q(hUh}q(h]h]h]h]h]uh]qhX Utilitiesqq}q(hX Utilitiesqh hubah!h"ubXdeveloper/indexqh)q}q(hUh}q(h]h]h]h]h]uh]qhXBuildbot Developmentrr}r(hXBuildbot Developmentrh hubah!h"ubXrelnotes/0.8.6rh)r}r(hUh}r(h]h]h]h]h]uh]rhX#Release Notes for Buildbot v0.8.6p1r r }r (hX#Release Notes for Buildbot v0.8.6p1r h jubah!h"ubXmanual/installationr h)r}r(hUh}r(h]h]h]h]h]uh]rhX Installationrr}r(hX Installationrh jubah!h"ubXrelnotes/indexrh)r}r(hUh}r(h]h]h]h]h]uh]rhX!Release Notes for Buildbot v0.8.8rr}r(hX!Release Notes for Buildbot v0.8.8rh jubah!h"ubXmanual/cfg-schedulersrh)r }r!(hUh}r"(h]h]h]h]h]uh]r#hX Schedulersr$r%}r&(hX Schedulersr'h j ubah!h"ubXdeveloper/configr(h)r)}r*(hUh}r+(h]h]h]h]h]uh]r,hX Configurationr-r.}r/(hX Configurationr0h j)ubah!h"ubXdeveloper/webstatusr1h)r2}r3(hUh}r4(h]h]h]h]h]uh]r5hX Web Statusr6r7}r8(hX Web Statusr9h j2ubah!h"ubXmanual/cfg-statustargetsr:h)r;}r<(hUh}r=(h]h]h]h]h]uh]r>hXStatus Targetsr?r@}rA(hXStatus TargetsrBh j;ubah!h"ubXmanual/customizationrCh)rD}rE(hUh}rF(h]h]h]h]h]uh]rGhX CustomizationrHrI}rJ(hX CustomizationrKh jDubah!h"ubXmanual/cfg-introrLh)rM}rN(hUh}rO(h]h]h]h]h]uh]rPhXConfiguring BuildbotrQrR}rS(hXConfiguring BuildbotrTh jMubah!h"ubXdeveloper/databaserUh)rV}rW(hUh}rX(h]h]h]h]h]uh]rYhXDatabaserZr[}r\(hXDatabaser]h jVubah!h"ubXmanual/cfg-buildersr^h)r_}r`(hUh}ra(h]h]h]h]h]uh]rbhXBuilder Configurationrcrd}re(hXBuilder Configurationrfh j_ubah!h"ubXmanual/cfg-buildstepsrgh)rh}ri(hUh}rj(h]h]h]h]h]uh]rkhX Build Stepsrlrm}rn(hX Build Stepsroh jhubah!h"ubX manual/indexrph)rq}rr(hUh}rs(h]h]h]h]h]uh]rthXBuildbot Manualrurv}rw(hXBuildbot Manualrxh jqubah!h"ubXdeveloper/definitionsryh)rz}r{(hUh}r|(h]h]h]h]h]uh]r}hX Definitionsr~r}r(hX Definitionsrh jzubah!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"ubuU domaindatar}r(Ustdr}r(UversionrKU anonlabelsr}r(Xbuildslave-connectionsrhtUbuildslave-connectionsrXbzrlaunchpademailmaildirsourcerjUbzrlaunchpademailmaildirsourcerX distutilshU distutilsX change-hooksrj:U change-hooksrXadding-logobserversrjCUadding-logobserversrXstep-cvsrjgUstep-cvsrXjinja-web-templatesrj1Ujinja-web-templatesrXcreating-a-buildslaverj Ucreating-a-buildslaverXinstalling-the-coderj Uinstalling-the-coderXcommand-line-toolrhbUcommand-line-toolrXtriggering-schedulersrjgUtriggering-schedulersrXstep-bzrrjgUstep-bzrrX source-stampsrjU source-stampsrX(how-different-vc-systems-specify-sourcesrjU(how-different-vc-systems-specify-sourcesrX attr-projectrjU attr-projectrXmerge-request-functionsrjCUmerge-request-functionsrXbuildbot developmentrhUbuildbot-developmentrXcommon-build-propertiesrhUcommon-build-propertiesrX optimizationrhU optimizationrXbuild-factoriesrhUbuild-factoriesrXsubscribing-the-buildmasterr jUsubscribing-the-buildmasterr Xbuilder-priority-functionsr jCUbuilder-priority-functionsr Xsvncommitemailmaildirsourcer jUsvncommitemailmaildirsourcerXstatus-targetsrj:Ustatus-targetsrXconcepts-usersrjUconcepts-usersrXslave-filesystem-stepsrjgUslave-filesystem-stepsrXparsing-email-change-messagesrjUparsing-email-change-messagesrXmail-parsing-changesourcesrjUmail-parsing-changesourcesrX bonsaipollerrjU bonsaipollerrXgerritchangesourcerjUgerritchangesourcerX bzr-pollerrjU bzr-pollerrXfactory-workdir-functionsrjCUfactory-workdir-functionsr Xscheduling-buildsr!jUscheduling-buildsr"Xattr-repositoryr#jUattr-repositoryr$Xmodifying-the-database-schemar%jUUmodifying-the-database-schemar&Xusing-maildirsr'jUusing-maildirsr(Xperiodic-schedulerr)jUperiodic-schedulerr*Xwithproperties-dictstylehUwithproperties-dictstyleX attr-revisionr+jU attr-revisionr,X step-sphinxr-jgU step-sphinxr.Xbuildbot-componentsr/j Ubuildbot-componentsr0Xchange-filtersr1jUchange-filtersr2Xsetting-the-pb-port-for-slavesr3hUsetting-the-pb-port-for-slavesr4Xtesting-the-config-filer5jLUtesting-the-config-filer6Xlogfilesr7j Ulogfilesr8Xother-buildslave-configurationr9j Uother-buildslave-configurationr:Xlatent-buildslavesr;h Ulatent-buildslavesr<X attr-commentsr=jU attr-commentsr>Xbuildmaster-architecturer?htUbuildmaster-architecturer@XtroubleshootingrAj UtroubleshootingrBXbasicbuildfactoryhUbasicbuildfactoryXpbchangesourcerCjUpbchangesourcerDXmaster-slave-updatesrEjUmaster-slave-updatesrFXsource-stamp-attributesrGhUsource-stamp-attributesrHUmodindexrIU py-modindexUXsource-checkoutrJjgUsource-checkoutrKXstarting-the-buildslaverLj Ustarting-the-buildslaverMX buildfactoryhU buildfactoryX svnpollerrNjU svnpollerrOXsetting-propertiesrPjgUsetting-propertiesrQXbzr-hookrRjUbzr-hookrSXquick-tour-labelrTjUquick-tour-labelrUXconnecting-to-the-buildmasterrVj Uconnecting-to-the-buildmasterrWX schedulersrXjU schedulersrYXstep-mercurialrZjgUstep-mercurialr[Xdependent-schedulerr\jUdependent-schedulerr]Xf1r^j Uf1r_X customizationr`jCU customizationraXmulti-master-moderbhUmulti-master-modercXmercurial-hookrdjUmercurial-hookreXprioritizing-buildersrfhUprioritizing-buildersrgXchoosing-a-change-sourcerhjUchoosing-a-change-sourceriXp4sourcerjjUp4sourcerkXbuild-propertiesrljUbuild-propertiesrmX interpolaternhU interpolateroXconcepts-build-slavesrpjUconcepts-build-slavesrqXconcepts-buildrrjUconcepts-buildrsXversion-control-systemsrtjUversion-control-systemsruXstep-cvs-slave-sidervjgUstep-cvs-slave-siderwXbuilder-configurationrxj^Ubuilder-configurationryX configurationrzjU configurationr{Xstep-setpropertyr|jgUstep-setpropertyr}X debug-optionsr~hU debug-optionsrXbuildslave-optionsrj Ubuildslave-optionsrUsearchrUsearchUXbuildbot-config-directoryrhbUbuildbot-config-directoryrXmaster-service-hierarchyrhUmaster-service-hierarchyrXbasicsvnhUbasicsvnX control-flowrhtU control-flowrXtrialhUtrialXdeveloper-databaserjUUdeveloper-databaserX factory-cpanhU factory-cpanXchange-sourcesrjUchange-sourcesrXhistory-and-philosophyrhtUhistory-and-philosophyrX upgrading-an-existing-buildslaverj U upgrading-an-existing-buildslaverXshutdownrj UshutdownrXbuild-result-codesrhUbuild-result-codesrXtry-schedulersrjUtry-schedulersrXstatus-delivery-architecturerhtUstatus-delivery-architecturerXnightly-schedulerrjUnightly-schedulerrXdeveloper-reconfigurationrj(Udeveloper-reconfigurationrXcommon-requirementsrj Ucommon-requirementsrXbuildsetrjUbuildsetrXgooglecodeatompollerrjUgooglecodeatompollerrXrendererrhUrendererrXshell-command-argsrjUshell-command-argsrX!buildslave-version-specific-notesrj U!buildslave-version-specific-notesrX introductionrhtU introductionrX try--diffrhbUtry-diffrX interlocksrh5U interlocksrXmultiple-codebase-buildsrjUmultiple-codebase-buildsrX propertiesrhU propertiesrXchange-hooks-http-notificationsrjUchange-hooks-http-notificationsrX gitpollerrjU gitpollerrXconfig-file-formatrjLUconfig-file-formatrXforceschedulerrhUforceschedulerrXcontrib-scriptsrj Ucontrib-scriptsrX gnuautoconfhU gnuautoconfX authorizationrj:U authorizationrX attr-filesrjU attr-filesrXwithpropertiesrhUwithpropertiesrUgenindexrjUX attr-codebaserjU attr-codebaserX maintenancerj U maintenancerXstep-buildepydocrjgUstep-buildepydocrXbuildmaster-requirementsrj Ubuildmaster-requirementsrXmerging-build-requestsrj^Umerging-build-requestsrXwhen-buildslaves-go-missingrh Uwhen-buildslaves-go-missingrXdatabase-specificationrhUdatabase-specificationrXconfiguring-schedulersrjUconfiguring-schedulersrX(upgrading-a-buildmaster-to-later-versionrj U(upgrading-a-buildmaster-to-later-versionrXcvsmaildirsourcerjUcvsmaildirsourcerXframboozle_regrjCUframboozle-regrX step-pylintrjgU step-pylintrXpredefined-config-file-symbolsrjLUpredefined-config-file-symbolsrXlive-status-clientsrjUlive-status-clientsrXsystem-architecturerhtUsystem-architecturerX step-trialrjgU step-trialrX resourcesrhYU resourcesrXsource-checkout-slave-siderjgUsource-checkout-slave-siderXpropertyrhUpropertyrXfirst-run-labelrjUfirst-run-labelrXbuild-priority-functionsrjCUbuild-priority-functionsrXstep-svnrjgUstep-svnrXinput-validationrhUinput-validationrXhgpollerrjUhgpollerrX!upgrading-an-existing-buildmasterrj U!upgrading-an-existing-buildmasterrXconcepts-build-factoriesrjUconcepts-build-factoriesrXweb-authorization-frameworkrj1Uweb-authorization-frameworkrX buildslavesh U buildslavesXfakesrjUfakesrXstep-subunitshellcommandrjgUstep-subunitshellcommandrXbuildstep-common-parametersrjgUbuildstep-common-parametersrXtriggerable-schedulerrjUtriggerable-schedulerrXattributes-of-changesrjUattributes-of-changesrXinstallation-in-a-virtualenvrj Uinstallation-in-a-virtualenvrX requirementsrj U requirementsrX access-modesrh5U access-modesr X step-pyflaker jgU step-pyflaker Xanybranchschedulerr jUanybranchschedulerr Xtests-independent-of-timerjUtests-independent-of-timerXpython-buildstepsrjgUpython-buildstepsrXscheduler-singlebranchschedulerrjUscheduler-singlebranchschedulerrXlaunching-the-daemonsrj Ulaunching-the-daemonsrX user-objectsrjU user-objectsrX fiveminutesrhU fiveminutesrXcreating-a-buildmasterrj Ucreating-a-buildmasterrXstep-svn-slave-siderjgUstep-svn-slave-siderXforcescheduler-parametersrjUforcescheduler-parametersrXdoing-things-with-usersr jUdoing-things-with-usersr!X running-buildbots-tests-optionalr"j U running-buildbots-tests-optionalr#Xwriting-change-sourcesr$jCUwriting-change-sourcesr%Xcustomizing-svnpollerr&jCUcustomizing-svnpollerr'Xmetricsr(hUmetricsr)X irc-nicknamesr*jU irc-nicknamesr+X buildrequestr,jU buildrequestr-Xemail-addressesr.jUemail-addressesr/Xattr-whor0jUattr-whor1Xwriting-buildstep-constructorsr2jCUwriting-buildstep-constructorsr3X"buildmaster-version-specific-notesr4j U"buildmaster-version-specific-notesr5Xinterpolate-dictstylehUinterpolate-dictstyleXbuilderr6jUbuilderr7Xprioritizing-buildsr8j^Uprioritizing-buildsr9XquickbuildfactoryhUquickbuildfactoryXstep-gitr:jgUstep-gitr;X users-optionsr<hU users-optionsr=X build-stepsr>jgU build-stepsr?uUlabelsr@}rA(jhtjXBuildSlave ConnectionsjjjXBzrLaunchpadEmailMaildirSourcejj:jX Change HooksjjCjXAdding LogObserversjjgjXCVSjj1jXJinja Web Templatesjj jXCreating a buildslavejj jXInstalling the codejhbjXCommand-line TooljjgjXTriggering SchedulersjjgjXBzrjjjX Source StampsjjjX(How Different VC Systems Specify SourcesjjjXProjectjjCjXMerge Request FunctionsjhjXBuildbot DevelopmentjhjXCommon Build PropertiesjhjX OptimizationjhjXBuild Factoriesj jj XSubscribing the Buildmasterj jCj XBuilder Priority Functionsj jjXSVNCommitEmailMaildirSourcejj:jXStatus TargetsjjjXUsersjjgjXSlave Filesystem StepsjjjXParsing Email Change MessagesjjjXMail-parsing ChangeSourcesjjjX BonsaiPollerjjjXGerritChangeSourcejjjX Bzr PollerjhtjX Control Flowj!jj"XScheduling Buildsj#jj$X Repositoryj%jUj&XModifying the Database Schemaj'jj(XUsing Maildirsj)jj*XPeriodic Schedulerjj jX!Upgrading an Existing Buildmasterj+jj,XRevisionj-jgj.XSphinxj/j j0XBuildbot Componentsj1jj2XChange Filtersj3hj4XSetting the PB Port for Slavesj5jLj6XTesting the Config Filej7j j8XLogfilesj9j j:XOther Buildslave Configurationj;h j<XLatent Buildslavesj=jj>XCommentsj?htj@XBuildmaster ArchitecturejAj jBXTroubleshootingjCjjDXPBChangeSourcejEjjFXUpdatesjGhjHXSource Stamp AttributesjIU py-modindexUcsphinx.locale _TranslationProxy rBcsphinx.locale mygettext rCU Module IndexrDrEjCjDrFbjJjgjKXSource CheckoutjLj jMXStarting the buildslavejNjjOX SVNPollerjPjgjQXSetting PropertiesjRjjSXBzr HookjVj jWXConnecting to the buildmasterjXjjYX SchedulersjZjgj[X Mercurialj\jj]XDependent Schedulerj`jCjaX CustomizationjbhjcXMulti-master modejdjjeXMercurial HookjfhjgXPrioritizing BuildersjhjjiXChoosing a Change SourcejjjjkXP4SourcejljjmXBuild PropertiesjnhjoX InterpolatejpjjqX Build SlavesjrjjsXBuildsjtjjuXVersion Control SystemsjvjgjwXCVS (Slave-Side)jxj^jyXBuilder Configurationjzjj{X Configurationj|jgj}X SetPropertyjhjX Propertiesjj jXBuildslave OptionsjjUjBjCU Search PagerGrHjCjGrIbjhbjX.buildbot config directoryjhjXMaster OrganizationjjUjXDatabasejjgjXPython BuildStepsjjjXChange SourcesjhtjXHistory and Philosophyjj jX Upgrading an Existing Buildslavejj jXShutdownjhjXBuild Result CodesjjjXTry SchedulersjhtjXStatus Delivery ArchitecturejjjXNightly Schedulerjj(jXReconfigurationjj jXCommon RequirementsjjjX BuildSetsjjjXGoogleCodeAtomPollerjhjXRendererjjjXshelljj jXVersion-specific NotesjhtjX IntroductionjhbjX try --diffjh5jX InterlocksjjjXMultiple-Codebase Buildsj~hjX Debug OptionsjjjX!Change Hooks (HTTP Notifications)jjjX GitPollerjjLjXConfig File FormatjhjXForceSchedulerjj jXContrib Scriptsjj:jX AuthorizationjjjXFilesjhjXWithPropertiesjjUjBjCUIndexrJrKjCjJrLbjjjXCodebasejj jX MaintenancejjgjX BuildEPYDocjj jXBuildmaster Requirementsjj^jXMerging Build Requestsjh jXWhen Buildslaves Go MissingjhjXDatabase SpecificationjjjXConfiguring Schedulersjj jX)Upgrading a Buildmaster to Later VersionsjjjXCVSMaildirSourcejjgjXPyLintjjLjXPredefined Config File SymbolsjjjXLive Status ClientsjhtjXSystem ArchitecturejjgjXTrialjhYjX ResourcesjjgjXSource Checkout (Slave-Side)jhjXPropertyjjjX First RunjjCjXBuild Priority FunctionsjjgjXSVNjhjXInput ValidationjjjXHgPollerjjjXBuild Factoriesjj1jXWeb Authorization FrameworkjjjXFakesjjgjXSubunitShellCommandjjgjXCommon ParametersjjjXTriggerable SchedulerjjjXChangesjj jXInstallation in a Virtualenvjj jX Requirementsjh5j X Access Modesj jgj XPyFlakesj jj XAnyBranchSchedulerjjjXIndependent of TimejjjXSingleBranchSchedulerjj jXLaunching the daemonsjjjX User ObjectsjhjX3Buildbot in 5 minutes - a user-contributed tutorialjj jXCreating a buildmasterjjgjXSVN (Slave-Side)jjjXForceSched ParametersjTjjUX A Quick Tourj"j j#X#Running Buildbot's Tests (optional)j$jCj%XWriting Change Sourcesj&jCj'XCustomizing SVNPollerj(hj)XMetricsj*jj+X IRC Nicknamesj,jj-X BuildRequestsj.jj/XEmail Addressesj0jj1XWhoj2jCj3XWriting BuildStep Constructorsj4j j5XVersion-specific NotesjjCj XFactory Workdir Functionsj6jj7XBuildersj8j^j9XPrioritizing Buildsj jj!XDoing Things With Usersj:jgj;XGitj<hj=X Users Optionsj>jgj?X Build StepsuU progoptionsrM}rN(Xbuildslave-create-slaverOX --log-sizerPj X+cmdoption-buildslave-create-slave--log-sizerQjOX --log-countrRj X,cmdoption-buildslave-create-slave--log-countrSjOX--umaskrTj X(cmdoption-buildslave-create-slave--umaskrUjOX --maxdelayrVj X+cmdoption-buildslave-create-slave--maxdelayrWjOX --keepaliverXj X,cmdoption-buildslave-create-slave--keepaliverYjOX--allow-shutdownrZj X1cmdoption-buildslave-create-slave--allow-shutdownr[jOX--no-logrotater\j X/cmdoption-buildslave-create-slave--no-logrotater]jOX--useptyr^j X)cmdoption-buildslave-create-slave--useptyr_uUobjectsr`}rauUc}rb(j`}rcjKuUbbrd}re(jKUtargetsrf}rg(Uchsrcrh}ri(X BzrPollerjXchsrc-BzrPollerrjX BonsaiPollerjXchsrc-BonsaiPollerrkXBzrLaunchpadEmailMaildirSourcejX$chsrc-BzrLaunchpadEmailMaildirSourcerlXHgPollerjXchsrc-HgPollerrmXPBChangeSourcejXchsrc-PBChangeSourcernXGoogleCodeAtomPollerjXchsrc-GoogleCodeAtomPollerroX Change HooksjXchsrc-Change HooksrpX GitPollerjXchsrc-GitPollerrqXGerritChangeSourcejXchsrc-GerritChangeSourcerrX SVNPollerjXchsrc-SVNPollerrsXSVNCommitEmailMaildirSourcejX!chsrc-SVNCommitEmailMaildirSourcertXP4SourcejXchsrc-P4SourceruXCVSMaildirSourcejXchsrc-CVSMaildirSourcervuUstatusrw}rx(X WebStatusj:Xstatus-WebStatusryXIRCj:X status-IRCrzXGerritStatusPushj:Xstatus-GerritStatusPushr{X PBListenerj:Xstatus-PBListenerr|XHttpStatusPushj:Xstatus-HttpStatusPushr}X MailNotifierj:Xstatus-MailNotifierr~X StatusPushj:Xstatus-StatusPushruUschedr}r(X Try_UserpassjXsched-Try_UserpassrXForceSchedulerjXsched-ForceSchedulerrX Try_JobdirjXsched-Try_JobdirrXAnyBranchSchedulerjXsched-AnyBranchSchedulerrX DependentjXsched-DependentrXInheritBuildParameterjXsched-InheritBuildParameterrXNightlyTriggerablejXsched-NightlyTriggerablerXBuildslaveChoiceParameterjXsched-BuildslaveChoiceParameterrXSingleBranchSchedulerjXsched-SingleBranchSchedulerrXNightlyjX sched-NightlyrXPeriodicjXsched-PeriodicrX SchedulerjXsched-SchedulerrX TriggerablejXsched-TriggerablerXChoiceStringParameterjXsched-ChoiceStringParameterruUcfgr}r(X user_managershXcfg-user_managersrXcodebaseGeneratorhXcfg-codebaseGeneratorrX changeHorizonhXcfg-changeHorizonrX logMaxSizehXcfg-logMaxSizerX propertieshXcfg-propertiesrX schedulersjXcfg-schedulersrXlogCompressionLimithXcfg-logCompressionLimitrXtitlehX cfg-titlerX buildHorizonhXcfg-buildHorizonrXbuildCacheSizehXcfg-buildCacheSizerX debugPasswordhXcfg-debugPasswordrX multiMasterhXcfg-multiMasterrXstatusj:X cfg-statusrXchangeCacheSizehXcfg-changeCacheSizerXdbhXcfg-dbrXdb_urlhX cfg-db_urlrXmetricshX cfg-metricsrXlogCompressionMethodhXcfg-logCompressionMethodrX eventHorizonhXcfg-eventHorizonrXmanholehX cfg-manholerX buildbotURLhXcfg-buildbotURLrX logHorizonhXcfg-logHorizonrXtitleURLhX cfg-titleURLrXlogMaxTailSizehXcfg-logMaxTailSizerX change_sourcejXcfg-change_sourcerXdb_poll_intervalhXcfg-db_poll_intervalrXrevlinkhX cfg-revlinkrXprioritizeBuildershXcfg-prioritizeBuildersrX validationhXcfg-validationrXslavesh X cfg-slavesrX slavePortnumhXcfg-slavePortnumrX mergeRequestshXcfg-mergeRequestsrXbuildersj^X 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 FileExistsjgXstep-FileExistsrXGitjgXstep-GitrXVS2008jgX step-VS2008rX FileDownloadjgXstep-FileDownloadrXDarcs (Slave-Side)jgXstep-Darcs (Slave-Side)rXGit (Slave-Side)jgXstep-Git (Slave-Side)rXStringDownloadjgXstep-StringDownloadrXP4 (Slave-Side)jgXstep-P4 (Slave-Side)rXPyLintjgX step-PyLintrXCVSjgXstep-CVSrXVS2003jgX step-VS2003rXMaxQjgX step-MaxQrXJSONStringDownloadjgXstep-JSONStringDownloadrXMsBuildjgX step-MsBuildrX DebCowbuilderjgXstep-DebCowbuilderrXTestjgX step-TestrXSphinxjgX step-SphinxrXSetPropertiesFromEnvjgXstep-SetPropertiesFromEnvrX MockBuildSRPMjgXstep-MockBuildSRPMrXMonotone (Slave-Side)jgXstep-Monotone (Slave-Side)rXVC11jgX step-VC11rX ConfigurejgXstep-ConfigurerXPyFlakesjgX step-PyFlakesrXSVN (Slave-Side)jgXstep-SVN (Slave-Side)rX DebLintianjgXstep-DebLintianrX CopyDirectoryjgXstep-CopyDirectoryrXSubunitShellCommandjgXstep-SubunitShellCommandrXDirectoryUploadjgXstep-DirectoryUploadrXRepojgX step-ReporXVS2005jgX step-VS2005rXRpmLintjgX step-RpmLintrXVC6jgXstep-VC6rXVC7jgXstep-VC7rXVC8jgXstep-VC8rXVC9jgXstep-VC9rXCVS (Slave-Side)jgXstep-CVS (Slave-Side)rXJSONPropertiesDownloadjgXstep-JSONPropertiesDownloadrXSVNjgXstep-SVNrXHLintjgX step-HLintrX FileUploadjgXstep-FileUploadrXBK (Slave-Side)jgXstep-BK (Slave-Side)rXBzrjgXstep-BzrrXP4jgXstep-P4rXMTRjgXstep-MTRrX MercurialjgXstep-MercurialrXTreeSizejgX step-TreeSizerXVS2012jgX step-VS2012rXVC10jgX step-VC10rXMercurial (Slave-Side)jgXstep-Mercurial (Slave-Side)rXCompilejgX step-CompilerXTrialjgX step-TrialrX LogRenderablejgXstep-LogRenderablerXVS2010jgX step-VS2010rXRemoveDirectoryjgXstep-RemoveDirectoryrX RemovePYCsjgXstep-RemovePYCsrX MockRebuildjgXstep-MockRebuildrX BuildEPYDocjgXstep-BuildEPYDocrXRepo (Slave-Side)jgXstep-Repo (Slave-Side)rXRpmBuildjgX step-RpmBuildrX DebPbuilderjgXstep-DebPbuilderrXSetPropertyFromCommandjgXstep-SetPropertyFromCommandrX ShellCommandjgXstep-ShellCommandrXTriggerjgX step-TriggerrX MakeDirectoryjgXstep-MakeDirectoryrXBzr (Slave-Side)jgXstep-Bzr (Slave-Side)rXMasterShellCommandjgXstep-MasterShellCommandrX SetPropertyjgXstep-SetPropertyr X VCExpress9jgXstep-VCExpress9r XPerlModuleTestjgXstep-PerlModuleTestr uuuUpyr }r (j`}r(Xbuildbot.db.modelrjUUmodulerX-buildbot.db.changes.ChangesConnectorComponentrjUXclassX4buildbot.process.buildstep.LoggingBuildStep.getText2rjXmethodXbuildbot.util.lru.max_sizerhX attributeX6buildbot.process.buildstep.RemoteCommand.useLogDelayedrh,XmethodX<buildbot.schedulers.forceshed.BaseParameter.updateFromKwargsrhXmethodX'buildbot.config.BuilderConfig.nextSlaverj(X attributeX3buildbot.process.buildstep.BuildStep.flunkOnFailurerjX attributeX)buildbot.config.MasterConfig.slavePortnumrj(X attributeX;buildbot.process.buildstep.LoggingBuildStep.commandCompleterjXmethodX4buildbot.schedulers.forceshed.BaseParameter.fullNamerhXmethodX1buildbot.process.buildstep.RemoteCommand.addToLogrh,XmethodX!buildbot.status.results.EXCEPTIONrhXdataX*buildbot.process.factory.QuickBuildFactoryrhXclassX0buildbot.process.buildstep.RemoteCommand.didFailrh,XmethodX?buildbot.steps.source.buildbot.steps.source.mercurial.MercurialrjgXclassXbuildbot.status.results.SUCCESSr hXdataX6buildbot.changes.gerritchangesource.GerritChangeSourcer!jXclassX8buildbot.process.buildstep.LoggingBuildStep.startCommandr"jXmethodX3buildbot.process.buildstep.BuildStep.warnOnWarningsr#jX attributeX(buildbot.config.BuilderConfig.slavenamesr$j(X attributeX!buildbot.status.client.PBListenerr%j:XclassX&buildbot.status.status_push.StatusPushr&j:XclassXbuildbot.config.ConfigErrorsr'j(X exceptionXbuildbot.util.naturalSortr(hXfunctionXbuildbot.schedulers.forceshedr)hjX$buildbot.status.results.worst_statusr*hXfunctionX%buildbot.status.web.baseweb.WebStatusr+j:XclassX'buildbot.config.MasterConfig.logHorizonr,j(X attributeX*buildbot.process.buildstep.BuildStep.locksr-jX attributeX$buildbot.util.maildir.MaildirServicer.hXclassX+buildbot.config.BuilderConfig.slavebuilddirr/j(X attributeX+buildbot.db.builds.BuildsConnectorComponentr0jUXclassX3buildbot.process.buildstep.LoggingBuildStep.getTextr1jXmethodXLbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromPropertiesr2jgXclassX?buildbot.steps.source.buildbot.steps.slave.SetPropertiesFromEnvr3jgXclassXbuildbot.util.lru.invr4hXmethodX buildbot.utilr5hjX,buildbot.db.pool.DBThreadPool.do_with_enginer6jUXmethodX4buildbot.util.maildir.MaildirService.messageReceivedr7hXmethodX%buildbot.util.bbcollections.KeyedSetsr8hXclassX3buildbot.process.buildstep.BuildStep.addCompleteLogr9jXmethodX>buildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetsr:jUXmethodX-buildbot.process.buildstep.BuildStep.finishedr;jXmethodX.buildbot.config.MasterConfig.codebaseGeneratorr<j(X attributeXbuildbot.util.lrur=hjXbuildbot.db.connectorr>jUjX>buildbot.steps.source.buildbot.steps.python_twisted.RemovePYCsr?jgXclassX"buildbot.process.factory.Distutilsr@hXclassX*buildbot.process.factory.BasicBuildFactoryrAhXclassX5buildbot.steps.source.buildbot.steps.source.repo.ReporBjgXclassXObuildbot.db.sourcestampsets.SourceStampSetsConnectorComponent.addSourceStampSetrCjUXmethodX7buildbot.process.buildstep.RemoteCommand.remoteCompleterDh,XmethodX2buildbot.steps.source.buildbot.steps.python.SphinxrEjgXclassX#buildbot.config.MasterConfig.statusrFj(X attributeXbuildbot.db.baserGjUjX1buildbot.steps.source.buildbot.steps.source.p4.P4rHjgXclassX0buildbot.util.netstrings.NetstringParser.stringsrIhX attributeXbuildbot.util.nowrJhXfunctionXbuildbot.process.factory.TrialrKhXclassX/buildbot.process.buildstep.RemoteCommand.activerLh,X attributeX-buildbot.db.buildrequests.AlreadyClaimedErrorrMjUX exceptionXbuildbot.util.diffSetsrNhXfunctionX1buildbot.db.users.UsersConnectorComponent.getUserrOjUXmethodXbuildbot.db.changesrPjUjX0buildbot.config.MasterConfig.logCompressionLimitrQj(X attributeX4buildbot.process.buildstep.BuildStep.flunkOnWarningsrRjX attributeX*buildbot.config.MasterConfig.debugPasswordrSj(X attributeXbuildbot.status.logfile.LogFilerTjXclassX=buildbot.steps.source.buildbot.steps.transfer.DirectoryUploadrUjgXclassX'buildbot.config.MasterConfig.loadConfigrVj(X classmethodX2buildbot.process.buildstep.BuildStep.setStepStatusrWjXmethodXbuildbot.db.base.cachedrXjUXfunctionX9buildbot.schedulers.forceshed.BaseParameter.getFromKwargsrYhXmethodX?buildbot.db.builds.BuildsConnectorComponent.getBuildsForRequestrZjUXmethodX%buildbot.config.MasterConfig.buildersr[j(X attributeX#buildbot.config.MasterConfig.cachesr\j(X attributeX9buildbot.db.buildrequests.BuildRequestsConnectorComponentr]jUXclassXbuildbot.db.sourcestampsetsr^jUjXbuildbot.process.buildstepr_jjXbuildbot.util.lru.putr`hXmethodX5buildbot.process.buildstep.RemoteCommand.remoteUpdaterah,XmethodX<buildbot.steps.source.buildbot.steps.transfer.StringDownloadrbjgXclassX9buildbot.steps.source.buildbot.steps.master.LogRenderablercjgXclassXDbuildbot.steps.source.buildbot.steps.transfer.JSONPropertiesDownloadrdjgXclassX-buildbot.process.buildstep.BuildStep.setBuildrejXmethodX)buildbot.db.buildrequests.NotClaimedErrorrfjUX exceptionX:buildbot.config.ReconfigurableServiceMixin.reconfigServicergj(XmethodXbuildbot.util.lru.hitsrhhX attributeX(buildbot.process.buildstep.RemoteCommandrih,XclassXbuildbot.util.none_or_strrjhXfunctionXbuildbot.util.epoch2datetimerkhXfunctionX3buildbot.process.buildstep.BuildStep.addLogObserverrljXmethodX=buildbot.db.sourcestampsets.SourceStampSetsConnectorComponentrmjUXclassX+buildbot.process.buildstep.BuildStep.addURLrnjXmethodX2buildbot.process.buildstep.BuildStep.warnOnFailurerojX attributeX>buildbot.db.changes.ChangesConnectorComponent.getRecentChangesrpjUXmethodX hasPropertyrqhPXmethodX%buildbot.config.BuilderConfig.factoryrrj(X attributeX'buildbot.util.misc.SerializedInvocationrshXclassX8buildbot.db.builds.BuildsConnectorComponent.finishBuildsrtjUXmethodX0buildbot.process.buildstep.BuildStep.useProgressrujX attributeXLbuildbot.db.buildrequests.BuildRequestsConnectorComponent.claimBuildRequestsrvjUXmethodX;buildbot.db.users.UsersConnectorComponent.getUserByUsernamerwjUXmethodXbuildbot.util.jsonrxhjX2buildbot.process.buildstep.RemoteCommand.addStderrryh,XmethodX2buildbot.process.buildstep.RemoteCommand.interruptrzh,XmethodXbuildbot.db.poolr{jUjXbuildbot.util.in_reactorr|hXfunctionXbuildbot.status.results.FAILUREr}hXdataX/buildbot.process.buildstep.RemoteCommand.stdoutr~h,X attributeX1buildbot.schedulers.forceshed.BaseParameter.regexrhX attributeXbuildbot.util.miscrhjX buildbot.status.results.WARNINGSrhXdataX3buildbot.steps.source.buildbot.steps.source.svn.SVNrjgXclassX)buildbot.process.buildstep.BuildStep.namerjX attributeX-buildbot.process.buildstep.RemoteShellCommandrh,XclassX'buildbot.util.state.StateMixin.getStaterhXmethodX3buildbot.config.ReconfigurableServiceMixin.priorityrj(X attributeXbuildbot.config.MasterConfig.dbrj(X attributeX-buildbot.process.buildstep.RemoteCommand.logsrh,X attributeXbuildbot.util.staterhjXObuildbot.db.buildrequests.BuildRequestsConnectorComponent.completeBuildRequestsrjUXmethodXbuildbot.configrj(jX@buildbot.steps.source.buildbot.steps.transfer.JSONStringDownloadrjgXclassX0buildbot.steps.source.buildbot.steps.source.ReporjgXclassX)buildbot.config.MasterConfig.eventHorizonrj(X attributeX.buildbot.process.buildstep.BuildStep.interruptrjXmethodX4buildbot.process.buildstep.LoggingBuildStep.logfilesrjX attributeX+buildbot.process.buildstep.BuildStep.getLogrjXmethodX0buildbot.schedulers.forceshed.BaseParameter.typerhX attributeX0buildbot.process.buildstep.RemoteCommand.resultsrh,XmethodX)buildbot.db.state.StateConnectorComponentrjUXclassX&buildbot.changes.mail.CVSMaildirSourcerjXclassXbuildbot.steps.sourcerjgjX%buildbot.util.eventual.fireEventuallyrhXfunctionXbuildbot.util.bbcollectionsrhjX?buildbot.db.changes.ChangesConnectorComponent.getLatestChangeidrjUXmethodX9buildbot.steps.source.buildbot.steps.python_twisted.TrialrjgXclassX7buildbot.steps.source.buildbot.steps.shell.ShellCommandrjgXclassXbuildbot.db.buildrequestsrjUjX#buildbot.config.ConfigErrors.errorsrj(X attributeX7buildbot.db.sourcestamps.SourceStampsConnectorComponentrjUXclassX4buildbot.process.buildstep.BuildStep.progressMetricsrjX attributeX4buildbot.db.builds.BuildsConnectorComponent.getBuildrjUXmethodX.buildbot.status.status_gerrit.GerritStatusPushrj:XclassX"buildbot.config.MasterConfig.titlerj(X attributeX*buildbot.process.buildstep.BuildStep.startrjXmethodXbuildbot.util.state.StateMixinrhXclassX)buildbot.config.MasterConfig.buildHorizonrj(X attributeXbuildbot.status.resultsrhjXbuildbot.util.NotABranchrhXdataXbuildbot.util.sautilsrhjX=buildbot.db.buildsets.BuildsetsConnectorComponent.addBuildsetrjUXmethodXbuildbot.db.staterjUjX+buildbot.process.buildstep.RemoteCommand.rcrh,X attributeXLbuildbot.db.schedulers.SchedulersConnectorComponent.getChangeClassificationsrjUXmethodX4buildbot.db.builds.BuildsConnectorComponent.addBuildrjUXmethodX6buildbot.process.buildstep.RemoteCommand.remote_updaterh,XmethodX7buildbot.steps.source.buildbot.steps.python.BuildEPYDocrjgXclassX!buildbot.db.connector.DBConnectorrjUXclassXBbuildbot.db.buildsets.BuildsetsConnectorComponent.completeBuildsetrjUXmethodX+buildbot.process.buildstep.BuildStep.addLogrjXmethodXJbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestsrjUXmethodX1buildbot.db.buildsets.BuildsetsConnectorComponentrjUXclassX!buildbot.status.mail.MailNotifierrj:XclassX>buildbot.steps.source.buildbot.steps.master.MasterShellCommandrjgXclassXPbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimExpiredRequestsrjUXmethodXbuildbot.status.results.RETRYrhXdataXbuildbot.util.safeTranslaterhXfunctionX(buildbot.config.MasterConfig.multiMasterrj(X attributeXbuildbot.util.makeListrhXfunctionX+buildbot.process.buildstep.LoggingBuildSteprjXclassX,buildbot.process.buildstep.RemoteCommand.runrh,XmethodX/buildbot.util.maildir.MaildirService.setBasedirrhXmethodXbuildbot.util.eventualrhjX4buildbot.schedulers.forceshed.BaseParameter.multiplerhX attributeX1buildbot.util.maildir.MaildirService.moveToCurDirrhXmethodX;buildbot.schedulers.forceshed.BaseParameter.parse_from_argsrhXmethodX4buildbot.changes.mail.BzrLaunchpadEmailMaildirSourcerjXclassX<buildbot.process.buildstep.BuildStep.slaveVersionIsOlderThanrjXmethodX/buildbot.process.buildstep.BuildStep.runCommandrjXmethodXCbuildbot.db.schedulers.SchedulersConnectorComponent.classifyChangesrjUXmethodX%buildbot.config.ConfigErrors.addErrorrj(XmethodX$buildbot.process.buildstep.BuildSteprjXclassX$buildbot.process.factory.GNUAutoconfrhXclassXGbuildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetPropertiesrjUXmethodX"buildbot.db.model.Model.is_currentrjUXmethodX6buildbot.process.buildstep.BuildStep.setDefaultWorkdirrjXmethodXbuildbot.process.factory.CPANrhXclassX!buildbot.util.eventual.eventuallyrhXfunctionXbuildbot.db.buildsrjUjXbuildbot.db.usersrjUjX4buildbot.schedulers.forceshed.BaseParameter.requiredrhX attributeX$buildbot.changes.svnpoller.SVNPollerrjXclassX%buildbot.config.MasterConfig.titleURLrj(X attributeX#buildbot.config.MasterConfig.slavesrj(X attributeX+buildbot.config.MasterConfig.logMaxTailSizerj(X attributeX(buildbot.config.BuilderConfig.propertiesrj(X attributeX7buildbot.steps.source.buildbot.steps.master.SetPropertyrjgXclassX2buildbot.db.users.UsersConnectorComponent.getUsersrjUXmethodX"buildbot.changes.pb.PBChangeSourcerjXclassXbuildbot.status.words.IRCrj:XclassX+buildbot.process.buildstep.BuildStep.failedrjXmethodX2buildbot.process.buildstep.RemoteCommand.addStdoutrh,XmethodX!buildbot.config.BuilderConfig.envrj(X attributeX9buildbot.process.buildstep.LoggingBuildStep.createSummaryrjXmethodX/buildbot.process.buildstep.BuildStep.addHTMLLogrjXmethodXNbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromChangeSourcerjgXclassXbuildbot.db.sourcestampsrjUjX(buildbot.util.netstrings.NetstringParserrhXclassX setPropertyrhPXmethodX3buildbot.db.schedulers.SchedulersConnectorComponentrjUXclassX)buildbot.changes.base.PollingChangeSourcerjCXclassrX0buildbot.process.buildstep.BuildStep.step_statusrjX attributeXbuildbot.util.flattenrhXfunctionXbuildbot.util.netstringsrhjX1buildbot.changes.mail.SVNCommitEmailMaildirSourcerjXclassXbuildbot.config.errorrj(XfunctionX!buildbot.util.misc.deferredLockedrhXfunctionX getPropertyrhPXmethodX1buildbot.process.buildstep.BuildStep.getSlaveNamerjXmethodX"buildbot.changes.base.ChangeSourcerjCXclassrXbuildbot.config.MasterConfigrj(XclassXbuildbot.util.lru.refhitsrhX attributeX"buildbot.config.BuilderConfig.namerj(X attributeX;buildbot.db.changes.ChangesConnectorComponent.getChangeUidsrjUXmethodX buildbot.util.sautils.sa_versionrhXfunctionX2buildbot.process.buildstep.BuildStep.haltOnFailurerjX attributeXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStamprjUXmethodX(buildbot.db.base.DBConnectorComponent.dbrjUX attributeX'buildbot.config.BuilderConfig.nextBuildrj(X attributeX+buildbot.config.MasterConfig.change_sourcesrj(X attributeXbuildbot.status.results.ResultsrhXdataX getPropertiesrhPXmethodX3buildbot.steps.source.buildbot.steps.source.cvs.CVSrjgXclassX/buildbot.process.buildstep.BuildStep.hideStepIfrjX attributeX buildbot.db.pool.DBThreadPool.dorjUXmethodXbuildbot.util.formatIntervalrhXfunctionX*buildbot.config.MasterConfig.changeHorizonrj(X attributeX!buildbot.process.factory.BasicSVNrhXclassX1buildbot.config.MasterConfig.logCompressionMethodrj(X attributeX&buildbot.config.BuilderConfig.categoryrj(X attributeX(buildbot.config.MasterConfig.buildbotURLrj(X attributeX;buildbot.process.buildstep.LoggingBuildStep.evaluateCommandrjXmethodX:buildbot.schedulers.forceshed.BaseParameter.parse_from_argrhXmethodX.buildbot.process.buildstep.BuildStep.startSteprjXmethodX#buildbot.config.BuilderConfig.locksr j(X attributeX2buildbot.db.state.StateConnectorComponent.getStater jUXmethodX8buildbot.process.buildstep.RemoteCommand.remote_completer h,XmethodXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.addSourceStampr jUXmethodX5buildbot.db.state.StateConnectorComponent.getObjectIdr jUXmethodX*buildbot.config.MasterConfig.mergeRequestsrj(X attributeX$buildbot.config.MasterConfig.manholerj(X attributeX/buildbot.process.buildstep.BuildStep.buildslaverjX attributeXGbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStampsrjUXmethodX4buildbot.steps.source.buildbot.steps.shell.ConfigurerjgXclassXAbuildbot.steps.source.buildbot.steps.shell.SetPropertyFromCommandrjgXclassXgetRenderingForrhXmethodXbuildbot.util.lru.getrhXmethodX-buildbot.process.buildstep.BuildStep.describerjXmethodX*buildbot.config.MasterConfig.user_managersrj(X attributeX'buildbot.config.MasterConfig.propertiesrj(X attributeX4buildbot.steps.source.buildbot.steps.python.PyFlakesrjgXclassX0buildbot.schedulers.forceshed.BaseParameter.namerhX attributeX1buildbot.schedulers.forceshed.BaseParameter.labelrhX attributeX.buildbot.process.buildstep.BuildStep.alwaysRunrjX attributeX&buildbot.util.sautils.InsertFromSelectrhXclassX%buildbot.util.state.StateMixin.masterrhX attributeX4buildbot.db.users.UsersConnectorComponent.updateUserrjUXmethodX-buildbot.util.netstrings.NetstringParser.feedr hXmethodXIbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestr!jUXmethodX3buildbot.schedulers.forceshed.BaseParameter.defaultr"hX attributeX0buildbot.process.buildstep.BuildStep.setProgressr#jXmethodX8buildbot.steps.source.buildbot.steps.transfer.FileUploadr$jgXclassX2buildbot.process.buildstep.BuildStep.setBuildSlaver%jXmethodX%buildbot.db.base.DBConnectorComponentr&jUXclassX)buildbot.db.users.UsersConnectorComponentr'jUXclassX+buildbot.config.BuilderConfig.mergeRequestsr(j(X attributeX2buildbot.process.buildstep.BuildStep.setupProgressr)jXmethodX'buildbot.config.MasterConfig.schedulersr*j(X attributeXbuildbot.util.UTCr+hXdataX)buildbot.config.BuilderConfig.descriptionr,j(X attributeX1buildbot.process.buildstep.BuildStep.slaveVersionr-jXmethodX&buildbot.config.BuilderConfig.builddirr.j(X attributeX9buildbot.db.users.UsersConnectorComponent.identifierToUidr/jUXmethodX)buildbot.util.eventual.flushEventualQueuer0hXfunctionX buildbot.db.model.Model.metadatar1jUX attributeXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimBuildRequestsr2jUXmethodXbuildbot.db.buildsetsr3jUjX*buildbot.process.buildstep.BuildStep.buildr4jX attributeXbuildbot.util.maildirr5hjXbuildbot.util.lru.missesr6hX attributeX,buildbot.schedulers.timed.NightlyTriggerabler7jXclassX*buildbot.process.buildstep.BuildStepFailedr8jX exceptionX'buildbot.config.MasterConfig.logMaxSizer9j(X attributeX2buildbot.process.buildstep.RemoteCommand.addHeaderr:h,XmethodX#buildbot.util.state.StateMixin.namer;hX attributeXbuildbot.db.pool.DBThreadPoolr<jUXclassX'buildbot.util.bbcollections.defaultdictr=hXclassX=buildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetr>jUXmethodXbuildbot.util.ComparableMixinr?hXclassXbuildbot.status.results.SKIPPEDr@hXdataX+buildbot.schedulers.forceshed.BaseParameterrAhXclassXbuildbot.util.datetime2epochrBhXfunctionX+buildbot.config.BuilderConfig.canStartBuildrCj(X attributeXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.reclaimBuildRequestsrDjUXmethodX$buildbot.config.MasterConfig.metricsrEj(X attributeX7buildbot.db.changes.ChangesConnectorComponent.getChangerFjUXmethodX'buildbot.config.MasterConfig.validationrGj(X attributeXbuildbot.db.model.Model.upgraderHjUXmethodX3buildbot.steps.source.buildbot.steps.source.git.GitrIjgXclassX3buildbot.steps.source.buildbot.steps.source.bzr.BzrrJjgXclassX/buildbot.config.MasterConfig.prioritizeBuildersrKj(X attributeX/buildbot.process.buildstep.RemoteCommand.useLogrLh,XmethodX-buildbot.process.buildstep.BuildStep.progressrMjX attributeXbuildbot.config.BuilderConfigrNj(XclassX,buildbot.process.buildstep.BuildStep.stoppedrOjX attributeX8buildbot.db.users.UsersConnectorComponent.findUserByAttrrPjUXmethodX2buildbot.db.state.StateConnectorComponent.setStaterQjUXmethodX4buildbot.db.users.UsersConnectorComponent.removeUserrRjUXmethodX-buildbot.process.buildstep.BuildStep.doStepIfrSjX attributeX:buildbot.steps.source.buildbot.steps.transfer.FileDownloadrTjgXclassX@buildbot.steps.source.buildbot.steps.subunit.SubunitShellCommandrUjgXclassXbuildbot.db.model.ModelrVjUXclassX*buildbot.config.ReconfigurableServiceMixinrWj(XclassXbuildbot.db.schedulersrXjUjX7buildbot.db.changes.ChangesConnectorComponent.addChangerYjUXmethoduUmodulesrZ}r[(j(jUUUtj(jUUUtj_(jUUtj5(hUUtj(jUUUtj(hUUtjx(hUUtj)(hUUtj{(jUUUtj5(hUUtjG(jUUUtj(hUUtj(hUUtj3(jUUUtj=(hUUtj>(jUUUtj(jgUUtj(hUUtj(hUUtj(jUUUtjP(jUUUtj^(jUUUtjX(jUUUtj(hUUtj(j(UUtj(jUUUtj(jUUUtj(hUUtujKuUjsr\}r](j`}r^jKuUrstr_}r`(j`}rajKuUcpprb}rc(j`}rdjKuuU glob_toctreesreh]RrfU reread_alwaysrgh]RrhU doctreedirriXX/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/_build/localmedia/.doctreesrjUversioning_conditionrkU citationsrl}jK*Utodo_all_todosrm]rn(}ro(UdocnamerpjUsourcerqcdocutils.nodes reprunicode rrXR/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/classes.rstrsrt}rubUtodorvcsphinx.ext.todo todo_node rw)rx}ry(hXcls-logobserverrzh}r{(h]h]r|Uadmonition-todor}ah]h]uh]r~(h)r}r(hXTodorh}r(h]h]h]h]h]uh jxh]rhXTodorr}r(hjh jubah!h"ubcdocutils.nodes paragraph r)r}r(hjzh}r(h]h]h]h]h]uh jxh]rhXcls-logobserverrr}r(hjzh 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]rUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}rjUclassesrsh]rjahUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rjl]rUdocumentrjU current_linerNUtransform_messagesr]rcdocutils.nodes system_message r)r}r(hUh}r(h]UlevelKh]h]Usourcejth]h]UtypeUINFOruh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX-Hyperlink target "index-0" is not referenced.rr}r(hUh jubah!jubah!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_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_sourcerUR/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/classes.rstUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesr U pep_base_urlr Uhttp://www.python.org/dev/peps/r Usyntax_highlightr Ulongr Uinput_encoding_error_handlerrjUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jjUindex-0rjw)r}r(hjzh jjqjtUexpect_referenced_by_namer}h!jh}r(h]h]rj}ah]h]r jah]uUliner!KjjUexpect_referenced_by_idr"}r#jjsh]r$(h)r%}r&(hjh}r'(h]h]h]h]h]uh jh]r(hXTodor)r*}r+(hjh j%ubah!h"ubj)r,}r-(hjzh jjqjth!jh}r.(h]h]h]h]h]uj!Kh]r/hXcls-logobserverr0r1}r2(hjzh j,ubaubeubuUsubstitution_namesr3}r4h!jh}r5(h]h]h]Usourcejth]h]uU footnotesr6]r7Urefidsr8}r9j]r:jasubjqjth!Usectionr;h}r<(h]h]h]h]r=jah]r>jauj!Kjjh]r?(h)r@}rA(hjh jjqjth!h"h}rB(h]h]h]h]h]uj!Kjjh]rChXClassesrDrE}rF(hjh j@ubaubj)rG}rH(hXLThe sections contained here document classes that can be used or subclassed.rIh jjqjth!jh}rJ(h]h]h]h]h]uj!Kjjh]rKhXLThe sections contained here document classes that can be used or subclassed.rLrM}rN(hjIh jGubaubcdocutils.nodes note rO)rP}rQ(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 jjqjth!UnoterRh}rS(h]h]h]h]h]uj!Njjh]rTj)rU}rV(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.rWh jPjqjth!jh}rX(h]h]h]h]h]uj!Kh]rYhXSome 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.rZr[}r\(hjWh jUubaubaubcdocutils.nodes compound r])r^}r_(hUh jjqjth!Ucompoundr`h}ra(h]h]rbUtoctree-wrapperrcah]h]h]uj!Njjh]rdcsphinx.addnodes toctree re)rf}rg(hUh j^jqjth!Utoctreerhh}ri(UnumberedrjKU includehiddenrkh jU titlesonlyrlUglobrmh]h]h]h]h]Uentriesrn]ro(NXdeveloper/cls-buildfactoryrprqNXdeveloper/cls-remotecommandsrrrsNXdeveloper/cls-buildstepsrtruNXdeveloper/cls-forceschedrvrwNXdeveloper/cls-irenderablerxryNXdeveloper/cls-ipropertiesrzr{eUhiddenr|U includefilesr}]r~(jpjrjtjvjxjzeUmaxdepthrKuj!K h]ubaubjjeubjqjth!jh}r(h]h]h]h]h]Urefidrjuj!Njjh]ubu}r(jphbjqjrXO/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cmdline.rstrr}rbjvjw)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-masterrNXdeveloper toolsrNXcommand-line toolrNXsighuprNXstoprNX statuslogrNX debugclientrNXuserrNX other toolsrNX"determining the revision and patchrNXrestartrNXlocating the masterrNjXtryrNX create-slaverNX try --diffrNXchoosing the buildersrNXdetermining the branch namerNX.buildbot config directoryrNXfinding the top of the treerNuj}rj]r(j)r}r(hUh j)r}r(hUU referencedrKh j)r}r(hUh jjqjh!j;h}r(h]h]h]h]rU buildslaverah]rjauj!Mjjh]r(h)r}r(hX buildslaverh jjqjh!h"h}r(h]h]h]h]h]uj!Mjjh]rhX buildslaverr}r(hjh jubaubj)r}r(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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(cdocutils.nodes strong r)r}r(hX:command:`buildslave`h}r(h]h]rUcommandrah]h]h]uh jh]rhX buildslaverr}r(hUh jubah!UstrongrubhX 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.rr}r(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 jubeubcsphinx.addnodes index r)r}r(hUh jjqjh!Uindexrh}r(h]h]h]h]h]Uentries]r((UsingleX&Command Line Subcommands; create-slavejjtr(UsingleX$create-slave Command Line Subcommandjjtreuj!Mjjh]ubj)r}r(hUh jjqjh!jh}r(h]h]h]h]h]jjuj!Mjjh]ubj)r}r(hUh jjqjj}h!j;h}r(h]h]h]h]r(U create-slaverjeh]rjauj!Mjjj"}rjjsh]r(h)r}r(hX create-slaverh jjqjh!h"h}r(h]h]h]h]h]uj!Mjjh]rhX create-slaver r }r (hjh jubaubj)r }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 :file:`buildbot.tac` file.h jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]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 rr}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 j ubcdocutils.nodes literal r)r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh j h]rhX buildbot.tacrr}r(hX buildbot.tach jubah!UliteralrubhX file.rr}r (hX file.h j ubeubj)r!}r"(hXKThe :option:`-r` option is advisable here, just like for ``create-master``.r#h jjqjh!jh}r$(h]h]h]h]h]uj!Mjjh]r%(hXThe r&r'}r((hXThe h j!ubcsphinx.addnodes pending_xref r))r*}r+(hX :option:`-r`r,h j!jqjh!U pending_xrefr-h}r.(UreftypeXoptionUrefwarnr/U reftargetr0X-rU refdomainXstdr1U refprogramr2Nh]h]U refexplicith]h]h]Urefdocr3hbuj!Mh]r4csphinx.addnodes literal_emphasis r5)r6}r7(hj,h}r8(h]h]r9(Uxrefr:j1X std-optionr;eh]h]h]uh j*h]r<hX-rr=r>}r?(hUh j6ubah!Uliteral_emphasisr@ubaubhX) option is advisable here, just like for rArB}rC(hX) option is advisable here, just like for h j!ubj)rD}rE(hX``create-master``h}rF(h]h]h]h]h]uh j!h]rGhX create-masterrHrI}rJ(hUh jDubah!jubhX.rK}rL(hX.h j!ubeubcdocutils.nodes literal_block rM)rN}rO(hXObuildslave create-slave -r {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}h jjqjh!U literal_blockrPh}rQ(UlinenosrRUlanguagerSXnoneU xml:spacerTUpreserverUh]h]h]h]h]uj!Mjjh]rVhXObuildslave create-slave -r {BASEDIR} {MASTERHOST}:{PORT} {SLAVENAME} {PASSWORD}rWrX}rY(hUh jNubaubj)rZ}r[(hXDThe create-slave options are described in :ref:`Buildslave-Options`.r\h jjqjh!jh}r](h]h]h]h]h]uj!Mjjh]r^(hX*The create-slave options are described in r_r`}ra(hX*The create-slave options are described in h jZubj))rb}rc(hX:ref:`Buildslave-Options`rdh jZjqjh!j-h}re(UreftypeXrefj/j0Xbuildslave-optionsU refdomainXstdrfh]h]U refexplicith]h]h]j3hbuj!Mh]rgcdocutils.nodes emphasis rh)ri}rj(hjdh}rk(h]h]rl(j:jfXstd-refrmeh]h]h]uh jbh]rnhXBuildslave-Optionsrorp}rq(hUh jiubah!UemphasisrrubaubhX.rs}rt(hX.h jZubeubj)ru}rv(hUh jjqjh!jh}rw(h]h]h]h]h]Uentries]rx((UsingleX,Command Line Subcommands; start (buildslave)jjtry(UsingleX*start (buildslave) Command Line Subcommandjjtrzeuj!Mjjh]ubj)r{}r|(hUh jjqjh!jh}r}(h]h]h]h]h]jjuj!Mjjh]ubeubjj)r~}r(hUjKh jjqjj}h!j;h}r(h]rXrestartrah]h]h]r(jUid5reh]uj!Mjjj"}rjj)r}r(hUh jjqjh!jh}r(h]h]h]h]h]jjuj!Mjjh]ubsh]r(h)r}r(hXrestartrh j~jqjh!h"h}r(h]h]h]h]h]uj!Mjjh]rhXrestartrr}r(hjh jubaubjM)r}r(hX'buildslave restart [--nodaemon] BASEDIRh j~jqjh!jPh}r(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]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 j~jqjh!jh}r(h]h]h]h]h]uj!Mjjh]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]rhXstoprr}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``.rh j~jqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hXThe rr}r(hXThe h jubj))r}r(hX:option:`--nodaemon`rh jjqjh!j-h}r(UreftypeXoptionj/j0X --nodaemonU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --nodaemonrr}r(hUh jubah!j@ubaubhX$ option has the same meaning as for rr}r(hX$ option has the same meaning as for 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(hUh j~jqjh!jh}r(h]h]h]h]h]Uentries]r((UsingleX+Command Line Subcommands; stop (buildslave)jjtr(UsingleX)stop (buildslave) Command Line Subcommandjjtreuj!Mjjh]ubj)r}r(hUh j~jqjh!jh}r(h]h]h]h]h]jjuj!Mjjh]ubeubj)r}r(hUjKh jjqjj}h!j;h}r(h]rXstoprah]h]h]r(jUid6reh]uj!Mjjj"}rjjsh]r(h)r}r(hXstoprh jjqjh!h"h}r(h]h]h]h]h]uj!Mjjh]rhXstoprr}r(hjh jubaubj)r}r(hXEThis terminates the daemon buildslave running in the given directory.rh jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]rhXEThis terminates the daemon buildslave running in the given directory.rr}r(hjh jubaubjM)r}r(hXbuildbot stop BASEDIRh jjqjh!jPh}r(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]rhXbuildbot stop BASEDIRrr}r(hUh jubaubeubeubjqjj}h!j;h}r(h]rXstartrah]h]h]r(jUid4reh]uj!Mjjj"}rjj{sh]r(h)r}r(hXstartrh jjqjh!h"h}r (h]h]h]h]h]uj!Mjjh]r hXstartr r }r (hjh jubaubj)r}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 :file:`twistd.log`.h jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]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 rr}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 jubj)r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jh]rhX twistd.logrr}r(hX twistd.logh jubah!jubhX.r}r(hX.h jubeubjM)r }r!(hX%buildslave start [--nodaemon] BASEDIRh jjqjh!jPh}r"(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]r#hX%buildslave start [--nodaemon] BASEDIRr$r%}r&(hUh j ubaubj)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 jjqjh!jh}r)(h]h]h]h]h]uj!Mjjh]r*(hXThe r+r,}r-(hXThe h j'ubj))r.}r/(hX:option:`--nodaemon`r0h j'jqjh!j-h}r1(UreftypeXoptionj/j0X --nodaemonU refdomainXstdr2j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r3j5)r4}r5(hj0h}r6(h]h]r7(j:j2X std-optionr8eh]h]h]uh j.h]r9hX --nodaemonr:r;}r<(hUh j4ubah!j@ubaubhX 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.r=r>}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 j'ubeubj)r@}rA(hUh jjqjh!jh}rB(h]h]h]h]h]Uentries]rC((UsingleX.Command Line Subcommands; restart (buildslave)jjtrD(UsingleX,restart (buildslave) Command Line SubcommandjjtrEeuj!Mjjh]ubjeubjqjh!jh}rF(h]UlevelKh]h]rGjaUsourcejh]h]UlineMUtypejuj!Mjjh]rHj)rI}rJ(hUh}rK(h]h]h]h]h]uh jh]rLhX(Duplicate implicit target name: "start".rMrN}rO(hUh jIubah!jubaubj)rP}rQ(hUh j~jqjh!jh}rR(h]UlevelKh]h]rSjaUsourcejh]h]UlineMUtypejuj!Mjjh]rTj)rU}rV(hUh}rW(h]h]h]h]h]uh jPh]rXhX*Duplicate implicit target name: "restart".rYrZ}r[(hUh jUubah!jubaubj)r\}r](hUh jjqjh!jh}r^(h]UlevelKh]h]r_jaUsourcejh]h]UlineMUtypejuj!Mjjh]r`j)ra}rb(hUh}rc(h]h]h]h]h]uh j\h]rdhX'Duplicate implicit target name: "stop".rerf}rg(hUh jaubah!jubaubejNjNjKj}rh(jUwaiting-for-resultsrijUbuildbotrjjjjjjU statusguirkjUadministrator-toolsrljUpatch-informationrmjjjUspecifying-the-vc-systemrnjNjUsending-propertiesrojU sendchangerpjU create-masterrqjUdeveloper-toolsrrjUid1rsjUsighuprtjNjU statuslogrujU debugclientrvjUuserrwjU other-toolsrxjU"determining-the-revision-and-patchryjNjUlocating-the-masterrzjjjUtryr{jjjUid2r|jUchoosing-the-buildersr}jUdetermining-the-branch-namer~jUid3rjUfinding-the-top-of-the-treeruh]r(j)r}r(hX.. _Command-line-Tool:h jjqjh!jh}r(h]h]h]h]h]jjuj!Kjjh]ubjehUjNj}rj}rj]rj]rj]rjl]rjjjNj]r(j)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKUtypejuh]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!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKAUtypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX;Hyperlink target "cmdline-create-master" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKOUtypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX>Hyperlink target "cmdline-start (buildbot)" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineK_Utypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX@Hyperlink target "cmdline-restart (buildbot)" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKlUtypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX=Hyperlink target "cmdline-stop (buildbot)" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKxUtypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX4Hyperlink target "cmdline-sighup" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKUtypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX7Hyperlink target "cmdline-statuslog" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKUtypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX7Hyperlink target "cmdline-statusgui" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineKUtypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX1Hyperlink target "cmdline-try" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]Utypejuh]rj)r}r(hUh}r(h]h]h]h]h]uh jh]rhX-Hyperlink target "index-0" is not referenced.rr}r(hUh jubah!jubah!jubj)r}r(hUh}r(h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]rj)r}r(hUh}r (h]h]h]h]h]uh jh]r hX.Hyperlink target "try-diff" is not referenced.r r }r (hUh jubah!jubah!jubj)r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX8Hyperlink target "cmdline-sendchange" is not referenced.r r }r (hUh j ubah!jubah!jubj)r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMbUtypejuh]r j)r }r (hUh}r (h]h]h]h]h]uh j h]r hX9Hyperlink target "cmdline-debugclient" is not referenced.r r }r (hUh j ubah!jubah!jubj)r }r (hUh}r (h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]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!jubj)r& }r' (hUh}r( (h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]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/ }r0 (hUh j* ubah!jubah!jubj)r1 }r2 (hUh}r3 (h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]r4 j)r5 }r6 (hUh}r7 (h]h]h]h]h]uh j1 h]r8 hX:Hyperlink target "cmdline-create-slave" is not referenced.r9 r: }r; (hUh j5 ubah!jubah!jubj)r< }r= (hUh}r> (h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]r? j)r@ }rA (hUh}rB (h]h]h]h]h]uh j< h]rC hX@Hyperlink target "cmdline-start (buildslave)" is not referenced.rD rE }rF (hUh j@ ubah!jubah!jubj)rG }rH (hUh}rI (h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]rJ j)rK }rL (hUh}rM (h]h]h]h]h]uh jG h]rN hXBHyperlink target "cmdline-restart (buildslave)" is not referenced.rO rP }rQ (hUh jK ubah!jubah!jubj)rR }rS (hUh}rT (h]UlevelKh]h]Usourcejh]h]UlineMUtypejuh]rU j)rV }rW (hUh}rX (h]h]h]h]h]uh jR h]rY hX?Hyperlink target "cmdline-stop (buildslave)" is not referenced.rZ r[ }r\ (hUh jV ubah!jubah!jubejNjKj]r] j}r^ j]r_ j(jor` }ra (jKjNjjjjNjNjjjjjNjKjNjKjNh"NjjjNjjjjKjNjKjNjjjKjNjNjjjNjNjNjjNjNjjjNjjjNjUjKjjjUO/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cmdline.rstjjNjNj j j j j jjjjjjNj]jjKjNubjKj}rb (jyjjmj)rc }rd (hUh jjqjh!j;h}re (h]h]h]h]rf jmah]rg jauj!Mjjh]rh (h)ri }rj (hXpatch informationrk h jc jqjh!h"h}rl (h]h]h]h]h]uj!Mjjh]rm hXpatch informationrn ro }rp (hjk h ji ubaubj)rq }rr (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 jc jqjh!jh}rs (h]h]h]h]h]uj!Mjjh]rt (hXYou can provide the ru rv }rw (hXYou can provide the h jq ubj))rx }ry (hX:option:`--who=dev`rz h jq jqjh!j-h}r{ (UreftypeXoptionj/j0X --who=devU refdomainXstdr| j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r} j5)r~ }r (hjz h}r (h]h]r (j:j| X std-optionr eh]h]h]uh jx h]r hX --who=devr r }r (hUh j~ ubah!j@ubaubhX> 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 jq ubj)r }r (hX``dev``h}r (h]h]h]h]h]uh jq 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 jq ubj)r }r (hX``try_who = dev``h}r (h]h]h]h]h]uh jq h]r hX try_who = devr r }r (hUh j ubah!jubhX in the r r }r (hX in the h jq ubj)r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh jq h]r hX.buildbot/optionsr r }r (hX.buildbot/optionsh j ubah!jubhX file. Note that r r }r (hX file. Note that h jq ubj))r }r (hX:option:`--who=dev`r h jq jqjh!j-h}r (UreftypeXoptionj/j0X --who=devU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX --who=devr r }r (hUh j ubah!j@ubaubhX3 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 jq 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 jc jqjh!jh}r (h]h]h]h]h]uj!Mjjh]r (hX Similarly, r r }r (hX Similarly, h j ubj))r }r (hX:option:`--comment=COMMENT`r h j jqjh!j-h}r (UreftypeXoptionj/j0X--comment=COMMENTU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX--comment=COMMENTr r }r (hUh j ubah!j@ubaubhX will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is r 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 r }r (hUh j ubah!jubhX.r }r (hX.h j ubeubeubjj)r }r (hUh jjqjh!j;h}r (h]h]h]h]r jah]r jauj!M=jjh]r (h)r }r (hXFinding the top of the treer h j jqjh!h"h}r (h]h]h]h]h]uj!M=jjh]r hXFinding the top of the treer r }r (hj h j ubaubj)r }r (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 j jqjh!jh}r (h]h]h]h]h]uj!M?jjh]r (hXgSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the r r }r (hXgSome VC systems (notably CVS and SVN) track each directory more-or-less independently, which means the h j ubj)r }r (hX:command:`try`h}r (h]h]r jah]h]h]uh j h]r hXtryr r }r (hUh j ubah!jubhX 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 (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 j ubj)r }r (hX:command:`try`h}r (h]h]r jah]h]h]uh j h]r hXtryr r }r (hUh j ubah!jubhX} 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 (hX} command will crawl up through the parent directories until it finds a marker file. The default name for this marker file is h j ubj)r }r (hUh}r (h]h]h]h]r Xfiler aUrolej h]uh j h]r hX .buildbot-topr r }r (hX .buildbot-toph j ubah!jubhX., so when you are using CVS or SVN you should r r }r (hX., so when you are using CVS or SVN you should h j ubj)r }r (hX``touch .buildbot-top``h}r (h]h]h]h]h]uh j 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 j ubj)r }r (hX:command:`buildbot try`h}r! (h]h]r" jah]h]h]uh j h]r# hX buildbot tryr$ r% }r& (hUh j ubah!jubhX-. Alternatively, you can use a filename like r' r( }r) (hX-. Alternatively, you can use a filename like h j ubj)r* }r+ (hUh}r, (h]h]h]h]r- Xfiler. aUrolej. h]uh j h]r/ hX ChangeLogr0 r1 }r2 (hX ChangeLogh j* ubah!jubhX or r3 r4 }r5 (hX or h j ubj)r6 }r7 (hUh}r8 (h]h]h]h]r9 Xfiler: aUrolej: h]uh j h]r; hXREADMEr< r= }r> (hXREADMEh j6 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@ }rA (hXw, since many projects put one of these files in their top-most directory (and nowhere else). To set this filename, use h j ubj)rB }rC (hX``--topfile=ChangeLog``h}rD (h]h]h]h]h]uh j h]rE hX--topfile=ChangeLogrF rG }rH (hUh jB ubah!jubhX%, or set it in the options file with rI rJ }rK (hX%, or set it in the options file with h j ubj)rL }rM (hX``try_topfile = 'ChangeLog'``h}rN (h]h]h]h]h]uh j h]rO hXtry_topfile = 'ChangeLog'rP rQ }rR (hUh jL ubah!jubhX.rS }rT (hX.h j ubeubj)rU }rV (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 j jqjh!jh}rW (h]h]h]h]h]uj!MMjjh]rX (hX3You can also manually set the top of the tree with rY rZ }r[ (hX3You can also manually set the top of the tree with h jU ubj)r\ }r] (hX``--topdir=~/trees/mytree``h}r^ (h]h]h]h]h]uh jU h]r_ hX--topdir=~/trees/mytreer` ra }rb (hUh j\ ubah!jubhX, or rc rd }re (hX, or h jU ubj)rf }rg (hX!``try_topdir = '~/trees/mytree'``h}rh (h]h]h]h]h]uh jU h]ri hXtry_topdir = '~/trees/mytree'rj rk }rl (hUh jf ubah!jubhX . If you use rm rn }ro (hX . If you use h jU ubj)rp }rq (hX``try_topdir``h}rr (h]h]h]h]h]uh jU h]rs hX try_topdirrt ru }rv (hUh jp ubah!jubhX, in a rw rx }ry (hX, in a h jU ubj)rz }r{ (hUh}r| (h]h]h]h]r} Xfiler~ aUrolej~ h]uh jU h]r hX.buildbot/optionsr r }r (hX.buildbot/optionsh jz 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 jU ubj)r }r (hX``try_topfile``h}r (h]h]h]h]h]uh jU h]r hX try_topfiler r }r (hUh j ubah!jubhX approach instead.r r }r (hX approach instead.h jU 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 j jqjh!jh}r (h]h]h]h]h]uj!MTjjh]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 ubj)r }r (hX:command:`try`h}r (h]h]r jah]h]h]uh j h]r hXtryr r }r (hUh j ubah!jubhX# 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 jqjh!j-h}r (UreftypeXoptionj/j0X --try-topfileU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!MTh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX --try-topfiler r }r (hUh j ubah!j@ubaubhX and r r }r (hX and h j ubj))r }r (hX:option:`--try-topdir`r h j jqjh!j-h}r (UreftypeXoptionj/j0X --try-topdirU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!MTh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX --try-topdirr r }r (hUh j ubah!j@ubaubhX 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 j jqjh!jh}r (h]h]h]h]h]uj!MYjjh]r (hXIf the r r }r (hXIf the h j ubj)r }r (hX:command:`try`h}r (h]h]r jah]h]h]uh j h]r hXtryr r }r (hUh j ubah!jubhXL 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:r h j jqjh!jh}r (h]h]h]h]h]uj!M\jjh]r hX]The following command line arguments are deprecated, but retained for backward compatibility:r r }r (hj h j ubaubcdocutils.nodes block_quote r )r }r (hUh j jqNh!U block_quoter h}r (h]h]h]h]h]uj!Njjh]r cdocutils.nodes bullet_list r )r }r (hUh}r (Ubulletr X*h]h]h]h]h]uh j h]r (cdocutils.nodes list_item r )r }r (hX2``--try-topdir`` is replaced by :option:`--topdir`r h}r (h]h]h]h]h]uh j h]r j)r }r (hj h j jqjh!jh}r (h]h]h]h]h]uj!M_h]r (j)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 is replaced by r r }r (hX is replaced by h j ubj))r }r (hX:option:`--topdir`r h j jqjh!j-h}r (UreftypeXoptionj/j0X--topdirU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!M_h]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX--topdirr r }r (hUh j ubah!j@ubaubeubah!U list_itemr ubj )r }r (hX5``--try-topfile`` is replaced by :option:`--topfile` h}r (h]h]h]h]h]uh j h]r j)r }r (hX4``--try-topfile`` is replaced by :option:`--topfile`h j jqjh!jh}r (h]h]h]h]h]uj!M`h]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 jqjh!j-h}r% (UreftypeXoptionj/j0X --topfileU refdomainXstdr& j2Nh]h]U refexplicith]h]h]j3hbuj!M`h]r' j5)r( }r) (hj$ h}r* (h]h]r+ (j:j& X std-optionr, eh]h]h]uh j" h]r- hX --topfiler. r/ }r0 (hUh j( ubah!j@ubaubeubah!j ubeh!U bullet_listr1 ubaubeubjj)r2 }r3 (hUjKh j)r4 }r5 (hUh jjqjh!j;h}r6 (h]h]h]h]r7 jlah]r8 jauj!K;jjh]r9 (h)r: }r; (hXAdministrator Toolsr< h j4 jqjh!h"h}r= (h]h]h]h]h]uj!K;jjh]r> hXAdministrator Toolsr? r@ }rA (hj< h j: ubaubj)rB }rC (hX[The following :command:`buildbot` sub-commands are intended for buildmaster administrators:h j4 jqjh!jh}rD (h]h]h]h]h]uj!K=jjh]rE (hXThe following rF rG }rH (hXThe following h jB ubj)rI }rJ (hX:command:`buildbot`h}rK (h]h]rL jah]h]h]uh jB h]rM hXbuildbotrN rO }rP (hUh jI ubah!jubhX: sub-commands are intended for buildmaster administrators:rQ rR }rS (hX: sub-commands are intended for buildmaster administrators:h jB ubeubj)rT }rU (hUh j4 jqjh!jh}rV (h]h]h]h]h]Uentries]rW ((UsingleX'Command Line Subcommands; create-masterjjtrX (UsingleX%create-master Command Line SubcommandjjtrY euj!KAjjh]ubj)rZ }r[ (hUh j4 jqjh!jh}r\ (h]h]h]h]h]jjuj!KAjjh]ubj)r] }r^ (hUh j4 jqjj}h!j;h}r_ (h]h]h]h]r` (jqjeh]ra jauj!KCjjj"}rb jjZ sh]rc (h)rd }re (hX create-masterrf h j] jqjh!h"h}rg (h]h]h]h]h]uj!KCjjh]rh hX create-masterri rj }rk (hjf h jd ubaubjM)rl }rm (hX#buildbot create-master -r {BASEDIR}h j] jqjh!jPh}rn (jRjSXnonejTjUh]h]h]h]h]uj!KEjjh]ro hX#buildbot create-master -r {BASEDIR}rp rq }rr (hUh jl ubaubj)rs }rt (hXtThis creates a new directory and populates it with files that allow it to be used as a buildmaster's base directory.ru h j] jqjh!jh}rv (h]h]h]h]h]uj!KIjjh]rw hXtThis creates a new directory and populates it with files that allow it to be used as a buildmaster's base directory.rx ry }rz (hju h js 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] jqjh!jh}r} (h]h]h]h]h]uj!KKjjh]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{ jqjh!j-h}r (UreftypeXoptionj/j0X-rU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!KKh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX-rr r }r (hUh j ubah!j@ubaubhX 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] jqjh!jh}r (h]h]h]h]h]Uentries]r ((UsingleX*Command Line Subcommands; start (buildbot)jjtr (UsingleX(start (buildbot) Command Line Subcommandjjtr euj!KOjjh]ubj)r }r (hUh j] jqjh!jh}r (h]h]h]h]h]jjuj!KOjjh]ubeubj)r }r (hUjKh j4 jqjj}h!j;h}r (h]r jah]h]h]r (Ustartr jeh]uj!KQjjj"}r jj sh]r (h)r }r (hXstartr h j jqjh!h"h}r (h]h]h]h]h]uj!KQjjh]r hXstartr r }r (hj h j ubaubjM)r }r (hX%buildbot start [--nodaemon] {BASEDIR}h j jqjh!jPh}r (jRjSXnonejTjUh]h]h]h]h]uj!KSjjh]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 jqjh!jh}r (h]h]h]h]h]uj!KWjjh]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}r (h]h]h]h]r Xfiler aUrolej h]uh j h]r hX twistd.logr r }r (hX twistd.logh j ubah!jubhX.r }r (hX.h j ubeubj)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 j jqjh!jh}r (h]h]h]h]h]uj!KZjjh]r (hXThe r r }r (hXThe h j ubj))r }r (hX:option:`--nodaemon`r h j jqjh!j-h}r (UreftypeXoptionj/j0X --nodaemonU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!KZh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX --nodaemonr r }r (hUh j ubah!j@ubaubhX 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.r r }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 j ubeubj)r }r (hUh j jqjh!jh}r (h]h]h]h]h]Uentries]r ((UsingleX,Command Line Subcommands; restart (buildbot)jjtr (UsingleX*restart (buildbot) Command Line Subcommandjjtr euj!K_jjh]ubj)r }r (hUh j jqjh!jh}r (h]h]h]h]h]jjuj!K_jjh]ubeubj)r }r (hUjKh j4 jqjj}h!j;h}r (h]r jah]h]h]r (Urestartr jeh]uj!Kajjj"}r jj sh]r (h)r }r (hXrestartr h j jqjh!h"h}r (h]h]h]h]h]uj!Kajjh]r hXrestartr r }r (hj h j ubaubjM)r }r (hX'buildbot restart [--nodaemon] {BASEDIR}h j jqjh!jPh}r (jRjSXnonejTjUh]h]h]h]h]uj!Kcjjh]r hX'buildbot restart [--nodaemon] {BASEDIR}r r }r (hUh j ubaubj)r }r (hXRestart the buildmaster. This is equivalent to ``stop`` followed by ``start`` The :option:`--nodaemon` option has the same meaning as for ``start``.h j jqjh!jh}r (h]h]h]h]h]uj!Kgjjh]r (hX/Restart the buildmaster. This is equivalent to r r }r (hX/Restart the buildmaster. This is equivalent to h j ubj)r }r (hX``stop``h}r (h]h]h]h]h]uh j h]r hXstopr r }r (hUh j ubah!jubhX followed by r r }r (hX followed by h j ubj)r }r (hX ``start``h}r (h]h]h]h]h]uh j h]r hXstartr r! }r" (hUh j ubah!jubhX The r# r$ }r% (hX The h j ubj))r& }r' (hX:option:`--nodaemon`r( h j jqjh!j-h}r) (UreftypeXoptionj/j0X --nodaemonU refdomainXstdr* j2Nh]h]U refexplicith]h]h]j3hbuj!Kgh]r+ j5)r, }r- (hj( h}r. (h]h]r/ (j:j* X std-optionr0 eh]h]h]uh j& h]r1 hX --nodaemonr2 r3 }r4 (hUh j, ubah!j@ubaubhX$ option has the same meaning as for r5 r6 }r7 (hX$ option has the same meaning as for h j ubj)r8 }r9 (hX ``start``h}r: (h]h]h]h]h]uh j h]r; hXstartr< r= }r> (hUh j8 ubah!jubhX.r? }r@ (hX.h j ubeubj)rA }rB (hUh j jqjh!jh}rC (h]h]h]h]h]Uentries]rD ((UsingleX)Command Line Subcommands; stop (buildbot)jjtrE (UsingleX'stop (buildbot) Command Line SubcommandjjtrF euj!Kljjh]ubj)rG }rH (hUh j jqjh!jh}rI (h]h]h]h]h]jjuj!Kljjh]ubeubj2 j)rJ }rK (hUh j4 jqjj}h!j;h}rL (h]h]h]h]rM (jtjeh]rN jauj!Kzjjj"}rO jj)rP }rQ (hUh j2 jqjh!jh}rR (h]h]h]h]h]jjuj!Kxjjh]ubsh]rS (h)rT }rU (hXsighuprV h jJ jqjh!h"h}rW (h]h]h]h]h]uj!Kzjjh]rX hXsighuprY rZ }r[ (hjV h jT ubaubjM)r\ }r] (hXbuildbot sighup {BASEDIR}h jJ jqjh!jPh}r^ (jRjSXnonejTjUh]h]h]h]h]uj!K|jjh]r_ hXbuildbot sighup {BASEDIR}r` ra }rb (hUh j\ ubaubj)rc }rd (hX~This sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its :file:`master.cfg` file.re h jJ jqjh!jh}rf (h]h]h]h]h]uj!Kjjh]rg (hXfThis sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its rh ri }rj (hXfThis sends a SIGHUP to the buildmaster running in the given directory, which causes it to re-read its h jc ubj)rk }rl (hUh}rm (h]h]h]h]rn Xfilero aUrolejo h]uh jc h]rp hX master.cfgrq rr }rs (hX master.cfgh jk ubah!jubhX file.rt ru }rv (hX file.h jc ubeubeubeubjqjj}h!j;h}rw (h]rx jah]h]h]ry (Ustoprz jeh]uj!Knjjj"}r{ jjG sh]r| (h)r} }r~ (hXstopr h j2 jqjh!h"h}r (h]h]h]h]h]uj!Knjjh]r hXstopr r }r (hj h j} ubaubjM)r }r (hXbuildbot stop {BASEDIR}h j2 jqjh!jPh}r (jRjSXnonejTjUh]h]h]h]h]uj!Kpjjh]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 j2 jqjh!jh}r (h]h]h]h]h]uj!Ktjjh]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 jqjh!j-h}r (UreftypeXoptionj/j0X--cleanU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!Kth]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX--cleanr r }r (hUh j ubah!j@ubaubhX+ option shuts down the buildmaster cleanly.r r }r (hX+ option shuts down the buildmaster cleanly.h j ubeubj)r }r (hUh j2 jqjh!jh}r (h]h]h]h]h]Uentries]r ((UsingleX Command Line Subcommands; sighupjjtr (UsingleXsighup Command Line Subcommandjjtr euj!Kxjjh]ubjP eubjj)r }r (hUh jjqjj}h!j;h}r (h]h]h]h]r (jkjeh]r jauj!Kjjj"}r jj)r }r (hUh j)r }r (hUh jjqjj}h!j;h}r (h]h]h]h]r (jujeh]r jauj!Kjjj"}r jj)r }r (hUh jjqjh!jh}r (h]h]h]h]h]jjuj!Kjjh]ubsh]r (h)r }r (hX statuslogr h j jqjh!h"h}r (h]h]h]h]h]uj!Kjjh]r hX statuslogr r }r (hj h j ubaubjM)r }r (hX/buildbot statuslog --master {MASTERHOST}:{PORT}h j jqjh!jPh}r (jRjSXnonejTjUh]h]h]h]h]uj!Kjjh]r hX/buildbot statuslog --master {MASTERHOST}:{PORT}r r }r (hUh j ubaubj)r }r (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.r h j jqjh!jh}r (h]h]h]h]h]uj!Kjjh]r 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.r r }r (hj h j 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 jqjh!jh}r (h]h]h]h]h]uj!Kjjh]r (hXThe r r }r (hXThe h j ubj))r }r (hX:option:`--master`r h j jqjh!j-h}r (UreftypeXoptionj/j0X--masterU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!Kh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX--masterr r }r (hUh j ubah!j@ubaubhX% option provides the location of the r r }r (hX% option provides the location of the h j ubj))r }r (hX*:class:`buildbot.status.client.PBListener`r h j jqjh!j-h}r (UreftypeXclassj/j0X!buildbot.status.client.PBListenerU refdomainXpyr h]h]U refexplicith]h]h]j3hbUpy:classr NU py:moduler Nuj!Kh]r j)r }r (hj h}r (h]h]r (j:j Xpy-classr eh]h]h]uh j h]r hX!buildbot.status.client.PBListenerr r }r (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 (r r }r (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)r }r (hUh}r (h]h]h]h]r Xsampr aUrolej h]uh j h]r (jh)r }r (hXHOSTNAMEh}r (h]h]h]h]h]uh j h]r hXHOSTNAMEr r }r (hUh j ubah!jrubhX:r }r (hX:h j ubjh)r }r (hXPORTNUMh}r (h]h]h]h]h]uh j h]r hXPORTNUMr r }r (hUh j ubah!jrubeh!jubhX). Note that this port is r r }r (hX). Note that this port is h j ubjh)r }r (hX*not*h}r (h]h]h]h]h]uh j h]r hXnotr r }r (hUh j ubah!jrubhX 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`r0 h j jqjh!j-h}r1 (UreftypeXclassj/j0X PBListenerU refdomainXpyr2 h]h]U refexplicith]h]h]j3hbj Nj Nuj!Kh]r3 j)r4 }r5 (hj0 h}r6 (h]h]r7 (j:j2 Xpy-classr8 eh]h]h]uh j. h]r9 hX PBListenerr: r; }r< (hUh j4 ubah!jubaubhX port.r= r> }r? (hX port.h j ubeubj)r@ }rA (hXThe :option:`--master` option can also be provided by the ``masterstatus`` name in :file:`.buildbot/options` (see :ref:`buildbot-config-directory`).h j jqjh!jh}rB (h]h]h]h]h]uj!Kjjh]rC (hXThe rD rE }rF (hXThe h j@ ubj))rG }rH (hX:option:`--master`rI h j@ jqjh!j-h}rJ (UreftypeXoptionj/j0X--masterU refdomainXstdrK j2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rL j5)rM }rN (hjI h}rO (h]h]rP (j:jK X std-optionrQ eh]h]h]uh jG h]rR hX--masterrS rT }rU (hUh jM ubah!j@ubaubhX$ option can also be provided by the rV rW }rX (hX$ option can also be provided by the h j@ ubj)rY }rZ (hX``masterstatus``h}r[ (h]h]h]h]h]uh j@ h]r\ hX masterstatusr] r^ }r_ (hUh jY ubah!jubhX name in r` ra }rb (hX name in h j@ ubj)rc }rd (hUh}re (h]h]h]h]rf Xfilerg aUrolejg h]uh j@ h]rh hX.buildbot/optionsri rj }rk (hX.buildbot/optionsh jc ubah!jubhX (see rl rm }rn (hX (see h j@ ubj))ro }rp (hX :ref:`buildbot-config-directory`rq h j@ jqjh!j-h}rr (UreftypeXrefj/j0Xbuildbot-config-directoryU refdomainXstdrs h]h]U refexplicith]h]h]j3hbuj!Kh]rt jh)ru }rv (hjq h}rw (h]h]rx (j:js Xstd-refry eh]h]h]uh jo h]rz hXbuildbot-config-directoryr{ r| }r} (hUh ju ubah!jrubaubhX).r~ r }r (hX).h j@ ubeubj)r }r (hUh j jqjh!jh}r (h]h]h]h]h]Uentries]r ((UsingleX#Command Line Subcommands; statusguijjtr (UsingleX!statusgui Command Line Subcommandjjtr euj!Kjjh]ubj eubjqjh!jh}r (h]h]h]h]h]jjuj!Kjjh]ubsh]r (h)r }r (hX statusguir h j jqjh!h"h}r (h]h]h]h]h]uj!Kjjh]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 jqjh!jh}r (h]h]h]h]h]uj!Kjjh]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`r h j jqjh!j-h}r (UreftypeXstatusj/j0X PBListenerU refdomainXbbr h]h]U refexplicith]h]h]j3hbuj!Kh]r j)r }r (hj h}r (h]h]r (j:j X bb-statusr eh]h]h]uh j h]r hX PBListenerr r }r (hUh j ubah!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]r hXbuildbot statusguir r }r (hUh j ubah!jubhX command:r r }r (hX command:h j ubeubjM)r }r (hX/buildbot statusgui --master {MASTERHOST}:{PORT}h j jqjh!jPh}r (jRjSXnonejTjUh]h]h]h]h]uj!Kjjh]r hX/buildbot statusgui --master {MASTERHOST}:{PORT}r r }r (hUh j ubaubj)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 jqjh!jh}r (h]h]h]h]h]uj!Kjjh]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 r }r (hX argument and 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 option as the r r }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 r }r (hUh j ubah!jubhX command (r r }r (hX command (h j ubj))r }r (hX:bb:cmdline:`statuslog`r h j jqjh!j-h}r (UreftypeXcmdlinej/j0X statuslogU refdomainXbbr h]h]U refexplicith]h]h]j3hbuj!Kh]r j)r }r (hj h}r (h]h]r (j:j X bb-cmdliner eh]h]h]uh j h]r hX statuslogr r }r (hUh j ubah!jubaubhX).r r }r (hX).h j ubeubj)r }r (hUh j jqjh!jh}r (h]h]h]h]h]Uentries]r ((UsingleXCommand Line Subcommands; tryjjtr (UsingleXtry Command Line Subcommandjjtr euj!Kjjh]ubj)r }r (hUh j jqjh!jh}r (h]h]h]h]h]jjuj!Kjjh]ubeubjlj4 jzj)r }r (hUh jjqjh!j;h}r (h]h]h]h]r jzah]r jauj!Kjjh]r(h)r}r(hXLocating the masterrh j jqjh!h"h}r(h]h]h]h]h]uj!Kjjh]rhXLocating the masterrr}r(hjh jubaubj)r }r (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 j jqjh!jh}r (h]h]h]h]h]uj!Kjjh]r (hXThe r r}r(hXThe h j ubj)r}r(hX:command:`try`h}r(h]h]rjah]h]h]uh j h]rhXtryrr}r(hUh jubah!jubhX 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 rr}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 j ubj)r}r(hX``--connect=ssh``h}r(h]h]h]h]h]uh j h]rhX --connect=sshrr }r!(hUh jubah!jubhX or r"r#}r$(hX or h j ubj)r%}r&(hX``--connect=pb``h}r'(h]h]h]h]h]uh j h]r(hX --connect=pbr)r*}r+(hUh j%ubah!jubhX (or r,r-}r.(hX (or h j ubj)r/}r0(hX``try_connect = 'ssh'``h}r1(h]h]h]h]h]uh j h]r2hXtry_connect = 'ssh'r3r4}r5(hUh j/ubah!jubhX or r6r7}r8(hX or h j ubj)r9}r:(hX``try_connect = 'pb'``h}r;(h]h]h]h]h]uh j h]r<hXtry_connect = 'pb'r=r>}r?(hUh j9ubah!jubhX in r@rA}rB(hX in h j ubj)rC}rD(hUh}rE(h]h]h]h]rFXfilerGaUrolejGh]uh j h]rHhX.buildbot/optionsrIrJ}rK(hX.buildbot/optionsh jCubah!jubhX).rLrM}rN(hX).h j ubeubj)rO}rP(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 j jqjh!jh}rQ(h]h]h]h]h]uj!Kjjh]rR(hX1For the PB approach, the command must be given a rSrT}rU(hX1For the PB approach, the command must be given a h jOubj))rV}rW(hX:option:`--master`rXh jOjqjh!j-h}rY(UreftypeXoptionj/j0X--masterU refdomainXstdrZj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]r[j5)r\}r](hjXh}r^(h]h]r_(j:jZX std-optionr`eh]h]h]uh jVh]rahX--masterrbrc}rd(hUh j\ubah!j@ubaubhX argument (in the form rerf}rg(hX argument (in the form h jOubj)rh}ri(hUh}rj(h]h]h]h]rkXsamprlaUrolejlh]uh jOh]rm(jh)rn}ro(hXHOSTh}rp(h]h]h]h]h]uh jhh]rqhXHOSTrrrs}rt(hUh jnubah!jrubhX:ru}rv(hX:h jhubjh)rw}rx(hXPORTh}ry(h]h]h]h]h]uh jhh]rzhXPORTr{r|}r}(hUh jwubah!jrubeh!jubhX1) that points to TCP port that you picked in the r~r}r(hX1) that points to TCP port that you picked in the h jOubj))r}r(hX:class:`Try_Userpass`rh jOjqjh!j-h}r(UreftypeXclassj/j0X Try_UserpassU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!Kh]rj)r}r(hjh}r(h]h]r(j:jXpy-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 jOubj))r}r(hX:option:`--username`rh jOjqjh!j-h}r(UreftypeXoptionj/j0X --usernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --usernamerr}r(hUh jubah!j@ubaubhX and rr}r(hX and h jOubj))r}r(hX:option:`--passwd`rh jOjqjh!j-h}r(UreftypeXoptionj/j0X--passwdU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--passwdrr}r(hUh jubah!j@ubaubhXF 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 jOubj)r}r(hX ``userpass``h}r(h]h]h]h]h]uh jOh]rhXuserpassrr}r(hUh jubah!jubhX/ list. These arguments can also be provided as rr}r(hX/ list. These arguments can also be provided as h jOubj)r}r(hX``try_master``h}r(h]h]h]h]h]uh jOh]rhX try_masterrr}r(hUh jubah!jubhX, rr}r(hX, h jOubj)r}r(hX``try_username``h}r(h]h]h]h]h]uh jOh]rhX try_usernamerr}r(hUh jubah!jubhX, and rr}r(hX, and h jOubj)r}r(hX``try_password``h}r(h]h]h]h]h]uh jOh]rhX try_passwordrr}r(hUh jubah!jubhX entries in the rr}r(hX entries in the h jOubj)r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jOh]rhX.buildbot/optionsrr}r(hX.buildbot/optionsh jubah!jubhX file.rr}r(hX file.h jOubeubj)r}r(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 j jqjh!jh}r(h]h]h]h]h]uj!Kjjh]r(hX0For the SSH approach, the command must be given rr}r(hX0For the SSH approach, the command must be given h jubj))r}r(hX:option:`--host`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--hostU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--hostrr}r(hUh jubah!j@ubaubhX and rr}r(hX and h jubj))r}r(hX:option:`--username`rh jjqjh!j-h}r(UreftypeXoptionj/j0X --usernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]r j5)r }r (hjh}r (h]h]r (j:jX std-optionreh]h]h]uh jh]rhX --usernamerr}r(hUh j ubah!j@ubaubhX8, to get to the buildmaster host. It must also be given rr}r(hX8, to get to the buildmaster host. It must also be given h jubj))r}r(hX:option:`--jobdir`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--jobdirU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionr eh]h]h]uh jh]r!hX--jobdirr"r#}r$(hUh jubah!j@ubaubhX, 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 r%r&}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 jubj)r(}r)(hUh}r*(h]h]h]h]r+Xfiler,aUrolej,h]uh jh]r-hX~buildbot/project/trydirr.r/}r0(hX~buildbot/project/trydirh j(ubah!jubhX%. These arguments can be provided in r1r2}r3(hX%. These arguments can be provided in h jubj)r4}r5(hUh}r6(h]h]h]h]r7Xfiler8aUrolej8h]uh jh]r9hX.buildbot/optionsr:r;}r<(hX.buildbot/optionsh j4ubah!jubhX as r=r>}r?(hX as h jubj)r@}rA(hX ``try_host``h}rB(h]h]h]h]h]uh jh]rChXtry_hostrDrE}rF(hUh j@ubah!jubhX, rGrH}rI(hX, h jubj)rJ}rK(hX``try_username``h}rL(h]h]h]h]h]uh jh]rMhX try_usernamerNrO}rP(hUh jJubah!jubhX, rQrR}rS(hX, h jubj)rT}rU(hX``try_password``h}rV(h]h]h]h]h]uh jh]rWhX try_passwordrXrY}rZ(hUh jTubah!jubhX, and r[r\}r](hX, and h jubj)r^}r_(hX``try_jobdir``h}r`(h]h]h]h]h]uh jh]rahX try_jobdirrbrc}rd(hUh j^ubah!jubhX.re}rf(hX.h jubeubj)rg}rh(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 j jqjh!jh}ri(h]h]h]h]h]uj!Kjjh]rj(hX!The SSH approach also provides a rkrl}rm(hX!The SSH approach also provides a h jgubj))rn}ro(hX:option:`--buildbotbin`rph jgjqjh!j-h}rq(UreftypeXoptionj/j0X --buildbotbinU refdomainXstdrrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rsj5)rt}ru(hjph}rv(h]h]rw(j:jrX std-optionrxeh]h]h]uh jnh]ryhX --buildbotbinrzr{}r|(hUh jtubah!j@ubaubhX 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 r}r~}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 jgubj))r}r(hX0:ref:`virtualenv `rh jgjqjh!j-h}r(UreftypeXrefj/j0Xinstallation-in-a-virtualenvU refdomainXstdrh]h]U refexplicith]h]h]j3hbuj!Kh]rjh)r}r(hjh}r(h]h]r(j:jXstd-refreh]h]h]uh jh]rhX virtualenvrr}r(hUh jubah!jrubaubhXw 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 jgubj))r}r(hX:option:`--username`rh jgjqjh!j-h}r(UreftypeXoptionj/j0X --usernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --usernamerr}r(hUh jubah!j@ubaubhX. The rr}r(hX. The h jgubj))r}r(hX:option:`--buildbotbin`rh jgjqjh!j-h}r(UreftypeXoptionj/j0X --buildbotbinU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --buildbotbinrr}r(hUh jubah!j@ubaubhX argument can be provided in rr}r(hX argument can be provided in h jgubj)r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jgh]rhX.buildbot/optionsrr}r(hX.buildbot/optionsh jubah!jubhX as rr}r(hX as h jgubj)r}r(hX``try_buildbotbin``h}r(h]h]h]h]h]uh jgh]rhXtry_buildbotbinrr}r(hUh jubah!jubeubj)r}r(hXFinally, the SSH approach needs to connect to a :class:`PBListener` status port, so it can retrieve and report the results of the build (the PB approach uses the existing connection to retrieve status information, so this step is not necessary). This requires a :option:`--masterstatus` argument, or a ``try_masterstatus`` entry in :file:`.buildbot/options`, in the form of a :samp:`{HOSTNAME}:{PORT}` string.h j jqjh!jh}r(h]h]h]h]h]uj!Kjjh]r(hX0Finally, the SSH approach needs to connect to a rr}r(hX0Finally, the SSH approach needs to connect to a h jubj))r}r(hX:class:`PBListener`rh jjqjh!j-h}r(UreftypeXclassj/j0X PBListenerU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!Kh]rj)r}r(hjh}r(h]h]r(j:jXpy-classreh]h]h]uh jh]rhX PBListenerrr}r(hUh jubah!jubaubhX status port, so it can retrieve and report the results of the build (the PB approach uses the existing connection to retrieve status information, so this step is not necessary). This requires a rr}r(hX status port, so it can retrieve and report the results of the build (the PB approach uses the existing connection to retrieve status information, so this step is not necessary). This requires a h jubj))r}r(hX:option:`--masterstatus`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--masterstatusU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Kh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--masterstatusrr}r(hUh jubah!j@ubaubhX argument, or a rr}r(hX argument, or a h jubj)r}r(hX``try_masterstatus``h}r(h]h]h]h]h]uh jh]rhXtry_masterstatusrr}r(hUh jubah!jubhX entry in rr}r(hX entry in h jubj)r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uh jh]rhX.buildbot/optionsrr}r(hX.buildbot/optionsh jubah!jubhX, in the form of a rr}r (hX, in the form of a h jubj)r }r (hUh}r (h]h]h]h]r XsampraUrolejh]uh jh]r(jh)r}r(hXHOSTNAMEh}r(h]h]h]h]h]uh j h]rhXHOSTNAMErr}r(hUh jubah!jrubhX:r}r(hX:h j ubjh)r}r(hXPORTh}r(h]h]h]h]h]uh j h]rhXPORTrr}r(hUh jubah!jrubeh!jubhX string.r r!}r"(hX string.h jubeubj)r#}r$(hX]The following command line arguments are deprecated, but retained for backward compatibility:r%h j jqjh!jh}r&(h]h]h]h]h]uj!Mjjh]r'hX]The following command line arguments are deprecated, but retained for backward compatibility:r(r)}r*(hj%h j#ubaubcdocutils.nodes option_list r+)r,}r-(hUh j jqjh!U option_listr.h}r/(h]h]h]h]h]uj!Njjh]r0(cdocutils.nodes option_list_item r1)r2}r3(hUh j,jqjh!Uoption_list_itemr4h}r5(h]h]h]h]h]uj!Njjh]r6(cdocutils.nodes option_group r7)r8}r9(hUh}r:(h]h]h]h]h]uh j2h]r;cdocutils.nodes option r<)r=}r>(hX --tryhostr?h}r@(h]h]h]h]h]uh j8h]rAcdocutils.nodes option_string rB)rC}rD(hj?h}rE(h]h]h]h]h]uh j=h]rFhX --tryhostrGrH}rI(hUh jCubah!U option_stringrJubah!UoptionrKubah!U option_grouprLubcdocutils.nodes description rM)rN}rO(hXis replaced by :option:`--host`rPh}rQ(h]h]h]h]h]uh j2h]rRj)rS}rT(hjPh jNjqjh!jh}rU(h]h]h]h]h]uj!Mh]rV(hXis replaced by rWrX}rY(hXis replaced by h jSubj))rZ}r[(hX:option:`--host`r\h jSjqjh!j-h}r](UreftypeXoptionj/j0X--hostU refdomainXstdr^j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r_j5)r`}ra(hj\h}rb(h]h]rc(j:j^X std-optionrdeh]h]h]uh jZh]rehX--hostrfrg}rh(hUh j`ubah!j@ubaubeubah!U descriptionriubeubj1)rj}rk(hUh j,jqjh!j4h}rl(h]h]h]h]h]uj!Njjh]rm(j7)rn}ro(hUh}rp(h]h]h]h]h]uh jjh]rqj<)rr}rs(hX--trydirrth}ru(h]h]h]h]h]uh jnh]rvjB)rw}rx(hjth}ry(h]h]h]h]h]uh jrh]rzhX--trydirr{r|}r}(hUh jwubah!jJubah!jKubah!jLubjM)r~}r(hX!is replaced by :option:`--jobdir`rh}r(h]h]h]h]h]uh jjh]rj)r}r(hjh j~jqjh!jh}r(h]h]h]h]h]uj!Mh]r(hXis replaced by rr}r(hXis replaced by h jubj))r}r(hX:option:`--jobdir`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--jobdirU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--jobdirrr}r(hUh jubah!j@ubaubeubah!jiubeubj1)r}r(hUh j,jqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX--masterrh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--masterrr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!Mh]r(hXis replaced by rr}r(hXis replaced by h jubj))r}r(hX:option:`--masterstatus`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--masterstatusU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--masterstatusrr}r(hUh jubah!j@ubaubeubah!jiubeubeubj)r}r(hXwLikewise, the following :file:`.buildbot/options` file entries are deprecated, but retained for backward compatibility:h j jqjh!jh}r(h]h]h]h]h]uj!M jjh]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 jubeubj )r}r(hUh j jqNh!j h}r(h]h]h]h]h]uj!Njjh]rj )r}r(hUh}r(j X*h]h]h]h]h]uh jh]r(j )r}r(hX)``try_dir`` is replaced by ``try_jobdir``rh}r(h]h]h]h]h]uh jh]rj)r}r(hjh jjqjh!jh}r(h]h]h]h]h]uj!M h]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!j ubj )r}r(hX5``masterstatus`` is replaced by ``try_masterstatus`` h}r(h]h]h]h]h]uh jh]rj)r}r(hX4``masterstatus`` is replaced by ``try_masterstatus``h jjqjh!jh}r(h]h]h]h]h]uj!Mh]r(j)r}r(hX``masterstatus``h}r(h]h]h]h]h]uh jh]rhX masterstatusrr }r (hUh jubah!jubhX is replaced by r r }r (hX is replaced by h jubj)r}r(hX``try_masterstatus``h}r(h]h]h]h]h]uh jh]rhXtry_masterstatusrr}r(hUh jubah!jubeubah!j ubeh!j1 ubaubeubj~j)r}r(hUh jjqjh!j;h}r(h]h]h]h]rj~ah]rjauj!Mcjjh]r(h)r}r(hXDetermining the branch namerh jjqjh!h"h}r(h]h]h]h]h]uj!Mcjjh]rhXDetermining the branch namer r!}r"(hjh jubaubj)r#}r$(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 jjqjh!jh}r%(h]h]h]h]h]uj!Mejjh]r&(hX<Some VC systems record the branch information in a way that r'r(}r)(hX<Some VC systems record the branch information in a way that h j#ubj)r*}r+(hX``try``h}r,(h]h]h]h]h]uh j#h]r-hXtryr.r/}r0(hUh j*ubah!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 r1r2}r3(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))r4}r5(hX:option:`--branch`r6h j#jqjh!j-h}r7(UreftypeXoptionj/j0X--branchU refdomainXstdr8j2Nh]h]U refexplicith]h]h]j3hbuj!Meh]r9j5)r:}r;(hj6h}r<(h]h]r=(j:j8X std-optionr>eh]h]h]uh j4h]r?hX--branchr@rA}rB(hUh j:ubah!j@ubaubhX argument, or a rCrD}rE(hX argument, or a h j#ubj)rF}rG(hX``try_branch``h}rH(h]h]h]h]h]uh j#h]rIhX try_branchrJrK}rL(hUh jFubah!jubhX entry in the rMrN}rO(hX entry in the h j#ubj)rP}rQ(hUh}rR(h]h]h]h]rSXfilerTaUrolejTh]uh j#h]rUhX.buildbot/optionsrVrW}rX(hX.buildbot/optionsh jPubah!jubhX file.rYrZ}r[(hX file.h j#ubeubeubjj)r\}r](hUh j)r^}r_(hUh jjqjh!j;h}r`(h]h]h]h]rajxah]rbjauj!Mjjh]rc(h)rd}re(hX Other Toolsrfh j^jqjh!h"h}rg(h]h]h]h]h]uj!Mjjh]rhhX Other Toolsrirj}rk(hjfh jdubaubj)rl}rm(hX=These tools are generally used by buildmaster administrators.rnh j^jqjh!jh}ro(h]h]h]h]h]uj!Mjjh]rphX=These tools are generally used by buildmaster administrators.rqrr}rs(hjnh jlubaubj)rt}ru(hUh j^jqjh!jh}rv(h]h]h]h]h]Uentries]rw((UsingleX$Command Line Subcommands; sendchangejjtrx(UsingleX"sendchange Command Line Subcommandjjtryeuj!Mjjh]ubj)rz}r{(hUh j^jqjh!jh}r|(h]h]h]h]h]jjuj!Mjjh]ubj)r}}r~(hUh j^jqjj}h!j;h}r(h]h]h]h]r(jpjeh]rjauj!Mjjj"}rjjzsh]r(h)r}r(hX sendchangerh j}jqjh!h"h}r(h]h]h]h]h]uj!Mjjh]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 j}jqjh!jh}r(h]h]h]h]h]uj!Mjjh]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 jjqjh!j-h}r(UreftypeXclassj/j0XPBChangeSourceU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!Mh]rj)r}r(hjh}r(h]h]r(j:jXpy-classreh]h]h]uh jh]rhXPBChangeSourcerr}r(hUh jubah!jubaubhX (rr}r(hX (h jubj))r}r(hX:bb:chsrc:`PBChangeSource`rh jjqjh!j-h}r(UreftypeXchsrcj/j0XPBChangeSourceU refdomainXbbrh]h]U refexplicith]h]h]j3hbuj!Mh]rj)r}r(hjh}r(h]h]r(j:jXbb-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 jubeubjM)r}r(hXhbuildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS} --who {USER} {FILENAMES..}h j}jqjh!jPh}r(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]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 j}jqjh!jh}r(h]h]h]h]h]uj!M"jjh]r(hXThe rr}r(hXThe h jubj))r}r(hX:option:`auth`rh jjqjh!j-h}r(UreftypeXoptionj/j0XauthU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!M"h]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXauthrr}r(hUh jubah!j@ubaubhXO 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 j}jqjh!jh}r(h]h]h]h]h]uj!M(jjh]r(hXThe rr}r(hXThe h jubj))r}r(hX:option:`master`rh jjqjh!j-h}r(UreftypeXoptionj/j0XmasterU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!M(h]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXmasterrr}r(hUh jubah!j@ubaubhX and rr}r(hX and h jubj))r}r(hX:option:`username`rh jjqjh!j-h}r(UreftypeXoptionj/j0XusernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!M(h]r j5)r }r (hjh}r (h]h]r (j:jX std-optionreh]h]h]uh jh]rhXusernamerr}r(hUh j ubah!j@ubaubhX6 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`rh jjqjh!j-h}r(UreftypeXrefj/j0Xbuildbot-config-directoryU refdomainXstdrh]h]U refexplicith]h]h]j3hbuj!M(h]rjh)r}r(hjh}r(h]h]r(j:jXstd-refr eh]h]h]uh jh]r!hXbuildbot-config-directoryr"r#}r$(hUh jubah!jrubaubhXA). There are other (optional) arguments which can influence the r%r&}r'(hXA). There are other (optional) arguments which can influence the h jubj)r(}r)(hX ``Change``h}r*(h]h]h]h]h]uh jh]r+hXChanger,r-}r.(hUh j(ubah!jubhX that gets submitted:r/r0}r1(hX that gets submitted:h jubeubj+)r2}r3(hUh j}jqjh!j.h}r4(h]h]h]h]h]uj!Njjh]r5(j1)r6}r7(hUh j2jqjh!j4h}r8(h]h]h]h]h]uj!Njjh]r9(j7)r:}r;(hUh}r<(h]h]h]h]h]uh j6h]r=j<)r>}r?(hX--branchr@h}rA(h]h]h]h]h]uh j:h]rBjB)rC}rD(hj@h}rE(h]h]h]h]h]uh j>h]rFhX--branchrGrH}rI(hUh jCubah!jJubah!jKubah!jLubjM)rJ}rK(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}rL(h]h]h]h]h]uh j6h]rMj)rN}rO(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 jJjqjh!jh}rP(h]h]h]h]h]uj!M-h]rQ(hX (or option rRrS}rT(hX (or option h jNubj)rU}rV(hX ``branch``h}rW(h]h]h]h]h]uh jNh]rXhXbranchrYrZ}r[(hUh jUubah!jubhXJ) This provides the (string) branch specifier. If omitted, it defaults to r\r]}r^(hXJ) This provides the (string) branch specifier. If omitted, it defaults to h jNubj)r_}r`(hX``None``h}ra(h]h]h]h]h]uh jNh]rbhXNonercrd}re(hUh j_ubah!jubhX, indicating the rfrg}rh(hX, indicating the h jNubj)ri}rj(hX``default branch``h}rk(h]h]h]h]h]uh jNh]rlhXdefault branchrmrn}ro(hUh jiubah!jubhX?. All files included in this Change must be on the same branch.rprq}rr(hX?. All files included in this Change must be on the same branch.h jNubeubah!jiubeubj1)rs}rt(hUh j2jqjh!j4h}ru(h]h]h]h]h]uj!Njjh]rv(j7)rw}rx(hUh}ry(h]h]h]h]h]uh jsh]rzj<)r{}r|(hX --categoryr}h}r~(h]h]h]h]h]uh jwh]rjB)r}r(hj}h}r(h]h]h]h]h]uh j{h]rhX --categoryrr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jsh]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 jjqjh!jh}r(h]h]h]h]h]uj!M2h]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 jjqjh!j-h}r(UreftypeXclassj/j0X SchedulerU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!M2h]rj)r}r(hjh}r(h]h]r(j:jXpy-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!jiubeubj1)r}r(hUh j2jqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX --projectrh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --projectrr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!M7h]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!jiubeubj1)r}r(hUh j2jqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX --repositoryrh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --repositoryrr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!M<h]r(hX (or option rr}r (hX (or option h jubj)r }r (hX``repository``h}r (h]h]h]h]h]uh jh]r hX repositoryrr}r(hUh j ubah!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]rhX''rr}r(hUh jubah!jubhX.r}r(hX.h jubeubah!jiubeubj1)r}r(hUh j2jqjh!j4h}r(h]h]h]h]h]uj!Njjh]r (j7)r!}r"(hUh}r#(h]h]h]h]h]uh jh]r$j<)r%}r&(hX --revisionr'h}r((h]h]h]h]h]uh j!h]r)jB)r*}r+(hj'h}r,(h]h]h]h]h]uh j%h]r-hX --revisionr.r/}r0(hUh j*ubah!jJubah!jKubah!jLubjM)r1}r2(hXIThis provides a revision specifier, appropriate to the VC system in use. h}r3(h]h]h]h]h]uh jh]r4j)r5}r6(hXHThis provides a revision specifier, appropriate to the VC system in use.r7h j1jqjh!jh}r8(h]h]h]h]h]uj!M@h]r9hXHThis provides a revision specifier, appropriate to the VC system in use.r:r;}r<(hj7h j5ubaubah!jiubeubj1)r=}r>(hUh j2jqjh!j4h}r?(h]h]h]h]h]uj!Njjh]r@(j7)rA}rB(hUh}rC(h]h]h]h]h]uh j=h]rDj<)rE}rF(hX--revision_filerGh}rH(h]h]h]h]h]uh jAh]rIjB)rJ}rK(hjGh}rL(h]h]h]h]h]uh jEh]rMhX--revision_filerNrO}rP(hUh jJubah!jJubah!jKubah!jLubjM)rQ}rR(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}rS(h]h]h]h]h]uh j=h]rTj)rU}rV(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 jQjqjh!jh}rW(h]h]h]h]h]uj!MCh]rX(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 rYrZ}r[(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 jUubj)r\}r](hX``darcs changes --context``h}r^(h]h]h]h]h]uh jUh]r_hXdarcs changes --contextr`ra}rb(hUh j\ubah!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.rcrd}re(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 jUubeubah!jiubeubj1)rf}rg(hUh j2jqjh!j4h}rh(h]h]h]h]h]uj!Njjh]ri(j7)rj}rk(hUh}rl(h]h]h]h]h]uh jfh]rmj<)rn}ro(hX --propertyrph}rq(h]h]h]h]h]uh jjh]rrjB)rs}rt(hjph}ru(h]h]h]h]h]uh jnh]rvhX --propertyrwrx}ry(hUh jsubah!jJubah!jKubah!jLubjM)rz}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 jfh]r}j)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 jzjqjh!jh}r(h]h]h]h]h]uj!MKh]r(hX0This parameter is used to set a property on the rr}r(hX0This parameter is used to set a property on the h j~ubj))r}r(hX:class:`Change`rh j~jqjh!j-h}r(UreftypeXclassj/j0XChangeU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!MKh]rj)r}r(hjh}r(h]h]r(j:jXpy-classreh]h]h]uh jh]rhXChangerr}r(hUh jubah!jubaubhX generated by rr}r(hX generated by h j~ubj)r}r(hX``sendchange``h}r(h]h]h]h]h]uh j~h]rhX sendchangerr}r(hUh jubah!jubhX . Properties are specified as a rr}r(hX . Properties are specified as a h j~ubj)r}r(hUh}r(h]h]h]h]rXsampraUrolejh]uh j~h]r(jh)r}r(hXnameh}r(h]h]h]h]h]uh jh]rhXnamerr}r(hUh jubah!jrubhX:r}r(hX:h jubjh)r}r(hXvalueh}r(h]h]h]h]h]uh jh]rhXvaluerr}r(hUh jubah!jrubeh!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 j~ubeubah!jiubeubj1)r}r(hUh j2jqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX --commentsrh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --commentsrr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!MPh]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 jjqjh!j-h}r(UreftypeXoptionj/j0X --logfileU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!MPh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --logfilerr}r(hUh jubah!j@ubaubhX instead.rr}r(hX instead.h jubeubah!jiubeubj1)r}r(hUh j2jqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX --logfilerh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX --logfilerr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!MTh]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]r hX-r}r(hUh j ubah!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!jiubeubj1)r}r(hUh j2jqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX --encodingrh}r(h]h]h]h]h]uh jh]rjB)r }r!(hjh}r"(h]h]h]h]h]uh jh]r#hX --encodingr$r%}r&(hUh j ubah!jJubah!jKubah!jLubjM)r'}r((hXUSpecifies the character encoding for all other parameters, defaulting to ``'utf8'``. h}r)(h]h]h]h]h]uh jh]r*j)r+}r,(hXTSpecifies the character encoding for all other parameters, defaulting to ``'utf8'``.h j'jqjh!jh}r-(h]h]h]h]h]uj!MYh]r.(hXISpecifies the character encoding for all other parameters, defaulting to r/r0}r1(hXISpecifies the character encoding for all other parameters, defaulting to h j+ubj)r2}r3(hX ``'utf8'``h}r4(h]h]h]h]h]uh j+h]r5hX'utf8'r6r7}r8(hUh j2ubah!jubhX.r9}r:(hX.h j+ubeubah!jiubeubj1)r;}r<(hUh j2jqjh!j4h}r=(h]h]h]h]h]uj!Njjh]r>(j7)r?}r@(hUh}rA(h]h]h]h]h]uh j;h]rBj<)rC}rD(hX--vcrEh}rF(h]h]h]h]h]uh j?h]rGjB)rH}rI(hjEh}rJ(h]h]h]h]h]uh jCh]rKhX--vcrLrM}rN(hUh jHubah!jJubah!jKubah!jLubjM)rO}rP(hXSpecifies which VC system the Change is coming from, one of: ``cvs``, ``svn``, ``darcs``, ``hg``, ``bzr``, ``git``, ``mtn``, or ``p4``. Defaults to ``None``. h}rQ(h]h]h]h]h]uh j;h]rRj)rS}rT(hXSpecifies which VC system the Change is coming from, one of: ``cvs``, ``svn``, ``darcs``, ``hg``, ``bzr``, ``git``, ``mtn``, or ``p4``. Defaults to ``None``.h jOjqjh!jh}rU(h]h]h]h]h]uj!M]h]rV(hX=Specifies which VC system the Change is coming from, one of: rWrX}rY(hX=Specifies which VC system the Change is coming from, one of: h jSubj)rZ}r[(hX``cvs``h}r\(h]h]h]h]h]uh jSh]r]hXcvsr^r_}r`(hUh jZubah!jubhX, rarb}rc(hX, h jSubj)rd}re(hX``svn``h}rf(h]h]h]h]h]uh jSh]rghXsvnrhri}rj(hUh jdubah!jubhX, rkrl}rm(hX, h jSubj)rn}ro(hX ``darcs``h}rp(h]h]h]h]h]uh jSh]rqhXdarcsrrrs}rt(hUh jnubah!jubhX, rurv}rw(hX, h jSubj)rx}ry(hX``hg``h}rz(h]h]h]h]h]uh jSh]r{hXhgr|r}}r~(hUh jxubah!jubhX, rr}r(hX, h jSubj)r}r(hX``bzr``h}r(h]h]h]h]h]uh jSh]rhXbzrrr}r(hUh jubah!jubhX, rr}r(hX, h jSubj)r}r(hX``git``h}r(h]h]h]h]h]uh jSh]rhXgitrr}r(hUh jubah!jubhX, rr}r(hX, h jSubj)r}r(hX``mtn``h}r(h]h]h]h]h]uh jSh]rhXmtnrr}r(hUh jubah!jubhX, or rr}r(hX, or h jSubj)r}r(hX``p4``h}r(h]h]h]h]h]uh jSh]rhXp4rr}r(hUh jubah!jubhX. Defaults to rr}r(hX. Defaults to h jSubj)r}r(hX``None``h}r(h]h]h]h]h]uh jSh]rhXNonerr}r(hUh jubah!jubhX.r}r(hX.h jSubeubah!jiubeubeubj)r}r(hUh j}jqjh!jh}r(h]h]h]h]h]Uentries]r((UsingleX%Command Line Subcommands; debugclientjjtr(UsingleX#debugclient Command Line Subcommandjjtreuj!Mbjjh]ubj)r}r(hUh j}jqjh!jh}r(h]h]h]h]h]jjuj!Mbjjh]ubeubj\j)r}r(hUh j^jqjj}h!j;h}r(h]h]h]h]r(jwjeh]rjauj!Mjjj"}rjj)r}r(hUh j\jqjh!jh}r(h]h]h]h]h]jjuj!Mjjh]ubsh]r(h)r}r(hXuserrh jjqjh!h"h}r(h]h]h]h]h]uj!Mjjh]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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]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 jjqjh!j-h}r(UreftypeXrefj/j0X users-optionsU refdomainXstdrh]h]U refexplicith]h]h]j3hbuj!Mh]rjh)r}r(hjh}r(h]h]r(j:jXstd-refreh]h]h]uh jh]rhX Users-Optionsrr}r(hUh jubah!jrubaubhX.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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]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 rr}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 jjqjh!j-h}r(UreftypeXrefj/j0Xconcepts-usersU refdomainXstdrh]h]U refexplicith]h]h]j3hbuj!Mh]rjh)r }r (hjh}r (h]h]r (j:jXstd-refr eh]h]h]uh jh]rhXConcepts-Usersrr}r(hUh j ubah!jrubaubhX.r}r(hX.h jubeubj+)r}r(hUh jjqjh!j.h}r(h]h]h]h]h]uj!Njjh]r(j1)r}r(hUh jjqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r }r!(hX--masterr"h}r#(h]h]h]h]h]uh jh]r$jB)r%}r&(hj"h}r'(h]h]h]h]h]uh j h]r(hX--masterr)r*}r+(hUh j%ubah!jJubah!jKubah!jLubjM)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}r.(h]h]h]h]h]uh jh]r/j)r0}r1(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 j,jqjh!jh}r2(h]h]h]h]h]uj!Mh]r3(hXThe r4r5}r6(hXThe h j0ubj)r7}r8(hX:command:`user`h}r9(h]h]r:jah]h]h]uh j0h]r;hXuserr<r=}r>(hUh j7ubah!jubhX[ command can be run virtually anywhere provided a location of the running buildmaster. The r?r@}rA(hX[ command can be run virtually anywhere provided a location of the running buildmaster. The h j0ubj))rB}rC(hX:option:`master`rDh j0jqjh!j-h}rE(UreftypeXoptionj/j0XmasterU refdomainXstdrFj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rGj5)rH}rI(hjDh}rJ(h]h]rK(j:jFX std-optionrLeh]h]h]uh jBh]rMhXmasterrNrO}rP(hUh jHubah!j@ubaubhX argument is of the form rQrR}rS(hX argument is of the form h j0ubj)rT}rU(hX``{MASTERHOST}:{PORT}``h}rV(h]h]h]h]h]uh j0h]rWhX{MASTERHOST}:{PORT}rXrY}rZ(hUh jTubah!jubhX.r[}r\(hX.h j0ubeubah!jiubeubj1)r]}r^(hUh jjqjh!j4h}r_(h]h]h]h]h]uj!Njjh]r`(j7)ra}rb(hUh}rc(h]h]h]h]h]uh j]h]rdj<)re}rf(hX --usernamergh}rh(h]h]h]h]h]uh jah]rijB)rj}rk(hjgh}rl(h]h]h]h]h]uh jeh]rmhX --usernamernro}rp(hUh jjubah!jJubah!jKubah!jLubjM)rq}rr(hXZPB connection authentication that should match the arguments to `CommandlineUserManager`. h}rs(h]h]h]h]h]uh j]h]rtj)ru}rv(hXYPB connection authentication that should match the arguments to `CommandlineUserManager`.h jqjqjh!jh}rw(h]h]h]h]h]uj!Mh]rx(hX@PB connection authentication that should match the arguments to ryrz}r{(hX@PB connection authentication that should match the arguments to h juubj)r|}r}(hX`CommandlineUserManager`h}r~(h]h]h]h]h]uh juh]rhXCommandlineUserManagerrr}r(hUh j|ubah!jubhX.r}r(hX.h juubeubah!jiubeubj1)r}r(hUh jjqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX--passwdrh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--passwdrr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!Mh]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!jiubeubj1)r}r(hUh jjqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX--oprh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--oprr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!Mh]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 jjqjh!j-h}r(UreftypeXoptionj/j0XopU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXoprr}r(hUh jubah!j@ubaubhX argument: rr}r(hX argument: h jubj))r}r(hX :option:`add`rh jjqjh!j-h}r(UreftypeXoptionj/j0XaddU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXaddrr}r(hUh jubah!j@ubaubhX, rr}r(hX, h jubj))r}r(hX:option:`update`rh jjqjh!j-h}r(UreftypeXoptionj/j0XupdateU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!j@ubaubhX, rr}r(hX, h jubj))r}r(hX:option:`remove`rh jjqjh!j-h}r(UreftypeXoptionj/j0XremoveU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r (hjh}r (h]h]r (j:jX std-optionr eh]h]h]uh jh]r hXremoverr}r(hUh jubah!j@ubaubhX, and rr}r(hX, and h jubj))r}r(hX :option:`get`rh jjqjh!j-h}r(UreftypeXoptionj/j0XgetU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXgetr r!}r"(hUh jubah!j@ubaubhX7. Each are described in full in the following sections.r#r$}r%(hX7. Each are described in full in the following sections.h jubeubah!jiubeubj1)r&}r'(hUh jjqjh!j4h}r((h]h]h]h]h]uj!Njjh]r)(j7)r*}r+(hUh}r,(h]h]h]h]h]uh j&h]r-j<)r.}r/(hX --bb_usernamer0h}r1(h]h]h]h]h]uh j*h]r2jB)r3}r4(hj0h}r5(h]h]h]h]h]uh j.h]r6hX --bb_usernamer7r8}r9(hUh j3ubah!jJubah!jKubah!jLubjM)r:}r;(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}r<(h]h]h]h]h]uh j&h]r=j)r>}r?(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 j:jqjh!jh}r@(h]h]h]h]h]uj!Mh]rA(hXUsed with the rBrC}rD(hXUsed with the h j>ubj))rE}rF(hX:option:`update`rGh j>jqjh!j-h}rH(UreftypeXoptionj/j0XupdateU refdomainXstdrIj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rJj5)rK}rL(hjGh}rM(h]h]rN(j:jIX std-optionrOeh]h]h]uh jEh]rPhXupdaterQrR}rS(hUh jKubah!j@ubaubhX[ option, this sets the user's username for web authentication in the database. It requires rTrU}rV(hX[ option, this sets the user's username for web authentication in the database. It requires h j>ubj))rW}rX(hX:option:`bb_password`rYh j>jqjh!j-h}rZ(UreftypeXoptionj/j0X bb_passwordU refdomainXstdr[j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r\j5)r]}r^(hjYh}r_(h]h]r`(j:j[X std-optionraeh]h]h]uh jWh]rbhX bb_passwordrcrd}re(hUh j]ubah!j@ubaubhX to be set along with it.rfrg}rh(hX to be set along with it.h j>ubeubah!jiubeubj1)ri}rj(hUh jjqjh!j4h}rk(h]h]h]h]h]uj!Njjh]rl(j7)rm}rn(hUh}ro(h]h]h]h]h]uh jih]rpj<)rq}rr(hX --bb_passwordrsh}rt(h]h]h]h]h]uh jmh]rujB)rv}rw(hjsh}rx(h]h]h]h]h]uh jqh]ryhX --bb_passwordrzr{}r|(hUh jvubah!jJubah!jKubah!jLubjM)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 jih]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 j}jqjh!jh}r(h]h]h]h]h]uj!Mh]r(hXAlso used with the rr}r(hXAlso used with the h jubj))r}r(hX:option:`update`rh jjqjh!j-h}r(UreftypeXoptionj/j0XupdateU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!j@ubaubhX 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!jiubeubj1)r}r(hUh jjqjh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX--idsrh}r(h]h]h]h]h]uh jh]rjB)r}r(hjh}r(h]h]h]h]h]uh jh]rhX--idsrr}r(hUh jubah!jJubah!jKubah!jLubjM)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 jjqjh!jh}r(h]h]h]h]h]uj!Mh]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 jjqjh!j-h}r(UreftypeXoptionj/j0XidsU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXidsrr}r(hUh jubah!j@ubaubhXV 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 jubj)r}r(hX:command:`user`h}r(h]h]rjah]h]h]uh jh]rhXuserrr}r(hUh jubah!jubhX command.rr}r(hX command.h jubeubj)r}r(hXTThe :option:`ids` option is used only when using :option:`remove` or :option:`show`.h jjqjh!jh}r(h]h]h]h]h]uj!Mh]r(hXThe rr}r(hXThe h jubj))r}r(hX :option:`ids`rh jjqjh!j-h}r(UreftypeXoptionj/j0XidsU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXidsrr}r(hUh jubah!j@ubaubhX option is used only when using rr}r(hX option is used only when using h jubj))r}r(hX:option:`remove`rh jjqjh!j-h}r(UreftypeXoptionj/j0XremoveU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXremoverr}r(hUh jubah!j@ubaubhX or rr}r(hX or h jubj))r}r(hX:option:`show`rh jjqjh!j-h}r(UreftypeXoptionj/j0XshowU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r (h]h]r (j:jX std-optionr eh]h]h]uh jh]r hXshowr r}r(hUh jubah!j@ubaubhX.r}r(hX.h jubeubeh!jiubeubj1)r}r(hUh jjqNh!j4h}r(h]h]h]h]h]uj!Njjh]r(j7)r}r(hUh}r(h]h]h]h]h]uh jh]rj<)r}r(hX--inforh}r(h]h]h]h]h]uh jh]rjB)r}r (hjh}r!(h]h]h]h]h]uh jh]r"hX--infor#r$}r%(hUh jubah!jJubah!jKubah!jLubjM)r&}r'(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}r((h]h]h]h]h]uh jh]r)(j)r*}r+(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 j&jqjh!jh}r,(h]h]h]h]h]uj!Mh]r-(hXgUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see r.r/}r0(hXgUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see h j*ubj))r1}r2(hX:ref:`Concepts-Users`r3h j*jqjh!j-h}r4(UreftypeXrefj/j0Xconcepts-usersU refdomainXstdr5h]h]U refexplicith]h]h]j3hbuj!Mh]r6jh)r7}r8(hj3h}r9(h]h]r:(j:j5Xstd-refr;eh]h]h]uh j1h]r<hXConcepts-Usersr=r>}r?(hUh j7ubah!jrubaubhX.). These attributes are specified in the form r@rA}rB(hX.). These attributes are specified in the form h j*ubj)rC}rD(hX``{TYPE}={VALUE}``h}rE(h]h]h]h]h]uh j*h]rFhX{TYPE}={VALUE}rGrH}rI(hUh jCubah!jubhX when using the rJrK}rL(hX when using the h j*ubj))rM}rN(hX:option:`info`rOh j*jqjh!j-h}rP(UreftypeXoptionj/j0XinfoU refdomainXstdrQj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rRj5)rS}rT(hjOh}rU(h]h]rV(j:jQX std-optionrWeh]h]h]uh jMh]rXhXinforYrZ}r[(hUh jSubah!j@ubaubhX option. These r\r]}r^(hX option. These h j*ubj)r_}r`(hX``{TYPE}={VALUE}``h}ra(h]h]h]h]h]uh j*h]rbhX{TYPE}={VALUE}rcrd}re(hUh j_ubah!jubhX? pairs are specified in a comma separated list, so for example:rfrg}rh(hX? pairs are specified in a comma separated list, so for example:h j*ubeubjM)ri}rj(hX1--info=svn=jschmo,git='Joe Schmo 'h j&jqjh!jPh}rk(jRjSXnonejTjUh]h]h]h]h]uj!Mh]rlhX1--info=svn=jschmo,git='Joe Schmo 'rmrn}ro(hUh jiubaubj)rp}rq(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 j&jqjh!jh}rr(h]h]h]h]h]uj!Mh]rs(hXThe rtru}rv(hXThe h jpubj))rw}rx(hX:option:`info`ryh jpjqjh!j-h}rz(UreftypeXoptionj/j0XinfoU refdomainXstdr{j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r|j5)r}}r~(hjyh}r(h]h]r(j:j{X std-optionreh]h]h]uh jwh]rhXinforr}r(hUh j}ubah!j@ubaubhX/ option can be specified multiple times in the rr}r(hX/ option can be specified multiple times in the h jpubj)r}r(hX:command:`user`h}r(h]h]rjah]h]h]uh jph]rhXuserrr}r(hUh jubah!jubhXP 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 jpubj))r}r(hX:option:`info`rh jpjqjh!j-h}r(UreftypeXoptionj/j0XinfoU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXinforr}r(hUh jubah!j@ubaubhX is only used with rr}r(hX is only used with h jpubj))r}r(hX :option:`add`rh jpjqjh!j-h}r(UreftypeXoptionj/j0XaddU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXaddrr}r(hUh jubah!j@ubaubhX or with rr}r(hX or with h jpubj))r}r(hX:option:`update`rh jpjqjh!j-h}r(UreftypeXoptionj/j0XupdateU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!j@ubaubhX, and whenever you use rr}r(hX, and whenever you use h jpubj))r}r(hX:option:`update`rh jpjqjh!j-h}r(UreftypeXoptionj/j0XupdateU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!j@ubaubhXc 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 jpubj))r}r(hX:option:`info`rh jpjqjh!j-h}r(UreftypeXoptionj/j0XinfoU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXinforr}r(hUh jubah!j@ubaubhX arguments with rr}r(hX arguments with h jpubj)r}r(hX ``{ID:}``h}r(h]h]h]h]h]uh jph]rhX{ID:}rr}r(hUh jubah!jubhX. If we were to update rr}r(hX. If we were to update h jpubj)r}r(hX ``'jschmo'``h}r(h]h]h]h]h]uh jph]rhX'jschmo'rr}r(hUh jubah!jubhX4 from the previous example, it would look like this:rr}r(hX4 from the previous example, it would look like this:h jpubeubjM)r}r(hX0--info=jschmo:git='Joseph Schmo 'h j&jqjh!jPh}r(jRjSXnonejTjUh]h]h]h]h]uj!Mh]rhX0--info=jschmo:git='Joseph Schmo 'rr}r(hUh jubaubeh!jiubeubeubj)r }r (hXNote that :option:`--master`, :option:`--username`, :option:`--passwd`, and :option:`--op` are always required to issue the :command:`user` command.h jjqjh!jh}r (h]h]h]h]h]uj!Mjjh]r (hX Note that r r}r(hX Note that h j ubj))r}r(hX:option:`--master`rh j jqjh!j-h}r(UreftypeXoptionj/j0X--masterU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--masterrr}r(hUh jubah!j@ubaubhX, rr }r!(hX, h j ubj))r"}r#(hX:option:`--username`r$h j jqjh!j-h}r%(UreftypeXoptionj/j0X --usernameU refdomainXstdr&j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r'j5)r(}r)(hj$h}r*(h]h]r+(j:j&X std-optionr,eh]h]h]uh j"h]r-hX --usernamer.r/}r0(hUh j(ubah!j@ubaubhX, r1r2}r3(hX, h j ubj))r4}r5(hX:option:`--passwd`r6h j jqjh!j-h}r7(UreftypeXoptionj/j0X--passwdU refdomainXstdr8j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r9j5)r:}r;(hj6h}r<(h]h]r=(j:j8X std-optionr>eh]h]h]uh j4h]r?hX--passwdr@rA}rB(hUh j:ubah!j@ubaubhX, and rCrD}rE(hX, and h j ubj))rF}rG(hX:option:`--op`rHh j jqjh!j-h}rI(UreftypeXoptionj/j0X--opU refdomainXstdrJj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rKj5)rL}rM(hjHh}rN(h]h]rO(j:jJX std-optionrPeh]h]h]uh jFh]rQhX--oprRrS}rT(hUh jLubah!j@ubaubhX" are always required to issue the rUrV}rW(hX" are always required to issue the h j ubj)rX}rY(hX:command:`user`h}rZ(h]h]r[jah]h]h]uh j h]r\hXuserr]r^}r_(hUh jXubah!jubhX command.r`ra}rb(hX command.h j ubeubj)rc}rd(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 jjqjh!jh}re(h]h]h]h]h]uj!Mjjh]rf(hXThe rgrh}ri(hXThe h jcubj))rj}rk(hX:option:`--master`rlh jcjqjh!j-h}rm(UreftypeXoptionj/j0X--masterU refdomainXstdrnj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]roj5)rp}rq(hjlh}rr(h]h]rs(j:jnX std-optionrteh]h]h]uh jjh]ruhX--masterrvrw}rx(hUh jpubah!j@ubaubhX, ryrz}r{(hX, h jcubj))r|}r}(hX:option:`--username`r~h jcjqjh!j-h}r(UreftypeXoptionj/j0X --usernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hj~h}r(h]h]r(j:jX std-optionreh]h]h]uh j|h]rhX --usernamerr}r(hUh jubah!j@ubaubhX, and rr}r(hX, and h jcubj))r}r(hX:option:`--passwd`rh jcjqjh!j-h}r(UreftypeXoptionj/j0X--passwdU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--passwdrr}r(hUh jubah!j@ubaubhX; options can be specified in the option file with keywords rr}r(hX; options can be specified in the option file with keywords h jcubj))r}r(hX:option:`user_master`rh jcjqjh!j-h}r(UreftypeXoptionj/j0X user_masterU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX user_masterrr}r(hUh jubah!j@ubaubhX, rr}r(hX, h jcubj))r}r(hX:option:`user_username`rh jcjqjh!j-h}r(UreftypeXoptionj/j0X user_usernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX user_usernamerr}r(hUh jubah!j@ubaubhX, and rr}r(hX, and h jcubj))r}r(hX:option:`user_passwd`rh jcjqjh!j-h}r(UreftypeXoptionj/j0X user_passwdU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX user_passwdrr}r(hUh jubah!j@ubaubhX, respectively. If rr}r(hX, respectively. If h jcubj))r}r(hX:option:`user_master`rh jcjqjh!j-h}r(UreftypeXoptionj/j0X user_masterU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX user_masterrr}r(hUh jubah!j@ubaubhX is not specified, then rr}r(hX is not specified, then h jcubj))r}r(hX:option:`master`rh jcjqjh!j-h}r(UreftypeXoptionj/j0XmasterU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXmasterrr}r(hUh jubah!j@ubaubhX, from the options file will be used instead.rr}r(hX, from the options file will be used instead.h jcubeubj)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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hX?Below are examples of how each command should look. Whenever a rr}r(hX?Below are examples of how each command should look. Whenever a h jubj)r}r(hX:command:`user`h}r(h]h]rjah]h]h]uh jh]rhXuserrr}r(hUh jubah!jubhXL command is successful, results will be shown to whoever issued the command.r r }r (hXL command is successful, results will be shown to whoever issued the command.h jubeubj)r }r (hXFor :option:`add`:rh jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hXFor rr}r(hXFor h j ubj))r}r(hX :option:`add`rh j jqjh!j-h}r(UreftypeXoptionj/j0XaddU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXaddr r!}r"(hUh jubah!j@ubaubhX:r#}r$(hX:h j ubeubjM)r%}r&(hX~buildbot user --master={MASTERHOST} --op=add \ --username={USER} --passwd={USERPW} \ --info={TYPE}={VALUE},...h jjqjh!jPh}r'(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]r(hX~buildbot user --master={MASTERHOST} --op=add \ --username={USER} --passwd={USERPW} \ --info={TYPE}={VALUE},...r)r*}r+(hUh j%ubaubj)r,}r-(hXFor :option:`update`:r.h jjqjh!jh}r/(h]h]h]h]h]uj!Mjjh]r0(hXFor r1r2}r3(hXFor h j,ubj))r4}r5(hX:option:`update`r6h j,jqjh!j-h}r7(UreftypeXoptionj/j0XupdateU refdomainXstdr8j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r9j5)r:}r;(hj6h}r<(h]h]r=(j:j8X std-optionr>eh]h]h]uh j4h]r?hXupdater@rA}rB(hUh j:ubah!j@ubaubhX:rC}rD(hX:h j,ubeubjM)rE}rF(hXbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...h jjqjh!jPh}rG(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]rHhXbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...rIrJ}rK(hUh jEubaubj)rL}rM(hXFor :option:`remove`:rNh jjqjh!jh}rO(h]h]h]h]h]uj!Mjjh]rP(hXFor rQrR}rS(hXFor h jLubj))rT}rU(hX:option:`remove`rVh jLjqjh!j-h}rW(UreftypeXoptionj/j0XremoveU refdomainXstdrXj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rYj5)rZ}r[(hjVh}r\(h]h]r](j:jXX std-optionr^eh]h]h]uh jTh]r_hXremover`ra}rb(hUh jZubah!j@ubaubhX:rc}rd(hX:h jLubeubjM)re}rf(hX}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h jjqjh!jPh}rg(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]rhhX}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...rirj}rk(hUh jeubaubj)rl}rm(hXFor :option:`get`:rnh jjqjh!jh}ro(h]h]h]h]h]uj!Mjjh]rp(hXFor rqrr}rs(hXFor h jlubj))rt}ru(hX :option:`get`rvh jljqjh!j-h}rw(UreftypeXoptionj/j0XgetU refdomainXstdrxj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]ryj5)rz}r{(hjvh}r|(h]h]r}(j:jxX std-optionr~eh]h]h]uh jth]rhXgetrr}r(hUh jzubah!j@ubaubhX:r}r(hX:h jlubeubjM)r}r(hXzbuildbot user --master={MASTERHOST} --op=get \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h jjqjh!jPh}r(jRjSXnonejTjUh]h]h]h]h]uj!Mjjh]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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hX A note on rr}r(hX A note on h jubj))r}r(hX:option:`update`rh jjqjh!j-h}r(UreftypeXoptionj/j0XupdateU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXupdaterr}r(hUh jubah!j@ubaubhX: when updating the rr}r(hX: when updating the h jubj))r}r(hX:option:`bb_username`rh jjqjh!j-h}r(UreftypeXoptionj/j0X bb_usernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX bb_usernamerr}r(hUh jubah!j@ubaubhX and rr}r(hX and h jubj))r}r(hX:option:`bb_password`rh jjqjh!j-h}r(UreftypeXoptionj/j0X bb_passwordU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX bb_passwordrr}r(hUh jubah!j@ubaubhX, the rr}r(hX, the h jubj))r}r(hX:option:`info`rh jjqjh!j-h}r(UreftypeXoptionj/j0XinfoU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhXinforr}r(hUh jubah!j@ubaubhX! 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 jjqjh!jh}r(h]h]h]h]h]jjuj!Mjjh]ubeubeubjqjj}h!j;h}r(h]h]h]h]r(jvjeh]rjauj!Mdjjj"}rjjsh]r(h)r}r(hX debugclientrh j\jqjh!h"h}r(h]h]h]h]h]uj!Mdjjh]rhX debugclientrr}r(hjh jubaubjM)r}r(hXDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}h j\jqjh!jPh}r(jRjSXnonejTjUh]h]h]h]h]uj!Mfjjh]rhXDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}rr}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 j\jqjh!jh}r(h]h]h]h]h]uj!Mjjjh]r (hXSThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's r r }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 j ubah!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`rh jjqjh!j-h}r(UreftypeXrefj/j0Xsetting-the-pb-port-for-slavesU refdomainXstdrh]h]U refexplicith]h]h]j3hbuj!Mjh]rjh)r}r(hjh}r(h]h]r (j:jXstd-refr!eh]h]h]uh jh]r"hXSetting-the-PB-Port-for-Slavesr#r$}r%(hUh jubah!jrubaubhX ), but the r&r'}r((hX ), but the h jubj)r)}r*(hX ``debugPort``h}r+(h]h]h]h]h]uh jh]r,hX debugPortr-r.}r/(hUh j)ubah!jubhXS is only enabled if you set a debug password in the buildmaster's config file (see r0r1}r2(hXS is only enabled if you set a debug password in the buildmaster's config file (see h jubj))r3}r4(hX:ref:`Debug-Options`r5h jjqjh!j-h}r6(UreftypeXrefj/j0X debug-optionsU refdomainXstdr7h]h]U refexplicith]h]h]j3hbuj!Mjh]r8jh)r9}r:(hj5h}r;(h]h]r<(j:j7Xstd-refr=eh]h]h]uh j3h]r>hX Debug-Optionsr?r@}rA(hUh j9ubah!jrubaubhX). The rBrC}rD(hX). The h jubj))rE}rF(hX:option:`--passwd`rGh jjqjh!j-h}rH(UreftypeXoptionj/j0X--passwdU refdomainXstdrIj2Nh]h]U refexplicith]h]h]j3hbuj!Mjh]rJj5)rK}rL(hjGh}rM(h]h]rN(j:jIX std-optionrOeh]h]h]uh jEh]rPhX--passwdrQrR}rS(hUh jKubah!j@ubaubhX option must match the rTrU}rV(hX option must match the h jubj)rW}rX(hX``c['debugPassword']``h}rY(h]h]h]h]h]uh jh]rZhXc['debugPassword']r[r\}r](hUh jWubah!jubhX value.r^r_}r`(hX value.h jubeubj)ra}rb(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 j\jqjh!jh}rc(h]h]h]h]h]uj!Mrjjh]rd(j))re}rf(hX:option:`--master`rgh jajqjh!j-h}rh(UreftypeXoptionj/j0X--masterU refdomainXstdrij2Nh]h]U refexplicith]h]h]j3hbuj!Mrh]rjj5)rk}rl(hjgh}rm(h]h]rn(j:jiX std-optionroeh]h]h]uh jeh]rphX--masterrqrr}rs(hUh jkubah!j@ubaubhX can also be provided in rtru}rv(hX can also be provided in h jaubj)rw}rx(hUh}ry(h]h]h]h]rzXfiler{aUrolej{h]uh jah]r|hX.debug/optionsr}r~}r(hX.debug/optionsh jwubah!jubhX by the rr}r(hX by the h jaubj)r}r(hX ``master``h}r(h]h]h]h]h]uh jah]rhXmasterrr}r(hUh jubah!jubhX key. rr}r(hX key. h jaubj))r}r(hX:option:`--passwd`rh jajqjh!j-h}r(UreftypeXoptionj/j0X--passwdU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mrh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--passwdrr}r(hUh jubah!j@ubaubhX can be provided by the rr}r(hX can be provided by the h jaubj)r}r(hX``debugPassword``h}r(h]h]h]h]h]uh jah]rhX debugPasswordrr}r(hUh jubah!jubhX key. See rr}r(hX key. See h jaubj))r}r(hX :ref:`buildbot-config-directory`rh jajqjh!j-h}r(UreftypeXrefj/j0Xbuildbot-config-directoryU refdomainXstdrh]h]U refexplicith]h]h]j3hbuj!Mrh]rjh)r}r(hjh}r(h]h]r(j:jXstd-refreh]h]h]uh jh]rhXbuildbot-config-directoryrr}r(hUh jubah!jrubaubhX.r}r(hX.h jaubeubj)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 j\jqjh!jh}r(h]h]h]h]h]uj!Mvjjh]r(hXThe rr}r(hXThe h jubjh)r}r(hUh}r(UrawtextX:guilabel:`Connect`h]h]h]h]rXguilabelrah]uh jh]rhXConnectrr}r(hUh jubah!jrubhX 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 j\jqjh!Udefinition_listrh}r(h]h]h]h]h]uj!Njjh]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 jjqjh!Udefinition_list_itemrh}r(h]h]h]h]h]uj!Mh]r(cdocutils.nodes term r)r}r(hX:guilabel:`Reload .cfg`rh jjqjh!Utermrh}r(h]h]h]h]h]uj!Mh]rjh)r}r(hUh}r(Urawtextjh]h]h]h]rXguilabelrah]uh jh]rhX Reload .cfgrr}r(hUh jubah!jrubaubcdocutils.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 jjqjh!jh}r(h]h]h]h]h]uj!M{h]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]rXfileraUrolejh]uh jh]rhX twistd.logrr}r (hX twistd.logh jubah!jubhXl as you reload the config file, as any errors which are detected in the config file will be announced there.r r }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 definitionr ubeubj)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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(j)r}r(hX:guilabel:`Rebuild .py`rh jjqjh!jh}r(h]h]h]h]h]uj!Mh]rjh)r}r(hUh}r(Urawtextjh]h]h]h]rXguilabelrah]uh jh]rhX Rebuild .pyrr}r(hUh jubah!jrubaubj)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 jqjh!jh}r&(h]h]h]h]h]uj!Mh]r'(hX9(not yet implemented). The idea here is to use Twisted's r(r)}r*(hX9(not yet implemented). The idea here is to use Twisted's h j$ubj)r+}r,(hX ``rebuild``h}r-(h]h]h]h]h]uh j$h]r.hXrebuildr/r0}r1(hUh j+ubah!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.r2r3}r4(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!j ubeubj)r5}r6(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 jjqjh!jh}r7(h]h]h]h]h]uj!Mjjh]r8(j)r9}r:(hX:guilabel:`poke IRC`r;h j5jqjh!jh}r<(h]h]h]h]h]uj!Mh]r=jh)r>}r?(hUh}r@(Urawtextj;h]h]h]h]rAXguilabelrBah]uh j9h]rChXpoke IRCrDrE}rF(hUh j>ubah!jrubaubj)rG}rH(hUh}rI(h]h]h]h]h]uh j5h]rJj)rK}rL(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 jGjqjh!jh}rM(h]h]h]h]h]uj!Mh]rN(hXThis locates a rOrP}rQ(hXThis locates a h jKubj))rR}rS(hX:class:`words.IRC`rTh jKjqjh!j-h}rU(UreftypeXclassj/j0X words.IRCU refdomainXpyrVh]h]U refexplicith]h]h]j3hbj Nj Nuj!Mh]rWj)rX}rY(hjTh}rZ(h]h]r[(j:jVXpy-classr\eh]h]h]uh jRh]r]hX words.IRCr^r_}r`(hUh jXubah!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.rarb}rc(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 jKubeubah!j ubeubj)rd}re(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 jjqjh!jh}rf(h]h]h]h]h]uj!Mjjh]rg(j)rh}ri(hX:guilabel:`Commit`rjh jdjqjh!jh}rk(h]h]h]h]h]uj!Mh]rljh)rm}rn(hUh}ro(Urawtextjjh]h]h]h]rpXguilabelrqah]uh jhh]rrhXCommitrsrt}ru(hUh jmubah!jrubaubj)rv}rw(hUh}rx(h]h]h]h]h]uh jdh]ryj)rz}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 jvjqjh!jh}r|(h]h]h]h]h]uj!Mh]r}(hXThis allows you to inject a r~r}r(hXThis allows you to inject a h jzubj))r}r(hX:class:`Change`rh jzjqjh!j-h}r(UreftypeXclassj/j0XChangeU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!Mh]rj)r}r(hjh}r(h]h]r(j:jXpy-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 jzubeubah!j ubeubj)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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(j)r}r(hX:guilabel:`Force Build`rh jjqjh!jh}r(h]h]h]h]h]uj!Mh]rjh)r}r(hUh}r(Urawtextjh]h]h]h]rXguilabelrah]uh jh]rhX Force Buildrr}r(hUh jubah!jrubaubj)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 jjqjh!jh}r(h]h]h]h]h]uj!Mh]r(hXThis lets you force a rr}r(hXThis lets you force a h jubj))r}r(hX:class:`Builder`rh jjqjh!j-h}r(UreftypeXclassj/j0XBuilderU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!Mh]rj)r}r(hjh}r(h]h]r(j:jXpy-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!j ubeubj)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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(j)r}r(hX:guilabel:`Currently`rh jjqjh!jh}r(h]h]h]h]h]uj!Mh]rjh)r}r(hUh}r(Urawtextjh]h]h]h]rXguilabelrah]uh jh]rhX Currentlyrr}r(hUh jubah!jrubaubj)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 jjqjh!jh}r(h]h]h]h]h]uj!Mh]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 jjqjh!j-h}r(UreftypeXclassj/j0XBuilderU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!Mh]rj)r}r(hjh}r(h]h]r(j:jXpy-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!j ubeubeubj)r}r(hUh j\jqjh!jh}r(h]h]h]h]h]Uentries]r((UsingleXCommand Line Subcommands; userjjtr(UsingleXuser Command Line Subcommandjjtreuj!Mjjh]ubjeubjjJ jjjij)r}r(hUh jjqjh!j;h}r(h]h]h]h]rjiah]rjauj!Mjjh]r(h)r}r(hXWaiting for resultsrh jjqjh!h"h}r(h]h]h]h]h]uj!Mjjh]rhXWaiting for resultsrr}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 jjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hXIf you provide the r r }r (hXIf you provide the h jubj))r }r (hX:option:`--wait`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--waitU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh j h]rhX--waitrr}r(hUh jubah!j@ubaubhX option (or rr}r(hX option (or h jubj)r}r(hX``try_wait = True``h}r (h]h]h]h]h]uh jh]r!hXtry_wait = Truer"r#}r$(hUh jubah!jubhX in r%r&}r'(hX in h jubj)r(}r)(hUh}r*(h]h]h]h]r+Xfiler,aUrolej,h]uh jh]r-hX.buildbot/optionsr.r/}r0(hX.buildbot/optionsh j(ubah!jubhX), the r1r2}r3(hX), the h jubj)r4}r5(hX``buildbot try``h}r6(h]h]h]h]h]uh jh]r7hX buildbot tryr8r9}r:(hUh j4ubah!jubhXm command will wait until your changes have either been proven good or bad before exiting. Unless you use the r;r<}r=(hXm command will wait until your changes have either been proven good or bad before exiting. Unless you use the h jubj))r>}r?(hX:option:`--quiet`r@h jjqjh!j-h}rA(UreftypeXoptionj/j0X--quietU refdomainXstdrBj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rCj5)rD}rE(hj@h}rF(h]h]rG(j:jBX std-optionrHeh]h]h]uh j>h]rIhX--quietrJrK}rL(hUh jDubah!j@ubaubhX option (or rMrN}rO(hX option (or h jubj)rP}rQ(hX``try_quiet=True``h}rR(h]h]h]h]h]uh jh]rShXtry_quiet=TruerTrU}rV(hUh jPubah!jubhXT), it will emit a progress message every 60 seconds until the builds have completed.rWrX}rY(hXT), it will emit a progress message every 60 seconds until the builds have completed.h jubeubeubjj~jjjjjkj jxj^jj jjjjjj~j|j)rZ}r[(hUh jjqjj}r\jj)r]}r^(hX.. _try--diff:h j)r_}r`(hUh jjqjh!j;h}ra(h]h]h]h]rbjoah]rcjauj!Mjjh]rd(h)re}rf(hXSending propertiesrgh j_jqjh!h"h}rh(h]h]h]h]h]uj!Mjjh]rihXSending propertiesrjrk}rl(hjgh jeubaubj)rm}rn(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 j_jqjh!jh}ro(h]h]h]h]h]uj!Mjjh]rp(hXAYou can set properties to send with your change using either the rqrr}rs(hXAYou can set properties to send with your change using either the h jmubj))rt}ru(hX:option:`--property=key=value`rvh jmjqjh!j-h}rw(UreftypeXoptionj/j0X--property=key=valueU refdomainXstdrxj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]ryj5)rz}r{(hjvh}r|(h]h]r}(j:jxX std-optionr~eh]h]h]uh jth]rhX--property=key=valuerr}r(hUh jzubah!j@ubaubhX. option, which sets a single property, or the rr}r(hX. option, which sets a single property, or the h jmubj))r}r(hX1:option:`--properties=key1=value1,key2=value2...`rh jmjqjh!j-h}r(UreftypeXoptionj/j0X'--properties=key1=value1,key2=value2...U refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX'--properties=key1=value1,key2=value2...rr}r(hUh jubah!j@ubaubhXx 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 jmubj))r}r(hX:option:`--properties`rh jmjqjh!j-h}r(UreftypeXoptionj/j0X --propertiesU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --propertiesrr}r(hUh jubah!j@ubaubhXv 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 jmubj))r}r(hX:option:`--property`rh jmjqjh!j-h}r(UreftypeXoptionj/j0X --propertyU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --propertyrr}r(hUh jubah!j@ubaubhX option to set it.rr}r(hX option to set it.h jmubeubj]eubjqjh!jh}r(h]h]h]h]h]jjuj!Mjjh]ubsh!j;h}r(h]h]h]h]r(jj|eh]r(jjeuj!Mjjj"}rjj]sh]r(h)r}r(hX try --diffrh jZjqjh!h"h}r(h]h]h]h]h]uj!Mjjh]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 jZjqjh!jh}r(h]h]h]h]h]uj!Mjjh]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 jZjqjh!jh}r(h]h]h]h]h]uj!Mjjh]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 jZjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hXThis form takes a rr}r(hXThis form takes a h jubj))r}r(hX:option:`--diff`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--diffU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--diffrr}r(hUh jubah!j@ubaubhX 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 jjqjh!j-h}r (UreftypeXoptionj/j0X --baserevU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r j5)r }r (hjh}r(h]h]r(j:j X std-optionreh]h]h]uh jh]rhX --baserevrr}r(hUh j ubah!j@ubaubhXZ argument, a tree of the given revision will be used as a starting point instead of TRUNK.rr}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 jZjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hXYou can also use rr}r(hXYou can also use h jubj)r}r (hX``buildbot try --diff=-``h}r!(h]h]h]h]h]uh jh]r"hXbuildbot try --diff=-r#r$}r%(hUh jubah!jubhX to read the patch from r&r'}r((hX to read the patch from h jubj)r)}r*(hUh}r+(h]h]h]h]r,Xfiler-aUrolej-h]uh jh]r.hXstdinr/r0}r1(hXstdinh j)ubah!jubhX.r2}r3(hX.h jubeubj)r4}r5(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 jZjqjh!jh}r6(h]h]h]h]h]uj!Mjjh]r7(hXEach patch has a r8r9}r:(hXEach patch has a h j4ubj)r;}r<(hX``patchlevel``h}r=(h]h]h]h]h]uh j4h]r>hX patchlevelr?r@}rA(hUh j;ubah!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 rBrC}rD(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 j4ubj))rE}rF(hX :option:`-p`rGh j4jqjh!j-h}rH(UreftypeXoptionj/j0X-pU refdomainXstdrIj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rJj5)rK}rL(hjGh}rM(h]h]rN(j:jIX std-optionrOeh]h]h]uh jEh]rPhX-prQrR}rS(hUh jKubah!j@ubaubhX or rTrU}rV(hX or h j4ubj))rW}rX(hX:option:`--strip`rYh j4jqjh!j-h}rZ(UreftypeXoptionj/j0X--stripU refdomainXstdr[j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r\j5)r]}r^(hjYh}r_(h]h]r`(j:j[X std-optionraeh]h]h]uh jWh]rbhX--striprcrd}re(hUh j]ubah!j@ubaubhX argument to the rfrg}rh(hX argument to the h j4ubj)ri}rj(hX:command:`patch`h}rk(h]h]rljah]h]h]uh j4h]rmhXpatchrnro}rp(hUh jiubah!jubhX utility. By default rqrr}rs(hX utility. By default h j4ubj)rt}ru(hX``buildbot try --diff``h}rv(h]h]h]h]h]uh j4h]rwhXbuildbot try --diffrxry}rz(hUh jtubah!jubhX< uses a patchlevel of 0, but you can override this with the r{r|}r}(hX< uses a patchlevel of 0, but you can override this with the h j4ubj))r~}r(hX :option:`-p`rh j4jqjh!j-h}r(UreftypeXoptionj/j0X-pU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh j~h]rhX-prr}r(hUh jubah!j@ubaubhX argument.rr}r(hX argument.h j4ubeubj)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 jZjqjh!jh}r(h]h]h]h]h]uj!Mjjh]r(hX When you use rr}r(hX When you use h jubj))r}r(hX:option:`--diff`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--diffU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--diffrr}r(hUh jubah!j@ubaubhX\, 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 jjqjh!j-h}r(UreftypeXoptionj/j0X--vcU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--vcrr}r(hUh jubah!j@ubaubhX, rr}r(hX, h jubj))r}r(hX:option:`--try-topfile`rh jjqjh!j-h}r(UreftypeXoptionj/j0X --try-topfileU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --try-topfilerr}r(hUh jubah!j@ubaubhX, or rr}r(hX, or h jubj))r}r(hX:option:`--try-topdir`rh jjqjh!j-h}r(UreftypeXoptionj/j0X --try-topdirU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --try-topdirrr}r(hUh jubah!j@ubaubhXf. 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 jjqjh!j-h}r(UreftypeXoptionj/j0X --connectU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --connectrr}r(hUh jubah!j@ubaubhX, rr}r(hX, h jubj))r}r(hX:option:`--tryhost`rh jjqjh!j-h}r(UreftypeXoptionj/j0X --tryhostU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX --tryhostrr}r(hUh jubah!j@ubaubhX, etc).rr}r(hX, etc).h jubeubeubjj)r}r(hUh jjqjj}rjjsh!j;h}r(h]h]h]h]r(jjeh]r(jjeuj!Mjjj"}r jjsh]r (h)r }r (hX.buildbot config directoryr h jjqjh!h"h}r(h]h]h]h]h]uj!Mjjh]rhX.buildbot config directoryrr}r(hj h j ubaubj)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 jjqjh!jh}r(h]h]h]h]h]uj!M jjh]r(hX Many of the rr}r(hX Many of the h jubj)r}r(hX:command:`buildbot`h}r(h]h]rjah]h]h]uh jh]rhXbuildbotrr }r!(hUh jubah!jubhX 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 r"r#}r$(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 jubj)r%}r&(hX ``options``h}r'(h]h]h]h]h]uh jh]r(hXoptionsr)r*}r+(hUh j%ubah!jubhX file. The r,r-}r.(hX file. The h jubj)r/}r0(hX:command:`buildbot`h}r1(h]h]r2jah]h]h]uh jh]r3hXbuildbotr4r5}r6(hUh j/ubah!jubhX1 command will look for a special directory named r7r8}r9(hX1 command will look for a special directory named h jubj)r:}r;(hUh}r<(h]h]h]h]r=Xfiler>aUrolej>h]uh jh]r?hX .buildbotr@rA}rB(hX .buildboth j:ubah!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 rCrD}rE(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 jubj)rF}rG(hUh}rH(h]h]h]h]rIXfilerJaUrolejJh]uh jh]rKhXoptionsrLrM}rN(hXoptionsh jFubah!jubhXz in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple rOrP}rQ(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 jubj)rR}rS(hX``name = 'value'``h}rT(h]h]h]h]h]uh jh]rUhXname = 'value'rVrW}rX(hUh jRubah!jubhX' pairs in this file to set the options.rYrZ}r[(hX' pairs in this file to set the options.h jubeubj)r\}r](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 jjqjh!jh}r^(h]h]h]h]h]uj!M,jjh]r_(hXbFor a description of the names used in this file, please see the documentation for the individual r`ra}rb(hXbFor a description of the names used in this file, please see the documentation for the individual h j\ubj)rc}rd(hX:command:`buildbot`h}re(h]h]rfjah]h]h]uh j\h]rghXbuildbotrhri}rj(hUh jcubah!jubhXU sub-commands. The following is a brief sample of what this file's contents could be.rkrl}rm(hXU sub-commands. The following is a brief sample of what this file's contents could be.h j\ubeubjM)rn}ro(hX# for status-reading tools masterstatus = 'buildbot.example.org:12345' # for 'sendchange' or the debug port master = 'buildbot.example.org:18990' debugPassword = 'eiv7Po'h jjqjh!jPh}rp(jRjSXnonejTjUh]h]h]h]h]uj!M0jjh]rqhX# for status-reading tools masterstatus = 'buildbot.example.org:12345' # for 'sendchange' or the debug port master = 'buildbot.example.org:18990' debugPassword = 'eiv7Po'rrrs}rt(hUh jnubaubj)ru}rv(hXlNote carefully that the names in the :file:`options` file usually do not match the command-line option name.h jjqjh!jh}rw(h]h]h]h]h]uj!M8jjh]rx(hX%Note carefully that the names in the ryrz}r{(hX%Note carefully that the names in the h juubj)r|}r}(hUh}r~(h]h]h]h]rXfileraUrolejh]uh juh]rhXoptionsrr}r(hXoptionsh j|ubah!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 juubeubj)r}r(hUh jjqjh!jh}r(h]h]h]h]h]uj!Njjh]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 jjqjh!jh}r(h]h]h]h]h]uj!M=h]r(j)r}r(hX``masterstatus``rh jjqjh!jh}r(h]h]h]h]h]uj!M=h]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 jjqjh!jh}r(h]h]h]h]h]uj!M<h]r(hXEquivalent to rr}r(hXEquivalent to h jubj))r}r(hX:option:`--master`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--masterU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!M<h]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--masterrr}r(hUh jubah!j@ubaubhX for rr}r(hX for h jubj))r}r(hX:bb:cmdline:`statuslog`rh jjqjh!j-h}r(UreftypeXcmdlinej/j0X statuslogU refdomainXbbrh]h]U refexplicith]h]h]j3hbuj!M<h]rj)r}r(hjh}r(h]h]r(j:jX 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 jjqjh!j-h}r(UreftypeXcmdlinej/j0X statusguiU refdomainXbbrh]h]U refexplicith]h]h]j3hbuj!M<h]rj)r}r(hjh}r(h]h]r(j:jX 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 jjqjh!j-h}r(UreftypeXclassj/j0Xclient.PBListenerU refdomainXpyrh]h]U refexplicith]h]h]j3hbj Nj Nuj!M<h]rj)r}r(hjh}r(h]h]r(j:jXpy-classreh]h]h]uh jh]rhXclient.PBListenerrr}r(hUh jubah!jubaubhX status port.rr}r(hX status port.h jubeubah!j ubeubj)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 jjqjh!jh}r(h]h]h]h]h]uj!MDjjh]r(j)r}r(hX ``master``rh jjqjh!jh}r(h]h]h]h]h]uj!MDh]rj)r}r(hjh}r(h]h]h]h]h]uh jh]rhXmasterrr}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 jjqjh!jh}r(h]h]h]h]h]uj!M@h]r(hXEquivalent to rr}r (hXEquivalent to h jubj))r }r (hX:option:`--master`r h jjqjh!j-h}r (UreftypeXoptionj/j0X--masterU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!M@h]rj5)r}r(hj h}r(h]h]r(j:jX std-optionreh]h]h]uh j h]rhX--masterrr}r(hUh jubah!j@ubaubhX for rr}r(hX for h jubj))r}r(hX:bb:cmdline:`debugclient`rh jjqjh!j-h}r(UreftypeXcmdlinej/j0X debugclientU refdomainXbbr h]h]U refexplicith]h]h]j3hbuj!M@h]r!j)r"}r#(hjh}r$(h]h]r%(j:j X bb-cmdliner&eh]h]h]uh jh]r'hX debugclientr(r)}r*(hUh j"ubah!jubaubhX and r+r,}r-(hX and h jubj))r.}r/(hX:bb:cmdline:`sendchange`r0h jjqjh!j-h}r1(UreftypeXcmdlinej/j0X sendchangeU refdomainXbbr2h]h]U refexplicith]h]h]j3hbuj!M@h]r3j)r4}r5(hj0h}r6(h]h]r7(j:j2X bb-cmdliner8eh]h]h]uh j.h]r9hX sendchanger:r;}r<(hUh j4ubah!jubaubhXC. This option is used for two purposes. It is the location of the r=r>}r?(hXC. This option is used for two purposes. It is the location of the h jubj)r@}rA(hX ``debugPort``h}rB(h]h]h]h]h]uh jh]rChX debugPortrDrE}rF(hUh j@ubah!jubhX for rGrH}rI(hX for h jubj)rJ}rK(hX``debugclient``h}rL(h]h]h]h]h]uh jh]rMhX debugclientrNrO}rP(hUh jJubah!jubhX and the location of the rQrR}rS(hX and the location of the h jubj))rT}rU(hX:class:`pb.PBChangeSource`rVh jjqjh!j-h}rW(UreftypeXclassj/j0Xpb.PBChangeSourceU refdomainXpyrXh]h]U refexplicith]h]h]j3hbj Nj Nuj!M@h]rYj)rZ}r[(hjVh}r\(h]h]r](j:jXXpy-classr^eh]h]h]uh jTh]r_hXpb.PBChangeSourcer`ra}rb(hUh jZubah!jubaubhX for rcrd}re(hX for h jubj)rf}rg(hX```sendchange``h}rh(h]h]h]h]h]uh jh]rihX `sendchangerjrk}rl(hUh jfubah!jubhX%. Generally these are the same port.rmrn}ro(hX%. Generally these are the same port.h jubeubah!j ubeubj)rp}rq(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 jjqjh!jh}rr(h]h]h]h]h]uj!MLjjh]rs(j)rt}ru(hX``debugPassword``rvh jpjqjh!jh}rw(h]h]h]h]h]uj!MLh]rxj)ry}rz(hjvh}r{(h]h]h]h]h]uh jth]r|hX debugPasswordr}r~}r(hUh jyubah!jubaubj)r}r(hUh}r(h]h]h]h]h]uh jph]r(j)r}r(hX?Equivalent to :option:`--passwd` for :bb:cmdline:`debugclient`.h jjqjh!jh}r(h]h]h]h]h]uj!MGh]r(hXEquivalent to rr}r(hXEquivalent to h jubj))r}r(hX:option:`--passwd`rh jjqjh!j-h}r(UreftypeXoptionj/j0X--passwdU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!MGh]rj5)r}r(hjh}r(h]h]r(j:jX std-optionreh]h]h]uh jh]rhX--passwdrr}r(hUh jubah!j@ubaubhX for rr}r(hX for h jubj))r}r(hX:bb:cmdline:`debugclient`rh jjqjh!j-h}r(UreftypeXcmdlinej/j0X debugclientU refdomainXbbrh]h]U refexplicith]h]h]j3hbuj!MGh]rj)r}r(hjh}r(h]h]r(j:jX 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 jjqjh!jh}r(h]h]h]h]h]uj!MKh]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 jjqjh!j-h}r(UreftypeXcfgj/j0X debugPasswordU refdomainXbbrh]h]U refexplicith]h]h]j3hbuj!MKh]rj)r}r(hjh}r(h]h]r(j:jXbb-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 jjqjh!j-h}r(UreftypeXcmdlinej/j0X debugclientU refdomainXbbrh]h]U refexplicith]h]h]j3hbuj!MKh]rj)r}r(hjh}r(h]h]r(j:jX bb-cmdlinereh]h]h]uh jh]rhX debugclientrr}r(hUh jubah!jubaubhX command.rr}r(hX command.h jubeubah!U importantrubeh!j ubeubj)r}r(hXZ``username`` Equivalent to :option:`--username` for the :bb:cmdline:`sendchange` command. h jjqjh!jh}r(h]h]h]h]h]uj!MOjjh]r(j)r}r(hX ``username``rh jjqjh!jh}r(h]h]h]h]h]uj!MOh]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]rj)r}r(hXLEquivalent to :option:`--username` for the :bb:cmdline:`sendchange` command.h jjqjh!jh}r(h]h]h]h]h]uj!MOh]r(hXEquivalent to rr}r(hXEquivalent to h jubj))r}r(hX:option:`--username`rh jjqjh!j-h}r(UreftypeXoptionj/j0X --usernameU refdomainXstdrj2Nh]h]U refexplicith]h]h]j3hbuj!MOh]rj5)r }r (hjh}r (h]h]r (j:jX std-optionr eh]h]h]uh jh]r hX --usernamer r }r (hUh j ubah!j@ubaubhX for the r r }r (hX for the h jubj))r }r (hX:bb:cmdline:`sendchange`r h jjqjh!j-h}r (UreftypeXcmdlinej/j0X sendchangeU refdomainXbbr h]h]U refexplicith]h]h]j3hbuj!MOh]r j)r }r (hj h}r (h]h]r (j:j 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 jubeubah!j ubeubj)r }r (hXV``branch`` Equivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command. h jjqjh!jh}r (h]h]h]h]h]uj!MRjjh]r! (j)r" }r# (hX ``branch``r$ h j jqjh!jh}r% (h]h]h]h]h]uj!MRh]r& j)r' }r( (hj$ h}r) (h]h]h]h]h]uh j" h]r* hXbranchr+ r, }r- (hUh j' ubah!jubaubj)r. }r/ (hUh}r0 (h]h]h]h]h]uh j h]r1 j)r2 }r3 (hXJEquivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command.h j. jqjh!jh}r4 (h]h]h]h]h]uj!MRh]r5 (hXEquivalent to r6 r7 }r8 (hXEquivalent to h j2 ubj))r9 }r: (hX:option:`--branch`r; h j2 jqjh!j-h}r< (UreftypeXoptionj/j0X--branchU refdomainXstdr= j2Nh]h]U refexplicith]h]h]j3hbuj!MRh]r> j5)r? }r@ (hj; h}rA (h]h]rB (j:j= X std-optionrC eh]h]h]uh j9 h]rD hX--branchrE rF }rG (hUh j? ubah!j@ubaubhX for the rH rI }rJ (hX for the h j2 ubj))rK }rL (hX:bb:cmdline:`sendchange`rM h j2 jqjh!j-h}rN (UreftypeXcmdlinej/j0X sendchangeU refdomainXbbrO h]h]U refexplicith]h]h]j3hbuj!MRh]rP j)rQ }rR (hjM h}rS (h]h]rT (j:jO X bb-cmdlinerU eh]h]h]uh jK h]rV hX sendchangerW rX }rY (hUh jQ ubah!jubaubhX command.rZ r[ }r\ (hX command.h j2 ubeubah!j ubeubj)r] }r^ (hXZ``category`` Equivalent to :option:`--category` for the :bb:cmdline:`sendchange` command. h jjqjh!jh}r_ (h]h]h]h]h]uj!MUjjh]r` (j)ra }rb (hX ``category``rc h j] jqjh!jh}rd (h]h]h]h]h]uj!MUh]re j)rf }rg (hjc h}rh (h]h]h]h]h]uh ja h]ri hXcategoryrj rk }rl (hUh jf ubah!jubaubj)rm }rn (hUh}ro (h]h]h]h]h]uh j] h]rp j)rq }rr (hXLEquivalent to :option:`--category` for the :bb:cmdline:`sendchange` command.h jm jqjh!jh}rs (h]h]h]h]h]uj!MUh]rt (hXEquivalent to ru rv }rw (hXEquivalent to h jq ubj))rx }ry (hX:option:`--category`rz h jq jqjh!j-h}r{ (UreftypeXoptionj/j0X --categoryU refdomainXstdr| j2Nh]h]U refexplicith]h]h]j3hbuj!MUh]r} j5)r~ }r (hjz h}r (h]h]r (j:j| X std-optionr eh]h]h]uh jx h]r hX --categoryr r }r (hUh j~ ubah!j@ubaubhX for the r r }r (hX for the h jq ubj))r }r (hX:bb:cmdline:`sendchange`r h jq jqjh!j-h}r (UreftypeXcmdlinej/j0X sendchangeU refdomainXbbr h]h]U refexplicith]h]h]j3hbuj!MUh]r j)r }r (hj h}r (h]h]r (j:j 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 jq ubeubah!j ubeubj)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 jjqjh!jh}r (h]h]h]h]h]uj!MZjjh]r (j)r }r (hX``try_connect``r h j jqjh!jh}r (h]h]h]h]h]uj!MZh]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 jqjh!jh}r (h]h]h]h]h]uj!MXh]r (hXEquivalent to r r }r (hXEquivalent to h j ubj))r }r (hX:option:`--connect`r h j jqjh!j-h}r (UreftypeXoptionj/j0X --connectU refdomainXstdr j2Nh]h]U refexplicith]h]h]j3hbuj!MXh]r j5)r }r (hj h}r (h]h]r (j:j X std-optionr eh]h]h]uh j h]r hX --connectr r }r (hUh j ubah!j@ubaubhX, this specifies how the r r }r (hX, this specifies how the h j ubj))r }r (hX:bb:cmdline:`try`r h j jqjh!j-h}r (UreftypeXcmdlinej/j0XtryU refdomainXbbr h]h]U refexplicith]h]h]j3hbuj!MXh]r j)r }r (hj h}r (h]h]r (j:j 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!j ubeubj)r }r (hX~``try_builders`` Equivalent to :option:`--builders`, specifies which builders should be used for the :bb:cmdline:`try` build. h jjqjh!jh}r (h]h]h]h]h]uj!M^jjh]r (j)r }r (hX``try_builders``r h j jqjh!jh}r (h]h]h]h]h]uj!M^h]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 jqjh!jh}r!(h]h]h]h]h]uj!M]h]r!(hXEquivalent to r!r!}r!(hXEquivalent to h j!ubj))r !}r !(hX:option:`--builders`r !h j!jqjh!j-h}r !(UreftypeXoptionj/j0X --buildersU refdomainXstdr !j2Nh]h]U refexplicith]h]h]j3hbuj!M]h]r!j5)r!}r!(hj !h}r!(h]h]r!(j:j !X std-optionr!eh]h]h]uh j !h]r!hX --buildersr!r!}r!(hUh j!ubah!j@ubaubhX2, 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!jqjh!j-h}r!(UreftypeXcmdlinej/j0XtryU refdomainXbbr!h]h]U refexplicith]h]h]j3hbuj!M]h]r !j)r!!}r"!(hj!h}r#!(h]h]r$!(j:j!X bb-cmdliner%!eh]h]h]uh j!h]r&!hXtryr'!r(!}r)!(hUh j!!ubah!jubaubhX build.r*!r+!}r,!(hX build.h j!ubeubah!j ubeubj)r-!}r.!(hXu``try_vc`` Equivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used. h jjqjh!jh}r/!(h]h]h]h]h]uj!Mbjjh]r0!(j)r1!}r2!(hX ``try_vc``r3!h j-!jqjh!jh}r4!(h]h]h]h]h]uj!Mbh]r5!j)r6!}r7!(hj3!h}r8!(h]h]h]h]h]uh j1!h]r9!hXtry_vcr:!r;!}r!(hUh}r?!(h]h]h]h]h]uh j-!h]r@!j)rA!}rB!(hXiEquivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used.h j=!jqjh!jh}rC!(h]h]h]h]h]uj!Mah]rD!(hXEquivalent to rE!rF!}rG!(hXEquivalent to h jA!ubj))rH!}rI!(hX:option:`--vc`rJ!h jA!jqjh!j-h}rK!(UreftypeXoptionj/j0X--vcU refdomainXstdrL!j2Nh]h]U refexplicith]h]h]j3hbuj!Mah]rM!j5)rN!}rO!(hjJ!h}rP!(h]h]rQ!(j:jL!X std-optionrR!eh]h]h]uh jH!h]rS!hX--vcrT!rU!}rV!(hUh jN!ubah!j@ubaubhX for rW!rX!}rY!(hX for h jA!ubj))rZ!}r[!(hX:bb:cmdline:`try`r\!h jA!jqjh!j-h}r]!(UreftypeXcmdlinej/j0XtryU refdomainXbbr^!h]h]U refexplicith]h]h]j3hbuj!Mah]r_!j)r`!}ra!(hj\!h}rb!(h]h]rc!(j:j^!X bb-cmdlinerd!eh]h]h]uh jZ!h]re!hXtryrf!rg!}rh!(hUh j`!ubah!jubaubhX7, this specifies the version control system being used.ri!rj!}rk!(hX7, this specifies the version control system being used.h jA!ubeubah!j ubeubj)rl!}rm!(hXp``try_branch`` Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch. h jjqjh!jh}rn!(h]h]h]h]h]uj!Mfjjh]ro!(j)rp!}rq!(hX``try_branch``rr!h jl!jqjh!jh}rs!(h]h]h]h]h]uj!Mfh]rt!j)ru!}rv!(hjr!h}rw!(h]h]h]h]h]uh jp!h]rx!hX try_branchry!rz!}r{!(hUh ju!ubah!jubaubj)r|!}r}!(hUh}r~!(h]h]h]h]h]uh jl!h]r!j)r!}r!(hX`Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch.h j|!jqjh!jh}r!(h]h]h]h]h]uj!Meh]r!(hXEquivalent to r!r!}r!(hXEquivalent to h j!ubj))r!}r!(hX:option:`--branch`r!h j!jqjh!j-h}r!(UreftypeXoptionj/j0X--branchU refdomainXstdr!j2Nh]h]U refexplicith]h]h]j3hbuj!Meh]r!j5)r!}r!(hj!h}r!(h]h]r!(j:j!X std-optionr!eh]h]h]uh j!h]r!hX--branchr!r!}r!(hUh j!ubah!j@ubaubhX@, 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!j ubeubeubj)r!}r!(hX``try_topdir``r!h jjqjh!jh}r!(h]h]h]h]h]uj!Mhjjh]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 jjqjh!jh}r!(h]h]h]h]h]uj!Njjh]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!jqjh!jh}r!(h]h]h]h]h]uj!Mnh]r!(j)r!}r!(hX``try_topfile``r!h j!jqjh!jh}r!(h]h]h]h]h]uj!Mnh]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!jqjh!jh}r!(h]h]h]h]h]uj!Mkh]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!jqjh!j-h}r!(UreftypeXoptionj/j0X --try-topdirU refdomainXstdr!j2Nh]h]U refexplicith]h]h]j3hbuj!Mkh]r!j5)r!}r!(hj!h}r!(h]h]r!(j:j!X std-optionr!eh]h]h]uh j!h]r!hX --try-topdirr!r!}r!(hUh j!ubah!j@ubaubhX:, 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!jqjh!j-h}r!(UreftypeXoptionj/j0X --try-topfileU refdomainXstdr!j2Nh]h]U refexplicith]h]h]j3hbuj!Mkh]r!j5)r!}r!(hj!h}r!(h]h]r!(j:j!X std-optionr!eh]h]h]uh j!h]r!hX --try-topfiler!r!}r!(hUh j!ubah!j@ubaubhXC 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!j ubeubaubj)r!}r!(hX ``try_host``r!h jjqjh!jh}r!(h]h]h]h]h]uj!Mpjjh]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 jjqjh!jh}r "(h]h]h]h]h]uj!Mrjjh]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 jjqjh!jh}r"(h]h]h]h]h]uj!Njjh]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"jqjh!jh}r"(h]h]h]h]h]uj!Mxh]r"(j)r"}r"(hX ``try_dir``r"h j"jqjh!jh}r"(h]h]h]h]h]uj!Mxh]r "j)r!"}r""(hj"h}r#"(h]h]h]h]h]uh j"h]r$"hXtry_dirr%"r&"}r'"(hUh j!"ubah!jubaubj)r("}r)"(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 j("jqjh!jh}r."(h]h]h]h]h]uj!Muh]r/"(hXWhen r0"r1"}r2"(hXWhen h j,"ubj)r3"}r4"(hX``try_connect``h}r5"(h]h]h]h]h]uh j,"h]r6"hX try_connectr7"r8"}r9"(hUh j3"ubah!jubhX is r:"r;"}r<"(hX is h j,"ubj)r="}r>"(hX``ssh``h}r?"(h]h]h]h]h]uh j,"h]r@"hXsshrA"rB"}rC"(hUh j="ubah!jubhX, the command will use rD"rE"}rF"(hX, the command will use h j,"ubj)rG"}rH"(hX ``try_host``h}rI"(h]h]h]h]h]uh j,"h]rJ"hXtry_hostrK"rL"}rM"(hUh jG"ubah!jubhX for rN"rO"}rP"(hX for h j,"ubj))rQ"}rR"(hX:option:`--tryhost`rS"h j,"jqjh!j-h}rT"(UreftypeXoptionj/j0X --tryhostU refdomainXstdrU"j2Nh]h]U refexplicith]h]h]j3hbuj!Muh]rV"j5)rW"}rX"(hjS"h}rY"(h]h]rZ"(j:jU"X std-optionr["eh]h]h]uh jQ"h]r\"hX --tryhostr]"r^"}r_"(hUh jW"ubah!j@ubaubhX, r`"ra"}rb"(hX, h j,"ubj)rc"}rd"(hX``try_username``h}re"(h]h]h]h]h]uh j,"h]rf"hX try_usernamerg"rh"}ri"(hUh jc"ubah!jubhX for rj"rk"}rl"(hX for h j,"ubj))rm"}rn"(hX:option:`--username`ro"h j,"jqjh!j-h}rp"(UreftypeXoptionj/j0X --usernameU refdomainXstdrq"j2Nh]h]U refexplicith]h]h]j3hbuj!Muh]rr"j5)rs"}rt"(hjo"h}ru"(h]h]rv"(j:jq"X std-optionrw"eh]h]h]uh jm"h]rx"hX --usernamery"rz"}r{"(hUh js"ubah!j@ubaubhX, 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,"jqjh!j-h}r"(UreftypeXoptionj/j0X--trydirU refdomainXstdr"j2Nh]h]U refexplicith]h]h]j3hbuj!Muh]r"j5)r"}r"(hj"h}r"(h]h]r"(j:j"X std-optionr"eh]h]h]uh j"h]r"hX--trydirr"r"}r"(hUh j"ubah!j@ubaubhX=. 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!j ubeubaubj)r"}r"(hX``try_username``r"h jjqjh!jh}r"(h]h]h]h]h]uj!Mzjjh]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 jjqjh!jh}r"(h]h]h]h]h]uj!M|jjh]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 jjqjh!jh}r"(h]h]h]h]h]uj!Njjh]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"jqjh!jh}r"(h]h]h]h]h]uj!Mh]r"(j)r"}r"(hX``try_master``r"h j"jqjh!jh}r"(h]h]h]h]h]uj!Mh]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"jqjh!jh}r"(h]h]h]h]h]uj!Mh]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"jqjh!j-h}r"(UreftypeXoptionj/j0X --usernameU refdomainXstdr"j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r"j5)r"}r"(hj"h}r"(h]h]r"(j:j"X std-optionr"eh]h]h]uh j"h]r"hX --usernamer"r"}r"(hUh j"ubah!j@ubaubhX, 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"jqjh!j-h}r#(UreftypeXoptionj/j0X--passwdU refdomainXstdr#j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r#j5)r#}r#(hj#h}r#(h]h]r#(j:j#X std-optionr#eh]h]h]uh j #h]r#hX--passwdr#r#}r#(hUh j#ubah!j@ubaubhX, and r#r#}r#(hX, and h j"ubj)r#}r#(hX``try_master``h}r #(h]h]h]h]h]uh j"h]r!#hX try_masterr"#r##}r$#(hUh j#ubah!jubhX for r%#r&#}r'#(hX for h j"ubj))r(#}r)#(hX:option:`--master`r*#h j"jqjh!j-h}r+#(UreftypeXoptionj/j0X--masterU refdomainXstdr,#j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r-#j5)r.#}r/#(hj*#h}r0#(h]h]r1#(j:j,#X std-optionr2#eh]h]h]uh j(#h]r3#hX--masterr4#r5#}r6#(hUh j.#ubah!j@ubaubhX.r7#}r8#(hX.h j"ubeubah!j ubeubaubj)r9#}r:#(hX ``try_wait``r;#h jjqjh!jh}r<#(h]h]h]h]h]uj!Mjjh]r=#j)r>#}r?#(hj;#h}r@#(h]h]h]h]h]uh j9#h]rA#hXtry_waitrB#rC#}rD#(hUh j>#ubah!jubaubj)rE#}rF#(hUh jjqjh!jh}rG#(h]h]h]h]h]uj!Njjh]rH#j)rI#}rJ#(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 jE#jqjh!jh}rK#(h]h]h]h]h]uj!Mh]rL#(j)rM#}rN#(hX``masterstatus``rO#h jI#jqjh!jh}rP#(h]h]h]h]h]uj!Mh]rQ#j)rR#}rS#(hjO#h}rT#(h]h]h]h]h]uh jM#h]rU#hX masterstatusrV#rW#}rX#(hUh jR#ubah!jubaubj)rY#}rZ#(hUh}r[#(h]h]h]h]h]uh jI#h]r\#j)r]#}r^#(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 jY#jqjh!jh}r_#(h]h]h]h]h]uj!Mh]r`#(j)ra#}rb#(hX ``try_wait``h}rc#(h]h]h]h]h]uh j]#h]rd#hXtry_waitre#rf#}rg#(hUh ja#ubah!jubhX and rh#ri#}rj#(hX and h j]#ubj)rk#}rl#(hX``masterstatus``h}rm#(h]h]h]h]h]uh j]#h]rn#hX masterstatusro#rp#}rq#(hUh jk#ubah!jubhX (equivalent to rr#rs#}rt#(hX (equivalent to h j]#ubj))ru#}rv#(hX:option:`--wait`rw#h j]#jqjh!j-h}rx#(UreftypeXoptionj/j0X--waitU refdomainXstdry#j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]rz#j5)r{#}r|#(hjw#h}r}#(h]h]r~#(j:jy#X std-optionr#eh]h]h]uh ju#h]r#hX--waitr#r#}r#(hUh j{#ubah!j@ubaubhX and r#r#}r#(hX and h j]#ubj)r#}r#(hX ``master``h}r#(h]h]h]h]h]uh j]#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 j]#ubj))r#}r#(hX:bb:cmdline:`try`r#h j]#jqjh!j-h}r#(UreftypeXcmdlinej/j0XtryU refdomainXbbr#h]h]U refexplicith]h]h]j3hbuj!Mh]r#j)r#}r#(hj#h}r#(h]h]r#(j:j#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 j]#ubeubah!j ubeubaubeubjoj_jsjj j Uindex-0r#jw)r#}r#(hjh jjqjj}h!jh}r#(h]h]r#jah]h]r#j#ah]uj!Mjjj"}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#jqjh!jh}r#(h]h]h]h]h]uj!Mh]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#ubaubeubjpj}jqj] jjjj] jtjJ jjZjnj)r#}r#(hUh jjqjh!j;h}r#(h]h]h]h]r#jnah]r#jauj!M,jjh]r#(h)r#}r#(hXSpecifying the VC systemr#h j#jqjh!h"h}r#(h]h]h]h]h]uj!M,jjh]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#jqjh!jh}r#(h]h]h]h]h]uj!M.jjh]r#(hXThe r#r#}r#(hXThe h j#ubj)r#}r#(hX:command:`try`h}r#(h]h]r#jah]h]h]uh j#h]r#hXtryr#r#}r#(hUh j#ubah!jubhX 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#ubj)r#}r#(hX:command:`try`h}r#(h]h]r#jah]h]h]uh j#h]r#hXtryr#r#}r#(hUh j#ubah!jubhX> 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#jqjh!j-h}r#(UreftypeXoptionj/j0X--vc=cvsU refdomainXstdr#j2Nh]h]U refexplicith]h]h]j3hbuj!M.h]r#j5)r#}r#(hj#h}r#(h]h]r#(j:j#X std-optionr#eh]h]h]uh j#h]r#hX--vc=cvsr#r#}r#(hUh j#ubah!j@ubaubhX or r#r#}r#(hX or h j#ubj))r#}r#(hX:option:`--vc=git`r#h j#jqjh!j-h}r#(UreftypeXoptionj/j0X--vc=gitU refdomainXstdr#j2Nh]h]U refexplicith]h]h]j3hbuj!M.h]r#j5)r#}r#(hj#h}r#(h]h]r#(j:j#X std-optionr$eh]h]h]uh j#h]r$hX--vc=gitr$r$}r$(hUh j#ubah!j@ubaubhX. 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#jqjh!Ucommentr $h}r!$(jTjUh]h]h]h]h]uj!M7jjh]r"$hXAThe order of this list comes from the end of scripts/tryclient.pyr#$r$$}r%$(hUh j$ubaubj)r&$}r'$(hXcThe following names are recognized: ``bzr`` ``cvs`` ``darcs`` ``hg`` ``git`` ``mtn`` ``p4`` ``svn``h j#jqjh!jh}r($(h]h]h]h]h]uj!M8jjh]r)$(hX$The following names are recognized: r*$r+$}r,$(hX$The following names are recognized: h j&$ubj)r-$}r.$(hX``bzr``h}r/$(h]h]h]h]h]uh j&$h]r0$hXbzrr1$r2$}r3$(hUh j-$ubah!jubhX r4$}r5$(hX h j&$ubj)r6$}r7$(hX``cvs``h}r8$(h]h]h]h]h]uh j&$h]r9$hXcvsr:$r;$}r<$(hUh j6$ubah!jubhX r=$}r>$(hX h j&$ubj)r?$}r@$(hX ``darcs``h}rA$(h]h]h]h]h]uh j&$h]rB$hXdarcsrC$rD$}rE$(hUh j?$ubah!jubhX rF$}rG$(hX h j&$ubj)rH$}rI$(hX``hg``h}rJ$(h]h]h]h]h]uh j&$h]rK$hXhgrL$rM$}rN$(hUh jH$ubah!jubhX rO$}rP$(hX h j&$ubj)rQ$}rR$(hX``git``h}rS$(h]h]h]h]h]uh j&$h]rT$hXgitrU$rV$}rW$(hUh jQ$ubah!jubhX rX$}rY$(hX h j&$ubj)rZ$}r[$(hX``mtn``h}r\$(h]h]h]h]h]uh j&$h]r]$hXmtnr^$r_$}r`$(hUh jZ$ubah!jubhX ra$}rb$(hX h j&$ubj)rc$}rd$(hX``p4``h}re$(h]h]h]h]h]uh j&$h]rf$hXp4rg$rh$}ri$(hUh jc$ubah!jubhX rj$}rk$(hX h j&$ubj)rl$}rm$(hX``svn``h}rn$(h]h]h]h]h]uh j&$h]ro$hXsvnrp$rq$}rr$(hUh jl$ubah!jubeubeubjjjz j2 jjjuj jj}j}j)rs$}rt$(hUh jjqjh!j;h}ru$(h]h]h]h]rv$j}ah]rw$jauj!Mjjh]rx$(h)ry$}rz$(hXChoosing the Buildersr{$h js$jqjh!h"h}r|$(h]h]h]h]h]uj!Mjjh]r}$hXChoosing the Buildersr~$r$}r$(hj{$h jy$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 js$jqjh!jh}r$(h]h]h]h]h]uj!Mjjh]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$jqjh!j-h}r$(UreftypeXclassj/j0X TrySchedulerU refdomainXpyr$h]h]U refexplicith]h]h]j3hbj Nj Nuj!Mh]r$j)r$}r$(hj$h}r$(h]h]r$(j:j$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 js$jqjh!jh}r$(h]h]h]h]h]uj!Mjjh]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$jqjh!j-h}r$(UreftypeXoptionj/j0X --builderU refdomainXstdr$j2Nh]h]U refexplicith]h]h]j3hbuj!Mh]r$j5)r$}r$(hj$h}r$(h]h]r$(j:j$X std-optionr$eh]h]h]uh j$h]r$hX --builderr$r$}r$(hUh j$ubah!j@ubaubhXG 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$ubeubj )r$}r$(hUh js$jqjh!j h}r$(h]h]h]h]h]uj!Njjh]r$j)r$}r$(hX7try_builders = ["full-OSX", "full-win32", "full-linux"]r$h j$jqjh!jh}r$(h]h]h]h]h]uj!M#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 js$jqjh!jh}r$(h]h]h]h]h]uj!M%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$ubeubj )r$}r$(hUh js$jqjh!j h}r$(h]h]h]h]h]uj!Njjh]r$j)r$}r$(hXVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...r$h j$jqjh!jh}r$(h]h]h]h]h]uj!M)h]r$hXVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...r$r$}r$(hj$h j$ubaubaubeubjwjjj jjjjjj j jjjjj{jjvj\jrjjj uj3}r$h!jh}r$(h]h]h]Usourcejh]h]uj6]r$j8}r$(j]r%j]aj]r%j aj]r%j{aj]r%jaj]r%jG aj]r%j aj]r%jP aj]r%jaj]r%jaj]r %jzaj#]r %jaj]r %jaj]r %j aj]r %jaj]r%j aj]r%jaj]r%j aj]r%jaj]r%jZ auubjqjj}r%jjsh!j;h}r%(h]h]h]h]r%(jjseh]r%(jjeuj!Kjjj"}r%jjsh]r%(h)r%}r%(hhjh jjqjh!h"h}r%(h]h]h]h]h]uj!Kjjh]r%hXCommand-line Toolr%r%}r%(hhjh j%ubaubj)r %}r!%(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 jjqjh!jh}r"%(h]h]h]h]h]uj!Kjjh]r#%(hXsThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all r$%r%%}r&%(hXsThis section describes command-line tools available after buildbot installation. Since version 0.8 the one-for-all h j %ubj)r'%}r(%(hX:command:`buildbot`h}r)%(h]h]r*%jah]h]h]uh j %h]r+%hXbuildbotr,%r-%}r.%(hUh j'%ubah!jubhX5 command-line tool was divided into two parts namely r/%r0%}r1%(hX5 command-line tool was divided into two parts namely h j %ubj)r2%}r3%(hX:command:`buildbot`h}r4%(h]h]r5%jah]h]h]uh j %h]r6%hXbuildbotr7%r8%}r9%(hUh j2%ubah!jubhX and r:%r;%}r<%(hX and h j %ubj)r=%}r>%(hX:command:`buildslave`h}r?%(h]h]r@%jah]h]h]uh j %h]rA%hX buildslaverB%rC%}rD%(hUh j=%ubah!jubhX. The last one was separated from main command-line tool to minimize dependencies required for running a buildslave while leaving all other functions to rE%rF%}rG%(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 j %ubj)rH%}rI%(hX:command:`buildbot`h}rJ%(h]h]rK%jah]h]h]uh j %h]rL%hXbuildbotrM%rN%}rO%(hUh jH%ubah!jubhX tool.rP%rQ%}rR%(hX tool.h j %ubeubj)rS%}rT%(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:rU%h jjqjh!jh}rV%(h]h]h]h]h]uj!K jjh]rW%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:rX%rY%}rZ%(hjU%h jS%ubaubjM)r[%}r\%(hXibuildbot [global options] command [command options] buildslave [global options] command [command options]h jjqjh!jPh}r]%(jRjSXnonejTjUh]h]h]h]h]uj!Kjjh]r^%hXibuildbot [global options] command [command options] buildslave [global options] command [command options]r_%r`%}ra%(hUh j[%ubaubj)rb%}rc%(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 jjqjh!jh}rd%(h]h]h]h]h]uj!Kjjh]re%(hXThe rf%rg%}rh%(hXThe h jb%ubj)ri%}rj%(hX ``buildbot``h}rk%(h]h]h]h]h]uh jb%h]rl%hXbuildbotrm%rn%}ro%(hUh ji%ubah!jubhX& command is used on the master, while rp%rq%}rr%(hX& command is used on the master, while h jb%ubj)rs%}rt%(hX``buildslave``h}ru%(h]h]h]h]h]uh jb%h]rv%hX buildslaverw%rx%}ry%(hUh js%ubah!jubhXg is used on the slave. Global options are the same for both tools which perform the following actions:rz%r{%}r|%(hXg is used on the slave. Global options are the same for both tools which perform the following actions:h jb%ubeubj+)r}%}r~%(hUh jjqjh!j.h}r%(h]h]h]h]h]uj!Njjh]r%(j1)r%}r%(hUh j}%jqjh!j4h}r%(h]h]h]h]h]uj!Njjh]r%(j7)r%}r%(hUh}r%(h]h]h]h]h]uh j%h]r%j<)r%}r%(hX--helpr%h}r%(h]h]h]h]h]uh j%h]r%jB)r%}r%(hj%h}r%(h]h]h]h]h]uh j%h]r%hX--helpr%r%}r%(hUh j%ubah!jJubah!jKubah!jLubjM)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%jqjh!jh}r%(h]h]h]h]h]uj!Kh]r%hXnPrint general help about available commands and global options and exit. All subsequent arguments are ignored.r%r%}r%(hj%h j%ubaubah!jiubeubj1)r%}r%(hUh j}%jqjh!j4h}r%(h]h]h]h]h]uj!Njjh]r%(j7)r%}r%(hUh}r%(h]h]h]h]h]uh j%h]r%j<)r%}r%(hX --verboser%h}r%(h]h]h]h]h]uh j%h]r%jB)r%}r%(hj%h}r%(h]h]h]h]h]uh j%h]r%hX --verboser%r%}r%(hUh j%ubah!jJubah!jKubah!jLubjM)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%jqjh!jh}r%(h]h]h]h]h]uj!Kh]r%hXSet verbose output.r%r%}r%(hj%h j%ubaubah!jiubeubj1)r%}r%(hUh j}%jqjh!j4h}r%(h]h]h]h]h]uj!Njjh]r%(j7)r%}r%(hUh}r%(h]h]h]h]h]uh j%h]r%j<)r%}r%(hX --versionr%h}r%(h]h]h]h]h]uh j%h]r%jB)r%}r%(hj%h}r%(h]h]h]h]h]uh j%h]r%hX --versionr%r%}r%(hUh j%ubah!jJubah!jKubah!jLubjM)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%jqjh!jh}r%(h]h]h]h]h]uj!K!h]r%hXNPrint current buildbot version and exit. All subsequent arguments are ignored.r%r%}r%(hj%h j%ubaubah!jiubeubeubj)r%}r%(hXMYou can get help on any command by specifying ``--help`` as a command option:h jjqjh!jh}r%(h]h]h]h]h]uj!K$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%ubeubjM)r%}r%(hXbuildbot @var{command} --helph jjqjh!jPh}r%(jRjSXnonejTjUh]h]h]h]h]uj!K'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 jjqjh!jh}r%(h]h]h]h]h]uj!K+jjh]r%(hX"You can also use manual pages for r%r%}r%(hX"You can also use manual pages for h j%ubj)r&}r&(hX:command:`buildbot`h}r&(h]h]r&jah]h]h]uh j%h]r&hXbuildbotr&r&}r&(hUh j&ubah!jubhX and r&r &}r &(hX and h j%ubj)r &}r &(hX:command:`buildslave`h}r &(h]h]r&jah]h]h]uh j%h]r&hX buildslaver&r&}r&(hUh j &ubah!jubhX- 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 jjqjh!jh}r&(h]h]h]h]h]uj!K.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&jqjh!j-h}r &(UreftypeXindexj/j0XcmdlineU refdomainXbbr!&h]h]U refexplicith]h]h]j3hbuj!K.h]r"&j)r#&}r$&(hj&h}r%&(h]h]r&&(j:j!&Xbb-indexr'&eh]h]h]uh j&h]r(&hXcmdliner)&r*&}r+&(hUh j#&ubah!jubaubhX for a full list.r,&r-&}r.&(hX for a full list.h j&ubeubjjeubjqjh!j;h}r/&(h]h]h]h]r0&jjah]r1&jauj!K2jjh]r2&(h)r3&}r4&(hXbuildbotr5&h jjqjh!h"h}r6&(h]h]h]h]h]uj!K2jjh]r7&hXbuildbotr8&r9&}r:&(hj5&h j3&ubaubj)r;&}r<&(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 jjqjh!jh}r=&(h]h]h]h]h]uj!K4jjh]r>&(hXThe r?&r@&}rA&(hXThe h j;&ubj)rB&}rC&(hX:command:`buildbot`h}rD&(h]h]rE&jah]h]h]uh j;&h]rF&hXbuildbotrG&rH&}rI&(hUh jB&ubah!jubhX  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.rJ&rK&}rL&(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 j;&ubeubj4 jj^jeubjqjh!j;h}rM&(h]h]h]h]rN&jrah]rO&jauj!Kjjh]rP&(h)rQ&}rR&(hXDeveloper ToolsrS&h jjqjh!h"h}rT&(h]h]h]h]h]uj!Kjjh]rU&hXDeveloper ToolsrV&rW&}rX&(hjS&h jQ&ubaubj)rY&}rZ&(hXoThese tools are provided for use by the developers who are working on the code that the buildbot is monitoring.r[&h jjqjh!jh}r\&(h]h]h]h]h]uj!Kjjh]r]&hXoThese tools are provided for use by the developers who are working on the code that the buildbot is monitoring.r^&r_&}r`&(hj[&h jY&ubaubj)ra&}rb&(hUh jjqjh!jh}rc&(h]h]h]h]h]Uentries]rd&((UsingleX#Command Line Subcommands; statuslogjjtre&(UsingleX!statuslog Command Line Subcommandjjtrf&euj!Kjjh]ubj j j jjZeubjqjj}h!j;h}rg&(h]h]h]h]rh&(j{jeh]ri&jauj!Kjjj"}rj&jj sh]rk&(h)rl&}rm&(hXtryrn&h jjqjh!h"h}ro&(h]h]h]h]h]uj!Kjjh]rp&hXtryrq&rr&}rs&(hjn&h jl&ubaubj)rt&}ru&(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 jjqjh!jh}rv&(h]h]h]h]h]uj!Kjjh]rw&(hX*This lets a developer to ask the question rx&ry&}rz&(hX*This lets a developer to ask the question h jt&ubj)r{&}r|&(hX:``What would happen if I committed this patch right now?``h}r}&(h]h]h]h]h]uh jt&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 jt&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 jjqjh!jh}r&(h]h]h]h]h]uj!Kjjh]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&jqjh!j-h}r&(UreftypeXclassj/j0X SourceStampU refdomainXpyr&h]h]U refexplicith]h]h]j3hbj Nj Nuj!Kh]r&j)r&}r&(hj&h}r&(h]h]r&(j:j&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 jjqjh!jh}r&(h]h]h]h]h]uj!Kjjh]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&ubj)r&}r&(hX:command:`svn diff`h}r&(h]h]r&jah]h]h]uh j&h]r&hXsvn diffr&r&}r&(hUh j&ubah!jubhX). 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&jqjh!j-h}r&(UreftypeXrefj/j0X try--diffU refdomainXstdr&h]h]U refexplicith]h]h]j3hbuj!Kh]r&jh)r&}r&(hj&h}r&(h]h]r&(j:j&Xstd-refr&eh]h]h]uh j&h]r&hX try--diffr&r&}r&(hUh j&ubah!jrubaubhX 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 jjqjh!jh}r&(h]h]h]h]h]uj!Kjjh]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&jqjh!j-h}r&(UreftypeXschedj/j0X Try_JobdirU refdomainXbbr&h]h]U refexplicith]h]h]j3hbuj!Kh]r&j)r&}r&(hj&h}r&(h]h]r&(j:j&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&jqjh!j-h}r'(UreftypeXschedj/j0X Try_UserpassU refdomainXbbr'h]h]U refexplicith]h]h]j3hbuj!Kh]r'j)r '}r '(hj'h}r '(h]h]r '(j:j'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&ubeubj js$j#j jjjc jj_eubjqjh!j;h}r'(h]h]h]h]r'jyah]r'jauj!Mmjjh]r'(h)r'}r'(hX"Determining the revision and patchr'h jjqjh!h"h}r'(h]h]h]h]h]uj!Mmjjh]r'hX"Determining the revision and patchr'r'}r '(hj'h j'ubaubj)r!'}r"'(hXfEach VC system has a separate approach for determining the tree's base revision and computing a patch.r#'h jjqjh!jh}r$'(h]h]h]h]h]uj!Mojjh]r%'hXfEach VC system has a separate approach for determining the tree's base revision and computing a patch.r&'r''}r('(hj#'h j!'ubaubj)r)'}r*'(hUh jjqjh!jh}r+'(h]h]h]h]h]uj!Njjh]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 j)'jqjh!jh}r/'(h]h]h]h]h]uj!Mxh]r0'(j)r1'}r2'(hXCVSr3'h j-'jqjh!jh}r4'(h]h]h]h]h]uj!Mxh]r5'hXCVSr6'r7'}r8'(hj3'h j1'ubaubj)r9'}r:'(hUh}r;'(h]h]h]h]h]uh j-'h]r<'j)r='}r>'(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 j9'jqjh!jh}r?'(h]h]h]h]h]uj!Msh]r@'(j)rA'}rB'(hX:command:`try`h}rC'(h]h]rD'jah]h]h]uh j='h]rE'hXtryrF'rG'}rH'(hUh jA'ubah!jubhXK pretends that the tree is up to date. It converts the current time into a rI'rJ'}rK'(hXK pretends that the tree is up to date. It converts the current time into a h j='ubj))rL'}rM'(hX :option:`-D`rN'h j='jqjh!j-h}rO'(UreftypeXoptionj/j0X-DU refdomainXstdrP'j2Nh]h]U refexplicith]h]h]j3hbuj!Msh]rQ'j5)rR'}rS'(hjN'h}rT'(h]h]rU'(j:jP'X std-optionrV'eh]h]h]uh jL'h]rW'hX-DrX'rY'}rZ'(hUh jR'ubah!j@ubaubhX 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]'(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 j='ubeubah!j ubeubj)r^'}r_'(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 j)'jqjh!jh}r`'(h]h]h]h]h]uj!Mjjh]ra'(j)rb'}rc'(hXSVNrd'h j^'jqjh!jh}re'(h]h]h]h]h]uj!Mh]rf'hXSVNrg'rh'}ri'(hjd'h jb'ubaubj)rj'}rk'(hUh}rl'(h]h]h]h]h]uh j^'h]rm'j)rn'}ro'(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 jj'jqjh!jh}rp'(h]h]h]h]h]uj!M{h]rq'(j)rr'}rs'(hX:command:`try`h}rt'(h]h]ru'jah]h]h]uh jn'h]rv'hXtryrw'rx'}ry'(hUh jr'ubah!jubhX does a rz'r{'}r|'(hX does a h jn'ubj)r}'}r~'(hX:command:`svn status -u`h}r'(h]h]r'jah]h]h]uh jn'h]r'hX svn status -ur'r'}r'(hUh j}'ubah!jubhXP 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 jn'ubj)r'}r'(hUh}r'(h]h]h]h]r'Xsampr'aUrolej'h]uh jn'h]r'(hXStatus against revision: r'r'}r'(hXStatus against revision: h j'ubjh)r'}r'(hXNNh}r'(h]h]h]h]h]uh j'h]r'hXNNr'r'}r'(hUh j'ubah!jrubeh!jubhX message). It then performs an r'r'}r'(hX message). It then performs an h jn'ubj)r'}r'(hUh}r'(h]h]h]h]r'Xsampr'aUrolej'h]uh jn'h]r'(hX svn diff -rr'r'}r'(hX svn diff -rh j'ubjh)r'}r'(hXNNh}r'(h]h]h]h]h]uh j'h]r'hXNNr'r'}r'(hUh j'ubah!jrubeh!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 jn'ubj)r'}r'(hX``try``h}r'(h]h]h]h]h]uh jn'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 jn'ubjh)r'}r'(hX *backwards*h}r'(h]h]h]h]h]uh jn'h]r'hX backwardsr'r'}r'(hUh j'ubah!jrubhX patches applied to bring it r'r'}r'(hX patches applied to bring it h jn'ubj)r'}r'(hX``back``h}r'(h]h]h]h]h]uh jn'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 jn'ubeubah!j ubeubj)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 j)'jqjh!jh}r'(h]h]h]h]h]uj!Mjjh]r'(j)r'}r'(hXbzrr'h j'jqjh!jh}r'(h]h]h]h]h]uj!Mh]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'jqjh!jh}r'(h]h]h]h]h]uj!Mh]r'(j)r'}r'(hX:command:`try`h}r'(h]h]r'jah]h]h]uh j'h]r'hXtryr'r'}r'(hUh j'ubah!jubhX 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!j ubeubj)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 j)'jqjh!jh}r((h]h]h]h]h]uj!Mjjh]r((j)r(}r((hX Mercurialr(h j'jqjh!jh}r((h]h]h]h]h]uj!Mh]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 (jqjh!jh}r((h]h]h]h]h]uj!Mh]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]r (hXhg diffr!(r"(}r#((hUh j(ubah!jubhX8 then provides the patch relative to that revision. For r$(r%(}r&((hX8 then provides the patch relative to that revision. For h j(ubj)r'(}r(((hX:command:`try`h}r)((h]h]r*(jah]h]h]uh j(h]r+(hXtryr,(r-(}r.((hUh j'(ubah!jubhX to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' r/(r0(}r1((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)r2(}r3((hX``source.Mercurial``h}r4((h]h]h]h]h]uh j(h]r5(hXsource.Mercurialr6(r7(}r8((hUh j2(ubah!jubhX will use.r9(r:(}r;((hX will use.h j(ubeubah!j ubeubj)r<(}r=((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 j)'jqjh!jh}r>((h]h]h]h]h]uj!Mjjh]r?((j)r@(}rA((hXPerforcerB(h j<(jqjh!jh}rC((h]h]h]h]h]uj!Mh]rD(hXPerforcerE(rF(}rG((hjB(h j@(ubaubj)rH(}rI((hUh}rJ((h]h]h]h]h]uh j<(h]rK(j)rL(}rM((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 jH(jqjh!jh}rN((h]h]h]h]h]uj!Mh]rO((j)rP(}rQ((hX:command:`try`h}rR((h]h]rS(jah]h]h]uh jL(h]rT(hXtryrU(rV(}rW((hUh jP(ubah!jubhX does a rX(rY(}rZ((hX does a h jL(ubj)r[(}r\((hX``p4 changes -m1 ...``h}r]((h]h]h]h]h]uh jL(h]r^(hXp4 changes -m1 ...r_(r`(}ra((hUh j[(ubah!jubhX to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a rb(rc(}rd((hX to determine the latest changelist and implicitly assumes that the local tree is synced to this revision. This is followed by a h jL(ubj)re(}rf((hX``p4 diff -du``h}rg((h]h]h]h]h]uh jL(h]rh(hX p4 diff -duri(rj(}rk((hUh je(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 rl(rm(}rn((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 jL(ubj))ro(}rp((hX:bb:chsrc:`P4Source`rq(h jL(jqjh!j-h}rr((UreftypeXchsrcj/j0XP4SourceU refdomainXbbrs(h]h]U refexplicith]h]h]j3hbuj!Mh]rt(j)ru(}rv((hjq(h}rw((h]h]rx((j:js(Xbb-chsrcry(eh]h]h]uh jo(h]rz(hXP4Sourcer{(r|(}r}((hUh ju(ubah!jubaubhX) is assumed to be r~(r(}r((hX) is assumed to be h jL(ubj)r(}r((hX ``//depot``h}r((h]h]h]h]h]uh jL(h]r(hX//depotr(r(}r((hUh j(ubah!jubeubah!j ubeubj)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 j)'jqjh!jh}r((h]h]h]h]h]uj!Mjjh]r((j)r(}r((hXDarcsr(h j(jqjh!jh}r((h]h]h]h]h]uj!Mh]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(jqjh!jh}r((h]h]h]h]h]uj!Mh]r((j)r(}r((hX:command:`try`h}r((h]h]r(jah]h]h]uh j(h]r(hXtryr(r(}r((hUh j(ubah!jubhX 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(ubjh)r(}r((hX*are*h}r((h]h]h]h]h]uh j(h]r(hXarer(r(}r((hUh j(ubah!jrubhXH 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!j ubeubj)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 j)'jqjh!jh}r((h]h]h]h]h]uj!Mjjh]r((j)r(}r((hXGitr(h j(jqjh!jh}r((h]h]h]h]h]uj!Mh]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(jqjh!jh}r((h]h]h]h]h]uj!Mh]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(ubj)r)}r)(hX:command:`try`h}r)(h]h]r)jah]h]h]uh j(h]r)hXtryr)r)}r)(hUh j)ubah!jubhX{ 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!j ubeubeubj$)r )}r )(hXEThe spaces in the previous 2 literals are non-breakable spaces  h jjqjh!j $h}r)(jTjUh]h]h]h]h]uj!Mjjh]r)hXEThe spaces in the previous 2 literals are non-breakable spaces  r)r)}r)(hUh j )ubaubjj#j)r)}r)(hUh jjqjh!jh}r)(h]h]h]h]h]uj!Njjh]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)jqjh!jh}r)(h]h]h]h]h]uj!Mh]r)(j)r)}r)(hXMonotoner)h j)jqjh!jh}r)(h]h]h]h]h]uj!Mh]r)hXMonotoner )r!)}r")(hj)h j)ubaubj)r#)}r$)(hUh}r%)(h]h]h]h]h]uh j)h]r&)j)r')}r()(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 j#)jqjh!jh}r))(h]h]h]h]h]uj!Mh]r*)(j)r+)}r,)(hX,:command:`mtn automate get_base_revision_id`h}r-)(h]h]r.)jah]h]h]uh j')h]r/)hX!mtn automate get_base_revision_idr0)r1)}r2)(hUh j+)ubah!jubhXx emits the full revision id which is a SHA1 hash of the current revision's contents. This is used as the base revision. r3)r4)}r5)(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 j')ubj)r6)}r7)(hX:command:`mtn diff`h}r8)(h]h]r9)jah]h]h]uh j')h]r:)hXmtn diffr;)r<)}r=)(hUh j6)ubah!jubhX9 then provides the patch relative to that revision. For r>)r?)}r@)(hX9 then provides the patch relative to that revision. For h j')ubj)rA)}rB)(hX:command:`try`h}rC)(h]h]rD)jah]h]h]uh j')h]rE)hXtryrF)rG)}rH)(hUh jA)ubah!jubhX to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' rI)rJ)}rK)(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))rL)}rM)(hX:class:`source.Monotone`rN)h j')jqjh!j-h}rO)(UreftypeXclassj/j0Xsource.MonotoneU refdomainXpyrP)h]h]U refexplicith]h]h]j3hbj Nj Nuj!Mh]rQ)j)rR)}rS)(hjN)h}rT)(h]h]rU)(j:jP)Xpy-classrV)eh]h]h]uh jL)h]rW)hXsource.MonotonerX)rY)}rZ)(hUh jR)ubah!jubaubhX will use.r[)r\)}r])(hX will use.h j')ubeubah!j ubeubaubeubjqjh!jh}r^)(h]h]h]h]h]jj#uj!Njjh]ubu}r_)(jpjCjqjrXU/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/customization.rstr`)ra)}rb)bjvjw)rc)}rd)(hXWhat *is* the best way to do this? From the docstring: As the step runs, it should send status information to the BuildStepStatus:: self.step_status.setText(['compile', 'failed']) self.step_status.setText2(['4', 'warnings'])re)h}rf)(h]h]rg)Uadmonition-todorh)ah]h]uh]ri)(h)rj)}rk)(hXTodorl)h}rm)(h]h]h]h]h]uh jc)h]rn)hXTodoro)rp)}rq)(hjl)h jj)ubah!h"ubj)rr)}rs)(hX7What *is* the best way to do this? From the docstring:rt)h}ru)(h]h]h]h]h]uh jc)h]rv)(hXWhat rw)rx)}ry)(hXWhat rz)h jr)ubjh)r{)}r|)(hX*is*r})h}r~)(h]h]h]h]h]uh jr)h]r)hXisr)r)}r)(hUh j{)ubah!jrubhX. the best way to do this? From the docstring:r)r)}r)(hX. the best way to do this? From the docstring:r)h jr)ubeh!jubj)r)}r)(hXLAs the step runs, it should send status information to the BuildStepStatus::r)h}r)(h]h]h]h]h]uh jc)h]r)hXKAs the step runs, it should send status information to the BuildStepStatus:r)r)}r)(hXKAs the step runs, it should send status information to the BuildStepStatus:r)h j)ubah!jubjM)r)}r)(hX\self.step_status.setText(['compile', 'failed']) self.step_status.setText2(['4', 'warnings'])r)h}r)(U xml:spacejUh]h]h]h]h]uh jc)h]r)hX\self.step_status.setText(['compile', 'failed']) self.step_status.setText2(['4', 'warnings'])r)r)}r)(hUh j)ubah!jPubeh!jubjMTjj)r)}r)(hUh j)r)}r)(hUh j)r)}r)(hUh j)r)}r)(hUjKh j)r)}r)(j}r)(jXbuilder priority functionsr)NjX#using logfiles in custom buildstepsr)NXcapturing logfilesr)NXwriting buildstep constructorsr)Nj`Xfactory workdir functionsr)NXupdating statusr)NXusing propertiesr)Nj&jX(project/branchname/filepath repositoriesr)NXwriting new status pluginsr)NXadding logobserversr)NXmerge request functionsr)NXa somewhat whimsical exampler)NXcustomizing svnpollerr)NXrunning commandsr)NX(branchname/project/filepath repositoriesr)NjX%programmatic configuration generationr)NX.writing a new latent buildslave implementationr)NXcustom build classesr)NX divmod.orgr)j$Xbuild priority functionsr)NXwriting new buildstepsr)Nj jj2jXwriting a change pollerr)NX*writing a notification-based change sourcer)NjXbuildstep urlsr)NXreading logfilesr)NXwriting change sourcesr)Nuj}r)j]r)j)r)}r)(hUh j)jqja)h!jh}r)(h]UlevelKh]h]r)Uid1r)aUsourceja)h]h]UlineKUtypejuj!Kjj)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!jubaubajNjNjKj}r)(jjj)Uid3r)jjj)U#using-logfiles-in-custom-buildstepsr)j)Ucapturing-logfilesr)j)Uid8r)j`jaj)Uid7r)j)Uupdating-statusr)j)Uusing-propertiesr)j&j'jjj)U(project-branchname-filepath-repositoriesr)j)Uwriting-new-status-pluginsr)j)Uid9r)j)Uid2r)j)Ua-somewhat-whimsical-exampler)j)Uid5r)j)Urunning-commandsr)j)U(branchname-project-filepath-repositoriesr)jjj)U%programmatic-configuration-generationr)j)U.writing-a-new-latent-buildslave-implementationr)j)Ucustom-build-classesr)j)U divmod-orgr)j$j%j)Uid4r)j)Uwriting-new-buildstepsr)j j jjj2j3jj j)Uwriting-a-change-pollerr)j)U*writing-a-notification-based-change-sourcer)jjj)Ubuildstep-urlsr)j)Ureading-logfilesr)j)Uid6r)uh]r)(j)r)}r)(hX.. _Customization:h j)jqja)h!jh}r)(h]h]h]h]h]jjauj!Kjj)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)jqja)h!j;h}r)(h]h]h]h]r)j)ah]r)j)auj!Mjj)h]r)(h)r)}r)(hXA Somewhat Whimsical Exampler)h j)jqja)h!h"h}r)(h]h]h]h]h]uj!Mjj)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)jqja)h!jh}r*(h]h]h]h]h]uj!Mjj)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)jqja)h!jh}r *(h]h]h]h]h]uj!Mjj)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 *jqja)h!j-h}r*(UreftypeXclassj/j0X BuildStepU refdomainXpyr*h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r*j)r*}r*(hj*h}r*(h]h]r*(j:j*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 *jqja)h!j-h}r&*(UreftypeXstepj/j0X ShellCommandU refdomainXbbr'*h]h]U refexplicith]h]h]j3jCuj!Mh]r(*j)r)*}r**(hj%*h}r+*(h]h]r,*(j:j'*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 *jqja)h!j-h}r8*(UreftypeXclassj/j0X BuildStepU refdomainXpyr9*h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r:*j)r;*}r<*(hj7*h}r=*(h]h]r>*(j:j9*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 *ubeubjM)rG*}rH*(hX]from buildbot.steps.shell import ShellCommand from buildbot.process.buildstep 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)jqja)h!jPh}rI*(jTjUh]h]h]h]h]uj!Mjj)h]rJ*hX]from buildbot.steps.shell import ShellCommand from buildbot.process.buildstep 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)jqja)h!jh}rQ*(h]h]h]h]h]uj!Mjj)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)jqja)h!jh}rY*(h]h]h]h]h]uj!Mjj)h]rZ*hX'You have a couple of different options.r[*r\*}r]*(hjX*h jV*ubaubj)r^*}r_*(hXOption 1: The simplest technique is to simply put this text (everything from START to FINISH) in your :FILE:`master.cfg` file, somewhere before the :class:`BuildFactory` definition where you actually use it in a clause like::h j)jqja)h!jh}r`*(h]h]h]h]h]uj!Mjj)h]ra*(hXfOption 1: The simplest technique is to simply put this text (everything from START to FINISH) in your rb*rc*}rd*(hXfOption 1: The simplest technique is to simply put this text (everything from START to FINISH) in your h j^*ubj)re*}rf*(hUh}rg*(h]h]h]h]rh*XFILEri*aUroleXfileh]uh j^*h]rj*hX master.cfgrk*rl*}rm*(hX master.cfgh je*ubah!jubhX file, somewhere before the rn*ro*}rp*(hX file, somewhere before the h j^*ubj))rq*}rr*(hX:class:`BuildFactory`rs*h j^*jqja)h!j-h}rt*(UreftypeXclassj/j0X BuildFactoryU refdomainXpyru*h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rv*j)rw*}rx*(hjs*h}ry*(h]h]rz*(j:ju*Xpy-classr{*eh]h]h]uh jq*h]r|*hX BuildFactoryr}*r~*}r*(hUh jw*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 j^*ubeubjM)r*}r*(hXIf = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())h j)jqja)h!jPh}r*(jTjUh]h]h]h]h]uj!Mjj)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)jqja)h!jh}r*(h]h]h]h]h]uj!Mjj)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)jqja)h!jh}r*(h]h]h]h]h]uj!Mjj)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*ubaubj)r*}r*(hXOption 2: 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 :bb:step:`ShellCommand` and :bb:step:`SVN`.h j)jqja)h!jh}r*(h]h]h]h]h]uj!Mjj)h]r*(hXOption 2: 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 r*r*}r*(hXOption 2: 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 h j*ubj))r*}r*(hX:bb:step:`ShellCommand`r*h j*jqja)h!j-h}r*(UreftypeXstepj/j0X ShellCommandU refdomainXbbr*h]h]U refexplicith]h]h]j3jCuj!Mh]r*j)r*}r*(hj*h}r*(h]h]r*(j:j*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*jqja)h!j-h}r*(UreftypeXstepj/j0XSVNU refdomainXbbr*h]h]U refexplicith]h]h]j3jCuj!Mh]r*j)r*}r*(hj*h}r*(h]h]r*(j:j*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 ~/lib/python, put everything from START to FINISH in :file:`~/lib/python/framboozle.py`, and run your buildmaster using:h j)jqja)h!jh}r*(h]h]h]h]h]uj!Mjj)h]r*(hXNCreate a directory named ~/lib/python, put everything from START to FINISH in r*r*}r*(hXNCreate a directory named ~/lib/python, put everything from START to FINISH 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*ubeubjM)r*}r*(hX0PYTHONPATH=~/lib/python buildbot start MASTERDIRh j)jqja)h!jPh}r*(jRjSXbashjTjUh]h]h]h]h]uj!Mjj)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)jqja)h!jh}r*(h]h]h]h]h]uj!Mjj)h]r*(hX or use the r*r*}r*(hX or use the h j*ubj)r*}r*(hUh}r*(h]h]h]h]r*Xfiler+aUrolej+h]uh j*h]r+hXMakefile.buildbotr+r+}r+(hXMakefile.buildboth j*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]r +hXbuildbot startr +r +}r+(hUh j+ubah!jubhX: works. Or add something like this to something like your r+r+}r+(hX: works. Or add something like this to something like your h j*ubj)r+}r+(hUh}r+(h]h]h]h]r+Xfiler+aUrolej+h]uh j*h]r+hX ~/.bashrcr+r+}r+(hX ~/.bashrch j+ubah!jubhX or r+r+}r+(hX or h j*ubj)r+}r+(hUh}r +(h]h]h]h]r!+Xfiler"+aUrolej"+h]uh j*h]r#+hX~/.bash_profiler$+r%+}r&+(hX~/.bash_profileh j+ubah!jubhX or r'+r(+}r)+(hX or h j*ubj)r*+}r++(hUh}r,+(h]h]h]h]r-+Xfiler.+aUrolej.+h]uh j*h]r/+hX~/.cshrcr0+r1+}r2+(hX~/.cshrch j*+ubah!jubhX:r3+}r4+(hX:h j*ubeubjM)r5+}r6+(hXexport PYTHONPATH=~/lib/pythonh j)jqja)h!jPh}r7+(jRjSXbashjTjUh]h]h]h]h]uj!Mjj)h]r8+hXexport PYTHONPATH=~/lib/pythonr9+r:+}r;+(hUh j5+ubaubj)r<+}r=+(hX<Once we've done this, our :file:`master.cfg` can look like::h j)jqja)h!jh}r>+(h]h]h]h]h]uj!Mjj)h]r?+(hXOnce we've done this, our r@+rA+}rB+(hXOnce we've done this, our h j<+ubj)rC+}rD+(hUh}rE+(h]h]h]h]rF+XfilerG+aUrolejG+h]uh j<+h]rH+hX master.cfgrI+rJ+}rK+(hX master.cfgh jC+ubah!jubhX can look like:rL+rM+}rN+(hX can look like:h j<+ubeubjM)rO+}rP+(hXkfrom framboozle import Framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())h j)jqja)h!jPh}rQ+(jTjUh]h]h]h]h]uj!Mjj)h]rR+hXkfrom framboozle import Framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())rS+rT+}rU+(hUh jO+ubaubj)rV+}rW+(hXor::h j)jqja)h!jh}rX+(h]h]h]h]h]uj!Mjj)h]rY+hXor:rZ+r[+}r\+(hXor:h jV+ubaubjM)r]+}r^+(hXfimport framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())h j)jqja)h!jPh}r_+(jTjUh]h]h]h]h]uj!Mjj)h]r`+hXfimport framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())ra+rb+}rc+(hUh j]+ubaubj)rd+}re+(hXV(check out the Python docs for details about how "import" and "from A import B" work).rf+h j)jqja)h!jh}rg+(h]h]h]h]h]uj!Mjj)h]rh+hXV(check out the Python docs for details about how "import" and "from A import B" work).ri+rj+}rk+(hjf+h jd+ubaubj)rl+}rm+(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)jqja)h!jh}rn+(h]h]h]h]h]uj!Mjj)h]ro+(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 rp+rq+}rr+(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 jl+ubj)rs+}rt+(hUh}ru+(h]h]h]h]rv+Xfilerw+aUrolejw+h]uh jl+h]rx+hX ~/lib/python/ry+rz+}r{+(hX ~/lib/python/h js+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 jl+ubj)r+}r+(hUh}r+(h]h]h]h]h]jn]r+((Usingler+X PYTHONPATHr+Uindex-6r+Utr+(j+X environment variable; PYTHONPATHj+Utr+euh jl+h]h!jubj)r+}r+(hUh}r+(h]h]h]h]r+j+ah]uh jl+h]h!jubj))r+}r+(hX:envvar:`PYTHONPATH`r+h jl+jqja)h!j-h}r+(UreftypeXenvvarj/j0j+U refdomainXstdr+h]h]U refexplicith]h]h]j3jCuj!Mh]r+j)r+}r+(hj+h}r+(h]h]r+(j:j+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 jl+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)jqja)h!jh}r+(h]h]h]h]h]uj!M jj)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]jn]r+((j+X PYTHONPATHr+Uindex-7r+Utr+(j+X environment variable; PYTHONPATHj+Utr+euh j+h]h!jubj)r+}r+(hUh}r+(h]h]h]h]r+j+ah]uh j+h]h!jubj))r+}r+(hX:envvar:`PYTHONPATH`r+h j+jqja)h!j-h}r+(UreftypeXenvvarj/j0j+U refdomainXstdr+h]h]U refexplicith]h]h]j3jCuj!M h]r+j)r+}r+(hj+h}r+(h]h]r+(j:j+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+ubeubj)r+}r+(hXDOption 3: Install this code into a standard Python library directoryr+h j)jqja)h!jh}r+(h]h]h]h]h]uj!Mjj)h]r+hXDOption 3: 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)jqja)h!jh}r+(h]h]h]h]h]uj!Mjj)h]r+hXBFind out what your Python's standard include path is by asking it:r+r+}r+(hj+h j+ubaubjM)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)jqja)h!jPh}r+(jRjSXnonejTjUh]h]h]h]h]uj!Mjj)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']r+r+}r+(hUh j+ubaubj)r+}r+(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)jqja)h!jh}r+(h]h]h]h]h]uj!M+jj)h]r+(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 r+r+}r+(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 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 r+}r+(hX h j+ubj)r+}r+(hX``import framboozle``h}r+(h]h]h]h]h]uh j+h]r+hXimport framboozler+r+}r+(hUh j+ubah!jubhXp statement as in Option 2. By putting it in a standard include directory (instead of the decidedly non-standard r+r+}r+(hXp statement as in Option 2. By putting it in a standard include directory (instead of the decidedly non-standard 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), we don't even have to set r ,r ,}r ,(hX), we don't even have to set h j+ubj)r ,}r ,(hUh}r,(h]h]h]h]h]jn]r,((j+X PYTHONPATHr,Uindex-8r,Utr,(j+X environment variable; PYTHONPATHj,Utr,euh j+h]h!jubj)r,}r,(hUh}r,(h]h]h]h]r,j,ah]uh j+h]h!jubj))r,}r,(hX:envvar:`PYTHONPATH`r,h j+jqja)h!j-h}r,(UreftypeXenvvarj/j0j,U refdomainXstdr,h]h]U refexplicith]h]h]j3jCuj!M+h]r,j)r,}r,(hj,h}r ,(h]h]r!,(j:j,X std-envvarr",eh]h]h]uh j,h]r#,hX PYTHONPATHr$,r%,}r&,(hUh j,ubah!jubaubhX~ to anything special. The downside is that you probably have to be root to write to one of those standard include directories.r',r(,}r),(hX~ to anything special. The downside is that you probably have to be root to write to one of those standard include directories.h j+ubeubj)r*,}r+,(hXDOption 4: Submit the code for inclusion in the Buildbot distributionr,,h j)jqja)h!jh}r-,(h]h]h]h]h]uj!M4jj)h]r.,hXDOption 4: Submit the code for inclusion in the Buildbot distributionr/,r0,}r1,(hj,,h j*,ubaubj)r2,}r3,(hXMake a fork of buildbot on http://github.com/djmitche/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 j)jqja)h!jh}r4,(h]h]h]h]h]uj!M6jj)h]r5,(hXMake a fork of buildbot on r6,r7,}r8,(hXMake a fork of buildbot on h j2,ubcdocutils.nodes reference r9,)r:,}r;,(hX#http://github.com/djmitche/buildbotr<,h}r=,(Urefurij<,h]h]h]h]h]uh j2,h]r>,hX#http://github.com/djmitche/buildbotr?,r@,}rA,(hUh j:,ubah!U referencerB,ubhX or post a patch in a bug at rC,rD,}rE,(hX or post a patch in a bug at h j2,ubj9,)rF,}rG,(hXhttp://buildbot.netrH,h}rI,(UrefurijH,h]h]h]h]h]uh j2,h]rJ,hXhttp://buildbot.netrK,rL,}rM,(hUh jF,ubah!jB,ubhX. In either case, post a note about your patch to the mailing list, so others can provide feedback and, eventually, commit it.rN,rO,}rP,(hX. In either case, post a note about your patch to the mailing list, so others can provide feedback and, eventually, commit it.h j2,ubeubj )rQ,}rR,(hUh j)jqja)h!j h}rS,(h]h]h]h]h]uj!Njj)h]rT,j)rU,}rV,(hXzfrom buildbot.steps import framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())rW,h jQ,jqja)h!jh}rX,(h]h]h]h]h]uj!M:h]rY,hXzfrom buildbot.steps import framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(framboozle.Framboozle())rZ,r[,}r\,(hjW,h jU,ubaubaubj)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 j)jqja)h!jh}r_,(h]h]h]h]h]uj!M?jj)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 ra,rb,}rc,(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)rd,}re,(hUh}rf,(h]h]h]h]h]jn]rg,((j+X PYTHONPATHrh,Uindex-9ri,Utrj,(j+X environment variable; PYTHONPATHji,Utrk,euh j],h]h!jubj)rl,}rm,(hUh}rn,(h]h]h]h]ro,ji,ah]uh j],h]h!jubj))rp,}rq,(hX:envvar:`PYTHONPATH`rr,h j],jqja)h!j-h}rs,(UreftypeXenvvarj/j0jh,U refdomainXstdrt,h]h]U refexplicith]h]h]j3jCuj!M?h]ru,j)rv,}rw,(hjr,h}rx,(h]h]ry,(j:jt,X std-envvarrz,eh]h]h]uh jp,h]r{,hX PYTHONPATHr|,r},}r~,(hUh jv,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 j)jqja)h!jh}r,(h]h]h]h]h]uj!MHjj)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,ubaubeubjqja)h!jh}r,(h]h]h]h]h]uj!Mjj)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,Uid10r,ah]h]h]h]jjuh]r,hX1r,}r,(hUh j)ubaubasj}r,j)]r,j)asj]r,j]r,j)aj]r,jl]r,jj)jNj]r,(j)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineKUtypejuh]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!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineK$Utypejuh]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!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineK*Utypejuh]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!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineKVUtypejuh]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!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineK\Utypejuh]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!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineKuUtypejuh]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!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineKvUtypejuh]r,j)r,}r,(hUh}r,(h]h]h]h]h]uh j,h]r,hX>Hyperlink target "build-priority-functions" is not referenced.r,r,}r,(hUh j,ubah!jubah!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineKUtypejuh]r,j)r,}r,(hUh}r,(h]h]h]h]h]uh j,h]r,hX;Hyperlink target "customizing-svnpoller" is not referenced.r,r,}r,(hUh j,ubah!jubah!jubj)r,}r,(hUh}r,(h]UlevelKh]h]Usourceja)h]h]UlineMbUtypejuh]r,j)r,}r,(hUh}r,(h]h]h]h]h]uh j,h]r,hX<Hyperlink target "writing-change-sources" is not referenced.r,r,}r-(hUh j,ubah!jubah!jubj)r-}r-(hUh}r-(h]UlevelKh]h]Usourceja)h]h]UlineMUtypejuh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j-h]r-hX?Hyperlink target "factory-workdir-functions" is not referenced.r -r -}r -(hUh j-ubah!jubah!jubj)r -}r -(hUh}r-(h]UlevelKh]h]Usourceja)h]h]UlineM Utypejuh]r-j)r-}r-(hUh}r-(h]h]h]h]h]uh j -h]r-hXDHyperlink target "writing-buildstep-constructors" is not referenced.r-r-}r-(hUh j-ubah!jubah!jubj)r-}r-(hUh}r-(h]UlevelKh]h]Usourceja)h]h]Utypejuh]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!jubj)r"-}r#-(hUh}r$-(h]UlevelKh]h]Usourceja)h]h]UlineMUtypejuh]r%-j)r&-}r'-(hUh}r(-(h]h]h]h]h]uh j"-h]r)-hX9Hyperlink target "adding-logobservers" is not referenced.r*-r+-}r,-(hUh j&-ubah!jubah!jubj)r--}r.-(hUh}r/-(h]UlevelKh]h]Usourceja)h]h]UlineMHUtypejuh]r0-j)r1-}r2-(hUh}r3-(h]h]h]h]h]uh j--h]r4-hX-Hyperlink target "index-4" is not referenced.r5-r6-}r7-(hUh j1-ubah!jubah!jubj)r8-}r9-(hUh}r:-(h]UlevelKh]h]Usourceja)h]h]Utypejuh]r;-j)r<-}r=-(hUh}r>-(h]h]h]h]h]uh j8-h]r?-hX-Hyperlink target "index-5" is not referenced.r@-rA-}rB-(hUh j<-ubah!jubah!jubj)rC-}rD-(hUh}rE-(h]UlevelKh]h]Usourceja)h]h]UlineMUtypejuh]rF-j)rG-}rH-(hUh}rI-(h]h]h]h]h]uh jC-h]rJ-hX-Hyperlink target "index-6" is not referenced.rK-rL-}rM-(hUh jG-ubah!jubah!jubj)rN-}rO-(hUh}rP-(h]UlevelKh]h]Usourceja)h]h]UlineM Utypejuh]rQ-j)rR-}rS-(hUh}rT-(h]h]h]h]h]uh jN-h]rU-hX-Hyperlink target "index-7" is not referenced.rV-rW-}rX-(hUh jR-ubah!jubah!jubj)rY-}rZ-(hUh}r[-(h]UlevelKh]h]Usourceja)h]h]UlineM+Utypejuh]r\-j)r]-}r^-(hUh}r_-(h]h]h]h]h]uh jY-h]r`-hX-Hyperlink target "index-8" is not referenced.ra-rb-}rc-(hUh j]-ubah!jubah!jubj)rd-}re-(hUh}rf-(h]UlevelKh]h]Usourceja)h]h]UlineM?Utypejuh]rg-j)rh-}ri-(hUh}rj-(h]h]h]h]h]uh jd-h]rk-hX-Hyperlink target "index-9" is not referenced.rl-rm-}rn-(hUh jh-ubah!jubah!jubejNjK j]ro-cdocutils.nodes footnote rp-)rq-}rr-(hX:framboozle.com is still available. Remember, I get 10% :).rs-h j)rt-}ru-(hUh j)jqja)h!j;h}rv-(h]h]h]h]rw-j)ah]rx-j)auj!MSjj)h]ry-(h)rz-}r{-(hXWriting New Status Pluginsr|-h jt-jqja)h!h"h}r}-(h]h]h]h]h]uj!MSjj)h]r~-hXWriting New Status Pluginsr-r-}r-(hj|-h jz-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 jt-jqja)h!jh}r-(h]h]h]h]h]uj!MUjj)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-jqja)h!j-h}r-(UreftypeXclassj/j0X$twisted.application.service.IServiceU refdomainXpyr-h]h]U refexplicith]h]h]j3jCj Nj Nuj!MUh]r-j)r-}r-(hj-h}r-(h]h]r-(j:j-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-jqja)h!j-h}r-(UreftypeXclassj/j0Xbuildbot.interfaces.IStatusU refdomainXpyr-h]h]U refexplicith]h]h]j3jCj Nj Nuj!MUh]r-j)r-}r-(hj-h}r-(h]h]r-(j:j-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 jt-jqja)h!jh}r-(h]h]h]h]h]uj!M^jj)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-jqja)h!j-h}r-(UreftypeXclassj/j0X MailNotifierU refdomainXpyr-h]h]U refexplicith]h]h]j3jCj Nj Nuj!M^h]r-j)r-}r-(hj-h}r-(h]h]r-(j:j-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 jt-jqja)h!jh}r-(h]h]h]h]h]uj!Mejj)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-jqja)h!j-h}r-(UreftypeXclassj/j0XIServiceCollectionU refdomainXpyr-h]h]U refexplicith]h]h]j3jCj Nj Nuj!Meh]r-j)r-}r-(hj-h}r-(h]h]r-(j:j-Xpy-classr-eh]h]h]uh j-h]r-hXIServiceCollectionr-r-}r-(hUh j-ubah!jubaubhX interface.r-r-}r-(hX interface.h j-ubeubjq-eubjqja)h!Ufootnoter-h}r-(j,Kh]r-jah]r-j,ah]h]h]r-jauj!Mjjj)h]r-(cdocutils.nodes label r-)r-}r-(hUh jq-jqNh!Ulabelr-h}r-(h]h]h]h]h]uj!Njj)h]r-hX1r-}r-(hUh j-ubaubj)r-}r-(hjs-h jq-jqja)h!jh}r-(h]h]h]h]h]uj!Mjh]r-hX:framboozle.com is still available. Remember, I get 10% :).r-r-}r-(hjs-h j-ubaubeubaj}r-j]r-j(jor-}r-(jKjNjjjjNjNjjjjjNjKjNjKjNh"NjjjNjjjjKjNjKjNjjjKjNjNjjjNjNjNjjNjNjjjNjjjNjUjKjjjUU/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/customization.rstjjNjNj j j j j jjjjjjNj]jjKjNubjKj}r-(jj)r-}r-(hUh j)jqja)j}r-jj)r-}r-(hX.. _Build-Priority-Functions:h j)r-}r-(hUh j)jqja)j}r.j j)r.}r.(hX.. _Builder-Priority-Functions:h j)r.}r.(hUh j)jqja)j}r.jj)r.}r.(hX.. _Merge-Request-Functions:h j)r.}r .(hUh j)jqja)h!j;h}r .(h]h]h]h]r .j)ah]r .j)auj!Kjj)h]r .(h)r.}r.(hX%Programmatic Configuration Generationr.h j.jqja)h!h"h}r.(h]h]h]h]h]uj!Kjj)h]r.hX%Programmatic Configuration Generationr.r.}r.(hj.h j.ubaubj)r.}r.(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 j.jqja)h!jh}r.(h]h]h]h]h]uj!Kjj)h]r.(hXBearing in mind that r.r.}r.(hXBearing in mind that h j.ubj)r.}r.(hX``master.cfg``h}r.(h]h]h]h]h]uh j.h]r .hX master.cfgr!.r".}r#.(hUh j.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:r$.r%.}r&.(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 j.ubeubjM)r'.}r(.(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 j.jqja)h!jPh}r).(jTjUh]h]h]h]h]uj!Kjj)h]r*.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 j'.ubaubj.eubjqja)h!jh}r..(h]h]h]h]h]jjuj!K$jj)h]ubsh!j;h}r/.(h]h]h]h]r0.(jj)eh]r1.(j)jeuj!K'jj)j"}r2.jj.sh]r3.(h)r4.}r5.(hXMerge Request Functionsr6.h j.jqja)h!h"h}r7.(h]h]h]h]h]uj!K'jj)h]r8.hXMerge Request Functionsr9.r:.}r;.(hj6.h j4.ubaubj)r<.}r=.(hUh j.jqja)h!jh}r>.(h]h]h]h]h]jn]r?.(j+XBuilds; mergingUindex-0r@.UtrA.aUinlinerB.uj!K)jj)h]ubj)rC.}rD.(hUh j.jqja)h!jh}rE.(h]h]h]h]h]jj@.uj!K*jj)h]ubj)rF.}rG.(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 j.jqja)j}h!jh}rH.(h]h]h]h]rI.j@.ah]uj!K+jj)j"}rJ.j@.jC.sh]rK.(hXThe logic Buildbot uses to decide which build request can be merged can be customized by providing a Python function (a callable) instead of rL.rM.}rN.(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 jF.ubj)rO.}rP.(hX``True``h}rQ.(h]h]h]h]h]uh jF.h]rR.hXTruerS.rT.}rU.(hUh jO.ubah!jubhX or rV.rW.}rX.(hX or h jF.ubj)rY.}rZ.(hX ``False``h}r[.(h]h]h]h]h]uh jF.h]r\.hXFalser].r^.}r_.(hUh jY.ubah!jubhX described in r`.ra.}rb.(hX described in h jF.ubj))rc.}rd.(hX:ref:`Merging-Build-Requests`re.h jF.jqja)h!j-h}rf.(UreftypeXrefj/j0Xmerging-build-requestsU refdomainXstdrg.h]h]U refexplicith]h]h]j3jCuj!K+h]rh.jh)ri.}rj.(hje.h}rk.(h]h]rl.(j:jg.Xstd-refrm.eh]h]h]uh jc.h]rn.hXMerging-Build-Requestsro.rp.}rq.(hUh ji.ubah!jrubaubhX.rr.}rs.(hX.h jF.ubeubj)rt.}ru.(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 j.jqja)h!jh}rv.(h]h]h]h]h]uj!K/jj)h]rw.(hX@The callable will be invoked with three positional arguments: a rx.ry.}rz.(hX@The callable will be invoked with three positional arguments: a h jt.ubj))r{.}r|.(hX:class:`Builder`r}.h jt.jqja)h!j-h}r~.(UreftypeXclassj/j0XBuilderU refdomainXpyr.h]h]U refexplicith]h]h]j3jCj Nj Nuj!K/h]r.j)r.}r.(hj}.h}r.(h]h]r.(j:j.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 jt.ubj))r.}r.(hX:class:`BuildRequest`r.h jt.jqja)h!j-h}r.(UreftypeXclassj/j0X BuildRequestU refdomainXpyr.h]h]U refexplicith]h]h]j3jCj Nj Nuj!K/h]r.j)r.}r.(hj.h}r.(h]h]r.(j:j.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 jt.ubeubjM)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 j.jqja)h!jPh}r.(jTjUh]h]h]h]h]uj!K3jj)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 j.jqja)h!jh}r.(h]h]h]h]h]uj!K8jj)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.jqja)h!j-h}r.(UreftypeXclassj/j0X SourceStampU refdomainXpyr.h]h]U refexplicith]h]h]j3jCj Nj Nuj!K8h]r.j)r.}r.(hj.h}r.(h]h]r.(j:j.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.jqja)h!j-h}r.(UreftypeXclassj/j0X BuildRequestU refdomainXpyr.h]h]U refexplicith]h]h]j3jCj Nj Nuj!K8h]r.j)r.}r.(hj.h}r.(h]h]r.(j:j.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.jqja)h!j-h}r.(UreftypeXclassj/j0X BuildRequestU refdomainXpyr.h]h]U refexplicith]h]h]j3jCj Nj Nuj!K8h]r.j)r.}r.(hj.h}r.(h]h]r.(j:j.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 r.r.}r.(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))r.}r.(hX:func:`canBeMergedWith`r.h j.jqja)h!j-h}r.(UreftypeXfuncj/j0XcanBeMergedWithU refdomainXpyr.h]h]U refexplicith]h]h]j3jCj Nj Nuj!K8h]r.j)r.}r.(hj.h}r.(h]h]r.(j:j.Xpy-funcr.eh]h]h]uh j.h]r.hXcanBeMergedWithr.r.}r.(hUh j.ubah!jubaubhX; method to access the source stamp compatibility algorithm.r.r.}r.(hX; method to access the source stamp compatibility algorithm.h j.ubeubjM)r.}r.(hXdef mergeRequests(builder, req1, req2): if req1.source.canBeMergedWith(req2.source) and req1.reason == req2.reason: return True return False c['mergeRequests'] = mergeRequestsh j.jqja)h!jPh}r.(jTjUh]h]h]h]h]uj!K>jj)h]r.hXdef mergeRequests(builder, req1, req2): if req1.source.canBeMergedWith(req2.source) and req1.reason == req2.reason: return True return False c['mergeRequests'] = mergeRequestsr.r.}r.(hUh j.ubaubj)r.}r.(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 j.jqja)h!jh}r.(h]h]h]h]h]uj!KDjj)h]r.(hXoIf it's necessary to perform some extended operation to determine whether two requests can be merged, then the r/r/}r/(hXoIf it's necessary to perform some extended operation to determine whether two requests can be merged, then the h j.ubj)r/}r/(hX``mergeRequests``h}r/(h]h]h]h]h]uh j.h]r/hX mergeRequestsr/r/}r /(hUh j/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:r /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 j.ubeubjM)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 j.jqja)h!jPh}r/(jTjUh]h]h]h]h]uj!KKjj)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'] = mergeRequestsr/r/}r/(hUh j /ubaubj.eubjqja)h!jh}r/(h]h]h]h]h]jj uj!KVjj)h]ubsh!j;h}r/(h]h]h]h]r/(j j)eh]r/(j)j euj!KYjj)j"}r/j j.sh]r/(h)r/}r/(hXBuilder Priority Functionsr/h j-jqja)h!h"h}r/(h]h]h]h]h]uj!KYjj)h]r/hXBuilder Priority Functionsr/r /}r!/(hj/h j/ubaubj)r"/}r#/(hUh j-jqja)h!jh}r$/(h]h]h]h]h]jn]r%/(j+XBuilders; priorityUindex-1r&/Utr'/ajB.uj!K[jj)h]ubj)r(/}r)/(hUh j-jqja)h!jh}r*/(h]h]h]h]h]jj&/uj!K\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 j-jqja)j}h!jh}r-/(h]h]h]h]r./j&/ah]uj!K]jj)j"}r//j&/j(/sh]r0/(hXThe r1/r2/}r3/(hXThe h j+/ubj))r4/}r5/(hX:bb:cfg:`prioritizeBuilders`r6/h j+/jqja)h!j-h}r7/(UreftypeXcfgj/j0XprioritizeBuildersU refdomainXbbr8/h]h]U refexplicith]h]h]j3jCuj!K]h]r9/j)r:/}r;/(hj6/h}r/eh]h]h]uh j4/h]r?/hXprioritizeBuildersr@/rA/}rB/(hUh j:/ubah!jubaubhXN configuration key specifies a function which is called with two arguments: a rC/rD/}rE/(hXN configuration key specifies a function which is called with two arguments: a h j+/ubj))rF/}rG/(hX:class:`BuildMaster`rH/h j+/jqja)h!j-h}rI/(UreftypeXclassj/j0X BuildMasterU refdomainXpyrJ/h]h]U refexplicith]h]h]j3jCj Nj Nuj!K]h]rK/j)rL/}rM/(hjH/h}rN/(h]h]rO/(j:jJ/Xpy-classrP/eh]h]h]uh jF/h]rQ/hX BuildMasterrR/rS/}rT/(hUh jL/ubah!jubaubhX and a list of rU/rV/}rW/(hX and a list of h j+/ubj))rX/}rY/(hX:class:`Builder`rZ/h j+/jqja)h!j-h}r[/(UreftypeXclassj/j0XBuilderU refdomainXpyr\/h]h]U refexplicith]h]h]j3jCj Nj Nuj!K]h]r]/j)r^/}r_/(hjZ/h}r`/(h]h]ra/(j:j\/Xpy-classrb/eh]h]h]uh jX/h]rc/hXBuilderrd/re/}rf/(hUh j^/ubah!jubaubhX/ objects. It should return a list of the same rg/rh/}ri/(hX/ objects. It should return a list of the same h j+/ubj))rj/}rk/(hX:class:`Builder`rl/h j+/jqja)h!j-h}rm/(UreftypeXclassj/j0XBuilderU refdomainXpyrn/h]h]U refexplicith]h]h]j3jCj Nj Nuj!K]h]ro/j)rp/}rq/(hjl/h}rr/(h]h]rs/(j:jn/Xpy-classrt/eh]h]h]uh jj/h]ru/hXBuilderrv/rw/}rx/(hUh jp/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 ry/rz/}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 j-jqja)h!jh}r/(h]h]h]h]h]uj!Kdjj)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/ubeubjM)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 j-jqja)h!jPh}r/(jTjUh]h]h]h]h]uj!Kfjj)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 j-jqja)h!jh}r/(h]h]h]h]h]jn]r/(j+XBuilds; priorityUindex-2r/Utr/ajB.uj!Ktjj)h]ubj)r/}r/(hUh j-jqja)h!jh}r/(h]h]h]h]h]jj/uj!Kujj)h]ubj-eubjqja)j}h!jh}r/(h]h]h]h]h]jjuj!Kvjj)j"}r/j/j/sh]ubsh!j;h}r/(h]h]h]h]r/(jj/j)eh]r/(j)jeuj!Kyjj)j"}r/(jj-j/j/uh]r/(h)r/}r/(hXBuild Priority Functionsr/h j-jqja)h!h"h}r/(h]h]h]h]h]uj!Kyjj)h]r/hXBuild Priority Functionsr/r/}r/(hj/h j/ubaubj)r/}r/(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 j-jqja)h!jh}r/(h]h]h]h]h]uj!K{jj)h]r/(hX>When a builder has multiple pending build requests, it uses a r/r/}r/(hX>When a builder has multiple pending build requests, it uses a h j/ubj)r/}r/(hX ``nextBuild``h}r/(h]h]h]h]h]uh j/h]r/hX nextBuildr/r/}r/(hUh j/ubah!jubhXc function to decide which build it should start first. This function is given two parameters: the r/r/}r/(hXc function to decide which build it should start first. This function is given two parameters: the h j/ubj))r/}r/(hX:class:`Builder`r/h j/jqja)h!j-h}r/(UreftypeXclassj/j0XBuilderU refdomainXpyr/h]h]U refexplicith]h]h]j3jCj Nj Nuj!K{h]r/j)r/}r/(hj/h}r/(h]h]r/(j:j/Xpy-classr/eh]h]h]uh j/h]r/hXBuilderr/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:`BuildRequest`r/h j/jqja)h!j-h}r/(UreftypeXclassj/j0X BuildRequestU refdomainXpyr/h]h]U refexplicith]h]h]j3jCj Nj Nuj!K{h]r/j)r/}r/(hj/h}r/(h]h]r/(j:j/Xpy-classr/eh]h]h]uh j/h]r/hX BuildRequestr/r/}r/(hUh j/ubah!jubaubhX- objects representing pending build requests.r/r/}r/(hX- objects representing pending build requests.h j/ubeubj)r/}r/(hXWA simple function to prioritize release builds over other builds might look like this::h j-jqja)h!jh}r/(h]h]h]h]h]uj!Kjj)h]r/hXVA simple function to prioritize release builds over other builds might look like this:r/r/}r/(hXVA simple function to prioritize release builds over other builds might look like this:h j/ubaubjM)r/}r/(hXdef nextBuild(bldr, requests): for r in requests: if r.source.branch == 'release': return r return requests[0]h j-jqja)h!jPh}r/(jTjUh]h]h]h]h]uj!Kjj)h]r/hXdef nextBuild(bldr, requests): for r in requests: if r.source.branch == 'release': return r return requests[0]r/r/}r/(hUh j/ubaubj)r/}r/(hXhIf some non-immediate result must be calculated, the ``nextBuild`` function can also return a Deferred::h j-jqja)h!jh}r/(h]h]h]h]h]uj!Kjj)h]r/(hX5If some non-immediate result must be calculated, the r/r/}r/(hX5If some non-immediate result must be calculated, the h j/ubj)r0}r0(hX ``nextBuild``h}r0(h]h]h]h]h]uh j/h]r0hX nextBuildr0r0}r0(hUh j0ubah!jubhX% function can also return a Deferred:r0r0}r 0(hX% function can also return a Deferred:h j/ubeubjM)r 0}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 j-jqja)h!jPh}r 0(jTjUh]h]h]h]h]uj!Kjj)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 dr0r0}r0(hUh j 0ubaubj)r0}r0(hX.. _Customizing-SVNPoller:h j-jqja)h!jh}r0(h]h]h]h]h]jj'uj!Kjj)h]ubeubj)j)r0}r0(hUh j)jqja)j}h!j;h}r0(h]h]h]h]r0(j)Uindex-4r0eh]r0j)auj!MJjj)j"}r0j0j)r0}r0(hUh j)r0}r0(hUh j)jqja)h!j;h}r0(h]h]h]h]r 0j)ah]r!0j)auj!M3jj)h]r"0(h)r#0}r$0(hXUsing Propertiesr%0h j0jqja)h!h"h}r&0(h]h]h]h]h]uj!M3jj)h]r'0hXUsing Propertiesr(0r)0}r*0(hj%0h j#0ubaubj)r+0}r,0(hXIn custom :class:`BuildSteps`, you can get and set the build properties with the :meth:`getProperty`/:meth:`setProperty` methods. Each takes a string for the name of the property, and returns or accepts an arbitrary object. For example::h j0jqja)h!jh}r-0(h]h]h]h]h]uj!M5jj)h]r.0(hX In custom r/0r00}r10(hX In custom h j+0ubj))r20}r30(hX:class:`BuildSteps`r40h j+0jqja)h!j-h}r50(UreftypeXclassj/j0X BuildStepsU refdomainXpyr60h]h]U refexplicith]h]h]j3jCj Nj Nuj!M5h]r70j)r80}r90(hj40h}r:0(h]h]r;0(j:j60Xpy-classr<0eh]h]h]uh j20h]r=0hX BuildStepsr>0r?0}r@0(hUh j80ubah!jubaubhX4, you can get and set the build properties with the rA0rB0}rC0(hX4, you can get and set the build properties with the h j+0ubj))rD0}rE0(hX:meth:`getProperty`rF0h j+0jqja)h!j-h}rG0(UreftypeXmethj/j0X getPropertyU refdomainXpyrH0h]h]U refexplicith]h]h]j3jCj Nj Nuj!M5h]rI0j)rJ0}rK0(hjF0h}rL0(h]h]rM0(j:jH0Xpy-methrN0eh]h]h]uh jD0h]rO0hX getPropertyrP0rQ0}rR0(hUh jJ0ubah!jubaubhX/rS0}rT0(hX/h j+0ubj))rU0}rV0(hX:meth:`setProperty`rW0h j+0jqja)h!j-h}rX0(UreftypeXmethj/j0X setPropertyU refdomainXpyrY0h]h]U refexplicith]h]h]j3jCj Nj Nuj!M5h]rZ0j)r[0}r\0(hjW0h}r]0(h]h]r^0(j:jY0Xpy-methr_0eh]h]h]uh jU0h]r`0hX setPropertyra0rb0}rc0(hUh j[0ubah!jubaubhXt methods. Each takes a string for the name of the property, and returns or accepts an arbitrary object. For example:rd0re0}rf0(hXt methods. Each takes a string for the name of the property, and returns or accepts an arbitrary object. For example:h j+0ubeubjM)rg0}rh0(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 j0jqja)h!jPh}ri0(jTjUh]h]h]h]h]uj!M:jj)h]rj0hXclass 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)rk0rl0}rm0(hUh jg0ubaubj)rn0}ro0(hXRemember 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 ``start`` method begins.h j0jqja)h!jh}rp0(h]h]h]h]h]uj!MBjj)h]rq0(hXlRemember that properties set in a step may not be available until the next step begins. In particular, any rr0rs0}rt0(hXlRemember that properties set in a step may not be available until the next step begins. In particular, any h jn0ubj))ru0}rv0(hX:class:`Property`rw0h jn0jqja)h!j-h}rx0(UreftypeXclassj/j0XPropertyU refdomainXpyry0h]h]U refexplicith]h]h]j3jCj Nj Nuj!MBh]rz0j)r{0}r|0(hjw0h}r}0(h]h]r~0(j:jy0Xpy-classr0eh]h]h]uh ju0h]r0hXPropertyr0r0}r0(hUh j{0ubah!jubaubhX or r0r0}r0(hX or h jn0ubj))r0}r0(hX:class:`Interpolate`r0h jn0jqja)h!j-h}r0(UreftypeXclassj/j0X InterpolateU refdomainXpyr0h]h]U refexplicith]h]h]j3jCj Nj Nuj!MBh]r0j)r0}r0(hj0h}r0(h]h]r0(j:j0Xpy-classr0eh]h]h]uh j0h]r0hX Interpolater0r0}r0(hUh j0ubah!jubaubhX< instances for the current step are interpolated before the r0r0}r0(hX< instances for the current step are interpolated before the h jn0ubj)r0}r0(hX ``start``h}r0(h]h]h]h]h]uh jn0h]r0hXstartr0r0}r0(hUh j0ubah!jubhX method begins.r0r0}r0(hX method begins.h jn0ubeubj)r0}r0(hUh j0jqja)h!jh}r0(h]h]h]h]h]jn]r0((j+Xlinksj0Utr0(j+XBuildStep URLsj0Utr0(j+XaddURLj0Utr0ejB.uj!MGjj)h]ubj0eubjqja)h!jh}r0(h]h]h]h]h]jj0uj!MHjj)h]ubsh]r0(h)r0}r0(hXBuildStep URLsr0h j0jqja)h!h"h}r0(h]h]h]h]h]uj!MJjj)h]r0hXBuildStep URLsr0r0}r0(hj0h j0ubaubj)r0}r0(hXQEach BuildStep has a collection of `links`. Like its collection of LogFiles, each link has a name and a target URL. The web status page creates HREFs for each link in the same box as it does for LogFiles, except that the target of the link is the external URL instead of an internal link to a page that shows the contents of the LogFile.h j0jqja)h!jh}r0(h]h]h]h]h]uj!MLjj)h]r0(hX#Each BuildStep has a collection of r0r0}r0(hX#Each BuildStep has a collection of h j0ubj)r0}r0(hX`links`h}r0(h]h]h]h]h]uh j0h]r0hXlinksr0r0}r0(hUh j0ubah!jubhX'. Like its collection of LogFiles, each link has a name and a target URL. The web status page creates HREFs for each link in the same box as it does for LogFiles, except that the target of the link is the external URL instead of an internal link to a page that shows the contents of the LogFile.r0r0}r0(hX'. Like its collection of LogFiles, each link has a name and a target URL. The web status page creates HREFs for each link in the same box as it does for LogFiles, except that the target of the link is the external URL instead of an internal link to a page that shows the contents of the LogFile.h j0ubeubj)r0}r0(hXThese external links can be used to point at build information hosted on other servers. For example, the test process might produce an intricate description of which tests passed and failed, or some sort of code coverage data in HTML form, or a PNG or GIF image with a graph of memory usage over time. The external link can provide an easy way for users to navigate from the buildbot's status page to these external web sites or file servers. Note that the step itself is responsible for insuring that there will be a document available at the given URL (perhaps by using :command:`scp` to copy the HTML output to a :file:`~/public_html/` directory on a remote web server). Calling :meth:`addURL` does not magically populate a web server.h j0jqja)h!jh}r0(h]h]h]h]h]uj!MRjj)h]r0(hX<These external links can be used to point at build information hosted on other servers. For example, the test process might produce an intricate description of which tests passed and failed, or some sort of code coverage data in HTML form, or a PNG or GIF image with a graph of memory usage over time. The external link can provide an easy way for users to navigate from the buildbot's status page to these external web sites or file servers. Note that the step itself is responsible for insuring that there will be a document available at the given URL (perhaps by using r0r0}r0(hX<These external links can be used to point at build information hosted on other servers. For example, the test process might produce an intricate description of which tests passed and failed, or some sort of code coverage data in HTML form, or a PNG or GIF image with a graph of memory usage over time. The external link can provide an easy way for users to navigate from the buildbot's status page to these external web sites or file servers. Note that the step itself is responsible for insuring that there will be a document available at the given URL (perhaps by using h j0ubj)r0}r0(hX:command:`scp`h}r0(h]h]r0jah]h]h]uh j0h]r0hXscpr0r0}r0(hUh j0ubah!jubhX to copy the HTML output to a r0r0}r0(hX to copy the HTML output to a h j0ubj)r0}r0(hUh}r0(h]h]h]h]r0Xfiler0aUrolej0h]uh j0h]r0hX~/public_html/r0r0}r0(hX~/public_html/h j0ubah!jubhX, directory on a remote web server). Calling r0r0}r0(hX, directory on a remote web server). Calling h j0ubj))r0}r0(hX:meth:`addURL`r0h j0jqja)h!j-h}r0(UreftypeXmethj/j0XaddURLU refdomainXpyr0h]h]U refexplicith]h]h]j3jCj Nj Nuj!MRh]r0j)r0}r0(hj0h}r0(h]h]r0(j:j0Xpy-methr0eh]h]h]uh j0h]r0hXaddURLr0r0}r0(hUh j0ubah!jubaubhX* does not magically populate a web server.r0r0}r0(hX* does not magically populate a web server.h j0ubeubj)r0}r0(hXTo set one of these links, the :class:`BuildStep` should call the :meth:`addURL` method with the name of the link and the target URL. Multiple URLs can be set.h j0jqja)h!jh}r0(h]h]h]h]h]uj!M^jj)h]r0(hXTo set one of these links, the r0r0}r0(hXTo set one of these links, the h j0ubj))r0}r0(hX:class:`BuildStep`r0h j0jqja)h!j-h}r0(UreftypeXclassj/j0X BuildStepU refdomainXpyr1h]h]U refexplicith]h]h]j3jCj Nj Nuj!M^h]r1j)r1}r1(hj0h}r1(h]h]r1(j:j1Xpy-classr1eh]h]h]uh j0h]r1hX BuildStepr1r 1}r 1(hUh j1ubah!jubaubhX should call the r 1r 1}r 1(hX should call the h j0ubj))r1}r1(hX:meth:`addURL`r1h j0jqja)h!j-h}r1(UreftypeXmethj/j0XaddURLU refdomainXpyr1h]h]U refexplicith]h]h]j3jCj Nj Nuj!M^h]r1j)r1}r1(hj1h}r1(h]h]r1(j:j1Xpy-methr1eh]h]h]uh j1h]r1hXaddURLr1r1}r1(hUh j1ubah!jubaubhXO method with the name of the link and the target URL. Multiple URLs can be set.r1r1}r1(hXO method with the name of the link and the target URL. Multiple URLs can be set.h j0ubeubj)r 1}r!1(hXIn this example, we assume that the ``make test`` command causes a collection of HTML files to be created and put somewhere on the coverage.example.org web server, in a filename that incorporates the build number. ::h j0jqja)h!jh}r"1(h]h]h]h]h]uj!Mbjj)h]r#1(hX$In this example, we assume that the r$1r%1}r&1(hX$In this example, we assume that the h j 1ubj)r'1}r(1(hX ``make test``h}r)1(h]h]h]h]h]uh j 1h]r*1hX make testr+1r,1}r-1(hUh j'1ubah!jubhX command causes a collection of HTML files to be created and put somewhere on the coverage.example.org web server, in a filename that incorporates the build number.r.1r/1}r01(hX command causes a collection of HTML files to be created and put somewhere on the coverage.example.org web server, in a filename that incorporates the build number.h j 1ubeubjM)r11}r21(hXIclass TestWithCodeCoverage(BuildStep): command = ["make", "test", Interpolate("buildnum=%(prop:buildnumber)s")] def createSummary(self, log): buildnumber = self.getProperty("buildnumber") url = "http://coverage.example.org/builds/%s.html" % buildnumber self.addURL("coverage", url)h j0jqja)h!jPh}r31(jTjUh]h]h]h]h]uj!Mgjj)h]r41hXIclass TestWithCodeCoverage(BuildStep): command = ["make", "test", Interpolate("buildnum=%(prop:buildnumber)s")] def createSummary(self, log): buildnumber = self.getProperty("buildnumber") url = "http://coverage.example.org/builds/%s.html" % buildnumber self.addURL("coverage", url)r51r61}r71(hUh j11ubaubj)r81}r91(hXeYou might also want to extract the URL from some special message output by the build process itself::h j0jqja)h!jh}r:1(h]h]h]h]h]uj!Mpjj)h]r;1hXdYou might also want to extract the URL from some special message output by the build process itself:r<1r=1}r>1(hXdYou might also want to extract the URL from some special message output by the build process itself:h j81ubaubjM)r?1}r@1(hXclass TestWithCodeCoverage(BuildStep): command = ["make", "test", Interpolate("buildnum=%(prop:buildnumber)s")] def createSummary(self, log): output = StringIO(log.getText()) for line in output.readlines(): if line.startswith("coverage-url:"): url = line[len("coverage-url:"):].strip() self.addURL("coverage", url) returnh j0jqja)h!jPh}rA1(jTjUh]h]h]h]h]uj!Msjj)h]rB1hXclass TestWithCodeCoverage(BuildStep): command = ["make", "test", Interpolate("buildnum=%(prop:buildnumber)s")] def createSummary(self, log): output = StringIO(log.getText()) for line in output.readlines(): if line.startswith("coverage-url:"): url = line[len("coverage-url:"):].strip() self.addURL("coverage", url) returnrC1rD1}rE1(hUh j?1ubaubj)rF1}rG1(hXNote that a build process which emits both :file:`stdout` and :file:`stderr` might cause this line to be split or interleaved between other lines. It might be necessary to restrict the :meth:`getText()` call to only stdout with something like this::h j0jqja)h!jh}rH1(h]h]h]h]h]uj!Mjj)h]rI1(hX+Note that a build process which emits both rJ1rK1}rL1(hX+Note that a build process which emits both h jF1ubj)rM1}rN1(hUh}rO1(h]h]h]h]rP1XfilerQ1aUrolejQ1h]uh jF1h]rR1hXstdoutrS1rT1}rU1(hXstdouth jM1ubah!jubhX and rV1rW1}rX1(hX and h jF1ubj)rY1}rZ1(hUh}r[1(h]h]h]h]r\1Xfiler]1aUrolej]1h]uh jF1h]r^1hXstderrr_1r`1}ra1(hXstderrh jY1ubah!jubhXm might cause this line to be split or interleaved between other lines. It might be necessary to restrict the rb1rc1}rd1(hXm might cause this line to be split or interleaved between other lines. It might be necessary to restrict the h jF1ubj))re1}rf1(hX:meth:`getText()`rg1h jF1jqja)h!j-h}rh1(UreftypeXmethj/j0XgetTextU refdomainXpyri1h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rj1j)rk1}rl1(hjg1h}rm1(h]h]rn1(j:ji1Xpy-methro1eh]h]h]uh je1h]rp1hXgetTextrq1rr1}rs1(hUh jk1ubah!jubaubhX. call to only stdout with something like this:rt1ru1}rv1(hX. call to only stdout with something like this:h jF1ubeubjM)rw1}rx1(hXoutput = StringIO("".join([c[1] for c in log.getChunks() if c[0] == LOG_CHANNEL_STDOUT]))h j0jqja)h!jPh}ry1(jTjUh]h]h]h]h]uj!Mjj)h]rz1hXoutput = StringIO("".join([c[1] for c in log.getChunks() if c[0] == LOG_CHANNEL_STDOUT]))r{1r|1}r}1(hUh jw1ubaubj)r~1}r1(hXOf course if the build is run under a PTY, then stdout and stderr will be merged before the buildbot ever sees them, so such interleaving will be unavoidable.r1h j0jqja)h!jh}r1(h]h]h]h]h]uj!Mjj)h]r1hXOf course if the build is run under a PTY, then stdout and stderr will be merged before the buildbot ever sees them, so such interleaving will be unavoidable.r1r1}r1(hj1h j~1ubaubj)r1}r1(hUh j0jqja)h!jh}r1(h]h]h]h]h]jUindex-5r1uj!Njj)h]ubjw)r1}r1(hX7Step Progress BuildStepFailed Running Multiple Commandsr1h j0jqja)j}h!jh}r1(h]h]r1Uadmonition-todor1ah]h]r1j1ah]uj!Mjj)j"}r1j1j1sh]r1(h)r1}r1(hXTodor1h}r1(h]h]h]h]h]uh j1h]r1hXTodor1r1}r1(hj1h j1ubah!h"ubj)r1}r1(hX7Step Progress BuildStepFailed Running Multiple Commandsr1h j1jqja)h!jh}r1(h]h]h]h]h]uj!Mh]r1hX7Step Progress BuildStepFailed Running Multiple Commandsr1r1}r1(hj1h j1ubaubeubeubj)j)r1}r1(hUh j)jqja)h!j;h}r1(h]h]h]h]r1j)ah]r1j)auj!Mjj)h]r1(h)r1}r1(hXReading Logfilesr1h j1jqja)h!h"h}r1(h]h]h]h]h]uj!Mjj)h]r1hXReading Logfilesr1r1}r1(hj1h j1ubaubj)r1}r1(hXOnce a :class:`~buildbot.status.logfile.LogFile` has been added to a :class:`~buildbot.process.buildstep.BuildStep` with :meth:`~buildbot.process.buildstep.BuildStep.addLog()`, :meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog()`, :meth:`~buildbot.process.buildstep.BuildStep.addHTMLLog()`, or ``logfiles={}``, your :class:`~buildbot.process.buildstep.BuildStep.BuildStep` can retrieve it by using :meth:`~buildbot.process.buildstep.BuildStep.getLog()`::h j1jqja)h!jh}r1(h]h]h]h]h]uj!Mjj)h]r1(hXOnce a r1r1}r1(hXOnce a h j1ubj))r1}r1(hX):class:`~buildbot.status.logfile.LogFile`r1h j1jqja)h!j-h}r1(UreftypeXclassj/j0Xbuildbot.status.logfile.LogFileU refdomainXpyr1h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r1j)r1}r1(hj1h}r1(h]h]r1(j:j1Xpy-classr1eh]h]h]uh j1h]r1hXLogFiler1r1}r1(hUh j1ubah!jubaubhX has been added to a r1r1}r1(hX has been added to a h j1ubj))r1}r1(hX.:class:`~buildbot.process.buildstep.BuildStep`r1h j1jqja)h!j-h}r1(UreftypeXclassj/j0X$buildbot.process.buildstep.BuildStepU refdomainXpyr1h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r1j)r1}r1(hj1h}r1(h]h]r1(j:j1Xpy-classr1eh]h]h]uh j1h]r1hX BuildStepr1r1}r1(hUh j1ubah!jubaubhX with r1r1}r1(hX with h j1ubj))r1}r1(hX6:meth:`~buildbot.process.buildstep.BuildStep.addLog()`r1h j1jqja)h!j-h}r1(UreftypeXmethj/j0X+buildbot.process.buildstep.BuildStep.addLogU refdomainXpyr1h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r1j)r1}r1(hj1h}r1(h]h]r1(j:j1Xpy-methr1eh]h]h]uh j1h]r1hXaddLogr1r1}r1(hUh j1ubah!jubaubhX, r1r1}r1(hX, h j1ubj))r1}r1(hX>:meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog()`r1h j1jqja)h!j-h}r1(UreftypeXmethj/j0X3buildbot.process.buildstep.BuildStep.addCompleteLogU refdomainXpyr1h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r1j)r1}r1(hj1h}r1(h]h]r1(j:j1Xpy-methr1eh]h]h]uh j1h]r1hXaddCompleteLogr1r1}r1(hUh j1ubah!jubaubhX, r1r1}r1(hX, h j1ubj))r2}r2(hX::meth:`~buildbot.process.buildstep.BuildStep.addHTMLLog()`r2h j1jqja)h!j-h}r2(UreftypeXmethj/j0X/buildbot.process.buildstep.BuildStep.addHTMLLogU refdomainXpyr2h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r2j)r2}r2(hj2h}r2(h]h]r 2(j:j2Xpy-methr 2eh]h]h]uh j2h]r 2hX addHTMLLogr 2r 2}r2(hUh j2ubah!jubaubhX, or r2r2}r2(hX, or h j1ubj)r2}r2(hX``logfiles={}``h}r2(h]h]h]h]h]uh j1h]r2hX logfiles={}r2r2}r2(hUh j2ubah!jubhX, your r2r2}r2(hX, your h j1ubj))r2}r2(hX8:class:`~buildbot.process.buildstep.BuildStep.BuildStep`r2h j1jqja)h!j-h}r2(UreftypeXclassj/j0X.buildbot.process.buildstep.BuildStep.BuildStepU refdomainXpyr 2h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r!2j)r"2}r#2(hj2h}r$2(h]h]r%2(j:j 2Xpy-classr&2eh]h]h]uh j2h]r'2hX BuildStepr(2r)2}r*2(hUh j"2ubah!jubaubhX can retrieve it by using r+2r,2}r-2(hX can retrieve it by using h j1ubj))r.2}r/2(hX6:meth:`~buildbot.process.buildstep.BuildStep.getLog()`r02h j1jqja)h!j-h}r12(UreftypeXmethj/j0X+buildbot.process.buildstep.BuildStep.getLogU refdomainXpyr22h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r32j)r42}r52(hj02h}r62(h]h]r72(j:j22Xpy-methr82eh]h]h]uh j.2h]r92hXgetLogr:2r;2}r<2(hUh j42ubah!jubaubhX:r=2}r>2(hX:h j1ubeubjM)r?2}r@2(hXclass MyBuildStep(ShellCommand): logfiles = @{ "nodelog": "_test/node.log" @} def evaluateCommand(self, cmd): nodelog = self.getLog("nodelog") if "STARTED" in nodelog.getText(): return SUCCESS else: return FAILUREh j1jqja)h!jPh}rA2(jTjUh]h]h]h]h]uj!Mjj)h]rB2hXclass MyBuildStep(ShellCommand): logfiles = @{ "nodelog": "_test/node.log" @} def evaluateCommand(self, cmd): nodelog = self.getLog("nodelog") if "STARTED" in nodelog.getText(): return SUCCESS else: return FAILURErC2rD2}rE2(hUh j?2ubaubj)rF2}rG2(hX.. _Adding-LogObservers:h j1jqja)h!jh}rH2(h]h]h]h]h]jjuj!Mjj)h]ubeubj)j)rI2}rJ2(hUh j)rK2}rL2(hUh j)jqja)h!j;h}rM2(h]h]h]h]rN2j)ah]rO2j)auj!M_jj)h]rP2(h)rQ2}rR2(hXCapturing LogfilesrS2h jK2jqja)h!h"h}rT2(h]h]h]h]h]uj!M_jj)h]rU2hXCapturing LogfilesrV2rW2}rX2(hjS2h jQ2ubaubj)rY2}rZ2(hXcEach BuildStep has a collection of `logfiles`. Each one has a short name, like `stdio` or `warnings`. Each :class:`LogFile` 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 jK2jqja)h!jh}r[2(h]h]h]h]h]uj!Majj)h]r\2(hX#Each BuildStep has a collection of r]2r^2}r_2(hX#Each BuildStep has a collection of h jY2ubj)r`2}ra2(hX `logfiles`h}rb2(h]h]h]h]h]uh jY2h]rc2hXlogfilesrd2re2}rf2(hUh j`2ubah!jubhX". Each one has a short name, like rg2rh2}ri2(hX". Each one has a short name, like h jY2ubj)rj2}rk2(hX`stdio`h}rl2(h]h]h]h]h]uh jY2h]rm2hXstdiorn2ro2}rp2(hUh jj2ubah!jubhX or rq2rr2}rs2(hX or h jY2ubj)rt2}ru2(hX `warnings`h}rv2(h]h]h]h]h]uh jY2h]rw2hXwarningsrx2ry2}rz2(hUh jt2ubah!jubhX. Each r{2r|2}r}2(hX. Each h jY2ubj))r~2}r2(hX:class:`LogFile`r2h jY2jqja)h!j-h}r2(UreftypeXclassj/j0XLogFileU refdomainXpyr2h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mah]r2j)r2}r2(hj2h}r2(h]h]r2(j:j2Xpy-classr2eh]h]h]uh j~2h]r2hXLogFiler2r2}r2(hUh j2ubah!jubaubhX 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 r2r2}r2(hX 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 jY2ubj)r2}r2(hUh}r2(h]h]h]h]r2Xfiler2aUrolej2h]uh jY2h]r2hXstdoutr2r2}r2(hXstdouth j2ubah!jubhX/r2}r2(hX/h jY2ubj)r2}r2(hUh}r2(h]h]h]h]r2Xfiler2aUrolej2h]uh jY2h]r2hXstderrr2r2}r2(hXstderrh j2ubah!jubhX& during the execution of some command.r2r2}r2(hX& during the execution of some command.h jY2ubeubj)r2}r2(hXLThese :class:`LogFile`\s are stored to disk, so they can be retrieved later.h jK2jqja)h!jh}r2(h]h]h]h]h]uj!Mgjj)h]r2(hXThese r2r2}r2(hXThese h j2ubj))r2}r2(hX:class:`LogFile`r2h j2jqja)h!j-h}r2(UreftypeXclassj/j0XLogFileU refdomainXpyr2h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mgh]r2j)r2}r2(hj2h}r2(h]h]r2(j:j2Xpy-classr2eh]h]h]uh j2h]r2hXLogFiler2r2}r2(hUh j2ubah!jubaubhX5s are stored to disk, so they can be retrieved later.r2r2}r2(hX6\s are stored to disk, so they can be retrieved later.h j2ubeubj)r2}r2(hX Each can contain multiple `channels`, generally limited to three basic ones: stdout, stderr, and `headers`. For example, when a ShellCommand 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 jK2jqja)h!jh}r2(h]h]h]h]h]uj!Mijj)h]r2(hXEach can contain multiple r2r2}r2(hXEach can contain multiple h j2ubj)r2}r2(hX `channels`h}r2(h]h]h]h]h]uh j2h]r2hXchannelsr2r2}r2(hUh j2ubah!jubhX=, generally limited to three basic ones: stdout, stderr, and r2r2}r2(hX=, generally limited to three basic ones: stdout, stderr, and h j2ubj)r2}r2(hX `headers`h}r2(h]h]h]h]h]uh j2h]r2hXheadersr2r2}r2(hUh j2ubah!jubhXF. For example, when a ShellCommand runs, it writes a few lines to the r2r2}r2(hXF. For example, when a ShellCommand runs, it writes a few lines to the h j2ubj)r2}r2(hX `headers`h}r2(h]h]h]h]h]uh j2h]r2hXheadersr2r2}r2(hUh j2ubah!jubhX 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 r2r2}r2(hX 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 j2ubj)r2}r2(hUh}r2(h]h]h]h]r2Xfiler2aUrolej2h]uh j2h]r2hXstdoutr2r2}r2(hXstdouth j2ubah!jubhX and r2r2}r2(hX and h j2ubj)r2}r2(hUh}r2(h]h]h]h]r2Xfiler2aUrolej2h]uh j2h]r2hXstderrr2r2}r2(hXstderrh j2ubah!jubhX. messages. When the command finishes, a final r2r2}r2(hX. messages. When the command finishes, a final h j2ubj)r2}r2(hX`header`h}r2(h]h]h]h]h]uh j2h]r3hXheaderr3r3}r3(hUh j2ubah!jubhX1 line is added with the exit code of the process.r3r3}r3(hX1 line is added with the exit code of the process.h j2ubeubj)r3}r3(hXStatus display plugins can format these different channels in different ways. For example, the web page shows LogFiles 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 jK2jqja)h!jh}r 3(h]h]h]h]h]uj!Mrjj)h]r 3(hXStatus display plugins can format these different channels in different ways. For example, the web page shows LogFiles 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 3r 3}r 3(hXStatus display plugins can format these different channels in different ways. For example, the web page shows LogFiles 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 j3ubj)r3}r3(hX:command:`grep`h}r3(h]h]r3jah]h]h]uh j3h]r3hXgrepr3r3}r3(hUh j3ubah!jubhX or whatever against the output.r3r3}r3(hX or whatever against the output.h j3ubeubj)r3}r3(hX1Each :class:`BuildStep` contains a mapping (implemented in a Python dictionary) from :class:`LogFile` name to the actual :class:`LogFile` objects. Status plugins can get a list of LogFiles to display, for example, a list of HREF links that, when clicked, provide the full contents of the :class:`LogFile`.h jK2jqja)h!jh}r3(h]h]h]h]h]uj!M{jj)h]r3(hXEach r3r3}r3(hXEach h j3ubj))r 3}r!3(hX:class:`BuildStep`r"3h j3jqja)h!j-h}r#3(UreftypeXclassj/j0X BuildStepU refdomainXpyr$3h]h]U refexplicith]h]h]j3jCj Nj Nuj!M{h]r%3j)r&3}r'3(hj"3h}r(3(h]h]r)3(j:j$3Xpy-classr*3eh]h]h]uh j 3h]r+3hX BuildStepr,3r-3}r.3(hUh j&3ubah!jubaubhX> contains a mapping (implemented in a Python dictionary) from r/3r03}r13(hX> contains a mapping (implemented in a Python dictionary) from h j3ubj))r23}r33(hX:class:`LogFile`r43h j3jqja)h!j-h}r53(UreftypeXclassj/j0XLogFileU refdomainXpyr63h]h]U refexplicith]h]h]j3jCj Nj Nuj!M{h]r73j)r83}r93(hj43h}r:3(h]h]r;3(j:j63Xpy-classr<3eh]h]h]uh j23h]r=3hXLogFiler>3r?3}r@3(hUh j83ubah!jubaubhX name to the actual rA3rB3}rC3(hX name to the actual h j3ubj))rD3}rE3(hX:class:`LogFile`rF3h j3jqja)h!j-h}rG3(UreftypeXclassj/j0XLogFileU refdomainXpyrH3h]h]U refexplicith]h]h]j3jCj Nj Nuj!M{h]rI3j)rJ3}rK3(hjF3h}rL3(h]h]rM3(j:jH3Xpy-classrN3eh]h]h]uh jD3h]rO3hXLogFilerP3rQ3}rR3(hUh jJ3ubah!jubaubhX objects. Status plugins can get a list of LogFiles to display, for example, a list of HREF links that, when clicked, provide the full contents of the rS3rT3}rU3(hX objects. Status plugins can get a list of LogFiles to display, for example, a list of HREF links that, when clicked, provide the full contents of the h j3ubj))rV3}rW3(hX:class:`LogFile`rX3h j3jqja)h!j-h}rY3(UreftypeXclassj/j0XLogFileU refdomainXpyrZ3h]h]U refexplicith]h]h]j3jCj Nj Nuj!M{h]r[3j)r\3}r]3(hjX3h}r^3(h]h]r_3(j:jZ3Xpy-classr`3eh]h]h]uh jV3h]ra3hXLogFilerb3rc3}rd3(hUh j\3ubah!jubaubhX.re3}rf3(hX.h j3ubeubjI2eubjqja)h!j;h}rg3(h]h]h]h]rh3j)ah]ri3j)auj!Mjj)h]rj3(h)rk3}rl3(hX#Using LogFiles in custom BuildStepsrm3h jI2jqja)h!h"h}rn3(h]h]h]h]h]uj!Mjj)h]ro3hX#Using LogFiles in custom BuildStepsrp3rq3}rr3(hjm3h jk3ubaubj)rs3}rt3(hXnThe most common way for a custom :class:`BuildStep` to use a :class:`LogFile` is to summarize the results of a :bb:step:`ShellCommand` (after the command has finished running). For example, a compile step with thousands of lines of output might want to create a summary of just the warning messages. If you were doing this from a shell, you would use something like:h jI2jqja)h!jh}ru3(h]h]h]h]h]uj!Mjj)h]rv3(hX!The most common way for a custom rw3rx3}ry3(hX!The most common way for a custom h js3ubj))rz3}r{3(hX:class:`BuildStep`r|3h js3jqja)h!j-h}r}3(UreftypeXclassj/j0X BuildStepU refdomainXpyr~3h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r3j)r3}r3(hj|3h}r3(h]h]r3(j:j~3Xpy-classr3eh]h]h]uh jz3h]r3hX BuildStepr3r3}r3(hUh j3ubah!jubaubhX to use a r3r3}r3(hX to use a h js3ubj))r3}r3(hX:class:`LogFile`r3h js3jqja)h!j-h}r3(UreftypeXclassj/j0XLogFileU refdomainXpyr3h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r3j)r3}r3(hj3h}r3(h]h]r3(j:j3Xpy-classr3eh]h]h]uh j3h]r3hXLogFiler3r3}r3(hUh j3ubah!jubaubhX" is to summarize the results of a r3r3}r3(hX" is to summarize the results of a h js3ubj))r3}r3(hX:bb:step:`ShellCommand`r3h js3jqja)h!j-h}r3(UreftypeXstepj/j0X ShellCommandU refdomainXbbr3h]h]U refexplicith]h]h]j3jCuj!Mh]r3j)r3}r3(hj3h}r3(h]h]r3(j:j3Xbb-stepr3eh]h]h]uh j3h]r3hX ShellCommandr3r3}r3(hUh j3ubah!jubaubhX (after the command has finished running). For example, a compile step with thousands of lines of output might want to create a summary of just the warning messages. If you were doing this from a shell, you would use something like:r3r3}r3(hX (after the command has finished running). For example, a compile step with thousands of lines of output might want to create a summary of just the warning messages. If you were doing this from a shell, you would use something like:h js3ubeubjM)r3}r3(hX(grep "warning:" output.log >warnings.logh jI2jqja)h!jPh}r3(jRjSXbashjTjUh]h]h]h]h]uj!Mjj)h]r3hX(grep "warning:" output.log >warnings.logr3r3}r3(hUh j3ubaubj)r3}r3(hXIn a custom BuildStep, you could instead create a ``warnings`` :class:`LogFile` that contained the same text. To do this, you would add code to your :meth:`createSummary` method that pulls lines from the main output log and creates a new :class:`LogFile` with the results::h jI2jqja)h!jh}r3(h]h]h]h]h]uj!Mjj)h]r3(hX2In a custom BuildStep, you could instead create a r3r3}r3(hX2In a custom BuildStep, you could instead create a h j3ubj)r3}r3(hX ``warnings``h}r3(h]h]h]h]h]uh j3h]r3hXwarningsr3r3}r3(hUh j3ubah!jubhX r3}r3(hX h j3ubj))r3}r3(hX:class:`LogFile`r3h j3jqja)h!j-h}r3(UreftypeXclassj/j0XLogFileU refdomainXpyr3h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r3j)r3}r3(hj3h}r3(h]h]r3(j:j3Xpy-classr3eh]h]h]uh j3h]r3hXLogFiler3r3}r3(hUh j3ubah!jubaubhXF that contained the same text. To do this, you would add code to your r3r3}r3(hXF that contained the same text. To do this, you would add code to your h j3ubj))r3}r3(hX:meth:`createSummary`r3h j3jqja)h!j-h}r3(UreftypeXmethj/j0X createSummaryU refdomainXpyr3h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r3j)r3}r3(hj3h}r3(h]h]r3(j:j3Xpy-methr3eh]h]h]uh j3h]r3hX createSummaryr3r3}r3(hUh j3ubah!jubaubhXD method that pulls lines from the main output log and creates a new r3r3}r3(hXD method that pulls lines from the main output log and creates a new h j3ubj))r3}r3(hX:class:`LogFile`r3h j3jqja)h!j-h}r3(UreftypeXclassj/j0XLogFileU refdomainXpyr3h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r3j)r3}r3(hj3h}r3(h]h]r3(j:j3Xpy-classr3eh]h]h]uh j3h]r3hXLogFiler3r3}r3(hUh j3ubah!jubaubhX with the results:r3r3}r3(hX with the results:h j3ubeubjM)r3}r3(hXdef createSummary(self, log): warnings = [] sio = StringIO.StringIO(log.getText()) for line in sio.readlines(): if "warning:" in line: warnings.append() self.addCompleteLog('warnings', "".join(warnings))h jI2jqja)h!jPh}r3(jTjUh]h]h]h]h]uj!Mjj)h]r4hXdef createSummary(self, log): warnings = [] sio = StringIO.StringIO(log.getText()) for line in sio.readlines(): if "warning:" in line: warnings.append() self.addCompleteLog('warnings', "".join(warnings))r4r4}r4(hUh j3ubaubj)r4}r4(hXDThis example uses the :meth:`addCompleteLog` method, which creates a new :class:`LogFile`, puts some text in it, and then `closes` it, meaning that no further contents will be added. This :class:`LogFile` will appear in the HTML display under an HREF with the name `warnings`, since that is the name of the :class:`LogFile`.h jI2jqja)h!jh}r4(h]h]h]h]h]uj!Mjj)h]r4(hXThis example uses the r4r 4}r 4(hXThis example uses the h j4ubj))r 4}r 4(hX:meth:`addCompleteLog`r 4h j4jqja)h!j-h}r4(UreftypeXmethj/j0XaddCompleteLogU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj 4h}r4(h]h]r4(j:j4Xpy-methr4eh]h]h]uh j 4h]r4hXaddCompleteLogr4r4}r4(hUh j4ubah!jubaubhX method, which creates a new r4r4}r4(hX method, which creates a new h j4ubj))r4}r4(hX:class:`LogFile`r4h j4jqja)h!j-h}r 4(UreftypeXclassj/j0XLogFileU refdomainXpyr!4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r"4j)r#4}r$4(hj4h}r%4(h]h]r&4(j:j!4Xpy-classr'4eh]h]h]uh j4h]r(4hXLogFiler)4r*4}r+4(hUh j#4ubah!jubaubhX!, puts some text in it, and then r,4r-4}r.4(hX!, puts some text in it, and then h j4ubj)r/4}r04(hX`closes`h}r14(h]h]h]h]h]uh j4h]r24hXclosesr34r44}r54(hUh j/4ubah!jubhX: it, meaning that no further contents will be added. This r64r74}r84(hX: it, meaning that no further contents will be added. This h j4ubj))r94}r:4(hX:class:`LogFile`r;4h j4jqja)h!j-h}r<4(UreftypeXclassj/j0XLogFileU refdomainXpyr=4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r>4j)r?4}r@4(hj;4h}rA4(h]h]rB4(j:j=4Xpy-classrC4eh]h]h]uh j94h]rD4hXLogFilerE4rF4}rG4(hUh j?4ubah!jubaubhX= will appear in the HTML display under an HREF with the name rH4rI4}rJ4(hX= will appear in the HTML display under an HREF with the name h j4ubj)rK4}rL4(hX `warnings`h}rM4(h]h]h]h]h]uh j4h]rN4hXwarningsrO4rP4}rQ4(hUh jK4ubah!jubhX , since that is the name of the rR4rS4}rT4(hX , since that is the name of the h j4ubj))rU4}rV4(hX:class:`LogFile`rW4h j4jqja)h!j-h}rX4(UreftypeXclassj/j0XLogFileU refdomainXpyrY4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rZ4j)r[4}r\4(hjW4h}r]4(h]h]r^4(j:jY4Xpy-classr_4eh]h]h]uh jU4h]r`4hXLogFilera4rb4}rc4(hUh j[4ubah!jubaubhX.rd4}re4(hX.h j4ubeubj)rf4}rg4(hXYou can also use :meth:`addHTMLLog` to create a complete (closed) :class:`LogFile` that contains HTML instead of plain text. The normal :class:`LogFile` will be HTML-escaped if presented through a web page, but the HTML :class:`LogFile` will not. At the moment this is only used to present a pretty HTML representation of an otherwise ugly exception traceback when something goes badly wrong during the :class:`BuildStep`.h jI2jqja)h!jh}rh4(h]h]h]h]h]uj!Mjj)h]ri4(hXYou can also use rj4rk4}rl4(hXYou can also use h jf4ubj))rm4}rn4(hX:meth:`addHTMLLog`ro4h jf4jqja)h!j-h}rp4(UreftypeXmethj/j0X addHTMLLogU refdomainXpyrq4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rr4j)rs4}rt4(hjo4h}ru4(h]h]rv4(j:jq4Xpy-methrw4eh]h]h]uh jm4h]rx4hX addHTMLLogry4rz4}r{4(hUh js4ubah!jubaubhX to create a complete (closed) r|4r}4}r~4(hX to create a complete (closed) h jf4ubj))r4}r4(hX:class:`LogFile`r4h jf4jqja)h!j-h}r4(UreftypeXclassj/j0XLogFileU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj4h}r4(h]h]r4(j:j4Xpy-classr4eh]h]h]uh j4h]r4hXLogFiler4r4}r4(hUh j4ubah!jubaubhX6 that contains HTML instead of plain text. The normal r4r4}r4(hX6 that contains HTML instead of plain text. The normal h jf4ubj))r4}r4(hX:class:`LogFile`r4h jf4jqja)h!j-h}r4(UreftypeXclassj/j0XLogFileU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj4h}r4(h]h]r4(j:j4Xpy-classr4eh]h]h]uh j4h]r4hXLogFiler4r4}r4(hUh j4ubah!jubaubhXD will be HTML-escaped if presented through a web page, but the HTML r4r4}r4(hXD will be HTML-escaped if presented through a web page, but the HTML h jf4ubj))r4}r4(hX:class:`LogFile`r4h jf4jqja)h!j-h}r4(UreftypeXclassj/j0XLogFileU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj4h}r4(h]h]r4(j:j4Xpy-classr4eh]h]h]uh j4h]r4hXLogFiler4r4}r4(hUh j4ubah!jubaubhX will not. At the moment this is only used to present a pretty HTML representation of an otherwise ugly exception traceback when something goes badly wrong during the r4r4}r4(hX will not. At the moment this is only used to present a pretty HTML representation of an otherwise ugly exception traceback when something goes badly wrong during the h jf4ubj))r4}r4(hX:class:`BuildStep`r4h jf4jqja)h!j-h}r4(UreftypeXclassj/j0X BuildStepU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj4h}r4(h]h]r4(j:j4Xpy-classr4eh]h]h]uh j4h]r4hX BuildStepr4r4}r4(hUh j4ubah!jubaubhX.r4}r4(hX.h jf4ubeubj)r4}r4(hX_In contrast, you might want to create a new :class:`LogFile` at the beginning of the step, and add text to it as the command runs. You can create the :class:`LogFile` and attach it to the build by calling :meth:`addLog`, which returns the :class:`LogFile` object. You then add text to this :class:`LogFile` by calling methods like :meth:`addStdout` and :meth:`addHeader`. When you are done, you must call the :meth:`finish` method so the :class:`LogFile` can be closed. It may be useful to create and populate a :class:`LogFile` like this from a :class:`LogObserver` method - see :ref:`Adding-LogObservers`.h jI2jqja)h!jh}r4(h]h]h]h]h]uj!Mjj)h]r4(hX,In contrast, you might want to create a new r4r4}r4(hX,In contrast, you might want to create a new h j4ubj))r4}r4(hX:class:`LogFile`r4h j4jqja)h!j-h}r4(UreftypeXclassj/j0XLogFileU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj4h}r4(h]h]r4(j:j4Xpy-classr4eh]h]h]uh j4h]r4hXLogFiler4r4}r4(hUh j4ubah!jubaubhXZ at the beginning of the step, and add text to it as the command runs. You can create the r4r4}r4(hXZ at the beginning of the step, and add text to it as the command runs. You can create the h j4ubj))r4}r4(hX:class:`LogFile`r4h j4jqja)h!j-h}r4(UreftypeXclassj/j0XLogFileU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj4h}r4(h]h]r4(j:j4Xpy-classr4eh]h]h]uh j4h]r4hXLogFiler4r4}r4(hUh j4ubah!jubaubhX' and attach it to the build by calling r4r4}r4(hX' and attach it to the build by calling h j4ubj))r4}r4(hX:meth:`addLog`r4h j4jqja)h!j-h}r4(UreftypeXmethj/j0XaddLogU refdomainXpyr4h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r4j)r4}r4(hj4h}r4(h]h]r4(j:j4Xpy-methr4eh]h]h]uh j4h]r4hXaddLogr4r4}r4(hUh j4ubah!jubaubhX, which returns the r5r5}r5(hX, which returns the h j4ubj))r5}r5(hX:class:`LogFile`r5h j4jqja)h!j-h}r5(UreftypeXclassj/j0XLogFileU refdomainXpyr5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r5j)r 5}r 5(hj5h}r 5(h]h]r 5(j:j5Xpy-classr 5eh]h]h]uh j5h]r5hXLogFiler5r5}r5(hUh j 5ubah!jubaubhX# object. You then add text to this r5r5}r5(hX# object. You then add text to this h j4ubj))r5}r5(hX:class:`LogFile`r5h j4jqja)h!j-h}r5(UreftypeXclassj/j0XLogFileU refdomainXpyr5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r5j)r5}r5(hj5h}r5(h]h]r5(j:j5Xpy-classr5eh]h]h]uh j5h]r 5hXLogFiler!5r"5}r#5(hUh j5ubah!jubaubhX by calling methods like r$5r%5}r&5(hX by calling methods like h j4ubj))r'5}r(5(hX:meth:`addStdout`r)5h j4jqja)h!j-h}r*5(UreftypeXmethj/j0X addStdoutU refdomainXpyr+5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r,5j)r-5}r.5(hj)5h}r/5(h]h]r05(j:j+5Xpy-methr15eh]h]h]uh j'5h]r25hX addStdoutr35r45}r55(hUh j-5ubah!jubaubhX and r65r75}r85(hX and h j4ubj))r95}r:5(hX:meth:`addHeader`r;5h j4jqja)h!j-h}r<5(UreftypeXmethj/j0X addHeaderU refdomainXpyr=5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r>5j)r?5}r@5(hj;5h}rA5(h]h]rB5(j:j=5Xpy-methrC5eh]h]h]uh j95h]rD5hX addHeaderrE5rF5}rG5(hUh j?5ubah!jubaubhX'. When you are done, you must call the rH5rI5}rJ5(hX'. When you are done, you must call the h j4ubj))rK5}rL5(hX:meth:`finish`rM5h j4jqja)h!j-h}rN5(UreftypeXmethj/j0XfinishU refdomainXpyrO5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rP5j)rQ5}rR5(hjM5h}rS5(h]h]rT5(j:jO5Xpy-methrU5eh]h]h]uh jK5h]rV5hXfinishrW5rX5}rY5(hUh jQ5ubah!jubaubhX method so the rZ5r[5}r\5(hX method so the h j4ubj))r]5}r^5(hX:class:`LogFile`r_5h j4jqja)h!j-h}r`5(UreftypeXclassj/j0XLogFileU refdomainXpyra5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rb5j)rc5}rd5(hj_5h}re5(h]h]rf5(j:ja5Xpy-classrg5eh]h]h]uh j]5h]rh5hXLogFileri5rj5}rk5(hUh jc5ubah!jubaubhX: can be closed. It may be useful to create and populate a rl5rm5}rn5(hX: can be closed. It may be useful to create and populate a h j4ubj))ro5}rp5(hX:class:`LogFile`rq5h j4jqja)h!j-h}rr5(UreftypeXclassj/j0XLogFileU refdomainXpyrs5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rt5j)ru5}rv5(hjq5h}rw5(h]h]rx5(j:js5Xpy-classry5eh]h]h]uh jo5h]rz5hXLogFiler{5r|5}r}5(hUh ju5ubah!jubaubhX like this from a r~5r5}r5(hX like this from a h j4ubj))r5}r5(hX:class:`LogObserver`r5h j4jqja)h!j-h}r5(UreftypeXclassj/j0X LogObserverU refdomainXpyr5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r5j)r5}r5(hj5h}r5(h]h]r5(j:j5Xpy-classr5eh]h]h]uh j5h]r5hX LogObserverr5r5}r5(hUh j5ubah!jubaubhX method - see r5r5}r5(hX method - see h j4ubj))r5}r5(hX:ref:`Adding-LogObservers`r5h j4jqja)h!j-h}r5(UreftypeXrefj/j0Xadding-logobserversU refdomainXstdr5h]h]U refexplicith]h]h]j3jCuj!Mh]r5jh)r5}r5(hj5h}r5(h]h]r5(j:j5Xstd-refr5eh]h]h]uh j5h]r5hXAdding-LogObserversr5r5}r5(hUh j5ubah!jrubaubhX.r5}r5(hX.h j4ubeubj)r5}r5(hXThe ``logfiles=`` argument to :bb:step:`ShellCommand` (see :bb:step:`ShellCommand`) creates new :class:`LogFile`\s 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 :class:`LogFile` by calling :meth:`addStdout`. These secondary LogFiles can be used as the source of a LogObserver just like the normal :file:`stdio` :class:`LogFile`.h jI2jqja)h!jh}r5(h]h]h]h]h]uj!Mjj)h]r5(hXThe r5r5}r5(hXThe h j5ubj)r5}r5(hX ``logfiles=``h}r5(h]h]h]h]h]uh j5h]r5hX logfiles=r5r5}r5(hUh j5ubah!jubhX argument to r5r5}r5(hX argument to h j5ubj))r5}r5(hX:bb:step:`ShellCommand`r5h j5jqja)h!j-h}r5(UreftypeXstepj/j0X ShellCommandU refdomainXbbr5h]h]U refexplicith]h]h]j3jCuj!Mh]r5j)r5}r5(hj5h}r5(h]h]r5(j:j5Xbb-stepr5eh]h]h]uh j5h]r5hX ShellCommandr5r5}r5(hUh j5ubah!jubaubhX (see r5r5}r5(hX (see h j5ubj))r5}r5(hX:bb:step:`ShellCommand`r5h j5jqja)h!j-h}r5(UreftypeXstepj/j0X ShellCommandU refdomainXbbr5h]h]U refexplicith]h]h]j3jCuj!Mh]r5j)r5}r5(hj5h}r5(h]h]r5(j:j5Xbb-stepr5eh]h]h]uh j5h]r5hX ShellCommandr5r5}r5(hUh j5ubah!jubaubhX) creates new r5r5}r5(hX) creates new h j5ubj))r5}r5(hX:class:`LogFile`r5h j5jqja)h!j-h}r5(UreftypeXclassj/j0XLogFileU refdomainXpyr5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r5j)r5}r5(hj5h}r5(h]h]r5(j:j5Xpy-classr5eh]h]h]uh j5h]r5hXLogFiler5r5}r5(hUh j5ubah!jubaubhXs 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 r5r5}r5(hX\s 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 j5ubj))r5}r5(hX:class:`BuildStep`r5h j5jqja)h!j-h}r5(UreftypeXclassj/j0X BuildStepU refdomainXpyr5h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r5j)r5}r5(hj5h}r5(h]h]r5(j:j5Xpy-classr5eh]h]h]uh j5h]r5hX BuildStepr5r5}r5(hUh j5ubah!jubaubhX'. These additions will be added to the r5r5}r5(hX'. These additions will be added to the h j5ubj))r5}r5(hX:class:`LogFile`r5h j5jqja)h!j-h}r6(UreftypeXclassj/j0XLogFileU refdomainXpyr6h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r6j)r6}r6(hj5h}r6(h]h]r6(j:j6Xpy-classr6eh]h]h]uh j5h]r6hXLogFiler 6r 6}r 6(hUh j6ubah!jubaubhX by calling r 6r 6}r6(hX by calling h j5ubj))r6}r6(hX:meth:`addStdout`r6h j5jqja)h!j-h}r6(UreftypeXmethj/j0X addStdoutU refdomainXpyr6h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r6j)r6}r6(hj6h}r6(h]h]r6(j:j6Xpy-methr6eh]h]h]uh j6h]r6hX addStdoutr6r6}r6(hUh j6ubah!jubaubhX[. These secondary LogFiles can be used as the source of a LogObserver just like the normal r6r6}r 6(hX[. These secondary LogFiles can be used as the source of a LogObserver just like the normal h j5ubj)r!6}r"6(hUh}r#6(h]h]h]h]r$6Xfiler%6aUrolej%6h]uh j5h]r&6hXstdior'6r(6}r)6(hXstdioh j!6ubah!jubhX r*6}r+6(hX h j5ubj))r,6}r-6(hX:class:`LogFile`r.6h j5jqja)h!j-h}r/6(UreftypeXclassj/j0XLogFileU refdomainXpyr06h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r16j)r26}r36(hj.6h}r46(h]h]r56(j:j06Xpy-classr66eh]h]h]uh j,6h]r76hXLogFiler86r96}r:6(hUh j26ubah!jubaubhX.r;6}r<6(hX.h j5ubeubeubj)j)j)j)r=6}r>6(hX jKh j)r?6}r@6(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)rA6}rB6(hUh j)rC6}rD6(hUh j)jqja)j}rE6j&j0sh!j;h}rF6(h]h]h]h]rG6(j'j)eh]rH6(j)j&euj!Kjj)j"}rI6j'j0sh]rJ6(h)rK6}rL6(hXCustomizing SVNPollerrM6h jC6jqja)h!h"h}rN6(h]h]h]h]h]uj!Kjj)h]rO6hXCustomizing SVNPollerrP6rQ6}rR6(hjM6h jK6ubaubj)rS6}rT6(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 jC6jqja)h!jh}rU6(h]h]h]h]h]uj!Kjj)h]rV6(hXqEach source file that is tracked by a Subversion repository has a fully-qualified SVN URL in the following form: rW6rX6}rY6(hXqEach source file that is tracked by a Subversion repository has a fully-qualified SVN URL in the following form: h jS6ubj)rZ6}r[6(hX2``({REPOURL})({PROJECT-plus-BRANCH})({FILEPATH})``h}r\6(h]h]h]h]h]uh jS6h]r]6hX.({REPOURL})({PROJECT-plus-BRANCH})({FILEPATH})r^6r_6}r`6(hUh jZ6ubah!jubhX. When you create the ra6rb6}rc6(hX. When you create the h jS6ubj))rd6}re6(hX:bb:chsrc:`SVNPoller`rf6h jS6jqja)h!j-h}rg6(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbrh6h]h]U refexplicith]h]h]j3jCuj!Kh]ri6j)rj6}rk6(hjf6h}rl6(h]h]rm6(j:jh6Xbb-chsrcrn6eh]h]h]uh jd6h]ro6hX SVNPollerrp6rq6}rr6(hUh jj6ubah!jubaubhX, you give it a rs6rt6}ru6(hX, you give it a h jS6ubj)rv6}rw6(hX ``svnurl``h}rx6(h]h]h]h]h]uh jS6h]ry6hXsvnurlrz6r{6}r|6(hUh jv6ubah!jubhX value that includes all of the r}6r~6}r6(hX value that includes all of the h jS6ubj)r6}r6(hX ``{REPOURL}``h}r6(h]h]h]h]h]uh jS6h]r6hX {REPOURL}r6r6}r6(hUh j6ubah!jubhX" and possibly some portion of the r6r6}r6(hX" and possibly some portion of the h jS6ubj)r6}r6(hX``{PROJECT-plus-BRANCH}``h}r6(h]h]h]h]h]uh jS6h]r6hX{PROJECT-plus-BRANCH}r6r6}r6(hUh j6ubah!jubhX string. The r6r6}r6(hX string. The h jS6ubj))r6}r6(hX:bb:chsrc:`SVNPoller`r6h jS6jqja)h!j-h}r6(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbr6h]h]U refexplicith]h]h]j3jCuj!Kh]r6j)r6}r6(hj6h}r6(h]h]r6(j:j6Xbb-chsrcr6eh]h]h]uh j6h]r6hX SVNPollerr6r6}r6(hUh j6ubah!jubaubhXG is responsible for producing Changes that contain a branch name and a r6r6}r6(hXG is responsible for producing Changes that contain a branch name and a h jS6ubj)r6}r6(hX``{FILEPATH}``h}r6(h]h]h]h]h]uh jS6h]r6hX {FILEPATH}r6r6}r6(hUh j6ubah!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.r6r6}r6(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 jS6ubeubj)r6}r6(hUh jC6jqja)h!j;h}r6(h]h]h]h]r6j)ah]r6j)auj!Kjj)h]r6(h)r6}r6(hX(PROJECT/BRANCHNAME/FILEPATH repositoriesr6h j6jqja)h!h"h}r6(h]h]h]h]h]uj!Kjj)h]r6hX(PROJECT/BRANCHNAME/FILEPATH repositoriesr6r6}r6(hj6h j6ubaubj)r6}r6(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 j6jqja)h!jh}r6(h]h]h]h]h]uj!Kjj)h]r6(hXzOne common layout is to have all the various projects that share a repository get a single top-level directory each, with r6r6}r6(hXzOne common layout is to have all the various projects that share a repository get a single top-level directory each, with h j6ubj)r6}r6(hX ``branches``h}r6(h]h]h]h]h]uh j6h]r6hXbranchesr6r6}r6(hUh j6ubah!jubhX, r6r6}r6(hX, h j6ubj)r6}r6(hX``tags``h}r6(h]h]h]h]h]uh j6h]r6hXtagsr6r6}r6(hUh j6ubah!jubhX, and r6r6}r6(hX, and h j6ubj)r6}r6(hX ``trunk``h}r6(h]h]h]h]h]uh j6h]r6hXtrunkr6r6}r6(hUh j6ubah!jubhX subdirectories:r6r6}r6(hX subdirectories:h j6ubeubjM)r6}r6(hXjamanda/trunk /branches/3_2 /3_3 /tags/3_2_1 /3_2_2 /3_3_0h j6jqja)h!jPh}r6(jRjSXnonejTjUh]h]h]h]h]uj!Kjj)h]r6hXjamanda/trunk /branches/3_2 /3_3 /tags/3_2_1 /3_2_2 /3_3_0r6r6}r6(hUh j6ubaubj)r6}r6(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 j6jqja)h!jh}r6(h]h]h]h]h]uj!Kjj)h]r6(hX To set up a r6r6}r6(hX To set up a h j6ubj))r6}r6(hX:bb:chsrc:`SVNPoller`r6h j6jqja)h!j-h}r6(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbr6h]h]U refexplicith]h]h]j3jCuj!Kh]r6j)r6}r6(hj6h}r6(h]h]r6(j:j6Xbb-chsrcr6eh]h]h]uh j6h]r6hX SVNPollerr6r6}r6(hUh j6ubah!jubaubhXa that watches the Amanda trunk (and nothing else), we would use the following, using the default r7r7}r7(hXa that watches the Amanda trunk (and nothing else), we would use the following, using the default h j6ubj)r7}r7(hX``split_file``h}r7(h]h]h]h]h]uh j6h]r7hX split_filer7r7}r 7(hUh j7ubah!jubhX:r 7}r 7(hX:h j6ubeubjM)r 7}r 7(hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller( svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/amanda/trunk")h j6jqja)h!jPh}r7(jTjUh]h]h]h]h]uj!Kjj)h]r7hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller( svnurl="https://svn.amanda.sourceforge.net/svnroot/amanda/amanda/trunk")r7r7}r7(hUh j 7ubaubj)r7}r7(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 j6jqja)h!jh}r7(h]h]h]h]h]uj!Kjj)h]r7(hX$In this case, every Change that our r7r7}r7(hX$In this case, every Change that our h j7ubj))r7}r7(hX:bb:chsrc:`SVNPoller`r7h j7jqja)h!j-h}r7(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbr7h]h]U refexplicith]h]h]j3jCuj!Kh]r7j)r 7}r!7(hj7h}r"7(h]h]r#7(j:j7Xbb-chsrcr$7eh]h]h]uh j7h]r%7hX SVNPollerr&7r'7}r(7(hUh j 7ubah!jubaubhX0 produces will have its branch attribute set to r)7r*7}r+7(hX0 produces will have its branch attribute set to h j7ubj)r,7}r-7(hX``None``h}r.7(h]h]h]h]h]uh j7h]r/7hXNoner07r17}r27(hUh j,7ubah!jubhXb, to indicate that the Change is on the trunk. No other sub-projects or branches will be tracked.r37r47}r57(hXb, to indicate that the Change is on the trunk. No other sub-projects or branches will be tracked.h j7ubeubj)r67}r77(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 j6jqja)h!jh}r87(h]h]h]h]h]uj!Kjj)h]r97(hXoIf we want our ChangeSource to follow multiple branches, we have to do two things. First we have to change our r:7r;7}r<7(hXoIf we want our ChangeSource to follow multiple branches, we have to do two things. First we have to change our h j67ubj)r=7}r>7(hX ``svnurl=``h}r?7(h]h]h]h]h]uh j67h]r@7hXsvnurl=rA7rB7}rC7(hUh j=7ubah!jubhX" argument to watch more than just rD7rE7}rF7(hX" argument to watch more than just h j67ubj)rG7}rH7(hX``amanda/trunk``h}rI7(h]h]h]h]h]uh j67h]rJ7hX amanda/trunkrK7rL7}rM7(hUh jG7ubah!jubhX. We will set it to rN7rO7}rP7(hX. We will set it to h j67ubj)rQ7}rR7(hX ``amanda``h}rS7(h]h]h]h]h]uh j67h]rT7hXamandarU7rV7}rW7(hUh jQ7ubah!jubhXP so that we'll see both the trunk and all the branches. Second, we have to tell rX7rY7}rZ7(hXP so that we'll see both the trunk and all the branches. Second, we have to tell h j67ubj))r[7}r\7(hX:bb:chsrc:`SVNPoller`r]7h j67jqja)h!j-h}r^7(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbr_7h]h]U refexplicith]h]h]j3jCuj!Kh]r`7j)ra7}rb7(hj]7h}rc7(h]h]rd7(j:j_7Xbb-chsrcre7eh]h]h]uh j[7h]rf7hX SVNPollerrg7rh7}ri7(hUh ja7ubah!jubaubhX how to split the rj7rk7}rl7(hX how to split the h j67ubj)rm7}rn7(hX'``({PROJECT-plus-BRANCH})({FILEPATH})``h}ro7(h]h]h]h]h]uh j67h]rp7hX#({PROJECT-plus-BRANCH})({FILEPATH})rq7rr7}rs7(hUh jm7ubah!jubhX. strings it gets from the repository out into rt7ru7}rv7(hX. strings it gets from the repository out into h j67ubj)rw7}rx7(hX``({BRANCH})``h}ry7(h]h]h]h]h]uh j67h]rz7hX ({BRANCH})r{7r|7}r}7(hUh jw7ubah!jubhX and r~7r7}r7(hX and h j67ubj)r7}r7(hX``({FILEPATH})```h}r7(h]h]h]h]h]uh j67h]r7hX ({FILEPATH})`r7r7}r7(hUh j7ubah!jubhX.r7}r7(hX.h j67ubeubj)r7}r7(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 j6jqja)h!jh}r7(h]h]h]h]h]uj!Kjj)h]r7(hX We do the latter by providing a r7r7}r7(hX We do the latter by providing a h j7ubj)r7}r7(hX``split_file``h}r7(h]h]h]h]h]uh j7h]r7hX split_filer7r7}r7(hUh j7ubah!jubhXE function. This function is responsible for splitting something like r7r7}r7(hXE function. This function is responsible for splitting something like h j7ubj)r7}r7(hX$``branches/3_3/common-src/amanda.h``h}r7(h]h]h]h]h]uh j7h]r7hX branches/3_3/common-src/amanda.hr7r7}r7(hUh j7ubah!jubhX into r7r7}r7(hX into h j7ubj)r7}r7(hX``branch='branches/3_3'``h}r7(h]h]h]h]h]uh j7h]r7hXbranch='branches/3_3'r7r7}r7(hUh j7ubah!jubhX and r7r7}r7(hX and h j7ubj)r7}r7(hX"``filepath='common-src/amanda.h'``h}r7(h]h]h]h]h]uh j7h]r7hXfilepath='common-src/amanda.h'r7r7}r7(hUh j7ubah!jubhXi. The function is always given a string that names a file relative to the subdirectory pointed to by the r7r7}r7(hXi. The function is always given a string that names a file relative to the subdirectory pointed to by the h j7ubj))r7}r7(hX:bb:chsrc:`SVNPoller`r7h j7jqja)h!j-h}r7(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbr7h]h]U refexplicith]h]h]j3jCuj!Kh]r7j)r7}r7(hj7h}r7(h]h]r7(j:j7Xbb-chsrcr7eh]h]h]uh j7h]r7hX SVNPollerr7r7}r7(hUh j7ubah!jubaubhX's r7r7}r7(hX\'s h j7ubj)r7}r7(hX ``svnurl=``h}r7(h]h]h]h]h]uh j7h]r7hXsvnurl=r7r7}r7(hUh j7ubah!jubhXC argument. It is expected to return a dictionary with at least the r7r7}r7(hXC argument. It is expected to return a dictionary with at least the h j7ubj)r7}r7(hX``path``h}r7(h]h]h]h]h]uh j7h]r7hXpathr7r7}r7(hUh j7ubah!jubhX& key. The splitter may optionally set r7r7}r7(hX& key. The splitter may optionally set h j7ubj)r7}r7(hX ``branch``h}r7(h]h]h]h]h]uh j7h]r7hXbranchr7r7}r7(hUh j7ubah!jubhX, r7r7}r7(hX, h j7ubj)r7}r7(hX ``project``h}r7(h]h]h]h]h]uh j7h]r7hXprojectr7r7}r7(hUh j7ubah!jubhX and r7r7}r7(hX and h j7ubj)r7}r7(hX``repository``h}r7(h]h]h]h]h]uh j7h]r7hX repositoryr7r7}r7(hUh j7ubah!jubhX7. For backwards compatibility it may return a tuple of r7r7}r7(hX7. For backwards compatibility it may return a tuple of h j7ubj)r7}r7(hX``(branchname, path)``h}r7(h]h]h]h]h]uh j7h]r8hX(branchname, path)r8r8}r8(hUh j7ubah!jubhX. It may also return r8r8}r8(hX. It may also return h j7ubj)r8}r8(hX``None``h}r 8(h]h]h]h]h]uh j7h]r 8hXNoner 8r 8}r 8(hUh j8ubah!jubhX- to indicate that the file is of no interest.r8r8}r8(hX- to indicate that the file is of no interest.h j7ubeubjO)r8}r8(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 j6jqja)h!jRh}r8(h]h]h]h]h]uj!Njj)h]r8j)r8}r8(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 j8jqja)h!jh}r8(h]h]h]h]h]uj!Kh]r8(hXthe function should return r8r8}r8(hXthe function should return h j8ubj)r8}r8(hX``branches/3_3``h}r8(h]h]h]h]h]uh j8h]r8hX branches/3_3r 8r!8}r"8(hUh j8ubah!jubhX rather than just r#8r$8}r%8(hX rather than just h j8ubj)r&8}r'8(hX``3_3``h}r(8(h]h]h]h]h]uh j8h]r)8hX3_3r*8r+8}r,8(hUh j&8ubah!jubhXC because the SVN checkout step, will append the branch name to the r-8r.8}r/8(hXC because the SVN checkout step, will append the branch name to the h j8ubj)r08}r18(hX ``baseURL``h}r28(h]h]h]h]h]uh j8h]r38hXbaseURLr48r58}r68(hUh j08ubah!jubhX", which requires that we keep the r78r88}r98(hX", which requires that we keep the h j8ubj)r:8}r;8(hX ``branches``h}r<8(h]h]h]h]h]uh j8h]r=8hXbranchesr>8r?8}r@8(hUh j:8ubah!jubhXr component in there. Other VC schemes use a different approach towards branches and may not require this artifact.rA8rB8}rC8(hXr component in there. Other VC schemes use a different approach towards branches and may not require this artifact.h j8ubeubaubj)rD8}rE8(hXuIf your repository uses this same ``{PROJECT}/{BRANCH}/{FILEPATH}`` naming scheme, the following function will work::h j6jqja)h!jh}rF8(h]h]h]h]h]uj!Kjj)h]rG8(hX"If your repository uses this same rH8rI8}rJ8(hX"If your repository uses this same h jD8ubj)rK8}rL8(hX!``{PROJECT}/{BRANCH}/{FILEPATH}``h}rM8(h]h]h]h]h]uh jD8h]rN8hX{PROJECT}/{BRANCH}/{FILEPATH}rO8rP8}rQ8(hUh jK8ubah!jubhX1 naming scheme, the following function will work:rR8rS8}rT8(hX1 naming scheme, the following function will work:h jD8ubeubjM)rU8}rV8(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 j6jqja)h!jPh}rW8(jTjUh]h]h]h]h]uj!Kjj)h]rX8hX9def 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 NonerY8rZ8}r[8(hUh jU8ubaubj)r\8}r]8(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 j6jqja)h!jh}r^8(h]h]h]h]h]uj!Kjj)h]r_8(hX0In fact, this is the definition of the provided r`8ra8}rb8(hX0In fact, this is the definition of the provided h j\8ubj)rc8}rd8(hX``split_file_branches``h}re8(h]h]h]h]h]uh j\8h]rf8hXsplit_file_branchesrg8rh8}ri8(hUh jc8ubah!jubhX, function. So to have our Twisted-watching rj8rk8}rl8(hX, function. So to have our Twisted-watching h j\8ubj))rm8}rn8(hX:bb:chsrc:`SVNPoller`ro8h j\8jqja)h!j-h}rp8(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbrq8h]h]U refexplicith]h]h]j3jCuj!Kh]rr8j)rs8}rt8(hjo8h}ru8(h]h]rv8(j:jq8Xbb-chsrcrw8eh]h]h]uh jm8h]rx8hX SVNPollerry8rz8}r{8(hUh js8ubah!jubaubhX- follow multiple branches, we would use this:r|8r}8}r~8(hX- follow multiple branches, we would use this:h j\8ubeubjM)r8}r8(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 j6jqja)h!jPh}r8(jTjUh]h]h]h]h]uj!Kjj)h]r8hXfrom buildbot.changes.svnpoller import SVNPoller, split_file_branches c['change_source'] = SVNPoller("svn://svn.twistedmatrix.com/svn/Twisted", split_file=split_file_branches)r8r8}r8(hUh j8ubaubj)r8}r8(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 j6jqja)h!jh}r8(h]h]h]h]h]uj!Kjj)h]r8(hX3Changes for all sorts of branches (with names like r8r8}r8(hX3Changes for all sorts of branches (with names like h j8ubj)r8}r8(hX``"branches/1.5.x"``h}r8(h]h]h]h]h]uh j8h]r8hX"branches/1.5.x"r8r8}r8(hUh j8ubah!jubhX, and r8r8}r8(hX, and h j8ubj)r8}r8(hX``None``h}r8(h]h]h]h]h]uh j8h]r8hXNoner8r8}r8(hUh j8ubah!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.r8r8}r8(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 j8ubeubj)r8}r8(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 j6jqja)h!jh}r8(h]h]h]h]h]uj!Kjj)h]r8hXIf 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:r8r8}r8(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 j8ubaubjM)r8}r8(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 j6jqja)h!jPh}r8(jTjUh]h]h]h]h]uj!Kjj)h]r8hXefrom 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 fr8r8}r8(hUh j8ubaubj)r8}r8(hXAAgain, this is provided by default. To use it you would do this::h j6jqja)h!jh}r8(h]h]h]h]h]uj!Mjj)h]r8hX@Again, this is provided by default. To use it you would do this:r8r8}r8(hX@Again, this is provided by default. To use it you would do this:h j8ubaubjM)r8}r8(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 j6jqja)h!jPh}r8(jTjUh]h]h]h]h]uj!Mjj)h]r8hXfrom 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)r8r8}r8(hUh j8ubaubj)r8}r8(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 j6jqja)h!jh}r8(h]h]h]h]h]uj!Mjj)h]r8(hXeNote here that we are monitoring at the root of the repository, and that within that repository is a r8r8}r8(hXeNote here that we are monitoring at the root of the repository, and that within that repository is a h j8ubj)r8}r8(hX ``amanda``h}r8(h]h]h]h]h]uh j8h]r8hXamandar8r8}r8(hUh j8ubah!jubhX subdirectory which in turn has r8r8}r8(hX subdirectory which in turn has h j8ubj)r8}r8(hX ``trunk``h}r8(h]h]h]h]h]uh j8h]r8hXtrunkr8r8}r8(hUh j8ubah!jubhX and r8r8}r8(hX and h j8ubj)r8}r8(hX ``branches``h}r8(h]h]h]h]h]uh j8h]r8hXbranchesr8r8}r8(hUh j8ubah!jubhX . It is that r8r8}r8(hX . It is that h j8ubj)r8}r8(hX ``amanda``h}r8(h]h]h]h]h]uh j8h]r8hXamandar8r8}r8(hUh j8ubah!jubhX% subdirectory whose name becomes the r8r8}r8(hX% subdirectory whose name becomes the h j8ubj)r8}r8(hX ``project``h}r8(h]h]h]h]h]uh j8h]r8hXprojectr8r8}r8(hUh j8ubah!jubhX field of the Change.r8r8}r8(hX field of the Change.h j8ubeubeubjA6eubjqja)h!j;h}r8(h]h]h]h]r8j)ah]r8j)auj!Mjj)h]r8(h)r8}r8(hX(BRANCHNAME/PROJECT/FILEPATH repositoriesr8h jA6jqja)h!h"h}r8(h]h]h]h]h]uj!Mjj)h]r8hX(BRANCHNAME/PROJECT/FILEPATH repositoriesr8r9}r9(hj8h j8ubaubj)r9}r9(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.r9h jA6jqja)h!jh}r9(h]h]h]h]h]uj!Mjj)h]r9hXAnother 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.r9r9}r 9(hj9h j9ubaubj?6j)r 9}r 9(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 jA6jqja)h!jh}r 9(h]h]h]h]h]uj!Mjj)h]r 9(hX5The fully-qualified SVN URL for the trunk version of r9r9}r9(hX5The fully-qualified SVN URL for the trunk version of h j 9ubj)r9}r9(hUh}r9(h]h]h]h]r9Xfiler9aUrolej9h]uh j 9h]r9hX webform.pyr9r9}r9(hX webform.pyh j9ubah!jubhX is r9r9}r9(hX is h j 9ubj)r9}r9(hX@``http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.py``h}r9(h]h]h]h]h]uh j 9h]r 9hX<http://divmod.org/svn/Divmod/trunk/Nevow/formless/webform.pyr!9r"9}r#9(hUh j9ubah!jubhX<. The 1.5.x branch version of this file would have a URL of r$9r%9}r&9(hX<. The 1.5.x branch version of this file would have a URL of h j 9ubj)r'9}r(9(hXI``http://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.py``h}r)9(h]h]h]h]h]uh j 9h]r*9hXEhttp://divmod.org/svn/Divmod/branches/1.5.x/Nevow/formless/webform.pyr+9r,9}r-9(hUh j'9ubah!jubhX2. The whole Nevow trunk would be checked out with r.9r/9}r09(hX2. The whole Nevow trunk would be checked out with h j 9ubj)r19}r29(hX,``http://divmod.org/svn/Divmod/trunk/Nevow``h}r39(h]h]h]h]h]uh j 9h]r49hX(http://divmod.org/svn/Divmod/trunk/Nevowr59r69}r79(hUh j19ubah!jubhX6, while the Quotient trunk would be checked out using r89r99}r:9(hX6, while the Quotient trunk would be checked out using h j 9ubj)r;9}r<9(hX/``http://divmod.org/svn/Divmod/trunk/Quotient``h}r=9(h]h]h]h]h]uh j 9h]r>9hX+http://divmod.org/svn/Divmod/trunk/Quotientr?9r@9}rA9(hUh j;9ubah!jubhX.rB9}rC9(hX.h j 9ubeubj)rD9}rE9(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 jA6jqja)h!jh}rF9(h]h]h]h]h]uj!M$jj)h]rG9(hXNow suppose we want to have an rH9rI9}rJ9(hXNow suppose we want to have an h jD9ubj))rK9}rL9(hX:bb:chsrc:`SVNPoller`rM9h jD9jqja)h!j-h}rN9(UreftypeXchsrcj/j0X SVNPollerU refdomainXbbrO9h]h]U refexplicith]h]h]j3jCuj!M$h]rP9j)rQ9}rR9(hjM9h}rS9(h]h]rT9(j:jO9Xbb-chsrcrU9eh]h]h]uh jK9h]rV9hX SVNPollerrW9rX9}rY9(hUh jQ9ubah!jubaubhXF that only cares about the Nevow trunk. This case looks just like the rZ9r[9}r\9(hXF that only cares about the Nevow trunk. This case looks just like the h jD9ubj)r]9}r^9(hX``{PROJECT}/{BRANCH}``h}r_9(h]h]h]h]h]uh jD9h]r`9hX{PROJECT}/{BRANCH}ra9rb9}rc9(hUh j]9ubah!jubhX layout described earlier:rd9re9}rf9(hX layout described earlier:h jD9ubeubjM)rg9}rh9(hX{from buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")h jA6jqja)h!jPh}ri9(jTjUh]h]h]h]h]uj!M(jj)h]rj9hX{from buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")rk9rl9}rm9(hUh jg9ubaubj)rn9}ro9(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 jA6jqja)h!jh}rp9(h]h]h]h]h]uj!M+jj)h]rq9(hXUBut what happens when we want to track multiple Nevow branches? We have to point our rr9rs9}rt9(hXUBut what happens when we want to track multiple Nevow branches? We have to point our h jn9ubj)ru9}rv9(hX ``svnurl=``h}rw9(h]h]h]h]h]uh jn9h]rx9hXsvnurl=ry9rz9}r{9(hUh ju9ubah!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 r|9r}9}r~9(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 jn9ubj)r9}r9(hX``split_file``h}r9(h]h]h]h]h]uh jn9h]r9hX split_filer9r9}r9(hUh j9ubah!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.r9r9}r9(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 jn9ubeubjM)r9}r9(hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod", split_file=my_file_splitter)h jA6jqja)h!jPh}r9(jTjUh]h]h]h]h]uj!M3jj)h]r9hXfrom buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod", split_file=my_file_splitter)r9r9}r9(hUh j9ubaubj)r9}r9(hXYThe ``my_file_splitter`` function will be called with repository-relative pathnames like:h jA6jqja)h!jh}r9(h]h]h]h]h]uj!M7jj)h]r9(hXThe r9r9}r9(hXThe h j9ubj)r9}r9(hX``my_file_splitter``h}r9(h]h]h]h]h]uh j9h]r9hXmy_file_splitterr9r9}r9(hUh j9ubah!jubhXA function will be called with repository-relative pathnames like:r9r9}r9(hXA function will be called with repository-relative pathnames like:h j9ubeubj)r9}r9(hUh jA6jqja)h!jh}r9(h]h]h]h]h]uj!Njj)h]r9(j)r9}r9(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 j9jqja)h!jh}r9(h]h]h]h]h]uj!M=h]r9(j)r9}r9(hX':file:`trunk/Nevow/formless/webform.py`h j9jqja)h!jh}r9(h]h]h]h]h]uj!M=h]r9j)r9}r9(hUh}r9(h]h]h]h]r9Xfiler9aUrolej9h]uh j9h]r9hXtrunk/Nevow/formless/webform.pyr9r9}r9(hXtrunk/Nevow/formless/webform.pyh j9ubah!jubaubj)r9}r9(hUh}r9(h]h]h]h]h]uh j9h]r9j)r9}r9(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 j9jqja)h!jh}r9(h]h]h]h]h]uj!M;h]r9(hX_This is a Nevow file, on the trunk. We want the Change that includes this to see a filename of r9r9}r9(hX_This is a Nevow file, on the trunk. We want the Change that includes this to see a filename of h j9ubj)r9}r9(hUh}r9(h]h]h]h]r9Xfiler9aUrolej9h]uh j9h]r9hXformless/webform.pyr9r9}r9(hXformless/webform.pyh j9ubah!jubhX, and a branch of r9r9}r9(hX, and a branch of h j9ubj)r9}r9(hX``None``h}r9(h]h]h]h]h]uh j9h]r9hXNoner9r9}r9(hUh j9ubah!jubeubah!j ubeubj)r9}r9(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 j9jqja)h!jh}r9(h]h]h]h]h]uj!MAjj)h]r9(j)r9}r9(hX0:file:`branches/1.5.x/Nevow/formless/webform.py`h j9jqja)h!jh}r9(h]h]h]h]h]uj!MAh]r9j)r9}r9(hUh}r9(h]h]h]h]r9Xfiler9aUrolej9h]uh j9h]r9hX(branches/1.5.x/Nevow/formless/webform.pyr9r9}r9(hX(branches/1.5.x/Nevow/formless/webform.pyh j9ubah!jubaubj)r9}r9(hUh}r9(h]h]h]h]h]uh j9h]r9j)r9}r9(hXuThis is a Nevow file, on a branch. We want to get ``branch='branches/1.5.x'`` and ``filename='formless/webform.py'``.h j9jqja)h!jh}r9(h]h]h]h]h]uj!M@h]r9(hX2This is a Nevow file, on a branch. We want to get r9r9}r9(hX2This is a Nevow file, on a branch. We want to get h j9ubj)r9}r9(hX``branch='branches/1.5.x'``h}r9(h]h]h]h]h]uh j9h]r9hXbranch='branches/1.5.x'r9r9}r9(hUh j9ubah!jubhX and r9r9}r9(hX and h j9ubj)r9}r9(hX"``filename='formless/webform.py'``h}r9(h]h]h]h]h]uh j9h]r9hXfilename='formless/webform.py'r9r9}r:(hUh j9ubah!jubhX.r:}r:(hX.h j9ubeubah!j ubeubj)r:}r:(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 j9jqja)h!jh}r:(h]h]h]h]h]uj!MEjj)h]r:(j)r:}r:(hX:file:`trunk/Quotient/setup.py`h j:jqja)h!jh}r :(h]h]h]h]h]uj!MEh]r :j)r :}r :(hUh}r :(h]h]h]h]r:Xfiler:aUrolej:h]uh j:h]r:hXtrunk/Quotient/setup.pyr:r:}r:(hXtrunk/Quotient/setup.pyh j :ubah!jubaubj)r:}r:(hUh}r:(h]h]h]h]h]uh j:h]r:j)r:}r:(hXdThis is a Quotient file, so we want to ignore it by having :meth:`my_file_splitter` return ``None``.h j:jqja)h!jh}r:(h]h]h]h]h]uj!MDh]r:(hX;This is a Quotient file, so we want to ignore it by having r:r:}r:(hX;This is a Quotient file, so we want to ignore it by having h j:ubj))r:}r :(hX:meth:`my_file_splitter`r!:h j:jqja)h!j-h}r":(UreftypeXmethj/j0Xmy_file_splitterU refdomainXpyr#:h]h]U refexplicith]h]h]j3jCj Nj Nuj!MDh]r$:j)r%:}r&:(hj!:h}r':(h]h]r(:(j:j#:Xpy-methr):eh]h]h]uh j:h]r*:hXmy_file_splitterr+:r,:}r-:(hUh j%:ubah!jubaubhX return r.:r/:}r0:(hX return h j:ubj)r1:}r2:(hX``None``h}r3:(h]h]h]h]h]uh j:h]r4:hXNoner5:r6:}r7:(hUh j1:ubah!jubhX.r8:}r9:(hX.h j:ubeubah!j ubeubj)r::}r;:(hX`:file:`branches/1.5.x/Quotient/setup.py` This is also a Quotient file, which should be ignored. h j9jqja)h!jh}r<:(h]h]h]h]h]uj!MHjj)h]r=:(j)r>:}r?:(hX(:file:`branches/1.5.x/Quotient/setup.py`h j::jqja)h!jh}r@:(h]h]h]h]h]uj!MHh]rA:j)rB:}rC:(hUh}rD:(h]h]h]h]rE:XfilerF:aUrolejF:h]uh j>:h]rG:hX branches/1.5.x/Quotient/setup.pyrH:rI:}rJ:(hX branches/1.5.x/Quotient/setup.pyh jB:ubah!jubaubj)rK:}rL:(hUh}rM:(h]h]h]h]h]uh j::h]rN:j)rO:}rP:(hX6This is also a Quotient file, which should be ignored.rQ:h jK:jqja)h!jh}rR:(h]h]h]h]h]uj!MHh]rS:hX6This is also a Quotient file, which should be ignored.rT:rU:}rV:(hjQ:h jO:ubaubah!j ubeubeubj)rW:}rX:(hXGThe following definition for :meth:`my_file_splitter` will do the job::h jA6jqja)h!jh}rY:(h]h]h]h]h]uj!MJjj)h]rZ:(hXThe following definition for r[:r\:}r]:(hXThe following definition for h jW:ubj))r^:}r_:(hX:meth:`my_file_splitter`r`:h jW:jqja)h!j-h}ra:(UreftypeXmethj/j0Xmy_file_splitterU refdomainXpyrb:h]h]U refexplicith]h]h]j3jCj Nj Nuj!MJh]rc:j)rd:}re:(hj`:h}rf:(h]h]rg:(j:jb:Xpy-methrh:eh]h]h]uh j^:h]ri:hXmy_file_splitterrj:rk:}rl:(hUh jd:ubah!jubaubhX will do the job:rm:rn:}ro:(hX will do the job:h jW:ubeubjM)rp:}rq:(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 jA6jqja)h!jPh}rr:(jTjUh]h]h]h]h]uj!MLjj)h]rs: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))rt:ru:}rv:(hUh jp:ubaubj)rw:}rx:(hXqIf you later decide you want to get changes for Quotient as well you could replace the last 3 lines with simply::h jA6jqja)h!jh}ry:(h]h]h]h]h]uj!M\jj)h]rz:hXpIf you later decide you want to get changes for Quotient as well you could replace the last 3 lines with simply:r{:r|:}r}:(hXpIf you later decide you want to get changes for Quotient as well you could replace the last 3 lines with simply:h jw:ubaubjM)r~:}r:(hXFreturn dict(project=projectname, branch=branch, path='/'.join(pieces))h jA6jqja)h!jPh}r:(jTjUh]h]h]h]h]uj!M_jj)h]r:hXFreturn dict(project=projectname, branch=branch, path='/'.join(pieces))r:r:}r:(hUh j~:ubaubj)r:}r:(hX.. _Writing-Change-Sources:h jA6jqja)h!jh}r:(h]h]h]h]h]jj%uj!Mbjj)h]ubeubjqja)h!jh}r:(h]h]h]h]h]uj!Mjj)h]r:(hX For example, r:r:}r:(hX For example, h j?6ubj9,)r:}r:(hX!`Divmod.org `_h}r:(UnameX Divmod.orgUrefurir:Xhttp://Divmod.orgr:h]h]h]h]h]uh j?6h]r:hX Divmod.orgr:r:}r:(hUh j:ubah!jB,ubj=6hX hosts a project named r:r:}r:(hX hosts a project named h j?6ubj)r:}r:(hX`Nevow`h}r:(h]h]h]h]h]uh j?6h]r:hXNevowr:r:}r:(hUh j:ubah!jubhX as well as one named r:r:}r:(hX as well as one named h j?6ubj)r:}r:(hX `Quotient`h}r:(h]h]h]h]h]uh j?6h]r:hXQuotientr:r:}r:(hUh j:ubah!jubhX9. In a checked-out Nevow tree there is a directory named r:r:}r:(hX9. In a checked-out Nevow tree there is a directory named h j?6ubj)r:}r:(hX `formless`h}r:(h]h]h]h]h]uh j?6h]r:hXformlessr:r:}r:(hUh j:ubah!jubhX* that contains a Python source file named r:r:}r:(hX* that contains a Python source file named h j?6ubj)r:}r:(hUh}r:(h]h]h]h]r:Xfiler:aUrolej:h]uh j?6h]r:hX webform.pyr:r:}r:(hX webform.pyh j:ubah!jubhX=. This repository is accessible via webdav (and thus uses an r:r:}r:(hX=. This repository is accessible via webdav (and thus uses an h j?6ubj)r:}r:(hX`http:`h}r:(h]h]h]h]h]uh j?6h]r:hXhttp:r:r:}r:(hUh j:ubah!jubhXe scheme) through the divmod.org hostname. There are many branches in this repository, and they use a r:r:}r:(hXe scheme) through the divmod.org hostname. There are many branches in this repository, and they use a h j?6ubj)r:}r:(hX``({BRANCHNAME})/({PROJECT})``h}r:(h]h]h]h]h]uh j?6h]r:hX({BRANCHNAME})/({PROJECT})r:r:}r:(hUh j:ubah!jubhX naming policy.r:r:}r:(hX naming policy.h j?6ubeubh!jh}r:(Urefurij:h]r:j)ah]h]h]h]r:j)auh]ubj)jt-j)j)r:}r:(hUh j)r:}r:(hUh j)jqja)j}r:j$j:sh!j;h}r:(h]h]h]h]r:(j%j)eh]r:(j)j$euj!Mejj)j"}r:j%j:sh]r:(h)r:}r:(hXWriting Change Sourcesr:h j:jqja)h!h"h}r:(h]h]h]h]h]uj!Mejj)h]r:hXWriting Change Sourcesr:r:}r:(hj:h j:ubaubj)r:}r:(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 j:jqja)h!jh}r:(h]h]h]h]h]uj!Mgjj)h]r:(hX{For some version-control systems, making Buildbot aware of new changes can be a challenge. If the pre-supplied classes in r:r:}r:(hX{For some version-control systems, making Buildbot aware of new changes can be a challenge. If the pre-supplied classes in h j:ubj))r:}r:(hX:ref:`Change-Sources`r:h j:jqja)h!j-h}r:(UreftypeXrefj/j0Xchange-sourcesU refdomainXstdr:h]h]U refexplicith]h]h]j3jCuj!Mgh]r:jh)r:}r:(hj:h}r:(h]h]r:(j:j:Xstd-refr:eh]h]h]uh j:h]r:hXChange-Sourcesr:r;}r;(hUh j:ubah!jrubaubhX: are not sufficient, then you will need to write your own.r;r;}r;(hX: are not sufficient, then you will need to write your own.h j:ubeubj)r;}r;(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.r;h j:jqja)h!jh}r;(h]h]h]h]h]uj!Mkjj)h]r ;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.r ;r ;}r ;(hj;h j;ubaubj)r ;}r;(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 j:jqja)h!jh}r;(h]h]h]h]h]uj!Mqjj)h]r;(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;r;}r;(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 j ;ubj))r;}r;(hX:ref:`PBChangeSource`r;h j ;jqja)h!j-h}r;(UreftypeXrefj/j0XpbchangesourceU refdomainXstdr;h]h]U refexplicith]h]h]j3jCuj!Mqh]r;jh)r;}r;(hj;h}r;(h]h]r;(j:j;Xstd-refr;eh]h]h]uh j;h]r;hXPBChangeSourcer ;r!;}r";(hUh j;ubah!jrubaubhX~. This section does not describe this particular approach, since it requires no customization within the buildmaster process.r#;r$;}r%;(hX~. This section does not describe this particular approach, since it requires no customization within the buildmaster process.h j ;ubeubj)r&;}r';(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.r(;h j:jqja)h!jh}r);(h]h]h]h]h]uj!Mwjj)h]r*;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.r+;r,;}r-;(hj(;h j&;ubaubj)r.;}r/;(hUh j:jqja)h!j;h}r0;(h]h]h]h]r1;j)ah]r2;j)auj!M~jj)h]r3;(h)r4;}r5;(hX*Writing a Notification-based Change Sourcer6;h j.;jqja)h!h"h}r7;(h]h]h]h]h]uj!M~jj)h]r8;hX*Writing a Notification-based Change Sourcer9;r:;}r;;(hj6;h j4;ubaubj)r<;}r=;(hUh j.;jqNh!jh}r>;(h]h]h]h]h]Uentries]r?;(j+X3buildbot.changes.base.ChangeSource (built-in class)jUtr@;auj!Njj)h]ubcsphinx.addnodes desc rA;)rB;}rC;(hUh j.;jqNh!UdescrD;h}rE;(UnoindexrF;UdomainrG;Xpyh]h]h]h]h]UobjtyperH;jUdesctyperI;juj!Njj)h]rJ;(csphinx.addnodes desc_signature rK;)rL;}rM;(hX"buildbot.changes.base.ChangeSourceh jB;jqja)h!Udesc_signaturerN;h}rO;(h]rP;jajNh]h]h]h]rQ;jaUfullnamerR;jUclassrS;Xbuildbot.changes.baseUfirstrT;uj!Mjj)h]rU;(csphinx.addnodes desc_annotation rV;)rW;}rX;(hXclass h jL;jqja)h!Udesc_annotationrY;h}rZ;(h]h]h]h]h]uj!Mjj)h]r[;hXclass r\;r];}r^;(hUh jW;ubaubcsphinx.addnodes desc_addname r_;)r`;}ra;(hXbuildbot.changes.base.h jL;jqja)h!U desc_addnamerb;h}rc;(h]h]h]h]h]uj!Mjj)h]rd;hXbuildbot.changes.base.re;rf;}rg;(hUh j`;ubaubcsphinx.addnodes desc_name rh;)ri;}rj;(hX ChangeSourceh jL;jqja)h!U desc_namerk;h}rl;(h]h]h]h]h]uj!Mjj)h]rm;hX ChangeSourcern;ro;}rp;(hUh ji;ubaubeubcsphinx.addnodes desc_content rq;)rr;}rs;(hUh jB;jqja)h!U desc_contentrt;h}ru;(h]h]h]h]h]uj!Mjj)h]ubeubj)rv;}rw;(hXQA custom change source must implement :class:`buildbot.interfaces.IChangeSource`.h j.;jqja)h!jh}rx;(h]h]h]h]h]uj!Mjj)h]ry;(hX&A custom change source must implement rz;r{;}r|;(hX&A custom change source must implement h jv;ubj))r};}r~;(hX*:class:`buildbot.interfaces.IChangeSource`r;h jv;jqja)h!j-h}r;(UreftypeXclassj/j0X!buildbot.interfaces.IChangeSourceU refdomainXpyr;h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r;j)r;}r;(hj;h}r;(h]h]r;(j:j;Xpy-classr;eh]h]h]uh j};h]r;hX!buildbot.interfaces.IChangeSourcer;r;}r;(hUh j;ubah!jubaubhX.r;}r;(hX.h jv;ubeubj)r;}r;(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 j.;jqja)h!jh}r;(h]h]h]h]h]uj!Mjj)h]r;(hX*The easiest way to do this is to subclass r;r;}r;(hX*The easiest way to do this is to subclass h j;ubj))r;}r;(hX+:class:`buildbot.changes.base.ChangeSource`r;h j;jqja)h!j-h}r;(UreftypeXclassj/j0X"buildbot.changes.base.ChangeSourceU refdomainXpyr;h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r;j)r;}r;(hj;h}r;(h]h]r;(j:j;Xpy-classr;eh]h]h]uh j;h]r;hX"buildbot.changes.base.ChangeSourcer;r;}r;(hUh j;ubah!jubaubhX, implementing the r;r;}r;(hX, implementing the h j;ubj))r;}r;(hX:meth:`describe`r;h j;jqja)h!j-h}r;(UreftypeXmethj/j0XdescribeU refdomainXpyr;h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r;j)r;}r;(hj;h}r;(h]h]r;(j:j;Xpy-methr;eh]h]h]uh j;h]r;hXdescriber;r;}r;(hUh j;ubah!jubaubhX" method to describe the instance. r;r;}r;(hX" method to describe the instance. h j;ubj))r;}r;(hX:class:`ChangeSource`r;h j;jqja)h!j-h}r;(UreftypeXclassj/j0X ChangeSourceU refdomainXpyr;h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r;j)r;}r;(hj;h}r;(h]h]r;(j:j;Xpy-classr;eh]h]h]uh j;h]r;hX ChangeSourcer;r;}r;(hUh j;ubah!jubaubhX9 is a Twisted service, so you will need to implement the r;r;}r;(hX9 is a Twisted service, so you will need to implement the h j;ubj))r;}r;(hX:meth:`startService`r;h j;jqja)h!j-h}r;(UreftypeXmethj/j0X startServiceU refdomainXpyr;h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r;j)r;}r;(hj;h}r;(h]h]r;(j:j;Xpy-methr;eh]h]h]uh j;h]r;hX startServicer;r;}r;(hUh j;ubah!jubaubhX and r;r;}r;(hX and h j;ubj))r;}r;(hX:meth:`stopService`r;h j;jqja)h!j-h}r;(UreftypeXmethj/j0X stopServiceU refdomainXpyr;h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r;j)r;}r;(hj;h}r;(h]h]r;(j:j;Xpy-methr;eh]h]h]uh j;h]r;hX stopServicer;r;}r;(hUh j;ubah!jubaubhXQ methods to control the means by which your change source receives notifications.r;r;}r;(hXQ methods to control the means by which your change source receives notifications.h j;ubeubj)r;}r;(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 j.;jqja)h!jh}r;(h]h]h]h]h]uj!Mjj)h]r;(hX5When the class does receive a change, it should call r;r;}r;(hX5When the class does receive a change, it should call h j;ubj)r;}r;(hX``self.master.addChange(..)``h}r;(h]h]h]h]h]uh j;h]r;hXself.master.addChange(..)r;r;}r;(hUh j;ubah!jubhXM to submit it to the buildmaster. This method shares the same parameters as r;r;}r;(hXM to submit it to the buildmaster. This method shares the same parameters as h j;ubj)r<}r<(hX``master.db.changes.addChange``h}r<(h]h]h]h]h]uh j;h]r<hXmaster.db.changes.addChanger<r<}r<(hUh j<ubah!jubhX\, so consult the API documentation for that function for details on the available arguments.r<r<}r <(hX\, so consult the API documentation for that function for details on the available arguments.h j;ubeubj)r <}r <(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 j.;jqja)h!jh}r <(h]h]h]h]h]uj!Mjj)h]r <(hX#You will probably also want to set r<r<}r<(hX#You will probably also want to set h j <ubj)r<}r<(hX``compare_attrs``h}r<(h]h]h]h]h]uh j <h]r<hX compare_attrsr<r<}r<(hUh j<ubah!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.r<r<}r<(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 j <ubeubeubj:eubjqja)h!j;h}r<(h]h]h]h]r<j)ah]r<j)auj!Mjj)h]r<(h)r<}r <(hXWriting a Change Pollerr!<h j:jqja)h!h"h}r"<(h]h]h]h]h]uj!Mjj)h]r#<hXWriting a Change Pollerr$<r%<}r&<(hj!<h j<ubaubj)r'<}r(<(hUh j:jqNh!jh}r)<(h]h]h]h]h]Uentries]r*<(j+X:buildbot.changes.base.PollingChangeSource (built-in class)jUtr+<auj!Njj)h]ubjA;)r,<}r-<(hUh j:jqNh!jD;h}r.<(jF;jG;Xpyh]h]h]h]h]jH;jjI;juj!Njj)h]r/<(jK;)r0<}r1<(hX)buildbot.changes.base.PollingChangeSourceh j,<jqja)h!jN;h}r2<(h]r3<jajNh]h]h]h]r4<jajR;jjS;Xbuildbot.changes.basejT;uj!Mjj)h]r5<(jV;)r6<}r7<(hXclass h j0<jqja)h!jY;h}r8<(h]h]h]h]h]uj!Mjj)h]r9<hXclass r:<r;<}r<<(hUh j6<ubaubj_;)r=<}r><(hXbuildbot.changes.base.h j0<jqja)h!jb;h}r?<(h]h]h]h]h]uj!Mjj)h]r@<hXbuildbot.changes.base.rA<rB<}rC<(hUh j=<ubaubjh;)rD<}rE<(hXPollingChangeSourceh j0<jqja)h!jk;h}rF<(h]h]h]h]h]uj!Mjj)h]rG<hXPollingChangeSourcerH<rI<}rJ<(hUh jD<ubaubeubjq;)rK<}rL<(hUh j,<jqja)h!jt;h}rM<(h]h]h]h]h]uj!Mjj)h]ubeubj)rN<}rO<(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 j:jqja)h!jh}rP<(h]h]h]h]h]uj!Mjj)h]rQ<(hXPolling is a very common means of seeking changes, so Buildbot supplies a utility parent class to make it easier. A poller should subclass rR<rS<}rT<(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 jN<ubj))rU<}rV<(hX2:class:`buildbot.changes.base.PollingChangeSource`rW<h jN<jqja)h!j-h}rX<(UreftypeXclassj/j0X)buildbot.changes.base.PollingChangeSourceU refdomainXpyrY<h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rZ<j)r[<}r\<(hjW<h}r]<(h]h]r^<(j:jY<Xpy-classr_<eh]h]h]uh jU<h]r`<hX)buildbot.changes.base.PollingChangeSourcera<rb<}rc<(hUh j[<ubah!jubaubhX, which is a subclass of rd<re<}rf<(hX, which is a subclass of h jN<ubj))rg<}rh<(hX:class:`ChangeSource`ri<h jN<jqja)h!j-h}rj<(UreftypeXclassj/j0X ChangeSourceU refdomainXpyrk<h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rl<j)rm<}rn<(hji<h}ro<(h]h]rp<(j:jk<Xpy-classrq<eh]h]h]uh jg<h]rr<hX ChangeSourcers<rt<}ru<(hUh jm<ubah!jubaubhX . This subclass implements the rv<rw<}rx<(hX . This subclass implements the h jN<ubj))ry<}rz<(hX:meth:`Service`r{<h jN<jqja)h!j-h}r|<(UreftypeXmethj/j0XServiceU refdomainXpyr}<h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r~<j)r<}r<(hj{<h}r<(h]h]r<(j:j}<Xpy-methr<eh]h]h]uh jy<h]r<hXServicer<r<}r<(hUh j<ubah!jubaubhX methods, and causes the r<r<}r<(hX methods, and causes the h jN<ubj))r<}r<(hX :meth:`poll`r<h jN<jqja)h!j-h}r<(UreftypeXmethj/j0XpollU refdomainXpyr<h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r<j)r<}r<(hj<h}r<(h]h]r<(j:j<Xpy-methr<eh]h]h]uh j<h]r<hXpollr<r<}r<(hUh j<ubah!jubaubhX method to be called every r<r<}r<(hX method to be called every h jN<ubj)r<}r<(hX``self.pollInterval``h}r<(h]h]h]h]h]uh jN<h]r<hXself.pollIntervalr<r<}r<(hUh j<ubah!jubhXI seconds. This method should return a Deferred to signal its completion.r<r<}r<(hXI seconds. This method should return a Deferred to signal its completion.h jN<ubeubj)r<}r<(hX[Aside from the service methods, the other concerns in the previous section apply here, too.r<h j:jqja)h!jh}r<(h]h]h]h]h]uj!Mjj)h]r<hX[Aside from the service methods, the other concerns in the previous section apply here, too.r<r<}r<(hj<h j<ubaubeubjaj)j)j)j,j)j3j)r<}r<(hUh j)jqja)j}r<j2j)r<}r<(hX#.. _Writing-BuildStep-Constructors:h j)jqja)h!jh}r<(h]h]h]h]h]jj3uj!M jj)h]ubsh!j;h}r<(h]h]h]h]r<(j3j)eh]r<(j)j2euj!Mjj)j"}r<j3j<sh]r<(h)r<}r<(hXWriting BuildStep Constructorsr<h j<jqja)h!h"h}r<(h]h]h]h]h]uj!Mjj)h]r<hXWriting BuildStep Constructorsr<r<}r<(hj<h j<ubaubj)r<}r<(hX)Build steps act as their own factories, so their constructors are a bit more complex than necessary. In the configuration file, a :class:`~buildbot.process.buildstep.BuildStep` object is instantiated, but because steps store state locally while executing, this object cannot be used during builds.h j<jqja)h!jh}r<(h]h]h]h]h]uj!Mjj)h]r<(hXBuild steps act as their own factories, so their constructors are a bit more complex than necessary. In the configuration file, a r<r<}r<(hXBuild steps act as their own factories, so their constructors are a bit more complex than necessary. In the configuration file, a h j<ubj))r<}r<(hX.:class:`~buildbot.process.buildstep.BuildStep`r<h j<jqja)h!j-h}r<(UreftypeXclassj/j0X$buildbot.process.buildstep.BuildStepU refdomainXpyr<h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r<j)r<}r<(hj<h}r<(h]h]r<(j:j<Xpy-classr<eh]h]h]uh j<h]r<hX BuildStepr<r<}r<(hUh j<ubah!jubaubhXy object is instantiated, but because steps store state locally while executing, this object cannot be used during builds.r<r<}r<(hXy object is instantiated, but because steps store state locally while executing, this object cannot be used during builds.h j<ubeubj)r<}r<(hX@Consider the use of a :class:`BuildStep` in :file:`master.cfg`::h j<jqja)h!jh}r<(h]h]h]h]h]uj!Mjj)h]r<(hXConsider the use of a r<r<}r<(hXConsider the use of a h j<ubj))r<}r<(hX:class:`BuildStep`r<h j<jqja)h!j-h}r<(UreftypeXclassj/j0X BuildStepU refdomainXpyr<h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r<j)r<}r<(hj<h}r<(h]h]r<(j:j<Xpy-classr<eh]h]h]uh j<h]r<hX BuildStepr<r<}r<(hUh j<ubah!jubaubhX 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 master.cfgr<r<}r<(hX master.cfgh j<ubah!jubhX:r<}r<(hX:h j<ubeubjM)r<}r=(hX0f.addStep(MyStep(someopt="stuff", anotheropt=1))h j<jqja)h!jPh}r=(jTjUh]h]h]h]h]uj!Mjj)h]r=hX0f.addStep(MyStep(someopt="stuff", anotheropt=1))r=r=}r=(hUh j<ubaubj)r=}r=(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 j<jqja)h!jh}r=(h]h]h]h]h]uj!Mjj)h]r =(hX(This creates a single instance of class r =r =}r =(hX(This creates a single instance of class h j=ubj)r =}r=(hX ``MyStep``h}r=(h]h]h]h]h]uh j=h]r=hXMyStepr=r=}r=(hUh j =ubah!jubhXV. However, Buildbot needs a new object each time the step is executed. An instance of r=r=}r=(hXV. However, Buildbot needs a new object each time the step is executed. An instance of h j=ubj))r=}r=(hX.:class:`~buildbot.process.buildstep.BuildStep`r=h j=jqja)h!j-h}r=(UreftypeXclassj/j0X$buildbot.process.buildstep.BuildStepU refdomainXpyr=h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r=j)r=}r=(hj=h}r=(h]h]r =(j:j=Xpy-classr!=eh]h]h]uh j=h]r"=hX BuildStepr#=r$=}r%=(hUh j=ubah!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.r&=r'=}r(=(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 j=ubeubj)r)=}r*=(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 j<jqja)h!jh}r+=(h]h]h]h]h]uj!Mjj)h]r,=(hXpIt is customary to call the parent class's constructor with all otherwise-unspecified keyword arguments. Keep a r-=r.=}r/=(hXpIt is customary to call the parent class's constructor with all otherwise-unspecified keyword arguments. Keep a h j)=ubj)r0=}r1=(hX ``**kwargs``h}r2=(h]h]h]h]h]uh j)=h]r3=hX**kwargsr4=r5=}r6=(hUh j0=ubah!jubhXY argument on the end of your options, and pass that up to the parent class's constructor.r7=r8=}r9=(hXY argument on the end of your options, and pass that up to the parent class's constructor.h j)=ubeubj)r:=}r;=(hX!The whole thing looks like this::h j<jqja)h!jh}r<=(h]h]h]h]h]uj!M!jj)h]r==hX The whole thing looks like this:r>=r?=}r@=(hX The whole thing looks like this:h j:=ubaubjM)rA=}rB=(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 j<jqja)h!jPh}rC=(jTjUh]h]h]h]h]uj!M#jj)h]rD=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 = speedrE=rF=}rG=(hUh jA=ubaubeubj)j)rH=}rI=(hUh j)jqja)h!j;h}rJ=(h]h]h]h]rK=j)ah]rL=j)auj!MAjj)h]rM=(h)rN=}rO=(hXRunning CommandsrP=h jH=jqja)h!h"h}rQ=(h]h]h]h]h]uj!MAjj)h]rR=hXRunning CommandsrS=rT=}rU=(hjP=h jN=ubaubj)rV=}rW=(hXTo spawn a command in the buildslave, create a :class:`~buildbot.process.buildstep.RemoteCommand` instance in your step's ``start`` method and run it with :meth:`~buildbot.process.buildstep.BuildStep.runCommand`::h jH=jqja)h!jh}rX=(h]h]h]h]h]uj!MCjj)h]rY=(hX/To spawn a command in the buildslave, create a rZ=r[=}r\=(hX/To spawn a command in the buildslave, create a h jV=ubj))r]=}r^=(hX2:class:`~buildbot.process.buildstep.RemoteCommand`r_=h jV=jqja)h!j-h}r`=(UreftypeXclassj/j0X(buildbot.process.buildstep.RemoteCommandU refdomainXpyra=h]h]U refexplicith]h]h]j3jCj Nj Nuj!MCh]rb=j)rc=}rd=(hj_=h}re=(h]h]rf=(j:ja=Xpy-classrg=eh]h]h]uh j]=h]rh=hX RemoteCommandri=rj=}rk=(hUh jc=ubah!jubaubhX instance in your step's rl=rm=}rn=(hX instance in your step's h jV=ubj)ro=}rp=(hX ``start``h}rq=(h]h]h]h]h]uh jV=h]rr=hXstartrs=rt=}ru=(hUh jo=ubah!jubhX method and run it with rv=rw=}rx=(hX method and run it with h jV=ubj))ry=}rz=(hX8:meth:`~buildbot.process.buildstep.BuildStep.runCommand`r{=h jV=jqja)h!j-h}r|=(UreftypeXmethj/j0X/buildbot.process.buildstep.BuildStep.runCommandU refdomainXpyr}=h]h]U refexplicith]h]h]j3jCj Nj Nuj!MCh]r~=j)r=}r=(hj{=h}r=(h]h]r=(j:j}=Xpy-methr=eh]h]h]uh jy=h]r=hX runCommandr=r=}r=(hUh j=ubah!jubaubhX:r=}r=(hX:h jV=ubeubjM)r=}r=(hX2cmd = RemoteCommand(args) d = self.runCommand(cmd)h jH=jqja)h!jPh}r=(jTjUh]h]h]h]h]uj!MEjj)h]r=hX2cmd = RemoteCommand(args) d = self.runCommand(cmd)r=r=}r=(hUh j=ubaubj)r=}r=(hX To add a LogFile, use :meth:`~buildbot.process.buildstep.BuildStep.addLog`. Make sure the log gets closed when it finishes. When giving a Logfile to a :class:`~buildbot.process.buildstep.RemoteShellCommand`, just ask it to close the log when the command completes::h jH=jqja)h!jh}r=(h]h]h]h]h]uj!MHjj)h]r=(hXTo add a LogFile, use r=r=}r=(hXTo add a LogFile, use h j=ubj))r=}r=(hX4:meth:`~buildbot.process.buildstep.BuildStep.addLog`r=h j=jqja)h!j-h}r=(UreftypeXmethj/j0X+buildbot.process.buildstep.BuildStep.addLogU refdomainXpyr=h]h]U refexplicith]h]h]j3jCj Nj Nuj!MHh]r=j)r=}r=(hj=h}r=(h]h]r=(j:j=Xpy-methr=eh]h]h]uh j=h]r=hXaddLogr=r=}r=(hUh j=ubah!jubaubhXM. Make sure the log gets closed when it finishes. When giving a Logfile to a r=r=}r=(hXM. Make sure the log gets closed when it finishes. When giving a Logfile to a h j=ubj))r=}r=(hX7:class:`~buildbot.process.buildstep.RemoteShellCommand`r=h j=jqja)h!j-h}r=(UreftypeXclassj/j0X-buildbot.process.buildstep.RemoteShellCommandU refdomainXpyr=h]h]U refexplicith]h]h]j3jCj Nj Nuj!MHh]r=j)r=}r=(hj=h}r=(h]h]r=(j:j=Xpy-classr=eh]h]h]uh j=h]r=hXRemoteShellCommandr=r=}r=(hUh j=ubah!jubaubhX:, just ask it to close the log when the command completes:r=r=}r=(hX:, just ask it to close the log when the command completes:h j=ubeubjM)r=}r=(hXClog = self.addLog('output') cmd.useLog(log, closeWhenFinished=True)h jH=jqja)h!jPh}r=(jTjUh]h]h]h]h]uj!MLjj)h]r=hXClog = self.addLog('output') cmd.useLog(log, closeWhenFinished=True)r=r=}r=(hUh j=ubaubeubj)j6jj.j)j:j)j)r=}r=(hUh j)jqja)j}r=jj)r=}r=(hX.. _Factory-Workdir-Functions:h j)r=}r=(hUh j)jqja)h!j;h}r=(h]h]h]h]r=j)ah]r=j)auj!Mjj)h]r=(h)r=}r=(hXCustom Build Classesr=h j=jqja)h!h"h}r=(h]h]h]h]h]uj!Mjj)h]r=hXCustom Build Classesr=r=}r=(hj=h j=ubaubj)r=}r=(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 j=jqja)h!jh}r=(h]h]h]h]h]uj!Mjj)h]r=(hX The standard r=r=}r=(hX The standard h j=ubj))r=}r=(hX:class:`BuildFactory`r=h j=jqja)h!j-h}r=(UreftypeXclassj/j0X BuildFactoryU refdomainXpyr=h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r=j)r=}r=(hj=h}r=(h]h]r=(j:j=Xpy-classr=eh]h]h]uh j=h]r=hX BuildFactoryr=r=}r=(hUh j=ubah!jubaubhX object creates r=r=}r=(hX object creates h j=ubj))r=}r=(hX:class:`Build`r=h j=jqja)h!j-h}r=(UreftypeXclassj/j0XBuildU refdomainXpyr=h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r=j)r=}r=(hj=h}r=(h]h]r=(j:j=Xpy-classr=eh]h]h]uh j=h]r=hXBuildr=r=}r=(hUh j=ubah!jubaubhXD objects by default. These Builds will each execute a collection of r=r=}r>(hXD objects by default. These Builds will each execute a collection of h j=ubj))r>}r>(hX:class:`BuildStep`r>h j=jqja)h!j-h}r>(UreftypeXclassj/j0X BuildStepU refdomainXpyr>h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r>j)r>}r>(hj>h}r >(h]h]r >(j:j>Xpy-classr >eh]h]h]uh j>h]r >hX BuildStepr >r>}r>(hUh j>ubah!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.r>r>}r>(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 j=ubeubj)r>}r>(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 j=jqja)h!jh}r>(h]h]h]h]h]uj!Mjj)h]r>(hXBy setting the factory's r>r>}r>(hXBy setting the factory's h j>ubj)r>}r>(hX``buildClass``h}r>(h]h]h]h]h]uh j>h]r>hX buildClassr>r>}r >(hUh j>ubah!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:r!>r">}r#>(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 j>ubeubjM)r$>}r%>(hXclass DynamicBuild(Build): # .. override some methods f = factory.BuildFactory() f.buildClass = DynamicBuild f.addStep(...)h j=jqja)h!jPh}r&>(jTjUh]h]h]h]h]uj!Mjj)h]r'>hXclass DynamicBuild(Build): # .. override some methods f = factory.BuildFactory() f.buildClass = DynamicBuild f.addStep(...)r(>r)>}r*>(hUh j$>ubaubj=eubjqja)h!jh}r+>(h]h]h]h]h]jj uj!Mjj)h]ubsh!j;h}r,>(h]h]h]h]r->(j j)eh]r.>(j)jeuj!Mjj)j"}r/>j j=sh]r0>(h)r1>}r2>(hXFactory Workdir Functionsr3>h j=jqja)h!h"h}r4>(h]h]h]h]h]uj!Mjj)h]r5>hXFactory Workdir Functionsr6>r7>}r8>(hj3>h j1>ubaubj)r9>}r:>(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 j=jqja)h!jh}r;>(h]h]h]h]h]uj!Mjj)h]r<>(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 r=>r>>}r?>(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 j9>ubj)r@>}rA>(hX ``workdir``h}rB>(h]h]h]h]h]uh j9>h]rC>hXworkdirrD>rE>}rF>(hUh j@>ubah!jubhXW attribute of the build factory to a callable. That callable will be invoked with the rG>rH>}rI>(hXW attribute of the build factory to a callable. That callable will be invoked with the h j9>ubj))rJ>}rK>(hX:class:`SourceStamp`rL>h j9>jqja)h!j-h}rM>(UreftypeXclassj/j0X SourceStampU refdomainXpyrN>h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rO>j)rP>}rQ>(hjL>h}rR>(h]h]rS>(j:jN>Xpy-classrT>eh]h]h]uh jJ>h]rU>hX SourceStamprV>rW>}rX>(hUh jP>ubah!jubaubhX for the build, and should return the appropriate workdir. Note that the value must be returned immediately - Deferreds are not supported.rY>rZ>}r[>(hX for the build, and should return the appropriate workdir. Note that the value must be returned immediately - Deferreds are not supported.h j9>ubeubj)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=jqja)h!jh}r^>(h]h]h]h]h]uj!Mjj)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`>ra>}rb>(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\>ubaubjM)rc>}rd>(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 j=jqja)h!jPh}re>(jTjUh]h]h]h]h]uj!Mjj)h]rf>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})rg>rh>}ri>(hUh jc>ubaubj)rj>}rk>(hX(The end result is a set of workdirs likerl>h j=jqja)h!jh}rm>(h]h]h]h]h]uj!Mjj)h]rn>hX(The end result is a set of workdirs likero>rp>}rq>(hjl>h jj>ubaubjM)rr>}rs>(hX[Repo1 => /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88h j=jqja)h!jPh}rt>(jRjSXnonejTjUh]h]h]h]h]uj!Mjj)h]ru>hX[Repo1 => /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88rv>rw>}rx>(hUh jr>ubaubj)ry>}rz>(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 j=jqja)h!jh}r{>(h]h]h]h]h]uj!Mjj)h]r|>(hXYou could make the r}>r~>}r>(hXYou could make the h jy>ubj))r>}r>(hX:func:`workdir()`r>h jy>jqja)h!j-h}r>(UreftypeXfuncj/j0XworkdirU refdomainXpyr>h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r>j)r>}r>(hj>h}r>(h]h]r>(j:j>Xpy-funcr>eh]h]h]uh j>h]r>hXworkdirr>r>}r>(hUh j>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 jy>ubeubeubj)j-j)jC6j)j.j)j-j)j)j0j0j1j1j+j+j+j+j@.jF.j&/j+/j/j-Uindex-3r>jw)r>}r>(hje)h j)jqja)j}h!jh}r>(h]h]r>jh)ah]h]r>j>ah]uj!MTjj)j"}r>j>j)sh]r>(h)r>}r>(hjl)h}r>(h]h]h]h]h]uh j>h]r>hXTodor>r>}r>(hjl)h j>ubah!h"ubj)r>}r>(hjt)h j>jqja)h!jh}r>(h]h]h]h]h]uj!MVh]r>(hXWhat r>r>}r>(hjz)h j>ubjh)r>}r>(hj})h}r>(h]h]h]h]h]uh j>h]r>hXisr>r>}r>(hUh j>ubah!jrubhX. the best way to do this? From the docstring:r>r>}r>(hj)h j>ubeubj)r>}r>(hj)h j>jqja)h!jh}r>(h]h]h]h]h]uj!MXh]r>hXKAs the step runs, it should send status information to the BuildStepStatus:r>r>}r>(hj)h j>ubaubjM)r>}r>(hj)h j>h!jPh}r>(jTjUh]h]h]h]h]uj!M[h]r>hX\self.step_status.setText(['compile', 'failed']) self.step_status.setText2(['4', 'warnings'])r>r>}r>(hUh j>ubaubeubj j-j)j=j,j,ji,jl,j)j.;jjq-j)j.jj)r>}r>(hUh j)jqja)j}r>jjF2sh!j;h}r>(h]h]h]h]r>(jj)eh]r>(j)jeuj!Mjj)j"}r>jjF2sh]r>(h)r>}r>(hXAdding LogObserversr>h j>jqja)h!h"h}r>(h]h]h]h]h]uj!Mjj)h]r>hXAdding LogObserversr>r>}r>(hj>h j>ubaubj)r>}r>(hX>Most 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. You can get a better measure of progress by counting the number of source files compiled or test cases run than by merely tracking the number of bytes that have been written to stdout. This improves the accuracy and the smoothness of the ETA display.h j>jqja)h!jh}r>(h]h]h]h]h]uj!Mjj)h]r>(hXpMost shell commands emit messages to stdout or stderr as they operate, especially if you ask them nicely with a r>r>}r>(hXpMost shell commands emit messages to stdout or stderr as they operate, especially if you ask them nicely with a h j>ubj))r>}r>(hX:option:`--verbose`r>h j>jqja)h!j-h}r>(UreftypeXoptionj/j0X --verboseU refdomainXstdr>j2Nh]h]U refexplicith]h]h]j3jCuj!Mh]r>j5)r>}r>(hj>h}r>(h]h]r>(j:j>X std-optionr>eh]h]h]uh j>h]r>hX --verboser>r>}r>(hUh j>ubah!j@ubaubhXP flag of some sort. They may also write text to a log file while they run. Your r>r>}r>(hXP flag of some sort. They may also write text to a log file while they run. Your h j>ubj))r>}r>(hX:class:`BuildStep`r>h j>jqja)h!j-h}r>(UreftypeXclassj/j0X BuildStepU refdomainXpyr>h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r>j)r>}r>(hj>h}r>(h]h]r>(j:j>Xpy-classr>eh]h]h]uh j>h]r>hX BuildStepr>r>}r>(hUh j>ubah!jubaubhXY can watch this output as it arrives, to keep track of how much progress the command has made. You can get a better measure of progress by counting the number of source files compiled or test cases run than by merely tracking the number of bytes that have been written to stdout. This improves the accuracy and the smoothness of the ETA display.r>r>}r>(hXY can watch this output as it arrives, to keep track of how much progress the command has made. You can get a better measure of progress by counting the number of source files compiled or test cases run than by merely tracking the number of bytes that have been written to stdout. This improves the accuracy and the smoothness of the ETA display.h j>ubeubj)r>}r>(hXTo accomplish this, you will need to attach a :class:`LogObserver` to one of the log channels, most commonly to the :file:`stdio` channel but perhaps to another one which tracks a log file. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally. Once the observer has decided that some event has occurred (like a source file being compiled), it can use the :meth:`setProgress` method to tell the :class:`BuildStep` about the progress that this event represents.h j>jqja)h!jh}r>(h]h]h]h]h]uj!Mjj)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?(hX:class:`LogObserver`r?h j>jqja)h!j-h}r?(UreftypeXclassj/j0X LogObserverU refdomainXpyr?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r?j)r?}r ?(hj?h}r ?(h]h]r ?(j:j?Xpy-classr ?eh]h]h]uh j?h]r ?hX LogObserverr?r?}r?(hUh j?ubah!jubaubhX2 to one of the log channels, most commonly to the r?r?}r?(hX2 to one of the log channels, most commonly to 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!jubhX+ channel but perhaps to another one which tracks a log file. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally. Once the observer has decided that some event has occurred (like a source file being compiled), it can use the r?r?}r?(hX+ channel but perhaps to another one which tracks a log file. This observer is given all text as it is emitted from the command, and has the opportunity to parse that output incrementally. Once the observer has decided that some event has occurred (like a source file being compiled), it can use the h j>ubj))r ?}r!?(hX:meth:`setProgress`r"?h j>jqja)h!j-h}r#?(UreftypeXmethj/j0X setProgressU refdomainXpyr$?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r%?j)r&?}r'?(hj"?h}r(?(h]h]r)?(j:j$?Xpy-methr*?eh]h]h]uh j ?h]r+?hX setProgressr,?r-?}r.?(hUh j&?ubah!jubaubhX method to tell the r/?r0?}r1?(hX method to tell the h j>ubj))r2?}r3?(hX:class:`BuildStep`r4?h j>jqja)h!j-h}r5?(UreftypeXclassj/j0X BuildStepU refdomainXpyr6?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r7?j)r8?}r9?(hj4?h}r:?(h]h]r;?(j:j6?Xpy-classr?r??}r@?(hUh j8?ubah!jubaubhX/ about the progress that this event represents.rA?rB?}rC?(hX/ about the progress that this event represents.h j>ubeubj)rD?}rE?(hXuThere are a number of pre-built :class:`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 j>jqja)h!jh}rF?(h]h]h]h]h]uj!Mjj)h]rG?(hX There are a number of pre-built rH?rI?}rJ?(hX There are a number of pre-built h jD?ubj))rK?}rL?(hX:class:`LogObserver`rM?h jD?jqja)h!j-h}rN?(UreftypeXclassj/j0X LogObserverU refdomainXpyrO?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rP?j)rQ?}rR?(hjM?h}rS?(h]h]rT?(j:jO?Xpy-classrU?eh]h]h]uh jK?h]rV?hX LogObserverrW?rX?}rY?(hUh jQ?ubah!jubaubhX. classes that you can choose from (defined in rZ?r[?}r\?(hX. classes that you can choose from (defined in h jD?ubj))r]?}r^?(hX!:mod:`buildbot.process.buildstep`r_?h jD?jqja)h!j-h}r`?(UreftypeXmodj/j0Xbuildbot.process.buildstepU refdomainXpyra?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rb?j)rc?}rd?(hj_?h}re?(h]h]rf?(j:ja?Xpy-modrg?eh]h]h]uh j]?h]rh?hXbuildbot.process.buildstepri?rj?}rk?(hUh jc?ubah!jubaubhXH, and of course you can subclass them to add further customization. The rl?rm?}rn?(hXH, and of course you can subclass them to add further customization. The h jD?ubj))ro?}rp?(hX:class:`LogLineObserver`rq?h jD?jqja)h!j-h}rr?(UreftypeXclassj/j0XLogLineObserverU refdomainXpyrs?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rt?j)ru?}rv?(hjq?h}rw?(h]h]rx?(j:js?Xpy-classry?eh]h]h]uh jo?h]rz?hXLogLineObserverr{?r|?}r}?(hUh ju?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 jD?ubj)r?}r?(hUh}r?(h]h]h]h]r?Xfiler?aUrolej?h]uh jD?h]r?hXstdoutr?r?}r?(hXstdouth j?ubah!jubhX/r?}r?(hX/h jD?ubj)r?}r?(hUh}r?(h]h]h]h]r?Xfiler?aUrolej?h]uh jD?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 jD?ubj))r?}r?(hX:meth:`setMaxLineLength()`r?h jD?jqja)h!j-h}r?(UreftypeXmethj/j0XsetMaxLineLengthU refdomainXpyr?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r?j)r?}r?(hj?h}r?(h]h]r?(j:j?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 jD?ubj))r?}r?(hX:class:`LogLineObserver`r?h jD?jqja)h!j-h}r?(UreftypeXclassj/j0XLogLineObserverU refdomainXpyr?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r?j)r?}r?(hj?h}r?(h]h]r?(j:j?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 jD?ubj)r?}r?(hX``sys.maxint``h}r?(h]h]h]h]h]uh jD?h]r?hX sys.maxintr?r?}r?(hUh j?ubah!jubhX for effective infinity.)r?r?}r?(hX for effective infinity.)h jD?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 j>jqja)h!jh}r?(h]h]h]h]h]uj!Mjj)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?jqja)h!j-h}r?(UreftypeXclassj/j0XTrialTestCaseCounterU refdomainXpyr?h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r?j)r?}r?(hj?h}r?(h]h]r?(j:j?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))r?}r?(hX:bb:step:`Trial`r?h j?jqja)h!j-h}r?(UreftypeXstepj/j0XTrialU refdomainXbbr?h]h]U refexplicith]h]h]j3jCuj!Mh]r?j)r?}r?(hj?h}r?(h]h]r?(j:j?Xbb-stepr?eh]h]h]uh j?h]r?hXTrialr?r?}r?(hUh j?ubah!jubaubhX` step to count test cases as they are run. As Trial executes, it emits lines like the following:r?r?}r?(hX` step to count test cases as they are run. As Trial executes, it emits lines like the following:h j?ubeubjM)r?}r?(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 j>jqja)h!jPh}r?(jRjSXnonejTjUh]h]h]h]h]uj!Mjj)h]r?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]r?r?}r?(hUh j?ubaubj)r?}r?(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 j>jqja)h!jh}r?(h]h]h]h]h]uj!Mjj)h]r?(hX8When the tests are finished, trial emits a long line of r?r?}r?(hX8When the tests are finished, trial emits a long line of 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 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 r@r@}r@(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 j?ubj)r @}r @(hX`[OK]`h}r @(h]h]h]h]h]uh j?h]r @hX[OK]r @r@}r@(hUh j @ubah!jubhX lines.r@r@}r@(hX lines.h j?ubeubj)r@}r@(hX"The parser class looks like this::h j>jqja)h!jh}r@(h]h]h]h]h]uj!Mjj)h]r@hX!The parser class looks like this:r@r@}r@(hX!The parser class looks like this:h j@ubaubjM)r@}r@(hX6from buildbot.process.buildstep 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 j>jqja)h!jPh}r@(jTjUh]h]h]h]h]uj!Mjj)h]r@hX6from buildbot.process.buildstep 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 j@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 j>jqja)h!jh}r#@(h]h]h]h]h]uj!Mjj)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/@r0@}r1@(hX to ignore everything after the h j!@ubj)r2@}r3@(hX``====``h}r4@(h]h]h]h]h]uh j!@h]r5@hX====r6@r7@}r8@(hUh j2@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.r9@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 @code{self.step.setProgress}. This class is specifically measuring progress along the `tests` metric, in units of test cases (as opposed to other kinds of progress like the `output` metric, which measures in units of bytes). The Progress-tracking code uses each progress metric separately to come up with an overall completion percentage and an ETA value.h j>jqja)h!jh}r>@(h]h]h]h]h]uj!Mjj)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 @code{self.step.setProgress}. This class is specifically measuring progress along the r@@rA@}rB@(hXEach time it identifies a test has been completed, it increments its counter and delivers the new progress value to the step with @code{self.step.setProgress}. This class is specifically measuring progress along the h j<@ubj)rC@}rD@(hX`tests`h}rE@(h]h]h]h]h]uh j<@h]rF@hXtestsrG@rH@}rI@(hUh jC@ubah!jubhXP metric, in units of test cases (as opposed to other kinds of progress like the rJ@rK@}rL@(hXP metric, in units of test cases (as opposed to other kinds of progress like the h j<@ubj)rM@}rN@(hX`output`h}rO@(h]h]h]h]h]uh j<@h]rP@hXoutputrQ@rR@}rS@(hUh jM@ubah!jubhX metric, which measures in units of bytes). The Progress-tracking code uses each progress metric separately to come up with an overall completion percentage and an ETA value.rT@rU@}rV@(hX metric, which measures in units of bytes). The Progress-tracking code uses each progress metric separately to come up with an overall completion percentage and an ETA value.h j<@ubeubj)rW@}rX@(hXpTo connect this parser into the :bb:step:`Trial` build step, ``Trial.__init__`` ends with the following clause::h j>jqja)h!jh}rY@(h]h]h]h]h]uj!M%jj)h]rZ@(hX To connect this parser into the r[@r\@}r]@(hX To connect this parser into the h jW@ubj))r^@}r_@(hX:bb:step:`Trial`r`@h jW@jqja)h!j-h}ra@(UreftypeXstepj/j0XTrialU refdomainXbbrb@h]h]U refexplicith]h]h]j3jCuj!M%h]rc@j)rd@}re@(hj`@h}rf@(h]h]rg@(j:jb@Xbb-steprh@eh]h]h]uh j^@h]ri@hXTrialrj@rk@}rl@(hUh jd@ubah!jubaubhX build step, rm@rn@}ro@(hX build step, h jW@ubj)rp@}rq@(hX``Trial.__init__``h}rr@(h]h]h]h]h]uh jW@h]rs@hXTrial.__init__rt@ru@}rv@(hUh jp@ubah!jubhX ends with the following clause:rw@rx@}ry@(hX ends with the following clause:h jW@ubeubjM)rz@}r{@(hX# this counter will feed Progress along the 'test cases' metric counter = TrialTestCaseCounter() self.addLogObserver('stdio', counter) self.progressMetrics += ('tests',)h j>jqja)h!jPh}r|@(jTjUh]h]h]h]h]uj!M(jj)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 jz@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 j>jqja)h!jh}r@(h]h]h]h]h]uj!M-jj)h]r@(hXThis creates a r@r@}r@(hXThis creates a h j@ubj))r@}r@(hX:class:`TrialTestCaseCounter`r@h j@jqja)h!j-h}r@(UreftypeXclassj/j0XTrialTestCaseCounterU refdomainXpyr@h]h]U refexplicith]h]h]j3jCj Nj Nuj!M-h]r@j)r@}r@(hj@h}r@(h]h]r@(j:j@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@jqja)h!j-h}r@(UreftypeXattrj/j0XstepU refdomainXpyr@h]h]U refexplicith]h]h]j3jCj Nj Nuj!M-h]r@j)r@}r@(hj@h}r@(h]h]r@(j:j@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'jC6j)j0j)j<jj0<j)j)r@}r@(hUh j)jqja)h!j;h}r@(h]h]h]h]r@j)ah]r@j)auj!Mjj)h]r@(h)r@}r@(hX.Writing a New Latent Buildslave Implementationr@h j@jqja)h!h"h}r@(h]h]h]h]h]uj!Mjj)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@jqja)h!jh}r@(h]h]h]h]h]uj!Mjj)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@jqja)h!j-h}r@(UreftypeXclassj/j0X,buildbot.buildslave.AbstractLatentBuildSlaveU refdomainXpyr@h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r@j)r@}r@(hj@h}r@(h]h]r@(j:j@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@jqja)h!j-h}r@(UreftypeXmethj/j0Xstart_instanceU refdomainXpyr@h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r@j)r@}r@(hj@h}r@(h]h]r@(j:j@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@jqja)h!j-h}r@(UreftypeXmethj/j0X stop_instanceU refdomainXpyr@h]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r@j)r@}r@(hj@h}r@(h]h]r@(j:j@Xpy-methr@eh]h]h]uh j@h]r@hX stop_instancer@r@}r@(hUh j@ubah!jubaubhX.rA}rA(hX.h j@ubeubjM)rA}rA(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@jqja)h!jPh}rA(jTjUh]h]h]h]h]uj!Mjj)h]rAhXdef 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 NotImplementedErrorrArA}rA(hUh jAubaubj)r A}r A(hXSee :class:`buildbot.ec2buildslave.EC2LatentBuildSlave` for an example, or see the test example :class:`buildbot.test_slaves.FakeLatentBuildSlave`.h j@jqja)h!jh}r A(h]h]h]h]h]uj!Mjj)h]r A(hXSee r ArA}rA(hXSee h j Aubj))rA}rA(hX3:class:`buildbot.ec2buildslave.EC2LatentBuildSlave`rAh j Ajqja)h!j-h}rA(UreftypeXclassj/j0X*buildbot.ec2buildslave.EC2LatentBuildSlaveU refdomainXpyrAh]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rAj)rA}rA(hjAh}rA(h]h]rA(j:jAXpy-classrAeh]h]h]uh jAh]rAhX*buildbot.ec2buildslave.EC2LatentBuildSlaverArA}rA(hUh jAubah!jubaubhX) for an example, or see the test example rAr A}r!A(hX) for an example, or see the test example h j Aubj))r"A}r#A(hX2:class:`buildbot.test_slaves.FakeLatentBuildSlave`r$Ah j Ajqja)h!j-h}r%A(UreftypeXclassj/j0X)buildbot.test_slaves.FakeLatentBuildSlaveU refdomainXpyr&Ah]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]r'Aj)r(A}r)A(hj$Ah}r*A(h]h]r+A(j:j&AXpy-classr,Aeh]h]h]uh j"Ah]r-AhX)buildbot.test_slaves.FakeLatentBuildSlaver.Ar/A}r0A(hUh j(Aubah!jubaubhX.r1A}r2A(hX.h j Aubeubeubj j=j)jK2j)j)j)jA6jjL;j)j>uj3}r3Ah!jh}r4A(h]h]h]Usourceja)h]h]uj6]r5Aj8}r6A(j]r7Aj-aj]r8Aj)aja]r9Aj)aj]r:Aj.aj%]r;Aj:aj']rAj0aj1]r?Aj1aj@.]r@AjC.aj&/]rAAj(/aj/]rBAj/aj>]rCAj)aj ]rDAj.aj3]rEAj<aj ]rFAj=auubjqja)j}rGAj`j)sh!j;h}rHA(h]rIAX customizationrJAah]h]h]rKA(jaj)eh]rLAj`auj!Kjj)j"}rMAjaj)sh]rNA(h)rOA}rPA(hjKh j)jqja)h!h"h}rQA(h]h]h]h]h]uj!Kjj)h]rRAhX CustomizationrSArTA}rUA(hjKh jOAubaubj)rVA}rWA(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.rXAh j)jqja)h!jh}rYA(h]h]h]h]h]uj!Kjj)h]rZAhXFor 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[Ar\A}r]A(hjXAh jVAubaubj)r^A}r_A(hXZThis chapter describes some of the more common idioms in advanced Buildbot configurations.r`Ah j)jqja)h!jh}raA(h]h]h]h]h]uj!K jj)h]rbAhXZThis chapter describes some of the more common idioms in advanced Buildbot configurations.rcArdA}reA(hj`Ah j^Aubaubj)rfA}rgA(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!rhAh j)jqja)h!jh}riA(h]h]h]h]h]uj!K jj)h]rjAhXAt 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!rkArlA}rmA(hjhAh jfAubaubj.j.j-j-jC6j:j@j=j=j)jt-eubjqja)h!j;h}rnA(h]h]h]h]roAj)ah]rpAj)auj!Mjj)h]rqA(h)rrA}rsA(hXWriting New BuildStepsrtAh j)jqja)h!h"h}ruA(h]h]h]h]h]uj!Mjj)h]rvAhXWriting New BuildStepsrwArxA}ryA(hjtAh jrAubaubj)rzA}r{A(hX0While 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:`BuildStep`. Once written, this Step can be used in the :file:`master.cfg` file.h j)jqja)h!jh}r|A(h]h]h]h]h]uj!Mjj)h]r}A(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 r~ArA}rA(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 jzAubj))rA}rA(hX:class:`BuildStep`rAh jzAjqja)h!j-h}rA(UreftypeXclassj/j0X BuildStepU refdomainXpyrAh]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rAj)rA}rA(hjAh}rA(h]h]rA(j:jAXpy-classrAeh]h]h]uh jAh]rAhX BuildSteprArA}rA(hUh jAubah!jubaubhX-. Once written, this Step can be used in the rArA}rA(hX-. Once written, this Step can be used in the h jzAubj)rA}rA(hUh}rA(h]h]h]h]rAXfilerAaUrolejAh]uh jzAh]rAhX master.cfgrArA}rA(hX master.cfgh jAubah!jubhX file.rArA}rA(hX file.h jzAubeubj)rA}rA(hXnThe best reason for writing a custom :class:`BuildStep` is to better parse the results of the command being run. For example, a :class:`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)jqja)h!jh}rA(h]h]h]h]h]uj!Mjj)h]rA(hX%The best reason for writing a custom rArA}rA(hX%The best reason for writing a custom h jAubj))rA}rA(hX:class:`BuildStep`rAh jAjqja)h!j-h}rA(UreftypeXclassj/j0X BuildStepU refdomainXpyrAh]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rAj)rA}rA(hjAh}rA(h]h]rA(j:jAXpy-classrAeh]h]h]uh jAh]rAhX BuildSteprArA}rA(hUh jAubah!jubaubhXI is to better parse the results of the command being run. For example, a rArA}rA(hXI is to better parse the results of the command being run. For example, a h jAubj))rA}rA(hX:class:`BuildStep`rAh jAjqja)h!j-h}rA(UreftypeXclassj/j0X BuildStepU refdomainXpyrAh]h]U refexplicith]h]h]j3jCj Nj Nuj!Mh]rAj)rA}rA(hjAh}rA(h]h]rA(j:jAXpy-classrAeh]h]h]uh jAh]rAhX BuildSteprArA}rA(hUh jAubah!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 rArA}rA(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 jAubj)rA}rA(hX ``rc==0``h}rA(h]h]h]h]h]uh jAh]rAhXrc==0rArA}rA(hUh jAubah!jubhX -based rArA}rA(hX -based h jAubj)rA}rA(hX `good/bad`h}rA(h]h]h]h]h]uh jAh]rAhXgood/badrArA}rA(hUh jAubah!jubhX decision.rArA}rA(hX decision.h jAubeubj)rA}rA(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.rAh j)jqja)h!jh}rA(h]h]h]h]h]uj!Mjj)h]rAhXBuildbot 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.rArA}rA(hjAh jAubaubj)rA}rA(hX`For complete documentation of the build step interfaces, see :doc:`../developer/cls-buildsteps`.h j)jqja)h!jh}rA(h]h]h]h]h]uj!M jj)h]rA(hX=For complete documentation of the build step interfaces, see rArA}rA(hX=For complete documentation of the build step interfaces, see h jAubj))rA}rA(hX":doc:`../developer/cls-buildsteps`rAh jAjqja)h!j-h}rA(UreftypeXdocrAj/j0X../developer/cls-buildstepsU refdomainUh]h]U refexplicith]h]h]j3jCuj!M h]rAj)rA}rA(hjAh}rA(h]h]rA(j:jAeh]h]h]uh jAh]rAhX../developer/cls-buildstepsrArA}rA(hUh jAubah!jubaubhX.rA}rA(hX.h jAubeubj<j<jH=j)jK2j1j>j0j0j)eubjqja)h!j;h}rA(h]h]h]h]rAj)ah]rAj)auj!MPjj)h]rB(h)rB}rB(hXUpdating StatusrBh j)jqja)h!h"h}rB(h]h]h]h]h]uj!MPjj)h]rBhXUpdating StatusrBrB}rB(hjBh jBubaubj)r B}r B(hXTBDr Bh j)jqja)h!jh}r B(h]h]h]h]h]uj!MRjj)h]r BhXTBDrBrB}rB(hj Bh j Bubaubj)j>eubjqja)h!jh}rB(h]h]h]h]h]jj>uj!Njj)h]ubu}rB(jpjCjqja)jvjw)rB}rB(hj1h}rB(h]h]rBj1ah]h]uh]rB(h)rB}rB(hj1h}rB(h]h]h]h]h]uh jBh]rBhXTodorBrB}rB(hj1h jBubah!h"ubj)rB}r B(hj1h}r!B(h]h]h]h]h]uh jBh]r"BhX7Step Progress BuildStepFailed Running Multiple Commandsr#Br$B}r%B(hj1h jBubah!jubeh!jubjMjj1ueUsrcdirr&BX</var/build/user_builds/buildbot/checkouts/v0.8.8/master/docsr'Bjcsphinx.config Config r(B)r)B}r*B(U latex_logor+BU#_images/header-text-transparent.pngUpygments_styler,BUsphinxr-BUhtml_use_smartypantsr.BUhtmlhelp_basenamer/BU BuildBotdocU html_themer0BUagogor1BU html_contextr2B}r3B(U github_userUbuildbotr4BUnamer5BXBuildbotr6BU github_repoj4BUversions]r7B(UlatestU /en/latest/r8BUv0.8.8r9BU /en/v0.8.8/r:BUv0.8.7p1U /en/v0.8.7p1/r;BUv0.8.7U /en/v0.8.7/rBUv0.8.5U /en/v0.8.5/r?BUv0.8.4U /en/v0.8.4/r@BeU using_themeU downloads]rAB(UPDFU>https://media.readthedocs.org/pdf/buildbot/v0.8.8/buildbot.pdfrBBUHTMLUBhttps://media.readthedocs.org/htmlzip/buildbot/v0.8.8/buildbot.ziprCBUEpubU@https://media.readthedocs.org/epub/buildbot/v0.8.8/buildbot.epubrDBeU READTHEDOCSUgithub_versionj9BU conf_py_pathU /master/docs/U canonical_urlUUanalytics_codeU UA-12313843-4U rtd_languageXenUPRODUCTION_DOMAINUreadthedocs.orgj0Bj1BUdisplay_githubUcurrent_versionrEBj9BUsingle_versionUapi_hostUhttps://readthedocs.orgUslugrFBj4BU new_themeU MEDIA_URLrGBUhttps://media.readthedocs.org/uU source_suffixrHBU.rstU copyrightrIBXBuildbot Team MembersUadd_function_parenthesesrJBUexclude_patternsrKB]rLB(U_buildrMBUrelease-notes/*.rstrNBeUlatex_paper_sizerOBUa4jU0.8.8rPBU man_pagesrQB]rRB(jj4BXBuildBot DocumentationrSB]rTBX Brian WarnerrUBaKtrVBaUlatex_show_urlsrWBU master_docrXBjUtemplates_pathrYB]rZB(UA/home/docs/checkouts/readthedocs.org/readthedocs/templates/sphinxr[BU _templatesr\BeUlatex_documentsr]B]r^B(UindexU BuildBot.texjSBjUBUmanualtr_BaU html_faviconr`BU buildbot.icoUhtml_static_pathraB]rbB(U_staticrcBUI/home/docs/checkouts/readthedocs.org/readthedocs/templates/sphinx/_staticrdBeU needs_sphinxreBU1.0Uhtml_theme_pathrfB]rgB(U_themesrhBj[BeUlanguageriBXenrjBU overridesrkB}rlBjiBjjBsUhtml_use_indexrmBUhtml_use_modindexrnBUprojectroBj6BU html_logorpBU#_images/header-text-transparent.pngU extensionsrqB]rrB(Usphinx.ext.todorsBU bbdocs.extrtBUreadthedocs_ext.readthedocsruBeUreleaservBjPBUsetuprwBNubUmetadatarxB}ryB(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}uUversionchangesrzB}Utoc_num_entriesr{B}r|B(h Kh#K h,Kh5Kh>KhGKhPKhYKhbK hkKhtKh}KhK hKhKhKhKhKhK hKhKhKhKhK hK hKjK j K%jK jKj(K j1Kj:KjCKjLKjUKj^KjgKDjpKjyKjKjKjKjK!jKjKjKjKjKjK uUimagesr}Bh)r~B(Xmanual/_images/slaves.svgrBh]rBhtaRrBX slaves.svgrBrBX%tutorial/_images/runtests-success.pngrBh]rBjaRrBXruntests-success.pngrBrBX$tutorial/_images/waterfall-empty.pngrBh]rBjaRrBXwaterfall-empty.pngrBrBX tutorial/_images/irc-testrun.pngrBh]rBjaRrBXirc-testrun.pngrBrBXtutorial/_images/index.pngrBh]rBjaRrBX index.pngrBrBXmanual/_images/slaves.pngrBh]rBhtaRrBX slaves.pngrBrBXmanual/_images/overview.pngrBh]rBhtaRrBX overview.pngrBrBXmanual/_images/status.pngrBh]rBhtaRrBX status.pngrBrBXmanual/_images/master.svgrBh]rBhtaRrBX master.svgrBrBXmanual/_images/status.svgrBh]rBhtaRrBX status.svgrBrBXmanual/_images/overview.svgrBh]rBhtaRrBX overview.svgrBrBXmanual/_images/master.pngrBh]rBhtaRrBX master.pngrBrBX tutorial/_images/force-build.pngrBh]rBjaRrBXforce-build.pngrBrBuh]rB(jBjBjBjBjBjBjBjBjBjBjBjBjBeRrBbUnumbered_toctreesrBh]RrBU found_docsrBh]rB(h h#h,h5h>hGhPhYjphkhth}jyhhhhhhhhhhhhhjj jjj(j1j:jCjLjUj^jghbhjjjjjjjjjjeRrBU longtitlesrB}rB(h hh#h$h,h-h5h6h>h?hGhHhPhQhYhZhbhchkhlhthuh}h~hhhhhhhhhhhhhhhhhhhhhhhhhhhhjjj jjjjj j(j)j1j2j:j;jCjDjLjMjUjVj^j_jgjhjpjqjyjzjjjjjjjjjjjjjjjjjjjjuU dependenciesrB}rB(jh]rB(jBjBjBeRrBjh]rB(jBjBeRrBhth]rB(jBjBjBjBjBjBjBjBeRrBuUtoctree_includesrB}rB(h]rB(Xdeveloper/master-overviewrBXdeveloper/definitionsrBXdeveloper/stylerBXdeveloper/testsrBXdeveloper/configrBXdeveloper/utilsrBXdeveloper/databaserBXdeveloper/resultsrBXdeveloper/formatsrBXdeveloper/webstatusrBXdeveloper/master-slaverBXdeveloper/encodingsrBXdeveloper/metricsrBXdeveloper/classesrBeh]rB(Xtutorial/indexrBX manual/indexrBXdeveloper/indexrBXrelnotes/indexrBej]rB(Xrelnotes/0.8.7rBXrelnotes/0.8.6rBej]rB(jpjrjtjvjxjzehG]rB(Xtutorial/firstrunrBX tutorial/tourrBXtutorial/furtherrBej]rB(Xmanual/cfg-introrBXmanual/cfg-globalrBXmanual/cfg-changesourcesrBXmanual/cfg-schedulersrBXmanual/cfg-buildslavesrBXmanual/cfg-buildersrBXmanual/cfg-buildfactoriesrBXmanual/cfg-propertiesrBXmanual/cfg-buildstepsrBXmanual/cfg-interlocksrBXmanual/cfg-statustargetsrBejp]rB(Xmanual/introductionrBXmanual/installationrBXmanual/conceptsrBXmanual/configurationrBXmanual/customizationrCXmanual/cmdlinerCXmanual/resourcesrCXmanual/optimizationrCeh}]rCXtutorial/fiveminutesrCauU temp_datarC}UtocsrC}rC(h j )r C}r C(hUh}r C(h]h]h]h]h]uh]r Cj )r C}rC(hUh}rC(h]h]h]h]h]uh j Ch]rC(csphinx.addnodes compact_paragraph rC)rC}rC(hUh}rC(h]h]h]h]h]uh j Ch]rCj9,)rC}rC(hUh}rC(U anchornameUUrefurih h]h]h]h]h]Uinternaluh jCh]rChX BuildslavesrCrC}rC(hhh jCubah!jB,ubah!Ucompact_paragraphrCubj )rC}rC(hUh}r C(h]h]h]h]h]uh j Ch]r!C(j )r"C}r#C(hUh}r$C(h]h]h]h]h]uh jCh]r%C(jC)r&C}r'C(hUh}r(C(h]h]h]h]h]uh j"Ch]r)Cj9,)r*C}r+C(hUh}r,C(U anchornameU#buildslave-optionsUrefurih h]h]h]h]h]Uinternaluh j&Ch]r-ChXBuildSlave Optionsr.Cr/C}r0C(hXBuildSlave Optionsh j*Cubah!jB,ubah!jCubj )r1C}r2C(hUh}r3C(h]h]h]h]h]uh j"Ch]r4C(j )r5C}r6C(hUh}r7C(h]h]h]h]h]uh j1Ch]r8CjC)r9C}r:C(hUh}r;C(h]h]h]h]h]uh j5Ch]rC(hUh}r?C(U anchornameU#master-slave-tcp-keepaliveUrefurih h]h]h]h]h]Uinternaluh j9Ch]r@ChXMaster-Slave TCP KeepaliverACrBC}rCC(hXMaster-Slave TCP Keepaliveh j=Cubah!jB,ubah!jCubah!j ubj )rDC}rEC(hUh}rFC(h]h]h]h]h]uh j1Ch]rGCjC)rHC}rIC(hUh}rJC(h]h]h]h]h]uh jDCh]rKCj9,)rLC}rMC(hUh}rNC(U anchornameU#when-buildslaves-go-missingUrefurih h]h]h]h]h]Uinternaluh jHCh]rOChXWhen Buildslaves Go MissingrPCrQC}rRC(hXWhen Buildslaves Go Missingh jLCubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rSC}rTC(hUh}rUC(h]h]h]h]h]uh jCh]rVC(jC)rWC}rXC(hUh}rYC(h]h]h]h]h]uh jSCh]rZCj9,)r[C}r\C(hUh}r]C(U anchornameU#latent-buildslavesUrefurih h]h]h]h]h]Uinternaluh jWCh]r^ChXLatent Buildslavesr_Cr`C}raC(hXLatent Buildslavesh j[Cubah!jB,ubah!jCubj )rbC}rcC(hUh}rdC(h]h]h]h]h]uh jSCh]reC(j )rfC}rgC(hUh}rhC(h]h]h]h]h]uh jbCh]riCjC)rjC}rkC(hUh}rlC(h]h]h]h]h]uh jfCh]rmCj9,)rnC}roC(hUh}rpC(U anchornameU#common-optionsUrefurih h]h]h]h]h]Uinternaluh jjCh]rqChXCommon OptionsrrCrsC}rtC(hXCommon Optionsh jnCubah!jB,ubah!jCubah!j ubj )ruC}rvC(hUh}rwC(h]h]h]h]h]uh jbCh]rxC(jC)ryC}rzC(hUh}r{C(h]h]h]h]h]uh juCh]r|Cj9,)r}C}r~C(hUh}rC(U anchornameU2#amazon-web-services-elastic-compute-cloud-aws-ec2Urefurih h]h]h]h]h]Uinternaluh jyCh]rChX5Amazon Web Services Elastic Compute Cloud ("AWS EC2")rCrC}rC(hX5Amazon Web Services Elastic Compute Cloud ("AWS EC2")h j}Cubah!jB,ubah!jCubj )rC}rC(hUh}rC(h]h]h]h]h]uh juCh]rC(j )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)rC}rC(hUh}rC(U anchornameU#get-an-aws-ec2-accountUrefurih h]h]h]h]h]Uinternaluh jCh]rChXGet an AWS EC2 AccountrCrC}rC(hXGet an AWS EC2 Accounth jCubah!jB,ubah!jCubah!j ubj )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)rC}rC(hUh}rC(U anchornameU#create-an-amiUrefurih h]h]h]h]h]Uinternaluh jCh]rChX Create an AMIrCrC}rC(hX Create an AMIh jCubah!jB,ubah!jCubah!j ubj )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)rC}rC(hUh}rC(U anchornameU1#configure-the-master-with-an-ec2latentbuildslaveUrefurih h]h]h]h]h]Uinternaluh jCh]rChX0Configure the Master with an EC2LatentBuildSlaverCrC}rC(hX0Configure the Master with an EC2LatentBuildSlaveh jCubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rC}rC(hUh}rC(h]h]h]h]h]uh jbCh]rC(jC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)rC}rC(hUh}rC(U anchornameU#libvirtUrefurih h]h]h]h]h]Uinternaluh jCh]rChXLibvirtrCrC}rC(hXLibvirth jCubah!jB,ubah!jCubj )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rC(j )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)rC}rC(hUh}rC(U anchornameU#setting-up-libvirtUrefurih h]h]h]h]h]Uinternaluh jCh]rChXSetting up libvirtrCrC}rC(hXSetting up libvirth jCubah!jB,ubah!jCubah!j ubj )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)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!jB,ubah!jCubah!j ubj )rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCjC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)rC}rC(hUh}rC(U anchornameU#configuring-your-masterUrefurih h]h]h]h]h]Uinternaluh jCh]rChXConfiguring your MasterrCrC}rC(hXConfiguring your Masterh jCubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rC}rC(hUh}rC(h]h]h]h]h]uh jbCh]rC(jC)rC}rC(hUh}rC(h]h]h]h]h]uh jCh]rCj9,)rC}rC(hUh}rC(U anchornameU #openstackUrefurih h]h]h]h]h]Uinternaluh jCh]rDhX OpenStackrDrD}rD(hX OpenStackh jCubah!jB,ubah!jCubj )rD}rD(hUh}rD(h]h]h]h]h]uh jCh]rD(j )rD}r D(hUh}r D(h]h]h]h]h]uh jDh]r DjC)r D}r D(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU%#get-an-account-in-an-openstack-cloudUrefurih h]h]h]h]h]Uinternaluh j Dh]rDhX$Get an Account in an OpenStack cloudrDrD}rD(hX$Get an Account in an OpenStack cloudh jDubah!jB,ubah!jCubah!j ubj )rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}r D(hUh}r!D(U anchornameU#create-an-imageUrefurih h]h]h]h]h]Uinternaluh jDh]r"DhXCreate an Imager#Dr$D}r%D(hXCreate an Imageh jDubah!jB,ubah!jCubah!j ubj )r&D}r'D(hUh}r(D(h]h]h]h]h]uh jDh]r)DjC)r*D}r+D(hUh}r,D(h]h]h]h]h]uh j&Dh]r-Dj9,)r.D}r/D(hUh}r0D(U anchornameU7#configure-the-master-with-an-openstacklatentbuildslaveUrefurih h]h]h]h]h]Uinternaluh j*Dh]r1DhX6Configure the Master with an OpenStackLatentBuildSlaver2Dr3D}r4D(hX6Configure the Master with an OpenStackLatentBuildSlaveh j.Dubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r5D}r6D(hUh}r7D(h]h]h]h]h]uh jbCh]r8DjC)r9D}r:D(hUh}r;D(h]h]h]h]h]uh j5Dh]rD(hUh}r?D(U anchornameU #dangers-with-latent-buildslavesUrefurih h]h]h]h]h]Uinternaluh j9Dh]r@DhXDangers with Latent BuildslavesrADrBD}rCD(hXDangers with Latent Buildslavesh j=Dubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubh#j )rDD}rED(hUh}rFD(h]h]h]h]h]uh]rGDj )rHD}rID(hUh}rJD(h]h]h]h]h]uh jDDh]rKD(jC)rLD}rMD(hUh}rND(h]h]h]h]h]uh jHDh]rODj9,)rPD}rQD(hUh}rRD(U anchornameUUrefurih#h]h]h]h]h]Uinternaluh jLDh]rSDhX!Release Notes for Buildbot v0.8.7rTDrUD}rVD(hh+h jPDubah!jB,ubah!jCubj )rWD}rXD(hUh}rYD(h]h]h]h]h]uh jHDh]rZD(j )r[D}r\D(hUh}r]D(h]h]h]h]h]uh jWDh]r^DjC)r_D}r`D(hUh}raD(h]h]h]h]h]uh j[Dh]rbDj9,)rcD}rdD(hUh}reD(U anchornameU#p1Urefurih#h]h]h]h]h]Uinternaluh j_Dh]rfDhX0.8.7p1rgDrhD}riD(hX0.8.7p1rjDh jcDubah!jB,ubah!jCubah!j ubj )rkD}rlD(hUh}rmD(h]h]h]h]h]uh jWDh]rnD(jC)roD}rpD(hUh}rqD(h]h]h]h]h]uh jkDh]rrDj9,)rsD}rtD(hUh}ruD(U anchornameU#masterUrefurih#h]h]h]h]h]Uinternaluh joDh]rvDhXMasterrwDrxD}ryD(hXMasterrzDh jsDubah!jB,ubah!jCubj )r{D}r|D(hUh}r}D(h]h]h]h]h]uh jkDh]r~D(j )rD}rD(hUh}rD(h]h]h]h]h]uh j{Dh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU #featuresUrefurih#h]h]h]h]h]Uinternaluh jDh]rDhXFeaturesrDrD}rD(hXFeaturesrDh jDubah!jB,ubah!jCubah!j ubj )rD}rD(hUh}rD(h]h]h]h]h]uh j{Dh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU1#deprecations-removals-and-non-compatible-changesUrefurih#h]h]h]h]h]Uinternaluh jDh]rDhX2Deprecations, Removals, and Non-Compatible ChangesrDrD}rD(hX2Deprecations, Removals, and Non-Compatible ChangesrDh jDubah!jB,ubah!jCubah!j ubj )rD}rD(hUh}rD(h]h]h]h]h]uh j{Dh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU#changes-for-developersUrefurih#h]h]h]h]h]Uinternaluh jDh]rDhXChanges for DevelopersrDrD}rD(hXChanges for DevelopersrDh jDubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rD}rD(hUh}rD(h]h]h]h]h]uh jWDh]rD(jC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU#slaveUrefurih#h]h]h]h]h]Uinternaluh jDh]rDhXSlaverDrD}rD(hXSlaverDh jDubah!jB,ubah!jCubj )rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rD(j )rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU#id1Urefurih#h]h]h]h]h]Uinternaluh jDh]rDhXFeaturesrDrD}rD(hXFeaturesrDh jDubah!jB,ubah!jCubah!j ubj )rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU#id2Urefurih#h]h]h]h]h]Uinternaluh jDh]rDhX2Deprecations, Removals, and Non-Compatible ChangesrDrD}rD(hX2Deprecations, Removals, and Non-Compatible ChangesrDh jDubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rD}rD(hUh}rD(h]h]h]h]h]uh jWDh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU#detailsUrefurih#h]h]h]h]h]Uinternaluh jDh]rDhXDetailsrDrD}rD(hXDetailsrDh jDubah!jB,ubah!jCubah!j ubj )rD}rD(hUh}rD(h]h]h]h]h]uh jWDh]rDjC)rD}rD(hUh}rD(h]h]h]h]h]uh jDh]rDj9,)rD}rD(hUh}rD(U anchornameU#older-versionsUrefurih#h]h]h]h]h]Uinternaluh jDh]rDhXOlder VersionsrDrE}rE(hXOlder VersionsrEh jDubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubh,j )rE}rE(hUh}rE(h]h]h]h]h]uh]rEj )rE}rE(hUh}r E(h]h]h]h]h]uh jEh]r E(jC)r E}r E(hUh}r E(h]h]h]h]h]uh jEh]rEj9,)rE}rE(hUh}rE(U anchornameUUrefurih,h]h]h]h]h]Uinternaluh j Eh]rEhXRemoteCommandsrErE}rE(hh4h jEubah!jB,ubah!jCubj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEjC)rE}rE(hUh}r E(h]h]h]h]h]uh jEh]r!Ej9,)r"E}r#E(hUh}r$E(U anchornameU#remotecommandUrefurih,h]h]h]h]h]Uinternaluh jEh]r%EhX RemoteCommandr&Er'E}r(E(hX RemoteCommandh j"Eubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubah!j1 ubh5j )r)E}r*E(hUh}r+E(h]h]h]h]h]uh]r,Ej )r-E}r.E(hUh}r/E(h]h]h]h]h]uh j)Eh]r0E(jC)r1E}r2E(hUh}r3E(h]h]h]h]h]uh j-Eh]r4Ej9,)r5E}r6E(hUh}r7E(U anchornameUUrefurih5h]h]h]h]h]Uinternaluh j1Eh]r8EhX Interlocksr9Er:E}r;E(hh=h j5Eubah!jB,ubah!jCubj )rE(h]h]h]h]h]uh j-Eh]r?E(j )r@E}rAE(hUh}rBE(h]h]h]h]h]uh jj )r|E}r}E(hUh}r~E(h]h]h]h]h]uh]rEj )rE}rE(hUh}rE(h]h]h]h]h]uh j|Eh]rE(jC)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj9,)rE}rE(hUh}rE(U anchornameUUrefurih>h]h]h]h]h]Uinternaluh jEh]rEhXString EncodingsrErE}rE(hhFh jEubah!jB,ubah!jCubj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(j )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEjC)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj9,)rE}rE(hUh}rE(U anchornameU#inputsUrefurih>h]h]h]h]h]Uinternaluh jEh]rEhXInputsrErE}rE(hXInputsh jEubah!jB,ubah!jCubah!j ubj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEjC)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj9,)rE}rE(hUh}rE(U anchornameU#outputsUrefurih>h]h]h]h]h]Uinternaluh jEh]rEhXOutputsrErE}rE(hXOutputsh jEubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubhGj )rE}rE(hUh}rE(h]h]h]h]h]uh]rEj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jC)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj9,)rE}rE(hUh}rE(U anchornameUUrefurihGh]h]h]h]h]Uinternaluh jEh]rEhXBuildbot TutorialrErE}rE(hhOh jEubah!jB,ubah!jCubj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEje)rE}rE(hUh}rE(UnumberedKUparenthGU titlesonlyUglobh]h]h]h]h]Uentries]rE(NjBrENjBrENjBrEeUhiddenUmaxdepthKU includefiles]rE(jBjBjBeU includehiddenuh jEh]h!jhubah!j1 ubeh!j ubah!j1 ubhPj )rE}rE(hUh}rE(h]h]h]h]h]uh]rEj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEjC)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj9,)rE}rE(hUh}rE(U anchornameUUrefurihPh]h]h]h]h]Uinternaluh jEh]rEhX IPropertiesrErE}rE(hhXh jEubah!jB,ubah!jCubah!j ubah!j1 ubhYj )rE}rE(hUh}rE(h]h]h]h]h]uh]rEj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEjC)rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rEj9,)rE}rE(hUh}rE(U anchornameUUrefurihYh]h]h]h]h]Uinternaluh jEh]rEhX ResourcesrErE}rE(hhah jEubah!jB,ubah!jCubah!j ubah!j1 ubhbj )rE}rE(hUh}rE(h]h]h]h]h]uh]rEj )rE}rE(hUh}rE(h]h]h]h]h]uh jEh]rE(jC)rE}rE(hUh}rF(h]h]h]h]h]uh jEh]rFj9,)rF}rF(hUh}rF(U anchornameUUrefurihbh]h]h]h]h]Uinternaluh jEh]rFhXCommand-line ToolrFrF}rF(hhjh jFubah!jB,ubah!jCubj )r F}r F(hUh}r F(h]h]h]h]h]uh jEh]r F(j )r F}rF(hUh}rF(h]h]h]h]h]uh j Fh]rF(jC)rF}rF(hUh}rF(h]h]h]h]h]uh j Fh]rFj9,)rF}rF(hUh}rF(U anchornameU #buildbotUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXbuildbotrFrF}rF(hj5&h jFubah!jB,ubah!jCubj )rF}rF(hUh}rF(h]h]h]h]h]uh j Fh]rF(j )r F}r!F(hUh}r"F(h]h]h]h]h]uh jFh]r#F(jC)r$F}r%F(hUh}r&F(h]h]h]h]h]uh j Fh]r'Fj9,)r(F}r)F(hUh}r*F(U anchornameU#administrator-toolsUrefurihbh]h]h]h]h]Uinternaluh j$Fh]r+FhXAdministrator Toolsr,Fr-F}r.F(hj< h j(Fubah!jB,ubah!jCubj )r/F}r0F(hUh}r1F(h]h]h]h]h]uh j Fh]r2F(j )r3F}r4F(hUh}r5F(h]h]h]h]h]uh j/Fh]r6FjC)r7F}r8F(hUh}r9F(h]h]h]h]h]uh j3Fh]r:Fj9,)r;F}rFhX create-masterr?Fr@F}rAF(hjf h j;Fubah!jB,ubah!jCubah!j ubj )rBF}rCF(hUh}rDF(h]h]h]h]h]uh j/Fh]rEFjC)rFF}rGF(hUh}rHF(h]h]h]h]h]uh jBFh]rIFj9,)rJF}rKF(hUh}rLF(U anchornameU#startUrefurihbh]h]h]h]h]Uinternaluh jFFh]rMFhXstartrNFrOF}rPF(hj h jJFubah!jB,ubah!jCubah!j ubj )rQF}rRF(hUh}rSF(h]h]h]h]h]uh j/Fh]rTFjC)rUF}rVF(hUh}rWF(h]h]h]h]h]uh jQFh]rXFj9,)rYF}rZF(hUh}r[F(U anchornameU#restartUrefurihbh]h]h]h]h]Uinternaluh jUFh]r\FhXrestartr]Fr^F}r_F(hj h jYFubah!jB,ubah!jCubah!j ubj )r`F}raF(hUh}rbF(h]h]h]h]h]uh j/Fh]rcFjC)rdF}reF(hUh}rfF(h]h]h]h]h]uh j`Fh]rgFj9,)rhF}riF(hUh}rjF(U anchornameU#stopUrefurihbh]h]h]h]h]Uinternaluh jdFh]rkFhXstoprlFrmF}rnF(hj h jhFubah!jB,ubah!jCubah!j ubj )roF}rpF(hUh}rqF(h]h]h]h]h]uh j/Fh]rrFjC)rsF}rtF(hUh}ruF(h]h]h]h]h]uh joFh]rvFj9,)rwF}rxF(hUh}ryF(U anchornameU#sighupUrefurihbh]h]h]h]h]Uinternaluh jsFh]rzFhXsighupr{Fr|F}r}F(hjV h jwFubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r~F}rF(hUh}rF(h]h]h]h]h]uh jFh]rF(jC)rF}rF(hUh}rF(h]h]h]h]h]uh j~Fh]rFj9,)rF}rF(hUh}rF(U anchornameU#developer-toolsUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXDeveloper ToolsrFrF}rF(hjS&h jFubah!jB,ubah!jCubj )rF}rF(hUh}rF(h]h]h]h]h]uh j~Fh]rF(j )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjC)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj9,)rF}rF(hUh}rF(U anchornameU #statuslogUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhX statuslogrFrF}rF(hj h jFubah!jB,ubah!jCubah!j ubj )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjC)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj9,)rF}rF(hUh}rF(U anchornameU #statusguiUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhX statusguirFrF}rF(hj h jFubah!jB,ubah!jCubah!j ubj )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rF(jC)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj9,)rF}rF(hUh}rF(U anchornameU#tryUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXtryrFrF}rF(hjn&h jFubah!jB,ubah!jCubj )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rF(j )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjC)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj9,)rF}rF(hUh}rF(U anchornameU#locating-the-masterUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXLocating the masterrFrF}rF(hjh jFubah!jB,ubah!jCubah!j ubj )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjC)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj9,)rF}rF(hUh}rF(U anchornameU#choosing-the-buildersUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXChoosing the BuildersrFrF}rF(hj{$h jFubah!jB,ubah!jCubah!j ubj )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjC)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj9,)rF}rF(hUh}rF(U anchornameU#specifying-the-vc-systemUrefurihbh]h]h]h]h]Uinternaluh jFh]rFhXSpecifying the VC systemrFrF}rF(hj#h jFubah!jB,ubah!jCubah!j ubj )rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFjC)rF}rF(hUh}rF(h]h]h]h]h]uh jFh]rFj9,)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(hj h jFubah!jB,ubah!jCubah!j ubj )rF}rF(hUh}rG(h]h]h]h]h]uh jFh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh jFh]rGj9,)rG}rG(hUh}rG(U anchornameU#determining-the-branch-nameUrefurihbh]h]h]h]h]Uinternaluh jGh]r GhXDetermining the branch namer Gr G}r G(hjh jGubah!jB,ubah!jCubah!j ubj )r G}rG(hUh}rG(h]h]h]h]h]uh jFh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh j Gh]rGj9,)rG}rG(hUh}rG(U anchornameU##determining-the-revision-and-patchUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhX"Determining the revision and patchrGrG}rG(hj'h jGubah!jB,ubah!jCubah!j ubj )rG}rG(hUh}rG(h]h]h]h]h]uh jFh]rGjC)r G}r!G(hUh}r"G(h]h]h]h]h]uh jGh]r#Gj9,)r$G}r%G(hUh}r&G(U anchornameU#patch-informationUrefurihbh]h]h]h]h]Uinternaluh j Gh]r'GhXpatch informationr(Gr)G}r*G(hjk h j$Gubah!jB,ubah!jCubah!j ubj )r+G}r,G(hUh}r-G(h]h]h]h]h]uh jFh]r.GjC)r/G}r0G(hUh}r1G(h]h]h]h]h]uh j+Gh]r2Gj9,)r3G}r4G(hUh}r5G(U anchornameU#waiting-for-resultsUrefurihbh]h]h]h]h]Uinternaluh j/Gh]r6GhXWaiting for resultsr7Gr8G}r9G(hjh j3Gubah!jB,ubah!jCubah!j ubj )r:G}r;G(hUh}rG}r?G(hUh}r@G(h]h]h]h]h]uh j:Gh]rAGj9,)rBG}rCG(hUh}rDG(U anchornameU#sending-propertiesUrefurihbh]h]h]h]h]Uinternaluh j>Gh]rEGhXSending propertiesrFGrGG}rHG(hjgh jBGubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rIG}rJG(hUh}rKG(h]h]h]h]h]uh jFh]rLGjC)rMG}rNG(hUh}rOG(h]h]h]h]h]uh jIGh]rPGj9,)rQG}rRG(hUh}rSG(U anchornameU #try-diffUrefurihbh]h]h]h]h]Uinternaluh jMGh]rTGhX try --diffrUGrVG}rWG(hjh jQGubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rXG}rYG(hUh}rZG(h]h]h]h]h]uh jFh]r[G(jC)r\G}r]G(hUh}r^G(h]h]h]h]h]uh jXGh]r_Gj9,)r`G}raG(hUh}rbG(U anchornameU #other-toolsUrefurihbh]h]h]h]h]Uinternaluh j\Gh]rcGhX Other ToolsrdGreG}rfG(hjfh j`Gubah!jB,ubah!jCubj )rgG}rhG(hUh}riG(h]h]h]h]h]uh jXGh]rjG(j )rkG}rlG(hUh}rmG(h]h]h]h]h]uh jgGh]rnGjC)roG}rpG(hUh}rqG(h]h]h]h]h]uh jkGh]rrGj9,)rsG}rtG(hUh}ruG(U anchornameU #sendchangeUrefurihbh]h]h]h]h]Uinternaluh joGh]rvGhX sendchangerwGrxG}ryG(hjh jsGubah!jB,ubah!jCubah!j ubj )rzG}r{G(hUh}r|G(h]h]h]h]h]uh jgGh]r}GjC)r~G}rG(hUh}rG(h]h]h]h]h]uh jzGh]rGj9,)rG}rG(hUh}rG(U anchornameU #debugclientUrefurihbh]h]h]h]h]Uinternaluh j~Gh]rGhX debugclientrGrG}rG(hjh jGubah!jB,ubah!jCubah!j ubj )rG}rG(hUh}rG(h]h]h]h]h]uh jgGh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj9,)rG}rG(hUh}rG(U anchornameU#userUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhXuserrGrG}rG(hjh jGubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rG}rG(hUh}rG(h]h]h]h]h]uh jFh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj9,)rG}rG(hUh}rG(U anchornameU#buildbot-config-directoryUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhX.buildbot config directoryrGrG}rG(hj h jGubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rG}rG(hUh}rG(h]h]h]h]h]uh j Fh]rG(jC)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj9,)rG}rG(hUh}rG(U anchornameU #buildslaveUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhX buildslaverGrG}rG(hjh jGubah!jB,ubah!jCubj )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rG(j )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj9,)rG}rG(hUh}rG(U anchornameU #create-slaveUrefurihbh]h]h]h]h]Uinternaluh jGh]rGhX create-slaverGrG}rG(hjh jGubah!jB,ubah!jCubah!j ubj )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj9,)rG}rG(hUh}rG(U anchornameX#cmdline-start (buildslave)Urefurihbh]h]h]h]h]Uinternaluh jGh]rGhXstartrGrG}rG(hjh jGubah!jB,ubah!jCubah!j ubj )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj9,)rG}rG(hUh}rG(U anchornameX#cmdline-restart (buildslave)Urefurihbh]h]h]h]h]Uinternaluh jGh]rGhXrestartrGrG}rG(hjh jGubah!jB,ubah!jCubah!j ubj )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGjC)rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rGj9,)rG}rG(hUh}rG(U anchornameX#cmdline-stop (buildslave)Urefurihbh]h]h]h]h]Uinternaluh jGh]rGhXstoprGrG}rG(hjh jGubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubhkj )rG}rG(hUh}rG(h]h]h]h]h]uh]rGj )rG}rG(hUh}rG(h]h]h]h]h]uh jGh]rG(jC)rG}rG(hUh}rH(h]h]h]h]h]uh jGh]rHj9,)rH}rH(hUh}rH(U anchornameUUrefurihkh]h]h]h]h]Uinternaluh jGh]rHhX BuildFactoryrHrH}rH(hhsh jHubah!jB,ubah!jCubj )r H}r H(hUh}r H(h]h]h]h]h]uh jGh]r Hj )r H}rH(hUh}rH(h]h]h]h]h]uh j Hh]rHjC)rH}rH(hUh}rH(h]h]h]h]h]uh j Hh]rHj9,)rH}rH(hUh}rH(U anchornameU!#buildfactory-implementation-noteUrefurihkh]h]h]h]h]Uinternaluh jHh]rHhX BuildFactory Implementation NoterHrH}rH(hX BuildFactory Implementation Noteh jHubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubah!j1 ubhtj )rH}rH(hUh}rH(h]h]h]h]h]uh]rHj )r H}r!H(hUh}r"H(h]h]h]h]h]uh jHh]r#H(jC)r$H}r%H(hUh}r&H(h]h]h]h]h]uh j Hh]r'Hj9,)r(H}r)H(hUh}r*H(U anchornameUUrefurihth]h]h]h]h]Uinternaluh j$Hh]r+HhX Introductionr,Hr-H}r.H(hh|h j(Hubah!jB,ubah!jCubj )r/H}r0H(hUh}r1H(h]h]h]h]h]uh j Hh]r2H(j )r3H}r4H(hUh}r5H(h]h]h]h]h]uh j/Hh]r6HjC)r7H}r8H(hUh}r9H(h]h]h]h]h]uh j3Hh]r:Hj9,)r;H}rHhXHistory and Philosophyr?Hr@H}rAH(hXHistory and PhilosophyrBHh j;Hubah!jB,ubah!jCubah!j ubj )rCH}rDH(hUh}rEH(h]h]h]h]h]uh j/Hh]rFH(jC)rGH}rHH(hUh}rIH(h]h]h]h]h]uh jCHh]rJHj9,)rKH}rLH(hUh}rMH(U anchornameU#system-architectureUrefurihth]h]h]h]h]Uinternaluh jGHh]rNHhXSystem ArchitecturerOHrPH}rQH(hXSystem ArchitecturerRHh jKHubah!jB,ubah!jCubj )rSH}rTH(hUh}rUH(h]h]h]h]h]uh jCHh]rVH(j )rWH}rXH(hUh}rYH(h]h]h]h]h]uh jSHh]rZHjC)r[H}r\H(hUh}r]H(h]h]h]h]h]uh jWHh]r^Hj9,)r_H}r`H(hUh}raH(U anchornameU#buildslave-connectionsUrefurihth]h]h]h]h]Uinternaluh j[Hh]rbHhXBuildSlave ConnectionsrcHrdH}reH(hXBuildSlave ConnectionsrfHh j_Hubah!jB,ubah!jCubah!j ubj )rgH}rhH(hUh}riH(h]h]h]h]h]uh jSHh]rjHjC)rkH}rlH(hUh}rmH(h]h]h]h]h]uh jgHh]rnHj9,)roH}rpH(hUh}rqH(U anchornameU#buildmaster-architectureUrefurihth]h]h]h]h]Uinternaluh jkHh]rrHhXBuildmaster ArchitecturersHrtH}ruH(hXBuildmaster ArchitecturervHh joHubah!jB,ubah!jCubah!j ubj )rwH}rxH(hUh}ryH(h]h]h]h]h]uh jSHh]rzHjC)r{H}r|H(hUh}r}H(h]h]h]h]h]uh jwHh]r~Hj9,)rH}rH(hUh}rH(U anchornameU#status-delivery-architectureUrefurihth]h]h]h]h]Uinternaluh j{Hh]rHhXStatus Delivery ArchitecturerHrH}rH(hXStatus Delivery ArchitecturerHh jHubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rH}rH(hUh}rH(h]h]h]h]h]uh j/Hh]rHjC)rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHj9,)rH}rH(hUh}rH(U anchornameU #control-flowUrefurihth]h]h]h]h]Uinternaluh jHh]rHhX Control FlowrHrH}rH(hX Control FlowrHh jHubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubh}j )rH}rH(hUh}rH(h]h]h]h]h]uh]rHj )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rH(jC)rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHj9,)rH}rH(hUh}rH(U anchornameUUrefurih}h]h]h]h]h]Uinternaluh jHh]rHhXFurther ReadingrHrH}rH(hhh jHubah!jB,ubah!jCubj )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHje)rH}rH(hUh}rH(UnumberedKUparenth}U titlesonlyUglobh]h]h]h]h]Uentries]rHNjCrHaUhiddenUmaxdepthKU includefiles]rHjCaU includehiddenuh jHh]h!jhubah!j1 ubeh!j ubah!j1 ubhj )rH}rH(hUh}rH(h]h]h]h]h]uh]rHj )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rH(jC)rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHj9,)rH}rH(hUh}rH(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jHh]rHhX PropertiesrHrH}rH(hhh jHubah!jB,ubah!jCubj )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rH(j )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHjC)rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHj9,)rH}rH(hUh}rH(U anchornameU#common-build-propertiesUrefurihh]h]h]h]h]Uinternaluh jHh]rHhXCommon Build PropertiesrHrH}rH(hXCommon Build Propertiesh jHubah!jB,ubah!jCubah!j ubj )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHjC)rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHj9,)rH}rH(hUh}rH(U anchornameU#source-stamp-attributesUrefurihh]h]h]h]h]Uinternaluh jHh]rHhXSource Stamp AttributesrHrH}rH(hXSource Stamp Attributesh jHubah!jB,ubah!jCubah!j ubj )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rH(jC)rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHj9,)rH}rH(hUh}rH(U anchornameU#using-properties-in-stepsUrefurihh]h]h]h]h]Uinternaluh jHh]rHhXUsing Properties in StepsrHrH}rH(hXUsing Properties in Stepsh jHubah!jB,ubah!jCubj )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rH(j )rH}rH(hUh}rH(h]h]h]h]h]uh jHh]rHjC)rI}rI(hUh}rI(h]h]h]h]h]uh jHh]rIj9,)rI}rI(hUh}rI(U anchornameU #propertyUrefurihh]h]h]h]h]Uinternaluh jIh]rIhXPropertyrIr I}r I(hXPropertyh jIubah!jB,ubah!jCubah!j ubj )r I}r I(hUh}r I(h]h]h]h]h]uh jHh]rIjC)rI}rI(hUh}rI(h]h]h]h]h]uh j Ih]rIj9,)rI}rI(hUh}rI(U anchornameU #interpolateUrefurihh]h]h]h]h]Uinternaluh jIh]rIhX InterpolaterIrI}rI(hX Interpolateh jIubah!jB,ubah!jCubah!j ubj )rI}rI(hUh}rI(h]h]h]h]h]uh jHh]rIjC)rI}rI(hUh}r I(h]h]h]h]h]uh jIh]r!Ij9,)r"I}r#I(hUh}r$I(U anchornameU #rendererUrefurihh]h]h]h]h]Uinternaluh jIh]r%IhXRendererr&Ir'I}r(I(hXRendererh j"Iubah!jB,ubah!jCubah!j ubj )r)I}r*I(hUh}r+I(h]h]h]h]h]uh jHh]r,IjC)r-I}r.I(hUh}r/I(h]h]h]h]h]uh j)Ih]r0Ij9,)r1I}r2I(hUh}r3I(U anchornameU#withpropertiesUrefurihh]h]h]h]h]Uinternaluh j-Ih]r4IhXWithPropertiesr5Ir6I}r7I(hXWithPropertiesh j1Iubah!jB,ubah!jCubah!j ubj )r8I}r9I(hUh}r:I(h]h]h]h]h]uh jHh]r;IjC)rI(h]h]h]h]h]uh j8Ih]r?Ij9,)r@I}rAI(hUh}rBI(U anchornameU#custom-renderablesUrefurihh]h]h]h]h]Uinternaluh jJ(h]h]h]h]h]uh j8Jh]r?Jj9,)r@J}rAJ(hUh}rBJ(U anchornameU#debug-optionsUrefurihh]h]h]h]h]Uinternaluh jK(hX Copyrighth j8Kubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubhj )r?K}r@K(hUh}rAK(h]h]h]h]h]uh]rBKj )rCK}rDK(hUh}rEK(h]h]h]h]h]uh j?Kh]rFKjC)rGK}rHK(hUh}rIK(h]h]h]h]h]uh jCKh]rJKj9,)rKK}rLK(hUh}rMK(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jGKh]rNKhX IRenderablerOKrPK}rQK(hhh jKKubah!jB,ubah!jCubah!j ubah!j1 ubhj )rRK}rSK(hUh}rTK(h]h]h]h]h]uh]rUKj )rVK}rWK(hUh}rXK(h]h]h]h]h]uh jRKh]rYK(jC)rZK}r[K(hUh}r\K(h]h]h]h]h]uh jVKh]r]Kj9,)r^K}r_K(hUh}r`K(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jZKh]raKhXBuildbot Coding StylerbKrcK}rdK(hhh j^Kubah!jB,ubah!jCubj )reK}rfK(hUh}rgK(h]h]h]h]h]uh jVKh]rhK(j )riK}rjK(hUh}rkK(h]h]h]h]h]uh jeKh]rlKjC)rmK}rnK(hUh}roK(h]h]h]h]h]uh jiKh]rpKj9,)rqK}rrK(hUh}rsK(U anchornameU #symbol-namesUrefurihh]h]h]h]h]Uinternaluh jmKh]rtKhX Symbol NamesruKrvK}rwK(hX Symbol Namesh jqKubah!jB,ubah!jCubah!j ubj )rxK}ryK(hUh}rzK(h]h]h]h]h]uh jeKh]r{K(jC)r|K}r}K(hUh}r~K(h]h]h]h]h]uh jxKh]rKj9,)rK}rK(hUh}rK(U anchornameU#twisted-idiomsUrefurihh]h]h]h]h]Uinternaluh j|Kh]rKhXTwisted IdiomsrKrK}rK(hXTwisted Idiomsh jKubah!jB,ubah!jCubj )rK}rK(hUh}rK(h]h]h]h]h]uh jxKh]rK(j )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKjC)rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKj9,)rK}rK(hUh}rK(U anchornameU#prefer-to-return-deferredsUrefurihh]h]h]h]h]Uinternaluh jKh]rKhXPrefer to Return DeferredsrKrK}rK(hXPrefer to Return Deferredsh jKubah!jB,ubah!jCubah!j ubj )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKjC)rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKj9,)rK}rK(hUh}rK(U anchornameU#helpful-twisted-classesUrefurihh]h]h]h]h]Uinternaluh jKh]rKhXHelpful Twisted ClassesrKrK}rK(hXHelpful Twisted Classesh jKubah!jB,ubah!jCubah!j ubj )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rK(jC)rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKj9,)rK}rK(hUh}rK(U anchornameU#sequences-of-operationsUrefurihh]h]h]h]h]Uinternaluh jKh]rKhXSequences of OperationsrKrK}rK(hXSequences of Operationsh jKubah!jB,ubah!jCubj )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rK(j )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKjC)rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKj9,)rK}rK(hUh}rK(U anchornameU#nested-callbacksUrefurihh]h]h]h]h]Uinternaluh jKh]rKhXNested CallbacksrKrK}rK(hXNested Callbacksh jKubah!jB,ubah!jCubah!j ubj )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKjC)rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKj9,)rK}rK(hUh}rK(U anchornameU#inlinecallbacksUrefurihh]h]h]h]h]Uinternaluh jKh]rKhXinlineCallbacksrKrK}rK(hXinlineCallbacksh jKubah!jB,ubah!jCubah!j ubj )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKjC)rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKj9,)rK}rK(hUh}rK(U anchornameU#lockingUrefurihh]h]h]h]h]Uinternaluh jKh]rKhXLockingrKrK}rK(hXLockingh jKubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKjC)rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rKj9,)rK}rK(hUh}rK(U anchornameU#joining-sequencesUrefurihh]h]h]h]h]Uinternaluh jKh]rKhXJoining SequencesrKrK}rK(hXJoining Sequencesh jKubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubhj )rK}rK(hUh}rK(h]h]h]h]h]uh]rKj )rK}rK(hUh}rK(h]h]h]h]h]uh jKh]rK(jC)rL}rL(hUh}rL(h]h]h]h]h]uh jKh]rLj9,)rL}rL(hUh}rL(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jLh]rLhXMetricsrLr L}r L(hhh jLubah!jB,ubah!jCubj )r L}r L(hUh}r L(h]h]h]h]h]uh jKh]rL(j )rL}rL(hUh}rL(h]h]h]h]h]uh j Lh]rLjC)rL}rL(hUh}rL(h]h]h]h]h]uh jLh]rLj9,)rL}rL(hUh}rL(U anchornameU#metric-eventsUrefurihh]h]h]h]h]Uinternaluh jLh]rLhX Metric EventsrLrL}rL(hX Metric Eventsh jLubah!jB,ubah!jCubah!j ubj )rL}rL(hUh}r L(h]h]h]h]h]uh j Lh]r!LjC)r"L}r#L(hUh}r$L(h]h]h]h]h]uh jLh]r%Lj9,)r&L}r'L(hUh}r(L(U anchornameU#metric-handlersUrefurihh]h]h]h]h]Uinternaluh j"Lh]r)LhXMetric Handlersr*Lr+L}r,L(hXMetric Handlersh j&Lubah!jB,ubah!jCubah!j ubj )r-L}r.L(hUh}r/L(h]h]h]h]h]uh j Lh]r0LjC)r1L}r2L(hUh}r3L(h]h]h]h]h]uh j-Lh]r4Lj9,)r5L}r6L(hUh}r7L(U anchornameU#metric-watchersUrefurihh]h]h]h]h]Uinternaluh j1Lh]r8LhXMetric Watchersr9Lr:L}r;L(hXMetric Watchersh j5Lubah!jB,ubah!jCubah!j ubj )rL(h]h]h]h]h]uh j Lh]r?LjC)r@L}rAL(hUh}rBL(h]h]h]h]h]uh jM(hUh}r?M(h]h]h]h]h]uh j.Mh]r@Mj )rAM}rBM(hUh}rCM(h]h]h]h]h]uh j=Mh]rDMjC)rEM}rFM(hUh}rGM(h]h]h]h]h]uh jAMh]rHMj9,)rIM}rJM(hUh}rKM(U anchornameU #attributesUrefurihh]h]h]h]h]Uinternaluh jEMh]rLMhX AttributesrMMrNM}rOM(hX Attributesh jIMubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rPM}rQM(hUh}rRM(h]h]h]h]h]uh j*Mh]rSM(jC)rTM}rUM(hUh}rVM(h]h]h]h]h]uh jPMh]rWMj9,)rXM}rYM(hUh}rZM(U anchornameU#predefined-build-factoriesUrefurihh]h]h]h]h]Uinternaluh jTMh]r[MhXPredefined Build Factoriesr\Mr]M}r^M(hXPredefined Build Factoriesh jXMubah!jB,ubah!jCubj )r_M}r`M(hUh}raM(h]h]h]h]h]uh jPMh]rbM(j )rcM}rdM(hUh}reM(h]h]h]h]h]uh j_Mh]rfMjC)rgM}rhM(hUh}riM(h]h]h]h]h]uh jcMh]rjMj9,)rkM}rlM(hUh}rmM(U anchornameU#index-1Urefurihh]h]h]h]h]Uinternaluh jgMh]rnMhX GNUAutoconfroMrpM}rqM(hX GNUAutoconfh jkMubah!jB,ubah!jCubah!j ubj )rrM}rsM(hUh}rtM(h]h]h]h]h]uh j_Mh]ruMjC)rvM}rwM(hUh}rxM(h]h]h]h]h]uh jrMh]ryMj9,)rzM}r{M(hUh}r|M(U anchornameU#index-2Urefurihh]h]h]h]h]Uinternaluh jvMh]r}MhXBasicBuildFactoryr~MrM}rM(hXBasicBuildFactoryh jzMubah!jB,ubah!jCubah!j ubj )rM}rM(hUh}rM(h]h]h]h]h]uh j_Mh]rMjC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameU#index-3Urefurihh]h]h]h]h]Uinternaluh jMh]rMhXBasicSVNrMrM}rM(hXBasicSVNh jMubah!jB,ubah!jCubah!j ubj )rM}rM(hUh}rM(h]h]h]h]h]uh j_Mh]rMjC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameU#index-4Urefurihh]h]h]h]h]Uinternaluh jMh]rMhXQuickBuildFactoryrMrM}rM(hXQuickBuildFactoryh jMubah!jB,ubah!jCubah!j ubj )rM}rM(hUh}rM(h]h]h]h]h]uh j_Mh]rMjC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameU#cpanUrefurihh]h]h]h]h]Uinternaluh jMh]rMhXCPANrMrM}rM(hXCPANh jMubah!jB,ubah!jCubah!j ubj )rM}rM(hUh}rM(h]h]h]h]h]uh j_Mh]rMjC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameU#index-6Urefurihh]h]h]h]h]Uinternaluh jMh]rMhX DistutilsrMrM}rM(hX Distutilsh jMubah!jB,ubah!jCubah!j ubj )rM}rM(hUh}rM(h]h]h]h]h]uh j_Mh]rMjC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameU#index-7Urefurihh]h]h]h]h]Uinternaluh jMh]rMhXTrialrMrM}rM(hXTrialh jMubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubhj )rM}rM(hUh}rM(h]h]h]h]h]uh]rMj )rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rM(jC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jMh]rMhX UtilitiesrMrM}rM(hhh jMubah!jB,ubah!jCubj )rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rM(j )rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMjC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameX#module-buildbot.util.lruUrefurihh]h]h]h]h]Uinternaluh jMh]rMhXbuildbot.util.lrurMrM}rM(hXbuildbot.util.lruh jMubah!jB,ubah!jCubah!j ubj )rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMjC)rM}rM(hUh}rM(h]h]h]h]h]uh jMh]rMj9,)rM}rM(hUh}rM(U anchornameX##module-buildbot.util.bbcollectionsUrefurihh]h]h]h]h]Uinternaluh jMh]rMhXbuildbot.util.bbcollectionsrMrM}rN(hXbuildbot.util.bbcollectionsh jMubah!jB,ubah!jCubah!j ubj )rN}rN(hUh}rN(h]h]h]h]h]uh jMh]rNjC)rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNj9,)r N}r N(hUh}r N(U anchornameX#module-buildbot.util.eventualUrefurihh]h]h]h]h]Uinternaluh jNh]r NhXbuildbot.util.eventualr NrN}rN(hXbuildbot.util.eventualh j Nubah!jB,ubah!jCubah!j ubj )rN}rN(hUh}rN(h]h]h]h]h]uh jMh]rNjC)rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNj9,)rN}rN(hUh}rN(U anchornameX#module-buildbot.util.jsonUrefurihh]h]h]h]h]Uinternaluh jNh]rNhXbuildbot.util.jsonrNrN}rN(hXbuildbot.util.jsonh jNubah!jB,ubah!jCubah!j ubj )rN}r N(hUh}r!N(h]h]h]h]h]uh jMh]r"NjC)r#N}r$N(hUh}r%N(h]h]h]h]h]uh jNh]r&Nj9,)r'N}r(N(hUh}r)N(U anchornameX#module-buildbot.util.maildirUrefurihh]h]h]h]h]Uinternaluh j#Nh]r*NhXbuildbot.util.maildirr+Nr,N}r-N(hXbuildbot.util.maildirh j'Nubah!jB,ubah!jCubah!j ubj )r.N}r/N(hUh}r0N(h]h]h]h]h]uh jMh]r1NjC)r2N}r3N(hUh}r4N(h]h]h]h]h]uh j.Nh]r5Nj9,)r6N}r7N(hUh}r8N(U anchornameX#module-buildbot.util.miscUrefurihh]h]h]h]h]Uinternaluh j2Nh]r9NhXbuildbot.util.miscr:Nr;N}rN(hUh}r?N(h]h]h]h]h]uh jMh]r@NjC)rAN}rBN(hUh}rCN(h]h]h]h]h]uh j=Nh]rDNj9,)rEN}rFN(hUh}rGN(U anchornameX #module-buildbot.util.netstringsUrefurihh]h]h]h]h]Uinternaluh jANh]rHNhXbuildbot.util.netstringsrINrJN}rKN(hXbuildbot.util.netstringsh jENubah!jB,ubah!jCubah!j ubj )rLN}rMN(hUh}rNN(h]h]h]h]h]uh jMh]rONjC)rPN}rQN(hUh}rRN(h]h]h]h]h]uh jLNh]rSNj9,)rTN}rUN(hUh}rVN(U anchornameX#module-buildbot.util.sautilsUrefurihh]h]h]h]h]Uinternaluh jPNh]rWNhXbuildbot.util.sautilsrXNrYN}rZN(hXbuildbot.util.sautilsh jTNubah!jB,ubah!jCubah!j ubj )r[N}r\N(hUh}r]N(h]h]h]h]h]uh jMh]r^NjC)r_N}r`N(hUh}raN(h]h]h]h]h]uh j[Nh]rbNj9,)rcN}rdN(hUh}reN(U anchornameU#buildbot-util-subscriptionUrefurihh]h]h]h]h]Uinternaluh j_Nh]rfNhXbuildbot.util.subscriptionrgNrhN}riN(hXbuildbot.util.subscriptionh jcNubah!jB,ubah!jCubah!j ubj )rjN}rkN(hUh}rlN(h]h]h]h]h]uh jMh]rmNjC)rnN}roN(hUh}rpN(h]h]h]h]h]uh jjNh]rqNj9,)rrN}rsN(hUh}rtN(U anchornameU#buildbot-util-croniterUrefurihh]h]h]h]h]Uinternaluh jnNh]ruNhXbuildbot.util.croniterrvNrwN}rxN(hXbuildbot.util.croniterh jrNubah!jB,ubah!jCubah!j ubj )ryN}rzN(hUh}r{N(h]h]h]h]h]uh jMh]r|NjC)r}N}r~N(hUh}rN(h]h]h]h]h]uh jyNh]rNj9,)rN}rN(hUh}rN(U anchornameX#module-buildbot.util.stateUrefurihh]h]h]h]h]Uinternaluh j}Nh]rNhXbuildbot.util.staterNrN}rN(hXbuildbot.util.stateh jNubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubhj )rN}rN(hUh}rN(h]h]h]h]h]uh]rNj )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rN(jC)rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNj9,)rN}rN(hUh}rN(U anchornameUUrefurihh]h]h]h]h]Uinternaluh jNh]rNhXBuildbot DevelopmentrNrN}rN(hjh jNubah!jB,ubah!jCubj )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNje)rN}rN(hUh}rN(UnumberedKUparenthU titlesonlyUglobh]h]h]h]h]Uentries]rN(NjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNNjBrNeUhiddenUmaxdepthKU includefiles]rN(jBjBjBjBjBjBjBjBjBjBjBjBjBjBeU includehiddenuh jNh]h!jhubah!j1 ubeh!j ubah!j1 ubjj )rN}rN(hUh}rN(h]h]h]h]h]uh]rNj )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rN(jC)rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNj9,)rN}rN(hUh}rN(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jNh]rNhX#Release Notes for Buildbot v0.8.6p1rNrN}rN(hj h jNubah!jB,ubah!jCubj )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rN(j )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNjC)rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNj9,)rN}rN(hUh}rN(U anchornameU#p1Urefurijh]h]h]h]h]Uinternaluh jNh]rNhX0.8.6p1rNrN}rN(hX0.8.6p1h jNubah!jB,ubah!jCubah!j ubj )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rN(jC)rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNj9,)rN}rN(hUh}rN(U anchornameU#masterUrefurijh]h]h]h]h]Uinternaluh jNh]rNhXMasterrNrN}rN(hXMasterh jNubah!jB,ubah!jCubj )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rN(j )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNjC)rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNj9,)rN}rN(hUh}rN(U anchornameU1#deprecations-removals-and-non-compatible-changesUrefurijh]h]h]h]h]Uinternaluh jNh]rNhX2Deprecations, Removals, and Non-Compatible ChangesrNrN}rN(hX2Deprecations, Removals, and Non-Compatible Changesh jNubah!jB,ubah!jCubah!j ubj )rN}rN(hUh}rN(h]h]h]h]h]uh jNh]rNjC)rN}rN(hUh}rO(h]h]h]h]h]uh jNh]rOj9,)rO}rO(hUh}rO(U anchornameU#changes-for-developersUrefurijh]h]h]h]h]Uinternaluh jNh]rOhXChanges for DevelopersrOrO}rO(hXChanges for Developersh jOubah!jB,ubah!jCubah!j ubj )r O}r O(hUh}r O(h]h]h]h]h]uh jNh]r OjC)r O}rO(hUh}rO(h]h]h]h]h]uh j Oh]rOj9,)rO}rO(hUh}rO(U anchornameU #featuresUrefurijh]h]h]h]h]Uinternaluh j Oh]rOhXFeaturesrOrO}rO(hXFeaturesh jOubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rO}rO(hUh}rO(h]h]h]h]h]uh jNh]rO(jC)rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj9,)r O}r!O(hUh}r"O(U anchornameU#slaveUrefurijh]h]h]h]h]Uinternaluh jOh]r#OhXSlaver$Or%O}r&O(hXSlaveh j Oubah!jB,ubah!jCubj )r'O}r(O(hUh}r)O(h]h]h]h]h]uh jOh]r*O(j )r+O}r,O(hUh}r-O(h]h]h]h]h]uh j'Oh]r.OjC)r/O}r0O(hUh}r1O(h]h]h]h]h]uh j+Oh]r2Oj9,)r3O}r4O(hUh}r5O(U anchornameU#id1Urefurijh]h]h]h]h]Uinternaluh j/Oh]r6OhX2Deprecations, Removals, and Non-Compatible Changesr7Or8O}r9O(hX2Deprecations, Removals, and Non-Compatible Changesh j3Oubah!jB,ubah!jCubah!j ubj )r:O}r;O(hUh}rO}r?O(hUh}r@O(h]h]h]h]h]uh j:Oh]rAOj9,)rBO}rCO(hUh}rDO(U anchornameU#id2Urefurijh]h]h]h]h]Uinternaluh j>Oh]rEOhXFeaturesrFOrGO}rHO(hXFeaturesh jBOubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rIO}rJO(hUh}rKO(h]h]h]h]h]uh jNh]rLOjC)rMO}rNO(hUh}rOO(h]h]h]h]h]uh jIOh]rPOj9,)rQO}rRO(hUh}rSO(U anchornameU#detailsUrefurijh]h]h]h]h]Uinternaluh jMOh]rTOhXDetailsrUOrVO}rWO(hXDetailsh jQOubah!jB,ubah!jCubah!j ubj )rXO}rYO(hUh}rZO(h]h]h]h]h]uh jNh]r[OjC)r\O}r]O(hUh}r^O(h]h]h]h]h]uh jXOh]r_Oj9,)r`O}raO(hUh}rbO(U anchornameU#older-versionsUrefurijh]h]h]h]h]Uinternaluh j\Oh]rcOhXOlder VersionsrdOreO}rfO(hXOlder Versionsh j`Oubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubj j )rgO}rhO(hUh}riO(h]h]h]h]h]uh]rjOj )rkO}rlO(hUh}rmO(h]h]h]h]h]uh jgOh]rnO(jC)roO}rpO(hUh}rqO(h]h]h]h]h]uh jkOh]rrOj9,)rsO}rtO(hUh}ruO(U anchornameUUrefurij h]h]h]h]h]Uinternaluh joOh]rvOhX InstallationrwOrxO}ryO(hjh jsOubah!jB,ubah!jCubj )rzO}r{O(hUh}r|O(h]h]h]h]h]uh jkOh]r}O(j )r~O}rO(hUh}rO(h]h]h]h]h]uh jzOh]rOjC)rO}rO(hUh}rO(h]h]h]h]h]uh j~Oh]rOj9,)rO}rO(hUh}rO(U anchornameU#buildbot-componentsUrefurij h]h]h]h]h]Uinternaluh jOh]rOhXBuildbot ComponentsrOrO}rO(hXBuildbot ComponentsrOh jOubah!jB,ubah!jCubah!j ubj )rO}rO(hUh}rO(h]h]h]h]h]uh jzOh]rO(jC)rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj9,)rO}rO(hUh}rO(U anchornameU #requirementsUrefurij h]h]h]h]h]Uinternaluh jOh]rOhX RequirementsrOrO}rO(hX RequirementsrOh jOubah!jB,ubah!jCubj )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rO(j )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rO(jC)rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj9,)rO}rO(hUh}rO(U anchornameU#common-requirementsUrefurij h]h]h]h]h]Uinternaluh jOh]rOhXCommon RequirementsrOrO}rO(hXCommon RequirementsrOh jOubah!jB,ubah!jCubj )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOjC)rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj9,)rO}rO(hUh}rO(U anchornameU#windows-supportUrefurij h]h]h]h]h]Uinternaluh jOh]rOhXWindows SupportrOrO}rO(hXWindows SupportrOh jOubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOjC)rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj9,)rO}rO(hUh}rO(U anchornameU#buildmaster-requirementsUrefurij h]h]h]h]h]Uinternaluh jOh]rOhXBuildmaster RequirementsrOrO}rO(hXBuildmaster RequirementsrOh jOubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rO}rO(hUh}rO(h]h]h]h]h]uh jzOh]rO(jC)rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj9,)rO}rO(hUh}rO(U anchornameU#installing-the-codeUrefurij h]h]h]h]h]Uinternaluh jOh]rOhXInstalling the coderOrO}rO(hXInstalling the coderOh jOubah!jB,ubah!jCubj )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rO(j )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOjC)rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOj9,)rO}rO(hUh}rO(U anchornameU#the-distribution-packageUrefurij h]h]h]h]h]Uinternaluh jOh]rOhXThe Distribution PackagerOrO}rO(hXThe Distribution PackagerOh jOubah!jB,ubah!jCubah!j ubj )rO}rO(hUh}rO(h]h]h]h]h]uh jOh]rOjC)rO}rO(hUh}rP(h]h]h]h]h]uh jOh]rPj9,)rP}rP(hUh}rP(U anchornameU#installation-from-pypiUrefurij h]h]h]h]h]Uinternaluh jOh]rPhXInstallation From PyPIrPrP}rP(hXInstallation From PyPIr Ph jPubah!jB,ubah!jCubah!j ubj )r P}r P(hUh}r P(h]h]h]h]h]uh jOh]r PjC)rP}rP(hUh}rP(h]h]h]h]h]uh j Ph]rPj9,)rP}rP(hUh}rP(U anchornameU#installation-from-tarballsUrefurij h]h]h]h]h]Uinternaluh jPh]rPhXInstallation From TarballsrPrP}rP(hXInstallation From TarballsrPh jPubah!jB,ubah!jCubah!j ubj )rP}rP(hUh}rP(h]h]h]h]h]uh jOh]rPjC)rP}rP(hUh}r P(h]h]h]h]h]uh jPh]r!Pj9,)r"P}r#P(hUh}r$P(U anchornameU#installation-in-a-virtualenvUrefurij h]h]h]h]h]Uinternaluh jPh]r%PhXInstallation in a Virtualenvr&Pr'P}r(P(hXInstallation in a Virtualenvr)Ph j"Pubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r*P}r+P(hUh}r,P(h]h]h]h]h]uh jzOh]r-PjC)r.P}r/P(hUh}r0P(h]h]h]h]h]uh j*Ph]r1Pj9,)r2P}r3P(hUh}r4P(U anchornameU"#running-buildbot-s-tests-optionalUrefurij h]h]h]h]h]Uinternaluh j.Ph]r5PhX#Running Buildbot's Tests (optional)r6Pr7P}r8P(hX#Running Buildbot's Tests (optional)r9Ph j2Pubah!jB,ubah!jCubah!j ubj )r:P}r;P(hUh}rP}r?P(hUh}r@P(h]h]h]h]h]uh j:Ph]rAPj9,)rBP}rCP(hUh}rDP(U anchornameU#creating-a-buildmasterUrefurij h]h]h]h]h]Uinternaluh j>Ph]rEPhXCreating a buildmasterrFPrGP}rHP(hXCreating a buildmasterrIPh jBPubah!jB,ubah!jCubj )rJP}rKP(hUh}rLP(h]h]h]h]h]uh j:Ph]rMP(j )rNP}rOP(hUh}rPP(h]h]h]h]h]uh jJPh]rQP(jC)rRP}rSP(hUh}rTP(h]h]h]h]h]uh jNPh]rUPj9,)rVP}rWP(hUh}rXP(U anchornameU#using-a-database-serverUrefurij h]h]h]h]h]Uinternaluh jRPh]rYPhXUsing A Database ServerrZPr[P}r\P(hXUsing A Database Serverr]Ph jVPubah!jB,ubah!jCubj )r^P}r_P(hUh}r`P(h]h]h]h]h]uh jNPh]raPj )rbP}rcP(hUh}rdP(h]h]h]h]h]uh j^Ph]rePjC)rfP}rgP(hUh}rhP(h]h]h]h]h]uh jbPh]riPj9,)rjP}rkP(hUh}rlP(U anchornameU#additional-requirementsUrefurij h]h]h]h]h]Uinternaluh jfPh]rmPhXAdditional RequirementsrnProP}rpP(hXAdditional RequirementsrqPh jjPubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rrP}rsP(hUh}rtP(h]h]h]h]h]uh jJPh]ruPjC)rvP}rwP(hUh}rxP(h]h]h]h]h]uh jrPh]ryPj9,)rzP}r{P(hUh}r|P(U anchornameU#buildmaster-optionsUrefurij h]h]h]h]h]Uinternaluh jvPh]r}PhXBuildmaster Optionsr~PrP}rP(hXBuildmaster OptionsrPh jzPubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rP}rP(hUh}rP(h]h]h]h]h]uh jzOh]rP(jC)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj9,)rP}rP(hUh}rP(U anchornameU"#upgrading-an-existing-buildmasterUrefurij h]h]h]h]h]Uinternaluh jPh]rPhX!Upgrading an Existing BuildmasterrPrP}rP(hX!Upgrading an Existing BuildmasterrPh jPubah!jB,ubah!jCubj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rP(jC)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj9,)rP}rP(hUh}rP(U anchornameU#version-specific-notesUrefurij h]h]h]h]h]Uinternaluh jPh]rPhXVersion-specific NotesrPrP}rP(hXVersion-specific NotesrPh jPubah!jB,ubah!jCubj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rP(j )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjC)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj9,)rP}rP(hUh}rP(U anchornameU*#upgrading-a-buildmaster-to-buildbot-0-7-6Urefurij h]h]h]h]h]Uinternaluh jPh]rPhX)Upgrading a Buildmaster to Buildbot-0.7.6rPrP}rP(hX)Upgrading a Buildmaster to Buildbot-0.7.6rPh jPubah!jB,ubah!jCubah!j ubj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjC)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj9,)rP}rP(hUh}rP(U anchornameU*#upgrading-a-buildmaster-to-buildbot-0-8-0Urefurij h]h]h]h]h]Uinternaluh jPh]rPhX)Upgrading a Buildmaster to Buildbot-0.8.0rPrP}rP(hX)Upgrading a Buildmaster to Buildbot-0.8.0rPh jPubah!jB,ubah!jCubah!j ubj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rP(jC)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj9,)rP}rP(hUh}rP(U anchornameU%#upgrading-into-a-non-sqlite-databaseUrefurij h]h]h]h]h]Uinternaluh jPh]rPhX$Upgrading into a non-SQLite databaserPrP}rP(hX$Upgrading into a non-SQLite databaserPh jPubah!jB,ubah!jCubj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjC)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj9,)rP}rP(hUh}rP(U anchornameU#change-encoding-issuesUrefurij h]h]h]h]h]Uinternaluh jPh]rPhXChange Encoding IssuesrPrP}rP(hXChange Encoding IssuesrPh jPubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPjC)rP}rP(hUh}rP(h]h]h]h]h]uh jPh]rPj9,)rP}rP(hUh}rP(U anchornameU*#upgrading-a-buildmaster-to-later-versionsUrefurij h]h]h]h]h]Uinternaluh jPh]rPhX)Upgrading a Buildmaster to Later VersionsrPrP}rP(hX)Upgrading a Buildmaster to Later VersionsrPh jPubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubeh!j ubj )rP}rP(hUh}rQ(h]h]h]h]h]uh jzOh]rQ(jC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jPh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU#creating-a-buildslaveUrefurij h]h]h]h]h]Uinternaluh jQh]r QhXCreating a buildslaver Qr Q}r Q(hXCreating a buildslaver Qh jQubah!jB,ubah!jCubj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jPh]rQ(j )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU#buildslave-optionsUrefurij h]h]h]h]h]Uinternaluh jQh]rQhXBuildslave OptionsrQrQ}r Q(hXBuildslave Optionsr!Qh jQubah!jB,ubah!jCubah!j ubj )r"Q}r#Q(hUh}r$Q(h]h]h]h]h]uh jQh]r%QjC)r&Q}r'Q(hUh}r(Q(h]h]h]h]h]uh j"Qh]r)Qj9,)r*Q}r+Q(hUh}r,Q(U anchornameU#other-buildslave-configurationUrefurij h]h]h]h]h]Uinternaluh j&Qh]r-QhXOther Buildslave Configurationr.Qr/Q}r0Q(hXOther Buildslave Configurationr1Qh j*Qubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r2Q}r3Q(hUh}r4Q(h]h]h]h]h]uh jzOh]r5Q(jC)r6Q}r7Q(hUh}r8Q(h]h]h]h]h]uh j2Qh]r9Qj9,)r:Q}r;Q(hUh}rQr?Q}r@Q(hX Upgrading an Existing BuildslaverAQh j:Qubah!jB,ubah!jCubj )rBQ}rCQ(hUh}rDQ(h]h]h]h]h]uh j2Qh]rEQj )rFQ}rGQ(hUh}rHQ(h]h]h]h]h]uh jBQh]rIQ(jC)rJQ}rKQ(hUh}rLQ(h]h]h]h]h]uh jFQh]rMQj9,)rNQ}rOQ(hUh}rPQ(U anchornameU"#buildslave-version-specific-notesUrefurij h]h]h]h]h]Uinternaluh jJQh]rQQhXVersion-specific NotesrRQrSQ}rTQ(hXVersion-specific NotesrUQh jNQubah!jB,ubah!jCubj )rVQ}rWQ(hUh}rXQ(h]h]h]h]h]uh jFQh]rYQj )rZQ}r[Q(hUh}r\Q(h]h]h]h]h]uh jVQh]r]QjC)r^Q}r_Q(hUh}r`Q(h]h]h]h]h]uh jZQh]raQj9,)rbQ}rcQ(hUh}rdQ(U anchornameU/#upgrading-a-buildslave-to-buildbot-slave-0-8-1Urefurij h]h]h]h]h]Uinternaluh j^Qh]reQhX.Upgrading a Buildslave to Buildbot-slave-0.8.1rfQrgQ}rhQ(hX.Upgrading a Buildslave to Buildbot-slave-0.8.1riQh jbQubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubah!j1 ubeh!j ubj )rjQ}rkQ(hUh}rlQ(h]h]h]h]h]uh jzOh]rmQjC)rnQ}roQ(hUh}rpQ(h]h]h]h]h]uh jjQh]rqQj9,)rrQ}rsQ(hUh}rtQ(U anchornameU#launching-the-daemonsUrefurij h]h]h]h]h]Uinternaluh jnQh]ruQhXLaunching the daemonsrvQrwQ}rxQ(hXLaunching the daemonsryQh jrQubah!jB,ubah!jCubah!j ubj )rzQ}r{Q(hUh}r|Q(h]h]h]h]h]uh jzOh]r}QjC)r~Q}rQ(hUh}rQ(h]h]h]h]h]uh jzQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU #logfilesUrefurij h]h]h]h]h]Uinternaluh j~Qh]rQhXLogfilesrQrQ}rQ(hXLogfilesrQh jQubah!jB,ubah!jCubah!j ubj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jzOh]rQjC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU #shutdownUrefurij h]h]h]h]h]Uinternaluh jQh]rQhXShutdownrQrQ}rQ(hXShutdownrQh jQubah!jB,ubah!jCubah!j ubj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jzOh]rQjC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU #maintenanceUrefurij h]h]h]h]h]Uinternaluh jQh]rQhX MaintenancerQrQ}rQ(hX MaintenancerQh jQubah!jB,ubah!jCubah!j ubj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jzOh]rQ(jC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU#troubleshootingUrefurij h]h]h]h]h]Uinternaluh jQh]rQhXTroubleshootingrQrQ}rQ(hXTroubleshootingrQh jQubah!jB,ubah!jCubj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQ(j )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU#starting-the-buildslaveUrefurij h]h]h]h]h]Uinternaluh jQh]rQhXStarting the buildslaverQrQ}rQ(hXStarting the buildslaverQh jQubah!jB,ubah!jCubah!j ubj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU#connecting-to-the-buildmasterUrefurij h]h]h]h]h]Uinternaluh jQh]rQhXConnecting to the buildmasterrQrQ}rQ(hXConnecting to the buildmasterrQh jQubah!jB,ubah!jCubah!j ubj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQjC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameU#contrib-scriptsUrefurij h]h]h]h]h]Uinternaluh jQh]rQhXContrib ScriptsrQrQ}rQ(hXContrib ScriptsrQh jQubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubjj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh]rQj )rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQ(jC)rQ}rQ(hUh}rQ(h]h]h]h]h]uh jQh]rQj9,)rQ}rQ(hUh}rQ(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jQh]rQhX!Release Notes for Buildbot v0.8.8rQrQ}rR(hjh jQubah!jB,ubah!jCubj )rR}rR(hUh}rR(h]h]h]h]h]uh jQh]rR(j )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(jC)r R}r R(hUh}r R(h]h]h]h]h]uh jRh]r Rj9,)r R}rR(hUh}rR(U anchornameU#masterUrefurijh]h]h]h]h]Uinternaluh j Rh]rRhXMasterrRrR}rR(hXMasterh j Rubah!jB,ubah!jCubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(j )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)r R}r!R(hUh}r"R(U anchornameU #featuresUrefurijh]h]h]h]h]Uinternaluh jRh]r#RhXFeaturesr$Rr%R}r&R(hXFeaturesh j Rubah!jB,ubah!jCubah!j ubj )r'R}r(R(hUh}r)R(h]h]h]h]h]uh jRh]r*RjC)r+R}r,R(hUh}r-R(h]h]h]h]h]uh j'Rh]r.Rj9,)r/R}r0R(hUh}r1R(U anchornameU1#deprecations-removals-and-non-compatible-changesUrefurijh]h]h]h]h]Uinternaluh j+Rh]r2RhX2Deprecations, Removals, and Non-Compatible Changesr3Rr4R}r5R(hX2Deprecations, Removals, and Non-Compatible Changesh j/Rubah!jB,ubah!jCubah!j ubj )r6R}r7R(hUh}r8R(h]h]h]h]h]uh jRh]r9RjC)r:R}r;R(hUh}rR}r?R(hUh}r@R(U anchornameU#changes-for-developersUrefurijh]h]h]h]h]Uinternaluh j:Rh]rARhXChanges for DevelopersrBRrCR}rDR(hXChanges for Developersh j>Rubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rER}rFR(hUh}rGR(h]h]h]h]h]uh jRh]rHR(jC)rIR}rJR(hUh}rKR(h]h]h]h]h]uh jERh]rLRj9,)rMR}rNR(hUh}rOR(U anchornameU#slaveUrefurijh]h]h]h]h]Uinternaluh jIRh]rPRhXSlaverQRrRR}rSR(hXSlaveh jMRubah!jB,ubah!jCubj )rTR}rUR(hUh}rVR(h]h]h]h]h]uh jERh]rWR(j )rXR}rYR(hUh}rZR(h]h]h]h]h]uh jTRh]r[RjC)r\R}r]R(hUh}r^R(h]h]h]h]h]uh jXRh]r_Rj9,)r`R}raR(hUh}rbR(U anchornameU#id1Urefurijh]h]h]h]h]Uinternaluh j\Rh]rcRhXFeaturesrdRreR}rfR(hXFeaturesh j`Rubah!jB,ubah!jCubah!j ubj )rgR}rhR(hUh}riR(h]h]h]h]h]uh jTRh]rjRjC)rkR}rlR(hUh}rmR(h]h]h]h]h]uh jgRh]rnRj9,)roR}rpR(hUh}rqR(U anchornameU#id2Urefurijh]h]h]h]h]Uinternaluh jkRh]rrRhX2Deprecations, Removals, and Non-Compatible ChangesrsRrtR}ruR(hX2Deprecations, Removals, and Non-Compatible Changesh joRubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rvR}rwR(hUh}rxR(h]h]h]h]h]uh jRh]ryRjC)rzR}r{R(hUh}r|R(h]h]h]h]h]uh jvRh]r}Rj9,)r~R}rR(hUh}rR(U anchornameU#detailsUrefurijh]h]h]h]h]Uinternaluh jzRh]rRhXDetailsrRrR}rR(hXDetailsh j~Rubah!jB,ubah!jCubah!j ubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(jC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)rR}rR(hUh}rR(U anchornameU#older-versionsUrefurijh]h]h]h]h]Uinternaluh jRh]rRhXOlder VersionsrRrR}rR(hXOlder Versionsh jRubah!jB,ubah!jCubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRje)rR}rR(hUh}rR(UnumberedKUparentjU titlesonlyUglobh]h]h]h]h]Uentries]rR(NjBrRNjBrReUhiddenUmaxdepthKU includefiles]rR(jBjBeU includehiddenuh jRh]h!jhubah!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubjj )rR}rR(hUh}rR(h]h]h]h]h]uh]rRj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(jC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)rR}rR(hUh}rR(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jRh]rRhX SchedulersrRrR}rR(hj'h jRubah!jB,ubah!jCubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rR(j )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)rR}rR(hUh}rR(U anchornameU#configuring-schedulersUrefurijh]h]h]h]h]Uinternaluh jRh]rRhXConfiguring SchedulersrRrR}rR(hXConfiguring Schedulersh jRubah!jB,ubah!jCubah!j ubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)rR}rR(hUh}rR(U anchornameU#change-filtersUrefurijh]h]h]h]h]Uinternaluh jRh]rRhXChange FiltersrRrR}rR(hXChange Filtersh jRubah!jB,ubah!jCubah!j ubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)rR}rR(hUh}rR(U anchornameU#singlebranchschedulerUrefurijh]h]h]h]h]Uinternaluh jRh]rRhXSingleBranchSchedulerrRrR}rR(hXSingleBranchSchedulerh jRubah!jB,ubah!jCubah!j ubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)rR}rR(hUh}rR(U anchornameU#anybranchschedulerUrefurijh]h]h]h]h]Uinternaluh jRh]rRhXAnyBranchSchedulerrRrR}rR(hXAnyBranchSchedulerh jRubah!jB,ubah!jCubah!j ubj )rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRjC)rR}rR(hUh}rR(h]h]h]h]h]uh jRh]rRj9,)rR}rR(hUh}rR(U anchornameU#dependent-schedulerUrefurijh]h]h]h]h]Uinternaluh jRh]rRhXDependent SchedulerrRrR}rS(hXDependent Schedulerh jRubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh jRh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)r S}r S(hUh}r S(U anchornameU#periodic-schedulerUrefurijh]h]h]h]h]Uinternaluh jSh]r ShXPeriodic Schedulerr SrS}rS(hXPeriodic Schedulerh j Subah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh jRh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#nightly-schedulerUrefurijh]h]h]h]h]Uinternaluh jSh]rShXNightly SchedulerrSrS}rS(hXNightly Schedulerh jSubah!jB,ubah!jCubah!j ubj )rS}r S(hUh}r!S(h]h]h]h]h]uh jRh]r"SjC)r#S}r$S(hUh}r%S(h]h]h]h]h]uh jSh]r&Sj9,)r'S}r(S(hUh}r)S(U anchornameU#try-schedulersUrefurijh]h]h]h]h]Uinternaluh j#Sh]r*ShXTry Schedulersr+Sr,S}r-S(hXTry Schedulersh j'Subah!jB,ubah!jCubah!j ubj )r.S}r/S(hUh}r0S(h]h]h]h]h]uh jRh]r1SjC)r2S}r3S(hUh}r4S(h]h]h]h]h]uh j.Sh]r5Sj9,)r6S}r7S(hUh}r8S(U anchornameU#triggerable-schedulerUrefurijh]h]h]h]h]Uinternaluh j2Sh]r9ShXTriggerable Schedulerr:Sr;S}rS(hUh}r?S(h]h]h]h]h]uh jRh]r@SjC)rAS}rBS(hUh}rCS(h]h]h]h]h]uh j=Sh]rDSj9,)rES}rFS(hUh}rGS(U anchornameU#nightlytriggerable-schedulerUrefurijh]h]h]h]h]Uinternaluh jASh]rHShXNightlyTriggerable SchedulerrISrJS}rKS(hXNightlyTriggerable Schedulerh jESubah!jB,ubah!jCubah!j ubj )rLS}rMS(hUh}rNS(h]h]h]h]h]uh jRh]rOS(jC)rPS}rQS(hUh}rRS(h]h]h]h]h]uh jLSh]rSSj9,)rTS}rUS(hUh}rVS(U anchornameU#forcescheduler-schedulerUrefurijh]h]h]h]h]Uinternaluh jPSh]rWShXForceScheduler SchedulerrXSrYS}rZS(hXForceScheduler Schedulerh jTSubah!jB,ubah!jCubj )r[S}r\S(hUh}r]S(h]h]h]h]h]uh jLSh]r^S(j )r_S}r`S(hUh}raS(h]h]h]h]h]uh j[Sh]rbSjC)rcS}rdS(hUh}reS(h]h]h]h]h]uh j_Sh]rfSj9,)rgS}rhS(hUh}riS(U anchornameU#authorizationUrefurijh]h]h]h]h]Uinternaluh jcSh]rjShX AuthorizationrkSrlS}rmS(hX Authorizationh jgSubah!jB,ubah!jCubah!j ubj )rnS}roS(hUh}rpS(h]h]h]h]h]uh j[Sh]rqS(jC)rrS}rsS(hUh}rtS(h]h]h]h]h]uh jnSh]ruSj9,)rvS}rwS(hUh}rxS(U anchornameU#forcesched-parametersUrefurijh]h]h]h]h]Uinternaluh jrSh]ryShXForceSched ParametersrzSr{S}r|S(hXForceSched Parametersh jvSubah!jB,ubah!jCubj )r}S}r~S(hUh}rS(h]h]h]h]h]uh jnSh]rS(j )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#fixedparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShXFixedParameterrSrS}rS(hXFixedParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#stringparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShXStringParameterrSrS}rS(hXStringParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#textparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShX TextParameterrSrS}rS(hX TextParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU #intparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShX IntParameterrSrS}rS(hX IntParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#booleanparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShXBooleanParameterrSrS}rS(hXBooleanParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#usernameparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShXUserNameParameterrSrS}rS(hXUserNameParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#choicestringparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShXChoiceStringParameterrSrS}rS(hXChoiceStringParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rSj9,)rS}rS(hUh}rS(U anchornameU#codebaseparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rShXCodebaseParameterrSrS}rS(hXCodebaseParameterh jSubah!jB,ubah!jCubah!j ubj )rS}rS(hUh}rS(h]h]h]h]h]uh j}Sh]rSjC)rS}rS(hUh}rS(h]h]h]h]h]uh jSh]rTj9,)rT}rT(hUh}rT(U anchornameU#inheritbuildparameterUrefurijh]h]h]h]h]Uinternaluh jSh]rThXInheritBuildParameterrTrT}rT(hXInheritBuildParameterh jTubah!jB,ubah!jCubah!j ubj )rT}r T(hUh}r T(h]h]h]h]h]uh j}Sh]r TjC)r T}r T(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameU#buildslavechoiceparameterUrefurijh]h]h]h]h]Uinternaluh j Th]rThXBuildslaveChoiceParameterrTrT}rT(hXBuildslaveChoiceParameterh jTubah!jB,ubah!jCubah!j ubj )rT}rT(hUh}rT(h]h]h]h]h]uh j}Sh]rTjC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}r T(hUh}r!T(U anchornameU#anypropertyparameterUrefurijh]h]h]h]h]Uinternaluh jTh]r"ThXAnyPropertyParameterr#Tr$T}r%T(hXAnyPropertyParameterh jTubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubj(j )r&T}r'T(hUh}r(T(h]h]h]h]h]uh]r)T(j )r*T}r+T(hUh}r,T(h]h]h]h]h]uh j&Th]r-T(jC)r.T}r/T(hUh}r0T(h]h]h]h]h]uh j*Th]r1Tj9,)r2T}r3T(hUh}r4T(U anchornameUUrefurij(h]h]h]h]h]Uinternaluh j.Th]r5ThX Configurationr6Tr7T}r8T(hj0h j2Tubah!jB,ubah!jCubj )r9T}r:T(hUh}r;T(h]h]h]h]h]uh j*Th]rT(hUh}r?T(h]h]h]h]h]uh j9Th]r@TjC)rAT}rBT(hUh}rCT(h]h]h]h]h]uh j=Th]rDTj9,)rET}rFT(hUh}rGT(U anchornameU#builder-configurationUrefurij(h]h]h]h]h]Uinternaluh jATh]rHThXBuilder ConfigurationrITrJT}rKT(hXBuilder Configurationh jETubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rLT}rMT(hUh}rNT(h]h]h]h]h]uh j&Th]rOTjC)rPT}rQT(hUh}rRT(h]h]h]h]h]uh jLTh]rSTj9,)rTT}rUT(hUh}rVT(U anchornameU#error-handlingUrefurij(h]h]h]h]h]Uinternaluh jPTh]rWThXError HandlingrXTrYT}rZT(hXError Handlingh jTTubah!jB,ubah!jCubah!j ubj )r[T}r\T(hUh}r]T(h]h]h]h]h]uh j&Th]r^T(jC)r_T}r`T(hUh}raT(h]h]h]h]h]uh j[Th]rbTj9,)rcT}rdT(hUh}reT(U anchornameU#reconfigurationUrefurij(h]h]h]h]h]Uinternaluh j_Th]rfThXReconfigurationrgTrhT}riT(hXReconfigurationh jcTubah!jB,ubah!jCubj )rjT}rkT(hUh}rlT(h]h]h]h]h]uh j[Th]rmT(j )rnT}roT(hUh}rpT(h]h]h]h]h]uh jjTh]rqTjC)rrT}rsT(hUh}rtT(h]h]h]h]h]uh jnTh]ruTj9,)rvT}rwT(hUh}rxT(U anchornameU#reconfigurable-servicesUrefurij(h]h]h]h]h]Uinternaluh jrTh]ryThXReconfigurable ServicesrzTr{T}r|T(hXReconfigurable Servicesh jvTubah!jB,ubah!jCubah!j ubj )r}T}r~T(hUh}rT(h]h]h]h]h]uh jjTh]rTjC)rT}rT(hUh}rT(h]h]h]h]h]uh j}Th]rTj9,)rT}rT(hUh}rT(U anchornameU#change-sourcesUrefurij(h]h]h]h]h]Uinternaluh jTh]rThXChange SourcesrTrT}rT(hXChange Sourcesh jTubah!jB,ubah!jCubah!j ubj )rT}rT(hUh}rT(h]h]h]h]h]uh jjTh]rT(jC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameU #schedulersUrefurij(h]h]h]h]h]Uinternaluh jTh]rThX SchedulersrTrT}rT(hX Schedulersh jTubah!jB,ubah!jCubj )rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj )rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTjC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameU#custom-subclassesUrefurij(h]h]h]h]h]Uinternaluh jTh]rThXCustom SubclassesrTrT}rT(hXCustom Subclassesh jTubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rT}rT(hUh}rT(h]h]h]h]h]uh jjTh]rTjC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameU#slavesUrefurij(h]h]h]h]h]Uinternaluh jTh]rThXSlavesrTrT}rT(hXSlavesh jTubah!jB,ubah!jCubah!j ubj )rT}rT(hUh}rT(h]h]h]h]h]uh jjTh]rTjC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameU#user-managersUrefurij(h]h]h]h]h]Uinternaluh jTh]rThX User ManagersrTrT}rT(hX User Managersh jTubah!jB,ubah!jCubah!j ubj )rT}rT(hUh}rT(h]h]h]h]h]uh jjTh]rTjC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameU#status-receiversUrefurij(h]h]h]h]h]Uinternaluh jTh]rThXStatus ReceiversrTrT}rT(hXStatus Receiversh jTubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubj1j )rT}rT(hUh}rT(h]h]h]h]h]uh]rTj )rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rT(jC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameUUrefurij1h]h]h]h]h]Uinternaluh jTh]rThX Web StatusrTrT}rT(hj9h jTubah!jB,ubah!jCubj )rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rT(j )rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rT(jC)rT}rT(hUh}rT(h]h]h]h]h]uh jTh]rTj9,)rT}rT(hUh}rT(U anchornameU#jinja-web-templatesUrefurij1h]h]h]h]h]Uinternaluh jTh]rThXJinja Web TemplatesrTrT}rU(hXJinja Web Templatesh jTubah!jB,ubah!jCubj )rU}rU(hUh}rU(h]h]h]h]h]uh jTh]rUj )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUjC)r U}r U(hUh}r U(h]h]h]h]h]uh jUh]r Uj9,)r U}rU(hUh}rU(U anchornameU #whitespaceUrefurij1h]h]h]h]h]Uinternaluh j Uh]rUhX WhitespacerUrU}rU(hX Whitespaceh j Uubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jTh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU#web-authorization-frameworkUrefurij1h]h]h]h]h]Uinternaluh jUh]rUhXWeb Authorization Frameworkr Ur!U}r"U(hXWeb Authorization Frameworkh jUubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubj:j )r#U}r$U(hUh}r%U(h]h]h]h]h]uh]r&Uj )r'U}r(U(hUh}r)U(h]h]h]h]h]uh j#Uh]r*U(jC)r+U}r,U(hUh}r-U(h]h]h]h]h]uh j'Uh]r.Uj9,)r/U}r0U(hUh}r1U(U anchornameUUrefurij:h]h]h]h]h]Uinternaluh j+Uh]r2UhXStatus Targetsr3Ur4U}r5U(hjBh j/Uubah!jB,ubah!jCubj )r6U}r7U(hUh}r8U(h]h]h]h]h]uh j'Uh]r9U(j )r:U}r;U(hUh}rU}r?U(hUh}r@U(h]h]h]h]h]uh j:Uh]rAUj9,)rBU}rCU(hUh}rDU(U anchornameU #webstatusUrefurij:h]h]h]h]h]Uinternaluh j>Uh]rEUhX WebStatusrFUrGU}rHU(hX WebStatush jBUubah!jB,ubah!jCubj )rIU}rJU(hUh}rKU(h]h]h]h]h]uh j:Uh]rLU(j )rMU}rNU(hUh}rOU(h]h]h]h]h]uh jIUh]rPUjC)rQU}rRU(hUh}rSU(h]h]h]h]h]uh jMUh]rTUj9,)rUU}rVU(hUh}rWU(U anchornameU#configurationUrefurij:h]h]h]h]h]Uinternaluh jQUh]rXUhX ConfigurationrYUrZU}r[U(hX Configurationh jUUubah!jB,ubah!jCubah!j ubj )r\U}r]U(hUh}r^U(h]h]h]h]h]uh jIUh]r_UjC)r`U}raU(hUh}rbU(h]h]h]h]h]uh j\Uh]rcUj9,)rdU}reU(hUh}rfU(U anchornameU#buildbot-web-resourcesUrefurij:h]h]h]h]h]Uinternaluh j`Uh]rgUhXBuildbot Web ResourcesrhUriU}rjU(hXBuildbot Web Resourcesh jdUubah!jB,ubah!jCubah!j ubj )rkU}rlU(hUh}rmU(h]h]h]h]h]uh jIUh]rnU(jC)roU}rpU(hUh}rqU(h]h]h]h]h]uh jkUh]rrUj9,)rsU}rtU(hUh}ruU(U anchornameU##webstatus-configuration-parametersUrefurij:h]h]h]h]h]Uinternaluh joUh]rvUhX"WebStatus Configuration ParametersrwUrxU}ryU(hX"WebStatus Configuration Parametersh jsUubah!jB,ubah!jCubj )rzU}r{U(hUh}r|U(h]h]h]h]h]uh jkUh]r}U(j )r~U}rU(hUh}rU(h]h]h]h]h]uh jzUh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh j~Uh]rUj9,)rU}rU(hUh}rU(U anchornameU#http-connectionUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXHTTP ConnectionrUrU}rU(hXHTTP Connectionh jUubah!jB,ubah!jCubah!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jzUh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU#authorizationUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhX AuthorizationrUrU}rU(hX Authorizationh jUubah!jB,ubah!jCubah!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jzUh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU#authenticationUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXAuthenticationrUrU}rU(hXAuthenticationh jUubah!jB,ubah!jCubah!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jzUh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU-#http-based-authentication-by-frontend-serverUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhX,HTTP-based authentication by frontend serverrUrU}rU(hX,HTTP-based authentication by frontend serverh jUubah!jB,ubah!jCubah!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jzUh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU#logging-configurationUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXLogging configurationrUrU}rU(hXLogging configurationh jUubah!jB,ubah!jCubah!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jzUh]rU(jC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU#url-decorating-optionsUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXURL-decorating optionsrUrU}rU(hXURL-decorating optionsh jUubah!jB,ubah!jCubj )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rU(j )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU#revlinkUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXrevlinkrUrU}rU(hXrevlinkh jUubah!jB,ubah!jCubah!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUjC)rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUj9,)rU}rU(hUh}rU(U anchornameU#changecommentlinkUrefurij:h]h]h]h]h]Uinternaluh jUh]rUhXchangecommentlinkrUrU}rU(hXchangecommentlinkh jUubah!jB,ubah!jCubah!j ubj )rU}rU(hUh}rU(h]h]h]h]h]uh jUh]rUjC)rU}rU(hUh}rV(h]h]h]h]h]uh jUh]rVj9,)rV}rV(hUh}rV(U anchornameU #projectsUrefurij:h]h]h]h]h]Uinternaluh jUh]rVhXprojectsrVrV}rV(hXprojectsh jVubah!jB,ubah!jCubah!j ubj )r V}r V(hUh}r V(h]h]h]h]h]uh jUh]r VjC)r V}rV(hUh}rV(h]h]h]h]h]uh j Vh]rVj9,)rV}rV(hUh}rV(U anchornameU #repositoriesUrefurij:h]h]h]h]h]Uinternaluh j Vh]rVhX repositoriesrVrV}rV(hX repositoriesh jVubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rV}rV(hUh}rV(h]h]h]h]h]uh jzUh]rVjC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)r V}r!V(hUh}r"V(U anchornameU#display-specific-optionsUrefurij:h]h]h]h]h]Uinternaluh jVh]r#VhXDisplay-Specific Optionsr$Vr%V}r&V(hXDisplay-Specific Optionsh j Vubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r'V}r(V(hUh}r)V(h]h]h]h]h]uh jIUh]r*V(jC)r+V}r,V(hUh}r-V(h]h]h]h]h]uh j'Vh]r.Vj9,)r/V}r0V(hUh}r1V(U anchornameU #change-hooksUrefurij:h]h]h]h]h]Uinternaluh j+Vh]r2VhX Change Hooksr3Vr4V}r5V(hX Change Hooksh j/Vubah!jB,ubah!jCubj )r6V}r7V(hUh}r8V(h]h]h]h]h]uh j'Vh]r9V(j )r:V}r;V(hUh}rV}r?V(hUh}r@V(h]h]h]h]h]uh j:Vh]rAVj9,)rBV}rCV(hUh}rDV(U anchornameU #github-hookUrefurij:h]h]h]h]h]Uinternaluh j>Vh]rEVhX GitHub hookrFVrGV}rHV(hX GitHub hookh jBVubah!jB,ubah!jCubah!j ubj )rIV}rJV(hUh}rKV(h]h]h]h]h]uh j6Vh]rLVjC)rMV}rNV(hUh}rOV(h]h]h]h]h]uh jIVh]rPVj9,)rQV}rRV(hUh}rSV(U anchornameU#google-code-hookUrefurij:h]h]h]h]h]Uinternaluh jMVh]rTVhXGoogle Code hookrUVrVV}rWV(hXGoogle Code hookh jQVubah!jB,ubah!jCubah!j ubj )rXV}rYV(hUh}rZV(h]h]h]h]h]uh j6Vh]r[VjC)r\V}r]V(hUh}r^V(h]h]h]h]h]uh jXVh]r_Vj9,)r`V}raV(hUh}rbV(U anchornameU #poller-hookUrefurij:h]h]h]h]h]Uinternaluh j\Vh]rcVhX Poller hookrdVreV}rfV(hX Poller hookh j`Vubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubj )rgV}rhV(hUh}riV(h]h]h]h]h]uh j6Uh]rjV(jC)rkV}rlV(hUh}rmV(h]h]h]h]h]uh jgVh]rnVj9,)roV}rpV(hUh}rqV(U anchornameU #mailnotifierUrefurij:h]h]h]h]h]Uinternaluh jkVh]rrVhX MailNotifierrsVrtV}ruV(hX MailNotifierh joVubah!jB,ubah!jCubj )rvV}rwV(hUh}rxV(h]h]h]h]h]uh jgVh]ryVj )rzV}r{V(hUh}r|V(h]h]h]h]h]uh jvVh]r}VjC)r~V}rV(hUh}rV(h]h]h]h]h]uh jzVh]rVj9,)rV}rV(hUh}rV(U anchornameU#mailnotifier-argumentsUrefurij:h]h]h]h]h]Uinternaluh j~Vh]rVhXMailNotifier argumentsrVrV}rV(hXMailNotifier argumentsh jVubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rV}rV(hUh}rV(h]h]h]h]h]uh j6Uh]rVjC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)rV}rV(hUh}rV(U anchornameU#irc-botUrefurij:h]h]h]h]h]Uinternaluh jVh]rVhXIRC BotrVrV}rV(hXIRC Both jVubah!jB,ubah!jCubah!j ubj )rV}rV(hUh}rV(h]h]h]h]h]uh j6Uh]rVjC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)rV}rV(hUh}rV(U anchornameU #pblistenerUrefurij:h]h]h]h]h]Uinternaluh jVh]rVhX PBListenerrVrV}rV(hX PBListenerh jVubah!jB,ubah!jCubah!j ubj )rV}rV(hUh}rV(h]h]h]h]h]uh j6Uh]rVjC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)rV}rV(hUh}rV(U anchornameU #statuspushUrefurij:h]h]h]h]h]Uinternaluh jVh]rVhX StatusPushrVrV}rV(hX StatusPushh jVubah!jB,ubah!jCubah!j ubj )rV}rV(hUh}rV(h]h]h]h]h]uh j6Uh]rVjC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)rV}rV(hUh}rV(U anchornameU#httpstatuspushUrefurij:h]h]h]h]h]Uinternaluh jVh]rVhXHttpStatusPushrVrV}rV(hXHttpStatusPushh jVubah!jB,ubah!jCubah!j ubj )rV}rV(hUh}rV(h]h]h]h]h]uh j6Uh]rVjC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)rV}rV(hUh}rV(U anchornameU#gerritstatuspushUrefurij:h]h]h]h]h]Uinternaluh jVh]rVhXGerritStatusPushrVrV}rV(hXGerritStatusPushh jVubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubjCj )rV}rV(hUh}rV(h]h]h]h]h]uh]rVj )rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rV(jC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)rV}rV(hUh}rV(U anchornameUUrefurijCh]h]h]h]h]Uinternaluh jVh]rVhX CustomizationrVrV}rV(hjKh jVubah!jB,ubah!jCubj )rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rV(j )rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVjC)rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVj9,)rV}rV(hUh}rV(U anchornameU&#programmatic-configuration-generationUrefurijCh]h]h]h]h]Uinternaluh jVh]rVhX%Programmatic Configuration GenerationrVrV}rV(hj.h jVubah!jB,ubah!jCubah!j ubj )rV}rV(hUh}rV(h]h]h]h]h]uh jVh]rVjC)rV}rV(hUh}rW(h]h]h]h]h]uh jVh]rWj9,)rW}rW(hUh}rW(U anchornameU#merge-request-functionsUrefurijCh]h]h]h]h]Uinternaluh jVh]rWhXMerge Request FunctionsrWrW}rW(hj6.h jWubah!jB,ubah!jCubah!j ubj )r W}r W(hUh}r W(h]h]h]h]h]uh jVh]r WjC)r W}rW(hUh}rW(h]h]h]h]h]uh j Wh]rWj9,)rW}rW(hUh}rW(U anchornameU#builder-priority-functionsUrefurijCh]h]h]h]h]Uinternaluh j Wh]rWhXBuilder Priority FunctionsrWrW}rW(hj/h jWubah!jB,ubah!jCubah!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jVh]rWjC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)r W}r!W(hUh}r"W(U anchornameU#build-priority-functionsUrefurijCh]h]h]h]h]Uinternaluh jWh]r#WhXBuild Priority Functionsr$Wr%W}r&W(hj/h j Wubah!jB,ubah!jCubah!j ubj )r'W}r(W(hUh}r)W(h]h]h]h]h]uh jVh]r*W(jC)r+W}r,W(hUh}r-W(h]h]h]h]h]uh j'Wh]r.Wj9,)r/W}r0W(hUh}r1W(U anchornameU#customizing-svnpollerUrefurijCh]h]h]h]h]Uinternaluh j+Wh]r2WhXCustomizing SVNPollerr3Wr4W}r5W(hjM6h j/Wubah!jB,ubah!jCubj )r6W}r7W(hUh}r8W(h]h]h]h]h]uh j'Wh]r9W(j )r:W}r;W(hUh}rW}r?W(hUh}r@W(h]h]h]h]h]uh j:Wh]rAWj9,)rBW}rCW(hUh}rDW(U anchornameU)#project-branchname-filepath-repositoriesUrefurijCh]h]h]h]h]Uinternaluh j>Wh]rEWhX(PROJECT/BRANCHNAME/FILEPATH repositoriesrFWrGW}rHW(hj6h jBWubah!jB,ubah!jCubah!j ubj )rIW}rJW(hUh}rKW(h]h]h]h]h]uh j6Wh]rLWjC)rMW}rNW(hUh}rOW(h]h]h]h]h]uh jIWh]rPWj9,)rQW}rRW(hUh}rSW(U anchornameU)#branchname-project-filepath-repositoriesUrefurijCh]h]h]h]h]Uinternaluh jMWh]rTWhX(BRANCHNAME/PROJECT/FILEPATH repositoriesrUWrVW}rWW(hj8h jQWubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rXW}rYW(hUh}rZW(h]h]h]h]h]uh jVh]r[W(jC)r\W}r]W(hUh}r^W(h]h]h]h]h]uh jXWh]r_Wj9,)r`W}raW(hUh}rbW(U anchornameU#writing-change-sourcesUrefurijCh]h]h]h]h]Uinternaluh j\Wh]rcWhXWriting Change SourcesrdWreW}rfW(hj:h j`Wubah!jB,ubah!jCubj )rgW}rhW(hUh}riW(h]h]h]h]h]uh jXWh]rjW(j )rkW}rlW(hUh}rmW(h]h]h]h]h]uh jgWh]rnWjC)roW}rpW(hUh}rqW(h]h]h]h]h]uh jkWh]rrWj9,)rsW}rtW(hUh}ruW(U anchornameU+#writing-a-notification-based-change-sourceUrefurijCh]h]h]h]h]Uinternaluh joWh]rvWhX*Writing a Notification-based Change SourcerwWrxW}ryW(hj6;h jsWubah!jB,ubah!jCubah!j ubj )rzW}r{W(hUh}r|W(h]h]h]h]h]uh jgWh]r}WjC)r~W}rW(hUh}rW(h]h]h]h]h]uh jzWh]rWj9,)rW}rW(hUh}rW(U anchornameU#writing-a-change-pollerUrefurijCh]h]h]h]h]Uinternaluh j~Wh]rWhXWriting a Change PollerrWrW}rW(hj!<h jWubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jVh]rWjC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rW(U anchornameU/#writing-a-new-latent-buildslave-implementationUrefurijCh]h]h]h]h]Uinternaluh jWh]rWhX.Writing a New Latent Buildslave ImplementationrWrW}rW(hj@h jWubah!jB,ubah!jCubah!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jVh]rWjC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rW(U anchornameU#custom-build-classesUrefurijCh]h]h]h]h]Uinternaluh jWh]rWhXCustom Build ClassesrWrW}rW(hj=h jWubah!jB,ubah!jCubah!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jVh]rWjC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rW(U anchornameU#factory-workdir-functionsUrefurijCh]h]h]h]h]Uinternaluh jWh]rWhXFactory Workdir FunctionsrWrW}rW(hj3>h jWubah!jB,ubah!jCubah!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jVh]rW(jC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rW(U anchornameU#writing-new-buildstepsUrefurijCh]h]h]h]h]Uinternaluh jWh]rWhXWriting New BuildStepsrWrW}rW(hjtAh jWubah!jB,ubah!jCubj )rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rW(j )rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWjC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rW(U anchornameU#writing-buildstep-constructorsUrefurijCh]h]h]h]h]Uinternaluh jWh]rWhXWriting BuildStep ConstructorsrWrW}rW(hj<h jWubah!jB,ubah!jCubah!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWjC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rW(U anchornameU#running-commandsUrefurijCh]h]h]h]h]Uinternaluh jWh]rWhXRunning CommandsrWrW}rW(hjP=h jWubah!jB,ubah!jCubah!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWjC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rW(U anchornameU#updating-statusUrefurijCh]h]h]h]h]Uinternaluh jWh]rWhXUpdating StatusrWrW}rW(hjBh jWubah!jB,ubah!jCubah!j ubj )rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rW(jC)rW}rW(hUh}rW(h]h]h]h]h]uh jWh]rWj9,)rW}rW(hUh}rX(U anchornameU#capturing-logfilesUrefurijCh]h]h]h]h]Uinternaluh jWh]rXhXCapturing LogfilesrXrX}rX(hjS2h jWubah!jB,ubah!jCubj )rX}rX(hUh}rX(h]h]h]h]h]uh jWh]rXj )r X}r X(hUh}r X(h]h]h]h]h]uh jXh]r XjC)r X}rX(hUh}rX(h]h]h]h]h]uh j Xh]rXj9,)rX}rX(hUh}rX(U anchornameU$#using-logfiles-in-custom-buildstepsUrefurijCh]h]h]h]h]Uinternaluh j Xh]rXhX#Using LogFiles in custom BuildStepsrXrX}rX(hjm3h jXubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rX}rX(hUh}rX(h]h]h]h]h]uh jWh]rXjC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)r X}r!X(hUh}r"X(U anchornameU#reading-logfilesUrefurijCh]h]h]h]h]Uinternaluh jXh]r#XhXReading Logfilesr$Xr%X}r&X(hj1h j Xubah!jB,ubah!jCubah!j ubj )r'X}r(X(hUh}r)X(h]h]h]h]h]uh jWh]r*XjC)r+X}r,X(hUh}r-X(h]h]h]h]h]uh j'Xh]r.Xj9,)r/X}r0X(hUh}r1X(U anchornameU#adding-logobserversUrefurijCh]h]h]h]h]Uinternaluh j+Xh]r2XhXAdding LogObserversr3Xr4X}r5X(hj>h j/Xubah!jB,ubah!jCubah!j ubj )r6X}r7X(hUh}r8X(h]h]h]h]h]uh jWh]r9XjC)r:X}r;X(hUh}rX}r?X(hUh}r@X(U anchornameU#using-propertiesUrefurijCh]h]h]h]h]Uinternaluh j:Xh]rAXhXUsing PropertiesrBXrCX}rDX(hj%0h j>Xubah!jB,ubah!jCubah!j ubj )rEX}rFX(hUh}rGX(h]h]h]h]h]uh jWh]rHXjC)rIX}rJX(hUh}rKX(h]h]h]h]h]uh jEXh]rLXj9,)rMX}rNX(hUh}rOX(U anchornameU#buildstep-urlsUrefurijCh]h]h]h]h]Uinternaluh jIXh]rPXhXBuildStep URLsrQXrRX}rSX(hj0h jMXubah!jB,ubah!jCubah!j ubj )rTX}rUX(hUh}rVX(h]h]h]h]h]uh jWh]rWXjC)rXX}rYX(hUh}rZX(h]h]h]h]h]uh jTXh]r[Xj9,)r\X}r]X(hUh}r^X(U anchornameU#a-somewhat-whimsical-exampleUrefurijCh]h]h]h]h]Uinternaluh jXXh]r_XhXA Somewhat Whimsical Exampler`XraX}rbX(hj)h j\Xubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rcX}rdX(hUh}reX(h]h]h]h]h]uh jVh]rfXjC)rgX}rhX(hUh}riX(h]h]h]h]h]uh jcXh]rjXj9,)rkX}rlX(hUh}rmX(U anchornameU#writing-new-status-pluginsUrefurijCh]h]h]h]h]Uinternaluh jgXh]rnXhXWriting New Status PluginsroXrpX}rqX(hj|-h jkXubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubjLj )rrX}rsX(hUh}rtX(h]h]h]h]h]uh]ruXj )rvX}rwX(hUh}rxX(h]h]h]h]h]uh jrXh]ryX(jC)rzX}r{X(hUh}r|X(h]h]h]h]h]uh jvXh]r}Xj9,)r~X}rX(hUh}rX(U anchornameUUrefurijLh]h]h]h]h]Uinternaluh jzXh]rXhXConfiguring BuildbotrXrX}rX(hjTh j~Xubah!jB,ubah!jCubj )rX}rX(hUh}rX(h]h]h]h]h]uh jvXh]rX(j )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rX(jC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)rX}rX(hUh}rX(U anchornameU#config-file-formatUrefurijLh]h]h]h]h]Uinternaluh jXh]rXhXConfig File FormatrXrX}rX(hXConfig File Formath jXubah!jB,ubah!jCubj )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXjC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)rX}rX(hUh}rX(U anchornameU#basic-python-syntaxUrefurijLh]h]h]h]h]Uinternaluh jXh]rXhXBasic Python SyntaxrXrX}rX(hXBasic Python Syntaxh jXubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXjC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)rX}rX(hUh}rX(U anchornameU#predefined-config-file-symbolsUrefurijLh]h]h]h]h]Uinternaluh jXh]rXhXPredefined Config File SymbolsrXrX}rX(hXPredefined Config File Symbolsh jXubah!jB,ubah!jCubah!j ubj )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXjC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)rX}rX(hUh}rX(U anchornameU#testing-the-config-fileUrefurijLh]h]h]h]h]Uinternaluh jXh]rXhXTesting the Config FilerXrX}rX(hXTesting the Config Fileh jXubah!jB,ubah!jCubah!j ubj )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rX(jC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)rX}rX(hUh}rX(U anchornameU#loading-the-config-fileUrefurijLh]h]h]h]h]Uinternaluh jXh]rXhXLoading the Config FilerXrX}rX(hXLoading the Config Fileh jXubah!jB,ubah!jCubj )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rX(j )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXjC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)rX}rX(hUh}rX(U anchornameU##reloading-the-config-file-reconfigUrefurijLh]h]h]h]h]Uinternaluh jXh]rXhX$Reloading the Config File (reconfig)rXrX}rX(hX$Reloading the Config File (reconfig)h jXubah!jB,ubah!jCubah!j ubj )rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXjC)rX}rX(hUh}rX(h]h]h]h]h]uh jXh]rXj9,)rX}rX(hUh}rX(U anchornameU#reconfig-by-debug-clientUrefurijLh]h]h]h]h]Uinternaluh jXh]rXhXReconfig by Debug ClientrXrX}rX(hXReconfig by Debug Clienth jXubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubjUj )rX}rX(hUh}rX(h]h]h]h]h]uh]rXj )rX}rX(hUh}rY(h]h]h]h]h]uh jXh]rY(jC)rY}rY(hUh}rY(h]h]h]h]h]uh jXh]rYj9,)rY}rY(hUh}rY(U anchornameUUrefurijUh]h]h]h]h]Uinternaluh jYh]r YhXDatabaser Yr Y}r Y(hj]h jYubah!jB,ubah!jCubj )r Y}rY(hUh}rY(h]h]h]h]h]uh jXh]rY(j )rY}rY(hUh}rY(h]h]h]h]h]uh j Yh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameU#database-overviewUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXDatabase OverviewrYrY}rY(hXDatabase Overviewh jYubah!jB,ubah!jCubah!j ubj )r Y}r!Y(hUh}r"Y(h]h]h]h]h]uh j Yh]r#YjC)r$Y}r%Y(hUh}r&Y(h]h]h]h]h]uh j Yh]r'Yj9,)r(Y}r)Y(hUh}r*Y(U anchornameU#schemaUrefurijUh]h]h]h]h]Uinternaluh j$Yh]r+YhXSchemar,Yr-Y}r.Y(hXSchemah j(Yubah!jB,ubah!jCubah!j ubj )r/Y}r0Y(hUh}r1Y(h]h]h]h]h]uh j Yh]r2Y(jC)r3Y}r4Y(hUh}r5Y(h]h]h]h]h]uh j/Yh]r6Yj9,)r7Y}r8Y(hUh}r9Y(U anchornameU#apiUrefurijUh]h]h]h]h]Uinternaluh j3Yh]r:YhXAPIr;YrY}r?Y(hUh}r@Y(h]h]h]h]h]uh j/Yh]rAY(j )rBY}rCY(hUh}rDY(h]h]h]h]h]uh j>Yh]rEYjC)rFY}rGY(hUh}rHY(h]h]h]h]h]uh jBYh]rIYj9,)rJY}rKY(hUh}rLY(U anchornameX!#module-buildbot.db.buildrequestsUrefurijUh]h]h]h]h]Uinternaluh jFYh]rMYhX buildrequestsrNYrOY}rPY(hX buildrequestsh jJYubah!jB,ubah!jCubah!j ubj )rQY}rRY(hUh}rSY(h]h]h]h]h]uh j>Yh]rTYjC)rUY}rVY(hUh}rWY(h]h]h]h]h]uh jQYh]rXYj9,)rYY}rZY(hUh}r[Y(U anchornameX#module-buildbot.db.buildsUrefurijUh]h]h]h]h]Uinternaluh jUYh]r\YhXbuildsr]Yr^Y}r_Y(hXbuildsh jYYubah!jB,ubah!jCubah!j ubj )r`Y}raY(hUh}rbY(h]h]h]h]h]uh j>Yh]rcYjC)rdY}reY(hUh}rfY(h]h]h]h]h]uh j`Yh]rgYj9,)rhY}riY(hUh}rjY(U anchornameX#module-buildbot.db.buildsetsUrefurijUh]h]h]h]h]Uinternaluh jdYh]rkYhX buildsetsrlYrmY}rnY(hX buildsetsh jhYubah!jB,ubah!jCubah!j ubj )roY}rpY(hUh}rqY(h]h]h]h]h]uh j>Yh]rrYjC)rsY}rtY(hUh}ruY(h]h]h]h]h]uh joYh]rvYj9,)rwY}rxY(hUh}ryY(U anchornameX#module-buildbot.db.changesUrefurijUh]h]h]h]h]Uinternaluh jsYh]rzYhXchangesr{Yr|Y}r}Y(hXchangesh jwYubah!jB,ubah!jCubah!j ubj )r~Y}rY(hUh}rY(h]h]h]h]h]uh j>Yh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh j~Yh]rYj9,)rY}rY(hUh}rY(U anchornameX#module-buildbot.db.schedulersUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhX schedulersrYrY}rY(hX schedulersh jYubah!jB,ubah!jCubah!j ubj )rY}rY(hUh}rY(h]h]h]h]h]uh j>Yh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameX #module-buildbot.db.sourcestampsUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhX sourcestampsrYrY}rY(hX sourcestampsh jYubah!jB,ubah!jCubah!j ubj )rY}rY(hUh}rY(h]h]h]h]h]uh j>Yh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameX##module-buildbot.db.sourcestampsetsUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXsourcestampsetrYrY}rY(hXsourcestampseth jYubah!jB,ubah!jCubah!j ubj )rY}rY(hUh}rY(h]h]h]h]h]uh j>Yh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameX#module-buildbot.db.stateUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXstaterYrY}rY(hXstateh jYubah!jB,ubah!jCubah!j ubj )rY}rY(hUh}rY(h]h]h]h]h]uh j>Yh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameX#module-buildbot.db.usersUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXusersrYrY}rY(hXusersh jYubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rY}rY(hUh}rY(h]h]h]h]h]uh j Yh]rY(jC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameU##writing-database-connector-methodsUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhX"Writing Database Connector MethodsrYrY}rY(hX"Writing Database Connector Methodsh jYubah!jB,ubah!jCubj )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rY(j )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameX#module-buildbot.db.connectorUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXThe DB Connector and ComponentsrYrY}rY(hXThe DB Connector and Componentsh jYubah!jB,ubah!jCubah!j ubj )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYjC)rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYj9,)rY}rY(hUh}rY(U anchornameX#module-buildbot.db.poolUrefurijUh]h]h]h]h]Uinternaluh jYh]rYhXDirect Database AccessrYrY}rY(hXDirect Database Accessh jYubah!jB,ubah!jCubah!j ubj )rY}rY(hUh}rY(h]h]h]h]h]uh jYh]rYjC)rY}rY(hUh}rZ(h]h]h]h]h]uh jYh]rZj9,)rZ}rZ(hUh}rZ(U anchornameX#module-buildbot.db.modelUrefurijUh]h]h]h]h]Uinternaluh jYh]rZhXDatabase SchemarZrZ}rZ(hXDatabase Schemah jZubah!jB,ubah!jCubah!j ubj )r Z}r Z(hUh}r Z(h]h]h]h]h]uh jYh]r ZjC)r Z}rZ(hUh}rZ(h]h]h]h]h]uh j Zh]rZj9,)rZ}rZ(hUh}rZ(U anchornameU#cachingUrefurijUh]h]h]h]h]Uinternaluh j Zh]rZhXCachingrZrZ}rZ(hXCachingh jZubah!jB,ubah!jCubah!j ubj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jYh]rZjC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)r Z}r!Z(hUh}r"Z(U anchornameU#testsUrefurijUh]h]h]h]h]Uinternaluh jZh]r#ZhXTestsr$Zr%Z}r&Z(hXTestsh j Zubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r'Z}r(Z(hUh}r)Z(h]h]h]h]h]uh j Yh]r*ZjC)r+Z}r,Z(hUh}r-Z(h]h]h]h]h]uh j'Zh]r.Zj9,)r/Z}r0Z(hUh}r1Z(U anchornameU#modifying-the-database-schemaUrefurijUh]h]h]h]h]Uinternaluh j+Zh]r2ZhXModifying the Database Schemar3Zr4Z}r5Z(hXModifying the Database Schemah j/Zubah!jB,ubah!jCubah!j ubj )r6Z}r7Z(hUh}r8Z(h]h]h]h]h]uh j Yh]r9Z(jC)r:Z}r;Z(hUh}rZ}r?Z(hUh}r@Z(U anchornameU#database-compatibility-notesUrefurijUh]h]h]h]h]Uinternaluh j:Zh]rAZhXDatabase Compatibility NotesrBZrCZ}rDZ(hXDatabase Compatibility Notesh j>Zubah!jB,ubah!jCubj )rEZ}rFZ(hUh}rGZ(h]h]h]h]h]uh j6Zh]rHZ(j )rIZ}rJZ(hUh}rKZ(h]h]h]h]h]uh jEZh]rLZjC)rMZ}rNZ(hUh}rOZ(h]h]h]h]h]uh jIZh]rPZj9,)rQZ}rRZ(hUh}rSZ(U anchornameU#index-length-in-mysqlUrefurijUh]h]h]h]h]Uinternaluh jMZh]rTZhXIndex Length in MySQLrUZrVZ}rWZ(hXIndex Length in MySQLh jQZubah!jB,ubah!jCubah!j ubj )rXZ}rYZ(hUh}rZZ(h]h]h]h]h]uh jEZh]r[ZjC)r\Z}r]Z(hUh}r^Z(h]h]h]h]h]uh jXZh]r_Zj9,)r`Z}raZ(hUh}rbZ(U anchornameU#transactions-in-mysqlUrefurijUh]h]h]h]h]Uinternaluh j\Zh]rcZhXTransactions in MySQLrdZreZ}rfZ(hXTransactions in MySQLh j`Zubah!jB,ubah!jCubah!j ubj )rgZ}rhZ(hUh}riZ(h]h]h]h]h]uh jEZh]rjZjC)rkZ}rlZ(hUh}rmZ(h]h]h]h]h]uh jgZh]rnZj9,)roZ}rpZ(hUh}rqZ(U anchornameU*#referential-integrity-in-sqlite-and-mysqlUrefurijUh]h]h]h]h]Uinternaluh jkZh]rrZhX)Referential Integrity in SQLite and MySQLrsZrtZ}ruZ(hX)Referential Integrity in SQLite and MySQLh joZubah!jB,ubah!jCubah!j ubj )rvZ}rwZ(hUh}rxZ(h]h]h]h]h]uh jEZh]ryZjC)rzZ}r{Z(hUh}r|Z(h]h]h]h]h]uh jvZh]r}Zj9,)r~Z}rZ(hUh}rZ(U anchornameU#subqueries-in-mysqlUrefurijUh]h]h]h]h]Uinternaluh jzZh]rZhXSubqueries in MySQLrZrZ}rZ(hXSubqueries in MySQLh j~Zubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubj^j )rZ}rZ(hUh}rZ(h]h]h]h]h]uh]rZj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)rZ}rZ(hUh}rZ(U anchornameUUrefurij^h]h]h]h]h]Uinternaluh jZh]rZhXBuilder ConfigurationrZrZ}rZ(hjfh jZubah!jB,ubah!jCubj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(j )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)rZ}rZ(hUh}rZ(U anchornameU#merging-build-requestsUrefurij^h]h]h]h]h]Uinternaluh jZh]rZhXMerging Build RequestsrZrZ}rZ(hXMerging Build Requestsh jZubah!jB,ubah!jCubah!j ubj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)rZ}rZ(hUh}rZ(U anchornameU#prioritizing-buildsUrefurij^h]h]h]h]h]Uinternaluh jZh]rZhXPrioritizing BuildsrZrZ}rZ(hXPrioritizing Buildsh jZubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubjgj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh]rZj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)rZ}rZ(hUh}rZ(U anchornameUUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhX Build StepsrZrZ}rZ(hjoh jZubah!jB,ubah!jCubj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(j )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)rZ}rZ(hUh}rZ(U anchornameU#common-parametersUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhXCommon ParametersrZrZ}rZ(hXCommon Parametersh jZubah!jB,ubah!jCubah!j ubj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(jC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)rZ}rZ(hUh}rZ(U anchornameX#module-buildbot.steps.sourceUrefurijgh]h]h]h]h]Uinternaluh jZh]rZhXSource CheckoutrZrZ}rZ(hXSource Checkouth jZubah!jB,ubah!jCubj )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZ(j )rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZjC)rZ}rZ(hUh}rZ(h]h]h]h]h]uh jZh]rZj9,)rZ}rZ(hUh}rZ(U anchornameU#id3Urefurijgh]h]h]h]h]Uinternaluh jZh]rZhXCommon ParametersrZr[}r[(hXCommon Parametersh jZubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jZh]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r [j9,)r [}r [(hUh}r [(U anchornameU #mercurialUrefurijgh]h]h]h]h]Uinternaluh j[h]r [hX Mercurialr[r[}r[(hX Mercurialh j [ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jZh]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#gitUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXGitr[r[}r[(hXGith j[ubah!jB,ubah!jCubah!j ubj )r [}r![(hUh}r"[(h]h]h]h]h]uh jZh]r#[jC)r$[}r%[(hUh}r&[(h]h]h]h]h]uh j [h]r'[j9,)r([}r)[(hUh}r*[(U anchornameU#svnUrefurijgh]h]h]h]h]Uinternaluh j$[h]r+[hXSVNr,[r-[}r.[(hXSVNh j([ubah!jB,ubah!jCubah!j ubj )r/[}r0[(hUh}r1[(h]h]h]h]h]uh jZh]r2[jC)r3[}r4[(hUh}r5[(h]h]h]h]h]uh j/[h]r6[j9,)r7[}r8[(hUh}r9[(U anchornameU#cvsUrefurijgh]h]h]h]h]Uinternaluh j3[h]r:[hXCVSr;[r<[}r=[(hXCVSh j7[ubah!jB,ubah!jCubah!j ubj )r>[}r?[(hUh}r@[(h]h]h]h]h]uh jZh]rA[jC)rB[}rC[(hUh}rD[(h]h]h]h]h]uh j>[h]rE[j9,)rF[}rG[(hUh}rH[(U anchornameU#bzrUrefurijgh]h]h]h]h]Uinternaluh jB[h]rI[hXBzrrJ[rK[}rL[(hXBzrh jF[ubah!jB,ubah!jCubah!j ubj )rM[}rN[(hUh}rO[(h]h]h]h]h]uh jZh]rP[jC)rQ[}rR[(hUh}rS[(h]h]h]h]h]uh jM[h]rT[j9,)rU[}rV[(hUh}rW[(U anchornameU#p4Urefurijgh]h]h]h]h]Uinternaluh jQ[h]rX[hXP4rY[rZ[}r[[(hXP4h jU[ubah!jB,ubah!jCubah!j ubj )r\[}r][(hUh}r^[(h]h]h]h]h]uh jZh]r_[jC)r`[}ra[(hUh}rb[(h]h]h]h]h]uh j\[h]rc[j9,)rd[}re[(hUh}rf[(U anchornameU#repoUrefurijgh]h]h]h]h]Uinternaluh j`[h]rg[hXReporh[ri[}rj[(hXRepoh jd[ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rk[}rl[(hUh}rm[(h]h]h]h]h]uh jZh]rn[(jC)ro[}rp[(hUh}rq[(h]h]h]h]h]uh jk[h]rr[j9,)rs[}rt[(hUh}ru[(U anchornameU#source-checkout-slave-sideUrefurijgh]h]h]h]h]Uinternaluh jo[h]rv[hXSource Checkout (Slave-Side)rw[rx[}ry[(hXSource Checkout (Slave-Side)h js[ubah!jB,ubah!jCubj )rz[}r{[(hUh}r|[(h]h]h]h]h]uh jk[h]r}[(j )r~[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j~[h]r[j9,)r[}r[(hUh}r[(U anchornameU#cvs-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXCVS (Slave-Side)r[r[}r[(hXCVS (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#svn-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXSVN (Slave-Side)r[r[}r[(hXSVN (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#darcs-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXDarcs (Slave-Side)r[r[}r[(hXDarcs (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#mercurial-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXMercurial (Slave-Side)r[r[}r[(hXMercurial (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#bzr-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXBzr (Slave-Side)r[r[}r[(hXBzr (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#p4-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXP4 (Slave-Side)r[r[}r[(hXP4 (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#git-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXGit (Slave-Side)r[r[}r[(hXGit (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r[(U anchornameU#bitkeeper-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r[hXBitKeeper (Slave-Side)r[r[}r[(hXBitKeeper (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r[}r[(hUh}r[(h]h]h]h]h]uh jz[h]r[jC)r[}r[(hUh}r[(h]h]h]h]h]uh j[h]r[j9,)r[}r[(hUh}r\(U anchornameU#repo-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j[h]r\hXRepo (Slave-Side)r\r\}r\(hXRepo (Slave-Side)h j[ubah!jB,ubah!jCubah!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh jz[h]r\jC)r \}r \(hUh}r \(h]h]h]h]h]uh j\h]r \j9,)r \}r\(hUh}r\(U anchornameU#monotone-slave-sideUrefurijgh]h]h]h]h]Uinternaluh j \h]r\hXMonotone (Slave-Side)r\r\}r\(hXMonotone (Slave-Side)h j \ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh jZh]r\(jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU #shellcommandUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hX ShellCommandr \r!\}r"\(hX ShellCommandh j\ubah!jB,ubah!jCubj )r#\}r$\(hUh}r%\(h]h]h]h]h]uh j\h]r&\(j )r'\}r(\(hUh}r)\(h]h]h]h]h]uh j#\h]r*\jC)r+\}r,\(hUh}r-\(h]h]h]h]h]uh j'\h]r.\j9,)r/\}r0\(hUh}r1\(U anchornameU#using-shellcommandsUrefurijgh]h]h]h]h]Uinternaluh j+\h]r2\hXUsing ShellCommandsr3\r4\}r5\(hXUsing ShellCommandsh j/\ubah!jB,ubah!jCubah!j ubj )r6\}r7\(hUh}r8\(h]h]h]h]h]uh j#\h]r9\jC)r:\}r;\(hUh}r<\(h]h]h]h]h]uh j6\h]r=\j9,)r>\}r?\(hUh}r@\(U anchornameU #configureUrefurijgh]h]h]h]h]Uinternaluh j:\h]rA\hX ConfigurerB\rC\}rD\(hX Configureh j>\ubah!jB,ubah!jCubah!j ubj )rE\}rF\(hUh}rG\(h]h]h]h]h]uh j#\h]rH\jC)rI\}rJ\(hUh}rK\(h]h]h]h]h]uh jE\h]rL\j9,)rM\}rN\(hUh}rO\(U anchornameU#compileUrefurijgh]h]h]h]h]Uinternaluh jI\h]rP\hXCompilerQ\rR\}rS\(hXCompileh jM\ubah!jB,ubah!jCubah!j ubj )rT\}rU\(hUh}rV\(h]h]h]h]h]uh j#\h]rW\jC)rX\}rY\(hUh}rZ\(h]h]h]h]h]uh jT\h]r[\j9,)r\\}r]\(hUh}r^\(U anchornameU #visual-cUrefurijgh]h]h]h]h]Uinternaluh jX\h]r_\hX Visual C++r`\ra\}rb\(hX Visual C++h j\\ubah!jB,ubah!jCubah!j ubj )rc\}rd\(hUh}re\(h]h]h]h]h]uh j#\h]rf\jC)rg\}rh\(hUh}ri\(h]h]h]h]h]uh jc\h]rj\j9,)rk\}rl\(hUh}rm\(U anchornameU#testUrefurijgh]h]h]h]h]Uinternaluh jg\h]rn\hXTestro\rp\}rq\(hXTesth jk\ubah!jB,ubah!jCubah!j ubj )rr\}rs\(hUh}rt\(h]h]h]h]h]uh j#\h]ru\jC)rv\}rw\(hUh}rx\(h]h]h]h]h]uh jr\h]ry\j9,)rz\}r{\(hUh}r|\(U anchornameU #treesizeUrefurijgh]h]h]h]h]Uinternaluh jv\h]r}\hXTreeSizer~\r\}r\(hXTreeSizeh jz\ubah!jB,ubah!jCubah!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh j#\h]r\jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU#perlmoduletestUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hXPerlModuleTestr\r\}r\(hXPerlModuleTesth j\ubah!jB,ubah!jCubah!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh j#\h]r\jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU#mtr-mysql-test-runUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hXMTR (mysql-test-run)r\r\}r\(hXMTR (mysql-test-run)h j\ubah!jB,ubah!jCubah!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh j#\h]r\jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU#subunitshellcommandUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hXSubunitShellCommandr\r\}r\(hXSubunitShellCommandh j\ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh jZh]r\(jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU#slave-filesystem-stepsUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hXSlave Filesystem Stepsr\r\}r\(hXSlave Filesystem Stepsh j\ubah!jB,ubah!jCubj )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\(j )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU #fileexistsUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hX FileExistsr\r\}r\(hX FileExistsh j\ubah!jB,ubah!jCubah!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU#copydirectoryUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hX CopyDirectoryr\r\}r\(hX CopyDirectoryh j\ubah!jB,ubah!jCubah!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU#removedirectoryUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hXRemoveDirectoryr\r\}r\(hXRemoveDirectoryh j\ubah!jB,ubah!jCubah!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\jC)r\}r\(hUh}r\(h]h]h]h]h]uh j\h]r\j9,)r\}r\(hUh}r\(U anchornameU#makedirectoryUrefurijgh]h]h]h]h]Uinternaluh j\h]r\hX MakeDirectoryr\r\}r\(hX MakeDirectoryh j\ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r\}r\(hUh}r\(h]h]h]h]h]uh jZh]r](jC)r]}r](hUh}r](h]h]h]h]h]uh j\h]r]j9,)r]}r](hUh}r](U anchornameU#python-buildstepsUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hXPython BuildStepsr ]r ]}r ](hXPython BuildStepsh j]ubah!jB,ubah!jCubj )r ]}r ](hUh}r](h]h]h]h]h]uh j\h]r](j )r]}r](hUh}r](h]h]h]h]h]uh j ]h]r]jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU #buildepydocUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hX BuildEPYDocr]r]}r](hX BuildEPYDoch j]ubah!jB,ubah!jCubah!j ubj )r]}r ](hUh}r!](h]h]h]h]h]uh j ]h]r"]jC)r#]}r$](hUh}r%](h]h]h]h]h]uh j]h]r&]j9,)r']}r(](hUh}r)](U anchornameU #pyflakesUrefurijgh]h]h]h]h]Uinternaluh j#]h]r*]hXPyFlakesr+]r,]}r-](hXPyFlakesh j']ubah!jB,ubah!jCubah!j ubj )r.]}r/](hUh}r0](h]h]h]h]h]uh j ]h]r1]jC)r2]}r3](hUh}r4](h]h]h]h]h]uh j.]h]r5]j9,)r6]}r7](hUh}r8](U anchornameU#sphinxUrefurijgh]h]h]h]h]Uinternaluh j2]h]r9]hXSphinxr:]r;]}r<](hXSphinxh j6]ubah!jB,ubah!jCubah!j ubj )r=]}r>](hUh}r?](h]h]h]h]h]uh j ]h]r@]jC)rA]}rB](hUh}rC](h]h]h]h]h]uh j=]h]rD]j9,)rE]}rF](hUh}rG](U anchornameU#pylintUrefurijgh]h]h]h]h]Uinternaluh jA]h]rH]hXPyLintrI]rJ]}rK](hXPyLinth jE]ubah!jB,ubah!jCubah!j ubj )rL]}rM](hUh}rN](h]h]h]h]h]uh j ]h]rO]jC)rP]}rQ](hUh}rR](h]h]h]h]h]uh jL]h]rS]j9,)rT]}rU](hUh}rV](U anchornameU#trialUrefurijgh]h]h]h]h]Uinternaluh jP]h]rW]hXTrialrX]rY]}rZ](hXTrialh jT]ubah!jB,ubah!jCubah!j ubj )r[]}r\](hUh}r]](h]h]h]h]h]uh j ]h]r^]jC)r_]}r`](hUh}ra](h]h]h]h]h]uh j[]h]rb]j9,)rc]}rd](hUh}re](U anchornameU #removepycsUrefurijgh]h]h]h]h]Uinternaluh j_]h]rf]hX RemovePYCsrg]rh]}ri](hX RemovePYCsh jc]ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rj]}rk](hUh}rl](h]h]h]h]h]uh jZh]rm](jC)rn]}ro](hUh}rp](h]h]h]h]h]uh jj]h]rq]j9,)rr]}rs](hUh}rt](U anchornameU#transferring-filesUrefurijgh]h]h]h]h]Uinternaluh jn]h]ru]hXTransferring Filesrv]rw]}rx](hXTransferring Filesh jr]ubah!jB,ubah!jCubj )ry]}rz](hUh}r{](h]h]h]h]h]uh jj]h]r|](j )r}]}r~](hUh}r](h]h]h]h]h]uh jy]h]r]jC)r]}r](hUh}r](h]h]h]h]h]uh j}]h]r]j9,)r]}r](hUh}r](U anchornameU#other-parametersUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hXOther Parametersr]r]}r](hXOther Parametersh j]ubah!jB,ubah!jCubah!j ubj )r]}r](hUh}r](h]h]h]h]h]uh jy]h]r]jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU#transfering-directoriesUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hXTransfering Directoriesr]r]}r](hXTransfering Directoriesh j]ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r]}r](hUh}r](h]h]h]h]h]uh jZh]r]jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU#transfering-stringsUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hXTransfering Stringsr]r]}r](hXTransfering Stringsh j]ubah!jB,ubah!jCubah!j ubj )r]}r](hUh}r](h]h]h]h]h]uh jZh]r](jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU#running-commands-on-the-masterUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hXRunning Commands on the Masterr]r]}r](hXRunning Commands on the Masterh j]ubah!jB,ubah!jCubj )r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j )r]}r](hUh}r](h]h]h]h]h]uh j]h]r]jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU#logrenderableUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hX LogRenderabler]r]}r](hX LogRenderableh j]ubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )r]}r](hUh}r](h]h]h]h]h]uh jZh]r](jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU#setting-propertiesUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hXSetting Propertiesr]r]}r](hXSetting Propertiesh j]ubah!jB,ubah!jCubj )r]}r](hUh}r](h]h]h]h]h]uh j]h]r](j )r]}r](hUh}r](h]h]h]h]h]uh j]h]r]jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU #setpropertyUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hX SetPropertyr]r]}r](hX SetPropertyh j]ubah!jB,ubah!jCubah!j ubj )r]}r](hUh}r](h]h]h]h]h]uh j]h]r]jC)r]}r](hUh}r](h]h]h]h]h]uh j]h]r]j9,)r]}r](hUh}r](U anchornameU#setpropertyfromcommandUrefurijgh]h]h]h]h]Uinternaluh j]h]r]hXSetPropertyFromCommandr]r]}r](hXSetPropertyFromCommandh j]ubah!jB,ubah!jCubah!j ubj )r]}r](hUh}r](h]h]h]h]h]uh j]h]r^jC)r^}r^(hUh}r^(h]h]h]h]h]uh j]h]r^j9,)r^}r^(hUh}r^(U anchornameU#setpropertiesfromenvUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hXSetPropertiesFromEnvr ^r ^}r ^(hXSetPropertiesFromEnvh j^ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r ^}r ^(hUh}r^(h]h]h]h]h]uh jZh]r^jC)r^}r^(hUh}r^(h]h]h]h]h]uh j ^h]r^j9,)r^}r^(hUh}r^(U anchornameU#triggering-schedulersUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hXTriggering Schedulersr^r^}r^(hXTriggering Schedulersh j^ubah!jB,ubah!jCubah!j ubj )r^}r^(hUh}r^(h]h]h]h]h]uh jZh]r^(jC)r^}r ^(hUh}r!^(h]h]h]h]h]uh j^h]r"^j9,)r#^}r$^(hUh}r%^(U anchornameU#rpm-related-stepsUrefurijgh]h]h]h]h]Uinternaluh j^h]r&^hXRPM-Related Stepsr'^r(^}r)^(hXRPM-Related Stepsh j#^ubah!jB,ubah!jCubj )r*^}r+^(hUh}r,^(h]h]h]h]h]uh j^h]r-^(j )r.^}r/^(hUh}r0^(h]h]h]h]h]uh j*^h]r1^jC)r2^}r3^(hUh}r4^(h]h]h]h]h]uh j.^h]r5^j9,)r6^}r7^(hUh}r8^(U anchornameU #rpmbuildUrefurijgh]h]h]h]h]Uinternaluh j2^h]r9^hXRpmBuildr:^r;^}r<^(hXRpmBuildh j6^ubah!jB,ubah!jCubah!j ubj )r=^}r>^(hUh}r?^(h]h]h]h]h]uh j*^h]r@^jC)rA^}rB^(hUh}rC^(h]h]h]h]h]uh j=^h]rD^j9,)rE^}rF^(hUh}rG^(U anchornameU#rpmlintUrefurijgh]h]h]h]h]Uinternaluh jA^h]rH^hXRpmLintrI^rJ^}rK^(hXRpmLinth jE^ubah!jB,ubah!jCubah!j ubj )rL^}rM^(hUh}rN^(h]h]h]h]h]uh j*^h]rO^jC)rP^}rQ^(hUh}rR^(h]h]h]h]h]uh jL^h]rS^j9,)rT^}rU^(hUh}rV^(U anchornameU #mock-stepsUrefurijgh]h]h]h]h]Uinternaluh jP^h]rW^hX Mock StepsrX^rY^}rZ^(hX Mock Stepsh jT^ubah!jB,ubah!jCubah!j ubj )r[^}r\^(hUh}r]^(h]h]h]h]h]uh j*^h]r^^jC)r_^}r`^(hUh}ra^(h]h]h]h]h]uh j[^h]rb^j9,)rc^}rd^(hUh}re^(U anchornameU#mockbuildsrpm-stepUrefurijgh]h]h]h]h]Uinternaluh j_^h]rf^hXMockBuildSRPM Steprg^rh^}ri^(hXMockBuildSRPM Steph jc^ubah!jB,ubah!jCubah!j ubj )rj^}rk^(hUh}rl^(h]h]h]h]h]uh j*^h]rm^jC)rn^}ro^(hUh}rp^(h]h]h]h]h]uh jj^h]rq^j9,)rr^}rs^(hUh}rt^(U anchornameU#mockrebuild-stepUrefurijgh]h]h]h]h]Uinternaluh jn^h]ru^hXMockRebuild Steprv^rw^}rx^(hXMockRebuild Steph jr^ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )ry^}rz^(hUh}r{^(h]h]h]h]h]uh jZh]r|^(jC)r}^}r~^(hUh}r^(h]h]h]h]h]uh jy^h]r^j9,)r^}r^(hUh}r^(U anchornameU#debian-build-stepsUrefurijgh]h]h]h]h]Uinternaluh j}^h]r^hXDebian Build Stepsr^r^}r^(hXDebian Build Stepsh j^ubah!jB,ubah!jCubj )r^}r^(hUh}r^(h]h]h]h]h]uh jy^h]r^(j )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jC)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j9,)r^}r^(hUh}r^(U anchornameU #debpbuilderUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hX DebPbuilderr^r^}r^(hX DebPbuilderh j^ubah!jB,ubah!jCubah!j ubj )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jC)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j9,)r^}r^(hUh}r^(U anchornameU#debcowbuilderUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hX DebCowbuilderr^r^}r^(hX DebCowbuilderh j^ubah!jB,ubah!jCubah!j ubj )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jC)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j9,)r^}r^(hUh}r^(U anchornameU #deblintianUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hX DebLintianr^r^}r^(hX DebLintianh j^ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r^}r^(hUh}r^(h]h]h]h]h]uh jZh]r^(jC)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j9,)r^}r^(hUh}r^(U anchornameU#miscellaneous-buildstepsUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hXMiscellaneous BuildStepsr^r^}r^(hXMiscellaneous BuildStepsh j^ubah!jB,ubah!jCubj )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^(j )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jC)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j9,)r^}r^(hUh}r^(U anchornameU#hlintUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hXHLintr^r^}r^(hXHLinth j^ubah!jB,ubah!jCubah!j ubj )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^jC)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j9,)r^}r^(hUh}r^(U anchornameU#maxqUrefurijgh]h]h]h]h]Uinternaluh j^h]r^hXMaxQr^r^}r^(hXMaxQh j^ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubjpj )r^}r^(hUh}r^(h]h]h]h]h]uh]r^j )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^(jC)r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r^j9,)r^}r^(hUh}r^(U anchornameUUrefurijph]h]h]h]h]Uinternaluh j^h]r^hXBuildbot Manualr^r^}r^(hjxh j^ubah!jB,ubah!jCubj )r^}r^(hUh}r^(h]h]h]h]h]uh j^h]r_je)r_}r_(hUh}r_(UnumberedKUparentjpU titlesonlyUglobh]h]h]h]h]Uentries]r_(NjBr_NjBr_NjBr_NjBr_NjCr _NjCr _NjCr _NjCr _eUhiddenUmaxdepthKU includefiles]r _(jBjBjBjBjCjCjCjCeU includehiddenuh j^h]h!jhubah!j1 ubeh!j ubah!j1 ubjyj )r_}r_(hUh}r_(h]h]h]h]h]uh]r_j )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_(jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameUUrefurijyh]h]h]h]h]Uinternaluh j_h]r_hX Definitionsr_r_}r _(hjh j_ubah!jB,ubah!jCubj )r!_}r"_(hUh}r#_(h]h]h]h]h]uh j_h]r$_(j )r%_}r&_(hUh}r'_(h]h]h]h]h]uh j!_h]r(_jC)r)_}r*_(hUh}r+_(h]h]h]h]h]uh j%_h]r,_j9,)r-_}r._(hUh}r/_(U anchornameU #repositoryUrefurijyh]h]h]h]h]Uinternaluh j)_h]r0_hX Repositoryr1_r2_}r3_(hX Repositoryh j-_ubah!jB,ubah!jCubah!j ubj )r4_}r5_(hUh}r6_(h]h]h]h]h]uh j!_h]r7_jC)r8_}r9_(hUh}r:_(h]h]h]h]h]uh j4_h]r;_j9,)r<_}r=_(hUh}r>_(U anchornameU#projectUrefurijyh]h]h]h]h]Uinternaluh j8_h]r?_hXProjectr@_rA_}rB_(hXProjecth j<_ubah!jB,ubah!jCubah!j ubj )rC_}rD_(hUh}rE_(h]h]h]h]h]uh j!_h]rF_jC)rG_}rH_(hUh}rI_(h]h]h]h]h]uh jC_h]rJ_j9,)rK_}rL_(hUh}rM_(U anchornameU#version-control-comparisonUrefurijyh]h]h]h]h]Uinternaluh jG_h]rN_hXVersion Control ComparisonrO_rP_}rQ_(hXVersion Control Comparisonh jK_ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubjj )rR_}rS_(hUh}rT_(h]h]h]h]h]uh]rU_j )rV_}rW_(hUh}rX_(h]h]h]h]h]uh jR_h]rY_(jC)rZ_}r[_(hUh}r\_(h]h]h]h]h]uh jV_h]r]_j9,)r^_}r__(hUh}r`_(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jZ_h]ra_hX First Runrb_rc_}rd_(hjh j^_ubah!jB,ubah!jCubj )re_}rf_(hUh}rg_(h]h]h]h]h]uh jV_h]rh_(j )ri_}rj_(hUh}rk_(h]h]h]h]h]uh je_h]rl_jC)rm_}rn_(hUh}ro_(h]h]h]h]h]uh ji_h]rp_j9,)rq_}rr_(hUh}rs_(U anchornameU#goalUrefurijh]h]h]h]h]Uinternaluh jm_h]rt_hXGoalru_rv_}rw_(hXGoalrx_h jq_ubah!jB,ubah!jCubah!j ubj )ry_}rz_(hUh}r{_(h]h]h]h]h]uh je_h]r|_jC)r}_}r~_(hUh}r_(h]h]h]h]h]uh jy_h]r_j9,)r_}r_(hUh}r_(U anchornameU#getting-the-codeUrefurijh]h]h]h]h]Uinternaluh j}_h]r_hXGetting the coder_r_}r_(hXGetting the coder_h j_ubah!jB,ubah!jCubah!j ubj )r_}r_(hUh}r_(h]h]h]h]h]uh je_h]r_jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameU#creating-a-masterUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXCreating a masterr_r_}r_(hXCreating a masterr_h j_ubah!jB,ubah!jCubah!j ubj )r_}r_(hUh}r_(h]h]h]h]h]uh je_h]r_jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameU#creating-a-slaveUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXCreating a slaver_r_}r_(hXCreating a slaver_h j_ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubjj )r_}r_(hUh}r_(h]h]h]h]h]uh]r_j )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_(jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameUUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXBuildbot's Test Suiter_r_}r_(hjh j_ubah!jB,ubah!jCubj )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_(j )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_(jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameU#suitesUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXSuitesr_r_}r_(hXSuitesh j_ubah!jB,ubah!jCubj )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_(j )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameU #unit-testsUrefurijh]h]h]h]h]Uinternaluh j_h]r_hX Unit Testsr_r_}r_(hX Unit Testsh j_ubah!jB,ubah!jCubah!j ubj )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameU#interface-testsUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXInterface Testsr_r_}r_(hXInterface Testsh j_ubah!jB,ubah!jCubah!j ubj )r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_jC)r_}r_(hUh}r_(h]h]h]h]h]uh j_h]r_j9,)r_}r_(hUh}r_(U anchornameU#integration-testsUrefurijh]h]h]h]h]Uinternaluh j_h]r_hXIntegration Testsr_r_}r_(hXIntegration Testsh j_ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh j_h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r `(hUh}r `(U anchornameU#regression-testsUrefurijh]h]h]h]h]Uinternaluh j`h]r `hXRegression Testsr `r `}r`(hXRegression Testsh j`ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh j_h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameU #fuzz-testsUrefurijh]h]h]h]h]Uinternaluh j`h]r`hX Fuzz Testsr`r`}r`(hX Fuzz Testsh j`ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )r`}r`(hUh}r `(h]h]h]h]h]uh j_h]r!`jC)r"`}r#`(hUh}r$`(h]h]h]h]h]uh j`h]r%`j9,)r&`}r'`(hUh}r(`(U anchornameU#mixinsUrefurijh]h]h]h]h]Uinternaluh j"`h]r)`hXMixinsr*`r+`}r,`(hXMixinsh j&`ubah!jB,ubah!jCubah!j ubj )r-`}r.`(hUh}r/`(h]h]h]h]h]uh j_h]r0`jC)r1`}r2`(hUh}r3`(h]h]h]h]h]uh j-`h]r4`j9,)r5`}r6`(hUh}r7`(U anchornameU#fakesUrefurijh]h]h]h]h]Uinternaluh j1`h]r8`hXFakesr9`r:`}r;`(hXFakesh j5`ubah!jB,ubah!jCubah!j ubj )r<`}r=`(hUh}r>`(h]h]h]h]h]uh j_h]r?`(jC)r@`}rA`(hUh}rB`(h]h]h]h]h]uh j<`h]rC`j9,)rD`}rE`(hUh}rF`(U anchornameU #good-testsUrefurijh]h]h]h]h]Uinternaluh j@`h]rG`hX Good TestsrH`rI`}rJ`(hX Good Testsh jD`ubah!jB,ubah!jCubj )rK`}rL`(hUh}rM`(h]h]h]h]h]uh j<`h]rN`(j )rO`}rP`(hUh}rQ`(h]h]h]h]h]uh jK`h]rR`jC)rS`}rT`(hUh}rU`(h]h]h]h]h]uh jO`h]rV`j9,)rW`}rX`(hUh}rY`(U anchornameU#independent-of-timeUrefurijh]h]h]h]h]Uinternaluh jS`h]rZ`hXIndependent of Timer[`r\`}r]`(hXIndependent of Timeh jW`ubah!jB,ubah!jCubah!j ubj )r^`}r_`(hUh}r``(h]h]h]h]h]uh jK`h]ra`jC)rb`}rc`(hUh}rd`(h]h]h]h]h]uh j^`h]re`j9,)rf`}rg`(hUh}rh`(U anchornameU #clean-codeUrefurijh]h]h]h]h]Uinternaluh jb`h]ri`hX Clean Coderj`rk`}rl`(hX Clean Codeh jf`ubah!jB,ubah!jCubah!j ubj )rm`}rn`(hUh}ro`(h]h]h]h]h]uh jK`h]rp`jC)rq`}rr`(hUh}rs`(h]h]h]h]h]uh jm`h]rt`j9,)ru`}rv`(hUh}rw`(U anchornameU #good-nameUrefurijh]h]h]h]h]Uinternaluh jq`h]rx`hX Good Namery`rz`}r{`(hX Good Nameh ju`ubah!jB,ubah!jCubah!j ubj )r|`}r}`(hUh}r~`(h]h]h]h]h]uh jK`h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j|`h]r`j9,)r`}r`(hUh}r`(U anchornameU#assert-only-one-thingUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXAssert Only One Thingr`r`}r`(hXAssert Only One Thingh j`ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh jK`h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameU#prefer-fakes-to-mocksUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXPrefer Fakes to Mocksr`r`}r`(hXPrefer Fakes to Mocksh j`ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh jK`h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameU #small-testsUrefurijh]h]h]h]h]Uinternaluh j`h]r`hX Small Testsr`r`}r`(hX Small Testsh j`ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh jK`h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameU #isolationUrefurijh]h]h]h]h]Uinternaluh j`h]r`hX Isolationr`r`}r`(hX Isolationh j`ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh jK`h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameU #be-correctUrefurijh]h]h]h]h]Uinternaluh j`h]r`hX Be Correctr`r`}r`(hX Be Correcth j`ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh jK`h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameU #be-helpfulUrefurijh]h]h]h]h]Uinternaluh j`h]r`hX Be Helpfulr`r`}r`(hX Be Helpfulh j`ubah!jB,ubah!jCubah!j ubj )r`}r`(hUh}r`(h]h]h]h]h]uh jK`h]r`jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameU#keeping-stateUrefurijh]h]h]h]h]Uinternaluh j`h]r`hX Keeping Stater`r`}r`(hX Keeping Stateh j`ubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubjj )r`}r`(hUh}r`(h]h]h]h]h]uh]r`j )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`(jC)r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`j9,)r`}r`(hUh}r`(U anchornameUUrefurijh]h]h]h]h]Uinternaluh j`h]r`hXClassesr`r`}r`(hjh j`ubah!jB,ubah!jCubj )r`}r`(hUh}r`(h]h]h]h]h]uh j`h]r`je)r`}r`(hUh}r`(UnumberedKUparentjU titlesonlyUglobh]h]h]h]h]UentriesjoUhiddenUmaxdepthKU includefilesj~U includehiddenuh j`h]h!jhubah!j1 ubeh!j ubah!j1 ubjj )r`}ra(hUh}ra(h]h]h]h]h]uh]raj )ra}ra(hUh}ra(h]h]h]h]h]uh j`h]ra(jC)ra}ra(hUh}r a(h]h]h]h]h]uh jah]r aj9,)r a}r a(hUh}r a(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jah]rahXConceptsrara}ra(hjh j aubah!jB,ubah!jCubj )ra}ra(hUh}ra(h]h]h]h]h]uh jah]ra(j )ra}ra(hUh}ra(h]h]h]h]h]uh jah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}r a(U anchornameU#source-stampsUrefurijh]h]h]h]h]Uinternaluh jah]r!ahX Source Stampsr"ar#a}r$a(hX Source Stampsr%ah jaubah!jB,ubah!jCubah!j ubj )r&a}r'a(hUh}r(a(h]h]h]h]h]uh jah]r)a(jC)r*a}r+a(hUh}r,a(h]h]h]h]h]uh j&ah]r-aj9,)r.a}r/a(hUh}r0a(U anchornameU#version-control-systemsUrefurijh]h]h]h]h]Uinternaluh j*ah]r1ahXVersion Control Systemsr2ar3a}r4a(hXVersion Control Systemsr5ah j.aubah!jB,ubah!jCubj )r6a}r7a(hUh}r8a(h]h]h]h]h]uh j&ah]r9a(j )r:a}r;a(hUh}ra}r?a(hUh}r@a(h]h]h]h]h]uh j:ah]rAaj9,)rBa}rCa(hUh}rDa(U anchornameU#tree-stabilityUrefurijh]h]h]h]h]Uinternaluh j>ah]rEahXTree StabilityrFarGa}rHa(hXTree StabilityrIah jBaubah!jB,ubah!jCubah!j ubj )rJa}rKa(hUh}rLa(h]h]h]h]h]uh j6ah]rMajC)rNa}rOa(hUh}rPa(h]h]h]h]h]uh jJah]rQaj9,)rRa}rSa(hUh}rTa(U anchornameU)#how-different-vc-systems-specify-sourcesUrefurijh]h]h]h]h]Uinternaluh jNah]rUahX(How Different VC Systems Specify SourcesrVarWa}rXa(hX(How Different VC Systems Specify SourcesrYah jRaubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rZa}r[a(hUh}r\a(h]h]h]h]h]uh jah]r]a(jC)r^a}r_a(hUh}r`a(h]h]h]h]h]uh jZah]raaj9,)rba}rca(hUh}rda(U anchornameU#changesUrefurijh]h]h]h]h]Uinternaluh j^ah]reahXChangesrfarga}rha(hXChangesriah jbaubah!jB,ubah!jCubj )rja}rka(hUh}rla(h]h]h]h]h]uh jZah]rma(j )rna}roa(hUh}rpa(h]h]h]h]h]uh jjah]rqajC)rra}rsa(hUh}rta(h]h]h]h]h]uh jnah]ruaj9,)rva}rwa(hUh}rxa(U anchornameU#whoUrefurijh]h]h]h]h]Uinternaluh jrah]ryahXWhorzar{a}r|a(hXWhor}ah jvaubah!jB,ubah!jCubah!j ubj )r~a}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh j~ah]raj9,)ra}ra(hUh}ra(U anchornameU#filesUrefurijh]h]h]h]h]Uinternaluh jah]rahXFilesrara}ra(hXFilesrah jaubah!jB,ubah!jCubah!j ubj )ra}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}ra(U anchornameU #commentsUrefurijh]h]h]h]h]Uinternaluh jah]rahXCommentsrara}ra(hXCommentsrah jaubah!jB,ubah!jCubah!j ubj )ra}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}ra(U anchornameU#projectUrefurijh]h]h]h]h]Uinternaluh jah]rahXProjectrara}ra(hXProjectrah jaubah!jB,ubah!jCubah!j ubj )ra}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}ra(U anchornameU #repositoryUrefurijh]h]h]h]h]Uinternaluh jah]rahX Repositoryrara}ra(hX Repositoryrah jaubah!jB,ubah!jCubah!j ubj )ra}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}ra(U anchornameU #codebaseUrefurijh]h]h]h]h]Uinternaluh jah]rahXCodebaserara}ra(hXCodebaserah jaubah!jB,ubah!jCubah!j ubj )ra}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}ra(U anchornameU #revisionUrefurijh]h]h]h]h]Uinternaluh jah]rahXRevisionrara}ra(hXRevisionrah jaubah!jB,ubah!jCubah!j ubj )ra}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}ra(U anchornameU #branchesUrefurijh]h]h]h]h]Uinternaluh jah]rahXBranchesrara}ra(hXBranchesrah jaubah!jB,ubah!jCubah!j ubj )ra}ra(hUh}ra(h]h]h]h]h]uh jjah]rajC)ra}ra(hUh}ra(h]h]h]h]h]uh jah]raj9,)ra}ra(hUh}ra(U anchornameU#change-propertiesUrefurijh]h]h]h]h]Uinternaluh jah]rahXChange Propertiesrara}ra(hXChange Propertiesrah jaubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )ra}ra(hUh}rb(h]h]h]h]h]uh jah]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jah]rbj9,)rb}rb(hUh}rb(U anchornameU#scheduling-buildsUrefurijh]h]h]h]h]Uinternaluh jbh]r bhXScheduling Buildsr br b}r b(hXScheduling Buildsr bh jbubah!jB,ubah!jCubah!j ubj )rb}rb(hUh}rb(h]h]h]h]h]uh jah]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU #buildsetsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhX BuildSetsrbrb}rb(hX BuildSetsrbh jbubah!jB,ubah!jCubah!j ubj )rb}rb(hUh}r b(h]h]h]h]h]uh jah]r!bjC)r"b}r#b(hUh}r$b(h]h]h]h]h]uh jbh]r%bj9,)r&b}r'b(hUh}r(b(U anchornameU#buildrequestsUrefurijh]h]h]h]h]Uinternaluh j"bh]r)bhX BuildRequestsr*br+b}r,b(hX BuildRequestsr-bh j&bubah!jB,ubah!jCubah!j ubj )r.b}r/b(hUh}r0b(h]h]h]h]h]uh jah]r1bjC)r2b}r3b(hUh}r4b(h]h]h]h]h]uh j.bh]r5bj9,)r6b}r7b(hUh}r8b(U anchornameU #buildersUrefurijh]h]h]h]h]Uinternaluh j2bh]r9bhXBuildersr:br;b}rb}r?b(hUh}r@b(h]h]h]h]h]uh jah]rAbjC)rBb}rCb(hUh}rDb(h]h]h]h]h]uh j>bh]rEbj9,)rFb}rGb(hUh}rHb(U anchornameU#build-factoriesUrefurijh]h]h]h]h]Uinternaluh jBbh]rIbhXBuild FactoriesrJbrKb}rLb(hXBuild FactoriesrMbh jFbubah!jB,ubah!jCubah!j ubj )rNb}rOb(hUh}rPb(h]h]h]h]h]uh jah]rQbjC)rRb}rSb(hUh}rTb(h]h]h]h]h]uh jNbh]rUbj9,)rVb}rWb(hUh}rXb(U anchornameU #build-slavesUrefurijh]h]h]h]h]Uinternaluh jRbh]rYbhX Build SlavesrZbr[b}r\b(hX Build Slavesr]bh jVbubah!jB,ubah!jCubah!j ubj )r^b}r_b(hUh}r`b(h]h]h]h]h]uh jah]rabjC)rbb}rcb(hUh}rdb(h]h]h]h]h]uh j^bh]rebj9,)rfb}rgb(hUh}rhb(U anchornameU#buildsUrefurijh]h]h]h]h]Uinternaluh jbbh]ribhXBuildsrjbrkb}rlb(hXBuildsrmbh jfbubah!jB,ubah!jCubah!j ubj )rnb}rob(hUh}rpb(h]h]h]h]h]uh jah]rqb(jC)rrb}rsb(hUh}rtb(h]h]h]h]h]uh jnbh]rubj9,)rvb}rwb(hUh}rxb(U anchornameU#usersUrefurijh]h]h]h]h]Uinternaluh jrbh]rybhXUsersrzbr{b}r|b(hXUsersr}bh jvbubah!jB,ubah!jCubj )r~b}rb(hUh}rb(h]h]h]h]h]uh jnbh]rb(j )rb}rb(hUh}rb(h]h]h]h]h]uh j~bh]rb(jC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU #user-objectsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhX User Objectsrbrb}rb(hX User Objectsrbh jbubah!jB,ubah!jCubj )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rb(j )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU#id6Urefurijh]h]h]h]h]Uinternaluh jbh]rbhXChangesrbrb}rb(hXChangesrbh jbubah!jB,ubah!jCubah!j ubj )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU#toolsUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXToolsrbrb}rb(hXToolsrbh jbubah!jB,ubah!jCubah!j ubj )rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU#usesUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXUsesrbrb}rb(hXUsesrbh jbubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rb}rb(hUh}rb(h]h]h]h]h]uh j~bh]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU#doing-things-with-usersUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXDoing Things With Usersrbrb}rb(hXDoing Things With Usersrbh jbubah!jB,ubah!jCubah!j ubj )rb}rb(hUh}rb(h]h]h]h]h]uh j~bh]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU#email-addressesUrefurijh]h]h]h]h]Uinternaluh jbh]rbhXEmail Addressesrbrb}rb(hXEmail Addressesrbh jbubah!jB,ubah!jCubah!j ubj )rb}rb(hUh}rb(h]h]h]h]h]uh j~bh]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rb(U anchornameU#irc-nicknamesUrefurijh]h]h]h]h]Uinternaluh jbh]rbhX IRC Nicknamesrbrb}rb(hX IRC Nicknamesrbh jbubah!jB,ubah!jCubah!j ubj )rb}rb(hUh}rb(h]h]h]h]h]uh j~bh]rbjC)rb}rb(hUh}rb(h]h]h]h]h]uh jbh]rbj9,)rb}rb(hUh}rc(U anchornameU#live-status-clientsUrefurijh]h]h]h]h]Uinternaluh jbh]rchXLive Status Clientsrcrc}rc(hXLive Status Clientsrch jbubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rc}rc(hUh}rc(h]h]h]h]h]uh jah]r cjC)r c}r c(hUh}r c(h]h]h]h]h]uh jch]r cj9,)rc}rc(hUh}rc(U anchornameU#build-propertiesUrefurijh]h]h]h]h]Uinternaluh j ch]rchXBuild Propertiesrcrc}rc(hXBuild Propertiesrch jcubah!jB,ubah!jCubah!j ubj )rc}rc(hUh}rc(h]h]h]h]h]uh jah]rcjC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}r c(U anchornameU#multiple-codebase-buildsUrefurijh]h]h]h]h]Uinternaluh jch]r!chXMultiple-Codebase Buildsr"cr#c}r$c(hXMultiple-Codebase Buildsr%ch jcubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubjj )r&c}r'c(hUh}r(c(h]h]h]h]h]uh]r)cj )r*c}r+c(hUh}r,c(h]h]h]h]h]uh j&ch]r-c(jC)r.c}r/c(hUh}r0c(h]h]h]h]h]uh j*ch]r1cj9,)r2c}r3c(hUh}r4c(U anchornameUUrefurijh]h]h]h]h]Uinternaluh j.ch]r5chX Configurationr6cr7c}r8c(hjh j2cubah!jB,ubah!jCubj )r9c}r:c(hUh}r;c(h]h]h]h]h]uh j*ch]rc(hUh}r?c(UnumberedKUparentjU titlesonlyUglobh]h]h]h]h]Uentries]r@c(NjBrAcNjBrBcNjBrCcNjBrDcNjBrEcNjBrFcNjBrGcNjBrHcNjBrIcNjBrJcNjBrKceUhiddenUmaxdepthKU includefiles]rLc(jBjBjBjBjBjBjBjBjBjBjBeU includehiddenuh j9ch]h!jhubah!j1 ubeh!j ubah!j1 ubjj )rMc}rNc(hUh}rOc(h]h]h]h]h]uh]rPcj )rQc}rRc(hUh}rSc(h]h]h]h]h]uh jMch]rTc(jC)rUc}rVc(hUh}rWc(h]h]h]h]h]uh jQch]rXcj9,)rYc}rZc(hUh}r[c(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jUch]r\chX File Formatsr]cr^c}r_c(hjh jYcubah!jB,ubah!jCubj )r`c}rac(hUh}rbc(h]h]h]h]h]uh jQch]rccj )rdc}rec(hUh}rfc(h]h]h]h]h]uh j`ch]rgcjC)rhc}ric(hUh}rjc(h]h]h]h]h]uh jdch]rkcj9,)rlc}rmc(hUh}rnc(U anchornameU#log-file-formatUrefurijh]h]h]h]h]Uinternaluh jhch]rochXLog File Formatrpcrqc}rrc(hXLog File Formath jlcubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubah!j1 ubjj )rsc}rtc(hUh}ruc(h]h]h]h]h]uh]rvcj )rwc}rxc(hUh}ryc(h]h]h]h]h]uh jsch]rzc(jC)r{c}r|c(hUh}r}c(h]h]h]h]h]uh jwch]r~cj9,)rc}rc(hUh}rc(U anchornameUUrefurijh]h]h]h]h]Uinternaluh j{ch]rchX BuildStepsrcrc}rc(hjh jcubah!jB,ubah!jCubj )rc}rc(hUh}rc(h]h]h]h]h]uh jwch]rc(j )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcjC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}rc(U anchornameU #buildstepUrefurijh]h]h]h]h]Uinternaluh jch]rchX BuildSteprcrc}rc(hX BuildSteph jcubah!jB,ubah!jCubah!j ubj )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcjC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}rc(U anchornameU#loggingbuildstepUrefurijh]h]h]h]h]Uinternaluh jch]rchXLoggingBuildSteprcrc}rc(hXLoggingBuildSteph jcubah!jB,ubah!jCubah!j ubj )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcjC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}rc(U anchornameU #exceptionsUrefurijh]h]h]h]h]Uinternaluh jch]rchX Exceptionsrcrc}rc(hX Exceptionsh jcubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubjj )rc}rc(hUh}rc(h]h]h]h]h]uh]rcj )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(jC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}rc(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jch]rchXMaster-Slave APIrcrc}rc(hjh jcubah!jB,ubah!jCubj )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(j )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcjC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}rc(U anchornameU #connectionUrefurijh]h]h]h]h]Uinternaluh jch]rchX Connectionrcrc}rc(hX Connectionh jcubah!jB,ubah!jCubah!j ubj )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(jC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}rc(U anchornameU #build-slavesUrefurijh]h]h]h]h]Uinternaluh jch]rchX Build Slavesrcrc}rc(hX Build Slavesh jcubah!jB,ubah!jCubj )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rc(j )rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcjC)rc}rc(hUh}rc(h]h]h]h]h]uh jch]rcj9,)rc}rc(hUh}rc(U anchornameU #bot-methodsUrefurijh]h]h]h]h]Uinternaluh jch]rchX Bot methodsrcrc}rc(hX Bot methodsh jcubah!jB,ubah!jCubah!j ubj )rc}rd(hUh}rd(h]h]h]h]h]uh jch]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdj9,)rd}rd(hUh}r d(U anchornameU#buildslave-methodsUrefurijh]h]h]h]h]Uinternaluh jdh]r dhXBuildSlave methodsr dr d}r d(hXBuildSlave methodsh jdubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU#setupUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXSetuprdrd}rd(hXSetuph jdubah!jB,ubah!jCubah!j ubj )rd}rd(hUh}rd(h]h]h]h]h]uh jch]r djC)r!d}r"d(hUh}r#d(h]h]h]h]h]uh jdh]r$dj9,)r%d}r&d(hUh}r'd(U anchornameU#pingingUrefurijh]h]h]h]h]Uinternaluh j!dh]r(dhXPingingr)dr*d}r+d(hXPingingh j%dubah!jB,ubah!jCubah!j ubj )r,d}r-d(hUh}r.d(h]h]h]h]h]uh jch]r/djC)r0d}r1d(hUh}r2d(h]h]h]h]h]uh j,dh]r3dj9,)r4d}r5d(hUh}r6d(U anchornameU #buildingUrefurijh]h]h]h]h]Uinternaluh j0dh]r7dhXBuildingr8dr9d}r:d(hXBuildingh j4dubah!jB,ubah!jCubah!j ubj )r;d}rd(jC)r?d}r@d(hUh}rAd(h]h]h]h]h]uh j;dh]rBdj9,)rCd}rDd(hUh}rEd(U anchornameU#slave-buildersUrefurijh]h]h]h]h]Uinternaluh j?dh]rFdhXSlave BuildersrGdrHd}rId(hXSlave Buildersh jCdubah!jB,ubah!jCubj )rJd}rKd(hUh}rLd(h]h]h]h]h]uh j;dh]rMd(j )rNd}rOd(hUh}rPd(h]h]h]h]h]uh jJdh]rQdjC)rRd}rSd(hUh}rTd(h]h]h]h]h]uh jNdh]rUdj9,)rVd}rWd(hUh}rXd(U anchornameU #slave-side-slavebuilder-methodsUrefurijh]h]h]h]h]Uinternaluh jRdh]rYdhXSlave-Side SlaveBuilder MethodsrZdr[d}r\d(hXSlave-Side SlaveBuilder Methodsh jVdubah!jB,ubah!jCubah!j ubj )r]d}r^d(hUh}r_d(h]h]h]h]h]uh jJdh]r`djC)rad}rbd(hUh}rcd(h]h]h]h]h]uh j]dh]rddj9,)red}rfd(hUh}rgd(U anchornameU!#master-side-slavebuilder-methodsUrefurijh]h]h]h]h]Uinternaluh jadh]rhdhX Master-side SlaveBuilder Methodsridrjd}rkd(hX Master-side SlaveBuilder Methodsh jedubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rld}rmd(hUh}rnd(h]h]h]h]h]uh jch]rod(jC)rpd}rqd(hUh}rrd(h]h]h]h]h]uh jldh]rsdj9,)rtd}rud(hUh}rvd(U anchornameU #commandsUrefurijh]h]h]h]h]Uinternaluh jpdh]rwdhXCommandsrxdryd}rzd(hXCommandsh jtdubah!jB,ubah!jCubj )r{d}r|d(hUh}r}d(h]h]h]h]h]uh jldh]r~dj )rd}rd(hUh}rd(h]h]h]h]h]uh j{dh]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU"#master-side-remotecommand-methodsUrefurijh]h]h]h]h]Uinternaluh jdh]rdhX!Master-Side RemoteCommand Methodsrdrd}rd(hX!Master-Side RemoteCommand Methodsh jdubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )rd}rd(hUh}rd(h]h]h]h]h]uh jch]rd(jC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU#updatesUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXUpdatesrdrd}rd(hXUpdatesh jdubah!jB,ubah!jCubj )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rd(jC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU#defined-commandsUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXDefined Commandsrdrd}rd(hXDefined Commandsh jdubah!jB,ubah!jCubj )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rd(j )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU#shellUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXshellrdrd}rd(hXshellh jdubah!jB,ubah!jCubah!j ubj )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU #uploadfileUrefurijh]h]h]h]h]Uinternaluh jdh]rdhX uploadFilerdrd}rd(hX uploadFileh jdubah!jB,ubah!jCubah!j ubj )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU#uploaddirectoryUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXuploadDirectoryrdrd}rd(hXuploadDirectoryh jdubah!jB,ubah!jCubah!j ubj )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU #downloadfileUrefurijh]h]h]h]h]Uinternaluh jdh]rdhX downloadFilerdrd}rd(hX downloadFileh jdubah!jB,ubah!jCubah!j ubj )rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdjC)rd}rd(hUh}rd(h]h]h]h]h]uh jdh]rdj9,)rd}rd(hUh}rd(U anchornameU#mkdirUrefurijh]h]h]h]h]Uinternaluh jdh]rdhXmkdirrdrd}rd(hXmkdirh jdubah!jB,ubah!jCubah!j ubj )rd}re(hUh}re(h]h]h]h]h]uh jdh]rejC)re}re(hUh}re(h]h]h]h]h]uh jdh]rej9,)re}re(hUh}r e(U anchornameU#rmdirUrefurijh]h]h]h]h]Uinternaluh jeh]r ehXrmdirr er e}r e(hXrmdirh jeubah!jB,ubah!jCubah!j ubj )re}re(hUh}re(h]h]h]h]h]uh jdh]rejC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#cpdirUrefurijh]h]h]h]h]Uinternaluh jeh]rehXcpdirrere}re(hXcpdirh jeubah!jB,ubah!jCubah!j ubj )re}re(hUh}re(h]h]h]h]h]uh jdh]r ejC)r!e}r"e(hUh}r#e(h]h]h]h]h]uh jeh]r$ej9,)r%e}r&e(hUh}r'e(U anchornameU#statUrefurijh]h]h]h]h]Uinternaluh j!eh]r(ehXstatr)er*e}r+e(hXstath j%eubah!jB,ubah!jCubah!j ubj )r,e}r-e(hUh}r.e(h]h]h]h]h]uh jdh]r/ejC)r0e}r1e(hUh}r2e(h]h]h]h]h]uh j,eh]r3ej9,)r4e}r5e(hUh}r6e(U anchornameU#source-commandsUrefurijh]h]h]h]h]Uinternaluh j0eh]r7ehXSource Commandsr8er9e}r:e(hXSource Commandsh j4eubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubeh!j ubeh!j1 ubeh!j ubah!j1 ubjj )r;e}rej )r?e}r@e(hUh}rAe(h]h]h]h]h]uh j;eh]rBe(jC)rCe}rDe(hUh}rEe(h]h]h]h]h]uh j?eh]rFej9,)rGe}rHe(hUh}rIe(U anchornameUUrefurijh]h]h]h]h]Uinternaluh jCeh]rJehXChange SourcesrKerLe}rMe(hjh jGeubah!jB,ubah!jCubj )rNe}rOe(hUh}rPe(h]h]h]h]h]uh j?eh]rQe(j )rRe}rSe(hUh}rTe(h]h]h]h]h]uh jNeh]rUejC)rVe}rWe(hUh}rXe(h]h]h]h]h]uh jReh]rYej9,)rZe}r[e(hUh}r\e(U anchornameU#choosing-a-change-sourceUrefurijh]h]h]h]h]Uinternaluh jVeh]r]ehXChoosing a Change Sourcer^er_e}r`e(hXChoosing a Change Sourceh jZeubah!jB,ubah!jCubah!j ubj )rae}rbe(hUh}rce(h]h]h]h]h]uh jNeh]rde(jC)ree}rfe(hUh}rge(h]h]h]h]h]uh jaeh]rhej9,)rie}rje(hUh}rke(U anchornameU#configuring-change-sourcesUrefurijh]h]h]h]h]Uinternaluh jeeh]rlehXConfiguring Change Sourcesrmerne}roe(hXConfiguring Change Sourcesh jieubah!jB,ubah!jCubj )rpe}rqe(hUh}rre(h]h]h]h]h]uh jaeh]rsej )rte}rue(hUh}rve(h]h]h]h]h]uh jpeh]rwejC)rxe}rye(hUh}rze(h]h]h]h]h]uh jteh]r{ej9,)r|e}r}e(hUh}r~e(U anchornameU#repository-and-projectUrefurijh]h]h]h]h]Uinternaluh jxeh]rehXRepository and Projectrere}re(hXRepository and Projecth j|eubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )re}re(hUh}re(h]h]h]h]h]uh jNeh]re(jC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#mail-parsing-changesourcesUrefurijh]h]h]h]h]Uinternaluh jeh]rehXMail-parsing ChangeSourcesrere}re(hXMail-parsing ChangeSourcesh jeubah!jB,ubah!jCubj )re}re(hUh}re(h]h]h]h]h]uh jeh]re(j )re}re(hUh}re(h]h]h]h]h]uh jeh]rejC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#subscribing-the-buildmasterUrefurijh]h]h]h]h]Uinternaluh jeh]rehXSubscribing the Buildmasterrere}re(hXSubscribing the Buildmasterh jeubah!jB,ubah!jCubah!j ubj )re}re(hUh}re(h]h]h]h]h]uh jeh]rejC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#using-maildirsUrefurijh]h]h]h]h]Uinternaluh jeh]rehXUsing Maildirsrere}re(hXUsing Maildirsh jeubah!jB,ubah!jCubah!j ubj )re}re(hUh}re(h]h]h]h]h]uh jeh]rejC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#parsing-email-change-messagesUrefurijh]h]h]h]h]Uinternaluh jeh]rehXParsing Email Change Messagesrere}re(hXParsing Email Change Messagesh jeubah!jB,ubah!jCubah!j ubj )re}re(hUh}re(h]h]h]h]h]uh jeh]re(jC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#cvsmaildirsourceUrefurijh]h]h]h]h]Uinternaluh jeh]rehXCVSMaildirSourcerere}re(hXCVSMaildirSourceh jeubah!jB,ubah!jCubj )re}re(hUh}re(h]h]h]h]h]uh jeh]rej )re}re(hUh}re(h]h]h]h]h]uh jeh]rejC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU.#configuration-of-cvs-and-buildbot-cvs-mail-pyUrefurijh]h]h]h]h]Uinternaluh jeh]rehX-Configuration of CVS and buildbot_cvs_mail.pyrere}re(hX-Configuration of CVS and buildbot_cvs_mail.pyh jeubah!jB,ubah!jCubah!j ubah!j1 ubeh!j ubj )re}re(hUh}re(h]h]h]h]h]uh jeh]rejC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#svncommitemailmaildirsourceUrefurijh]h]h]h]h]Uinternaluh jeh]rehXSVNCommitEmailMaildirSourcerere}re(hXSVNCommitEmailMaildirSourceh jeubah!jB,ubah!jCubah!j ubj )re}re(hUh}re(h]h]h]h]h]uh jeh]rejC)re}re(hUh}re(h]h]h]h]h]uh jeh]rej9,)re}re(hUh}re(U anchornameU#bzrlaunchpademailmaildirsourceUrefurijh]h]h]h]h]Uinternaluh jeh]rehXBzrLaunchpadEmailMaildirSourcerfrf}rf(hXBzrLaunchpadEmailMaildirSourceh jeubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubj )rf}rf(hUh}rf(h]h]h]h]h]uh jNeh]rf(jC)rf}rf(hUh}r f(h]h]h]h]h]uh jfh]r fj9,)r f}r f(hUh}r f(U anchornameU#pbchangesourceUrefurijh]h]h]h]h]Uinternaluh jfh]rfhXPBChangeSourcerfrf}rf(hXPBChangeSourceh j fubah!jB,ubah!jCubj )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rf(j )rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rf(jC)rf}rf(hUh}rf(h]h]h]h]h]uh jfh]rfj9,)rf}rf(hUh}r f(U anchornameU#mercurial-hookUrefurijh]h]h]h]h]Uinternaluh jfh]r!fhXMercurial Hookr"fr#f}r$f(hXMercurial Hookh jfubah!jB,ubah!jCubj )r%f}r&f(hUh}r'f(h]h]h]h]h]uh jfh]r(f(j )r)f}r*f(hUh}r+f(h]h]h]h]h]uh j%fh]r,fjC)r-f}r.f(hUh}r/f(h]h]h]h]h]uh j)fh]r0fj9,)r1f}r2f(hUh}r3f(U anchornameU#authenticationUrefurijh]h]h]h]h]Uinternaluh j-fh]r4fhXAuthenticationr5fr6f}r7f(hXAuthenticationh j1fubah!jB,ubah!jCubah!j ubj )r8f}r9f(hUh}r:f(h]h]h]h]h]uh j%fh]r;fjC)rf(h]h]h]h]h]uh j8fh]r?fj9,)r@f}rAf(hUh}rBf(U anchornameU #branch-typeUrefurijh]h]h]h]h]Uinternaluh jg(hUh}r?g(U anchornameU#setting-project-name-and-urlUrefurijh]h]h]h]h]Uinternaluh j9gh]r@ghXSetting Project Name and URLrAgrBg}rCg(hXSetting Project Name and URLrDgh j=gubah!jB,ubah!jCubah!j ubj )rEg}rFg(hUh}rGg(h]h]h]h]h]uh j!gh]rHgjC)rIg}rJg(hUh}rKg(h]h]h]h]h]uh jEgh]rLgj9,)rMg}rNg(hUh}rOg(U anchornameU#configuration-errorsUrefurijh]h]h]h]h]Uinternaluh jIgh]rPghXConfiguration ErrorsrQgrRg}rSg(hXConfiguration ErrorsrTgh jMgubah!jB,ubah!jCubah!j ubj )rUg}rVg(hUh}rWg(h]h]h]h]h]uh j!gh]rXgjC)rYg}rZg(hUh}r[g(h]h]h]h]h]uh jUgh]r\gj9,)r]g}r^g(hUh}r_g(U anchornameU#your-first-buildUrefurijh]h]h]h]h]Uinternaluh jYgh]r`ghXYour First Buildragrbg}rcg(hXYour First Buildrdgh j]gubah!jB,ubah!jCubah!j ubj )reg}rfg(hUh}rgg(h]h]h]h]h]uh j!gh]rhgjC)rig}rjg(hUh}rkg(h]h]h]h]h]uh jegh]rlgj9,)rmg}rng(hUh}rog(U anchornameU#enabling-the-irc-botUrefurijh]h]h]h]h]Uinternaluh jigh]rpghXEnabling the IRC Botrqgrrg}rsg(hXEnabling the IRC Botrtgh jmgubah!jB,ubah!jCubah!j ubj )rug}rvg(hUh}rwg(h]h]h]h]h]uh j!gh]rxgjC)ryg}rzg(hUh}r{g(h]h]h]h]h]uh jugh]r|gj9,)r}g}r~g(hUh}rg(U anchornameU#setting-authorized-web-usersUrefurijh]h]h]h]h]Uinternaluh jygh]rghXSetting Authorized Web Usersrgrg}rg(hXSetting Authorized Web Usersrgh j}gubah!jB,ubah!jCubah!j ubj )rg}rg(hUh}rg(h]h]h]h]h]uh j!gh]rgjC)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj9,)rg}rg(hUh}rg(U anchornameU#debugging-with-manholeUrefurijh]h]h]h]h]Uinternaluh jgh]rghXDebugging with Manholergrg}rg(hXDebugging with Manholergh jgubah!jB,ubah!jCubah!j ubj )rg}rg(hUh}rg(h]h]h]h]h]uh j!gh]rgjC)rg}rg(hUh}rg(h]h]h]h]h]uh jgh]rgj9,)rg}rg(hUh}rg(U anchornameU#adding-a-try-schedulerUrefurijh]h]h]h]h]Uinternaluh jgh]rghXAdding a 'try' schedulerrgrg}rg(hXAdding a 'try' schedulerrgh jgubah!jB,ubah!jCubah!j ubeh!j1 ubeh!j ubah!j1 ubuU indexentriesrg}rg(h ]rg((UsingleXBuildmaster Config; slavesjjtrg(UsingleXslaves (Buildmaster Config)jjtrg(j+XProperties; from buildslaveUindex-0Utrg(j+X"Build Slaves; limiting concurrencyUindex-1Utrg(j+XBuildSlaves; latentUindex-2Utrg(j+XAWS EC2Uindex-3rgUtrg(j+XBuildSlaves; AWS EC2jgUtrg(j+XlibvirtUindex-4rgUtrg(j+XBuildSlaves; libvirtjgUtrgeh#]h,]rg((j+X3RemoteCommand (class in buildbot.process.buildstep)jiUtrg(j+X;active (buildbot.process.buildstep.RemoteCommand attribute)jLUtrg(j+X7run() (buildbot.process.buildstep.RemoteCommand method)jUtrg(j+X=interrupt() (buildbot.process.buildstep.RemoteCommand method)jzUtrg(j+X;results() (buildbot.process.buildstep.RemoteCommand method)jUtrg(j+X;didFail() (buildbot.process.buildstep.RemoteCommand method)jUtrg(j+XAremote_update() (buildbot.process.buildstep.RemoteCommand method)jUtrg(j+XCremote_complete() (buildbot.process.buildstep.RemoteCommand method)j Utrg(j+X@remoteUpdate() (buildbot.process.buildstep.RemoteCommand method)jaUtrg(j+XBremoteComplete() (buildbot.process.buildstep.RemoteCommand method)jDUtrg(j+X9logs (buildbot.process.buildstep.RemoteCommand attribute)jUtrg(j+X7rc (buildbot.process.buildstep.RemoteCommand attribute)jUtrg(j+X;stdout (buildbot.process.buildstep.RemoteCommand attribute)j~Utrg(j+X:useLog() (buildbot.process.buildstep.RemoteCommand method)jLUtrg(j+XAuseLogDelayed() (buildbot.process.buildstep.RemoteCommand method)jUtrg(j+X=addStdout() (buildbot.process.buildstep.RemoteCommand method)jUtrg(j+X=addStderr() (buildbot.process.buildstep.RemoteCommand method)jyUtrg(j+X=addHeader() (buildbot.process.buildstep.RemoteCommand method)j:Utrg(j+X<addToLog() (buildbot.process.buildstep.RemoteCommand method)jUtrg(j+X8RemoteShellCommand (class in buildbot.process.buildstep)jUtrgeh5]h>]hG]hP]rg((j+XProperties; IPropertiesUindex-0Utrg(j+X getProperty()jUtrg(j+X hasProperty()jqUtrg(j+X setProperty()jUtrg(j+XgetProperties()jUtrgehY]hb]rg(jX jY j j j j jE jF j j je&jf&j j j j jxjyjjjjjjjyjzjDjEjjehk]ht]h}]h]rg((j+X PropertiesUindex-0Utrg(j+XProperties; Common PropertiesUindex-1Utrg(j+XProperties; got_revisionUindex-2Utrg(j+XProperties; buildernameUindex-3Utrg(j+XProperties; buildnumberUindex-4Utrg(j+XProperties; slavenameUindex-5Utrg(j+XProperties; schedulerUindex-6Utrg(j+XProperties; workdirUindex-7Utrg(j+XProperties; branchUindex-8Utrg(j+XProperties; PropertyUindex-9Utrg(j+XProperties; InterpolateUindex-10Utrg(j+XProperties; RendererUindex-11Utrg(j+XProperties; WithPropertiesUindex-12Utrg(j+Xunsupported format characterUindex-13Utrgeh]rg((UsingleXBuildmaster Config; dbjjtrg(UsingleXdb (Buildmaster Config)jjtrg(UsingleXBuildmaster Config; db_urljjtrg(UsingleXdb_url (Buildmaster Config)jjtrg(UsingleX$Buildmaster Config; db_poll_intervaljjtrg(UsingleX%db_poll_interval (Buildmaster Config)jjtrg(j+XSQLiteUindex-0Utrg(j+XMySQLUindex-1Utrg(j+XPostgresUindex-2Utrg(UsingleXBuildmaster Config; multiMasterjjtrg(UsingleX multiMaster (Buildmaster Config)jjtrg(UsingleXBuildmaster Config; buildbotURLjjtrg(UsingleX buildbotURL (Buildmaster Config)jjtrg(UsingleXBuildmaster Config; titleURLjjtrg(UsingleXtitleURL (Buildmaster Config)jjtrg(UsingleXBuildmaster Config; titlejjtrg(UsingleXtitle (Buildmaster Config)jjtrg(UsingleX'Buildmaster Config; logCompressionLimitjjtrg(UsingleX(logCompressionLimit (Buildmaster Config)jjtrg(UsingleX(Buildmaster Config; logCompressionMethodjjtrg(UsingleX)logCompressionMethod (Buildmaster Config)jjtrg(UsingleXBuildmaster Config; logMaxSizejjtrg(UsingleXlogMaxSize (Buildmaster Config)jjtrg(UsingleX"Buildmaster Config; logMaxTailSizejjtrg(UsingleX#logMaxTailSize (Buildmaster Config)jjtrg(UsingleX!Buildmaster Config; changeHorizonjjtrg(UsingleX"changeHorizon (Buildmaster Config)jjtrg(UsingleX Buildmaster Config; buildHorizonjjtrg(UsingleX!buildHorizon (Buildmaster Config)jjtrg(UsingleX Buildmaster Config; eventHorizonjjtrg(UsingleX!eventHorizon (Buildmaster Config)jjtrg(UsingleXBuildmaster Config; logHorizonjjtrg(UsingleXlogHorizon (Buildmaster Config)jjtrg(UsingleXBuildmaster Config; cachesjjtrh(UsingleXcaches (Buildmaster Config)jjtrh(UsingleX#Buildmaster Config; changeCacheSizejjtrh(UsingleX$changeCacheSize (Buildmaster Config)jjtrh(UsingleX"Buildmaster Config; buildCacheSizejjtrh(UsingleX#buildCacheSize (Buildmaster Config)jjtrh(UsingleX!Buildmaster Config; mergeRequestsjjtrh(UsingleX"mergeRequests (Buildmaster Config)jjtrh(j+XBuilds; mergingUindex-3Utrh(j+XBuilders; priorityUindex-4Utr h(UsingleX&Buildmaster Config; prioritizeBuildersjjtr h(UsingleX'prioritizeBuilders (Buildmaster Config)jjtr h(UsingleX Buildmaster Config; slavePortnumjjtr h(UsingleX!slavePortnum (Buildmaster Config)jjtr h(j+XProperties; globalUindex-5Utrh(UsingleXBuildmaster Config; propertiesjjtrh(UsingleXproperties (Buildmaster Config)jjtrh(UsingleX!Buildmaster Config; debugPasswordjjtrh(UsingleX"debugPassword (Buildmaster Config)jjtrh(j+XManholeUindex-6Utrh(UsingleXBuildmaster Config; manholejjtrh(UsingleXmanhole (Buildmaster Config)jjtrh(UsingleXBuildmaster Config; metricsjjtrh(UsingleXmetrics (Buildmaster Config)jjtrh(UsingleX!Buildmaster Config; user_managersjjtrh(UsingleX"user_managers (Buildmaster Config)jjtrh(UsingleXBuildmaster Config; validationjjtrh(UsingleXvalidation (Buildmaster Config)jjtrh(UsingleXBuildmaster Config; revlinkjjtrh(UsingleXrevlink (Buildmaster Config)jjtrh(UsingleX%Buildmaster Config; codebaseGeneratorjjtrh(UsingleX&codebaseGenerator (Buildmaster Config)jjtrheh]h]r h((j+X buildbot.status.results (module)Xmodule-buildbot.status.resultsUtr!h(j+X+SUCCESS (in module buildbot.status.results)j Utr"h(j+X,WARNINGS (in module buildbot.status.results)jUtr#h(j+X+FAILURE (in module buildbot.status.results)j}Utr$h(j+X+SKIPPED (in module buildbot.status.results)j@Utr%h(j+X-EXCEPTION (in module buildbot.status.results)jUtr&h(j+X)RETRY (in module buildbot.status.results)jUtr'h(j+X+Results (in module buildbot.status.results)jUtr(h(j+X2worst_status() (in module buildbot.status.results)j*Utr)heh]h]r*h((j+XProperties; IRenderableUindex-0Utr+h(j+XgetRenderingFor()jUtr,heh]h]h]r-h((j+X&buildbot.schedulers.forceshed (module)X$module-buildbot.schedulers.forceshedUtr.h(j+X6BaseParameter (class in buildbot.schedulers.forceshed)jAUtr/h(j+XDgetFromKwargs() (buildbot.schedulers.forceshed.BaseParameter method)jYUtr0h(j+XGupdateFromKwargs() (buildbot.schedulers.forceshed.BaseParameter method)jUtr1h(j+X<name (buildbot.schedulers.forceshed.BaseParameter attribute)jUtr2h(j+X=label (buildbot.schedulers.forceshed.BaseParameter attribute)jUtr3h(j+X?fullName() (buildbot.schedulers.forceshed.BaseParameter method)jUtr4h(j+X<type (buildbot.schedulers.forceshed.BaseParameter attribute)jUtr5h(j+X?default (buildbot.schedulers.forceshed.BaseParameter attribute)j"Utr6h(j+X@required (buildbot.schedulers.forceshed.BaseParameter attribute)jUtr7h(j+X@multiple (buildbot.schedulers.forceshed.BaseParameter attribute)jUtr8h(j+X=regex (buildbot.schedulers.forceshed.BaseParameter attribute)jUtr9h(j+XFparse_from_args() (buildbot.schedulers.forceshed.BaseParameter method)jUtr:h(j+XEparse_from_arg() (buildbot.schedulers.forceshed.BaseParameter method)jUtr;heh]h]h]rhUtr?h(j+XBuild Factory; GNUAutoconfj>hUtr@h(j+X5buildbot.process.factory.GNUAutoconf (built-in class)jUtrAh(j+XBasicBuildFactoryUindex-2rBhUtrCh(j+X Build Factory; BasicBuildFactoryjBhUtrDh(j+X;buildbot.process.factory.BasicBuildFactory (built-in class)jAUtrEh(j+XBasicSVNUindex-3rFhUtrGh(j+XBuild Factory; BasicSVNjFhUtrHh(j+X2buildbot.process.factory.BasicSVN (built-in class)jUtrIh(j+XQuickBuildFactoryUindex-4rJhUtrKh(j+X Build Factory; QuickBuildFactoryjJhUtrLh(j+X;buildbot.process.factory.QuickBuildFactory (built-in class)jUtrMh(j+XCPANUindex-5rNhUtrOh(j+XBuild Factory; CPANjNhUtrPh(j+X.buildbot.process.factory.CPAN (built-in class)jUtrQh(j+X DistutilsUindex-6rRhUtrSh(j+XBuild Factory; DistutilsjRhUtrTh(j+X3buildbot.process.factory.Distutils (built-in class)j@UtrUh(j+XTrialUindex-7rVhUtrWh(j+XBuild Factory; TrialjVhUtrXh(j+X/buildbot.process.factory.Trial (built-in class)jKUtrYh(j+X PYTHONPATHUindex-8rZhUtr[h(j+X environment variable; PYTHONPATHjZhUtr\heh]r]h((j+Xbuildbot.util (module)Xmodule-buildbot.utilUtr^h(j+X'naturalSort() (in module buildbot.util)j(Utr_h(j+X*formatInterval() (in module buildbot.util)jUtr`h(j+X(ComparableMixin (class in buildbot.util)j?Utrah(j+X)safeTranslate() (in module buildbot.util)jUtrbh(j+X*epoch2datetime() (in module buildbot.util)jkUtrch(j+X*datetime2epoch() (in module buildbot.util)jBUtrdh(j+XUTC (in module buildbot.util)j+Utreh(j+X$diffSets() (in module buildbot.util)jNUtrfh(j+X$makeList() (in module buildbot.util)jUtrgh(j+Xnow() (in module buildbot.util)jJUtrhh(j+X#flatten() (in module buildbot.util)jUtrih(j+X'none_or_str() (in module buildbot.util)jjUtrjh(j+X$NotABranch (in module buildbot.util)jUtrkh(j+X&in_reactor() (in module buildbot.util)j|Utrlh(j+Xbuildbot.util.lru (module)Xmodule-buildbot.util.lruUtrmh(j+X"hits (in module buildbot.util.lru)jhUtrnh(j+X%refhits (in module buildbot.util.lru)jUtroh(j+X$misses (in module buildbot.util.lru)j6Utrph(j+X&max_size (in module buildbot.util.lru)jUtrqh(j+X#get() (in module buildbot.util.lru)jUtrrh(j+X#put() (in module buildbot.util.lru)j`Utrsh(j+X#inv() (in module buildbot.util.lru)j4Utrth(j+X$buildbot.util.bbcollections (module)X"module-buildbot.util.bbcollectionsUtruh(j+X%Python Enhancement Proposals; PEP 328Uindex-0Utrvh(j+X2defaultdict (class in buildbot.util.bbcollections)j=Utrwh(j+X0KeyedSets (class in buildbot.util.bbcollections)j8Utrxh(j+Xbuildbot.util.eventual (module)Xmodule-buildbot.util.eventualUtryh(j+X/eventually() (in module buildbot.util.eventual)jUtrzh(j+X3fireEventually() (in module buildbot.util.eventual)jUtr{h(j+X7flushEventualQueue() (in module buildbot.util.eventual)j0Utr|h(j+Xbuildbot.util.json (module)Xmodule-buildbot.util.jsonUtr}h(j+Xbuildbot.util.maildir (module)Xmodule-buildbot.util.maildirUtr~h(j+X/MaildirService (class in buildbot.util.maildir)j.Utrh(j+X:setBasedir() (buildbot.util.maildir.MaildirService method)jUtrh(j+X?messageReceived() (buildbot.util.maildir.MaildirService method)j7Utrh(j+X<moveToCurDir() (buildbot.util.maildir.MaildirService method)jUtrh(j+Xbuildbot.util.misc (module)Xmodule-buildbot.util.miscUtrh(j+X/deferredLocked() (in module buildbot.util.misc)jUtrh(j+X2SerializedInvocation (class in buildbot.util.misc)jsUtrh(j+X!buildbot.util.netstrings (module)Xmodule-buildbot.util.netstringsUtrh(j+X3NetstringParser (class in buildbot.util.netstrings)jUtrh(j+X8feed() (buildbot.util.netstrings.NetstringParser method)j Utrh(j+X<strings (buildbot.util.netstrings.NetstringParser attribute)jIUtrh(j+Xbuildbot.util.sautils (module)Xmodule-buildbot.util.sautilsUtrh(j+X1InsertFromSelect (class in buildbot.util.sautils)jUtrh(j+X.sa_version() (in module buildbot.util.sautils)jUtrh(j+Xbuildbot.util.state (module)Xmodule-buildbot.util.stateUtrh(j+X)StateMixin (class in buildbot.util.state)jUtrh(j+X/name (buildbot.util.state.StateMixin attribute)j;Utrh(j+X1master (buildbot.util.state.StateMixin attribute)jUtrh(j+X2getState() (buildbot.util.state.StateMixin method)jUtrh(j+X2getState() (buildbot.util.state.StateMixin method)X'buildbot.util.state.StateMixin.getStateUtrheh]j]j ]rh((j+XPATHrhUindex-0rhUtrh(j+Xenvironment variable; PATHjhUtrh(UpairrhX;buildslave-create-slave command line option; --no-logrotatej]Utrh(jhX5buildslave-create-slave command line option; --useptyj_Utrh(jhX4buildslave-create-slave command line option; --umaskjUUtrh(jhX8buildslave-create-slave command line option; --keepalivejYUtrh(jhX7buildslave-create-slave command line option; --maxdelayjWUtrh(jhX7buildslave-create-slave command line option; --log-sizejQUtrh(jhX8buildslave-create-slave command line option; --log-countjSUtrh(jhX=buildslave-create-slave command line option; --allow-shutdownj[Utrh(j+XPATHrhUindex-1rhUtrh(j+Xenvironment variable; PATHjhUtrh(j+XPATHrhUindex-2rhUtrh(j+Xenvironment variable; PATHjhUtrh(j+X PYTHONPATHrhUindex-3rhUtrh(j+X environment variable; PYTHONPATHjhUtrh(j+XHOMErhUindex-4rhUtrh(j+Xenvironment variable; HOMEjhUtrh(j+XPATHrhUindex-5rhUtrh(j+Xenvironment variable; PATHjhUtrh(j+X PYTHONPATHrhUindex-6rhUtrh(j+X environment variable; PYTHONPATHjhUtrh(j+X PYTHONPATHrhUindex-7rhUtrh(j+X environment variable; PYTHONPATHjhUtrhej]j]rh((UsingleXBuildmaster Config; schedulersjjtrh(UsingleXschedulers (Buildmaster Config)jjtrh(j+XProperties; from schedulerUindex-0Utrh(UsingleX!Schedulers; SingleBranchSchedulerjjtrh(UsingleXSingleBranchScheduler Schedulerjjtrh(UsingleXSchedulers; Schedulerjjtrh(UsingleXScheduler Schedulerjjtrh(UsingleXSchedulers; AnyBranchSchedulerjjtrh(UsingleXAnyBranchScheduler Schedulerjjtrh(UsingleXSchedulers; Dependentjjtrh(UsingleXDependent Schedulerjjtrh(UsingleXSchedulers; Periodicjjtrh(UsingleXPeriodic Schedulerjjtrh(UsingleXSchedulers; Nightlyjjtrh(UsingleXNightly Schedulerjjtrh(UsingleXSchedulers; Try_Jobdirjjtrh(UsingleXTry_Jobdir Schedulerjjtrh(UsingleXSchedulers; Try_Userpassjjtrh(UsingleXTry_Userpass Schedulerjjtrh(UsingleXSchedulers; Triggerablejjtrh(UsingleXTriggerable Schedulerjjtrh(j+XTriggersUindex-1Utrh(UsingleXSchedulers; NightlyTriggerablejjtrh(UsingleXNightlyTriggerable Schedulerjjtrh(j+X=buildbot.schedulers.timed.NightlyTriggerable (built-in class)j7Utrh(UsingleXSchedulers; ForceSchedulerjjtrh(UsingleXForceScheduler Schedulerjjtrh(j+X Forced BuildsUindex-2Utrh(UsingleX!Schedulers; ChoiceStringParameterjjtrh(UsingleXChoiceStringParameter Schedulerjjtrh(UsingleX!Schedulers; InheritBuildParameterjjtrh(UsingleXInheritBuildParameter Schedulerjjtrh(UsingleX%Schedulers; BuildslaveChoiceParameterjjtrh(UsingleX#BuildslaveChoiceParameter Schedulerjjtrhej(]rh((j+Xbuildbot.config (module)Xmodule-buildbot.configUtrh(j+X'MasterConfig (class in buildbot.config)jUtrh(j+X.title (buildbot.config.MasterConfig attribute)jUtrh(j+X1titleURL (buildbot.config.MasterConfig attribute)jUtrh(j+X4buildbotURL (buildbot.config.MasterConfig attribute)jUtrh(j+X6changeHorizon (buildbot.config.MasterConfig attribute)jUtrh(j+X5eventHorizon (buildbot.config.MasterConfig attribute)jUtrh(j+X3logHorizon (buildbot.config.MasterConfig attribute)j,Utrh(j+X5buildHorizon (buildbot.config.MasterConfig attribute)jUtrh(j+X<logCompressionLimit (buildbot.config.MasterConfig attribute)jQUtrh(j+X=logCompressionMethod (buildbot.config.MasterConfig attribute)jUtrh(j+X3logMaxSize (buildbot.config.MasterConfig attribute)j9Utrh(j+X7logMaxTailSize (buildbot.config.MasterConfig attribute)jUtrh(j+X3properties (buildbot.config.MasterConfig attribute)jUtrh(j+X6mergeRequests (buildbot.config.MasterConfig attribute)jUtrh(j+X;prioritizeBuilders (buildbot.config.MasterConfig attribute)jKUtrh(j+X:codebaseGenerator (buildbot.config.MasterConfig attribute)j<Utrh(j+X5slavePortnum (buildbot.config.MasterConfig attribute)jUtrh(j+X4multiMaster (buildbot.config.MasterConfig attribute)jUtrh(j+X6debugPassword (buildbot.config.MasterConfig attribute)jSUtrh(j+X0manhole (buildbot.config.MasterConfig attribute)jUtrh(j+X3validation (buildbot.config.MasterConfig attribute)jGUtrh(j+X+db (buildbot.config.MasterConfig attribute)jUtrh(j+X0metrics (buildbot.config.MasterConfig attribute)jEUtrh(j+X/caches (buildbot.config.MasterConfig attribute)j\Utrh(j+X3schedulers (buildbot.config.MasterConfig attribute)j*Utrh(j+X1builders (buildbot.config.MasterConfig attribute)j[Utrh(j+X/slaves (buildbot.config.MasterConfig attribute)jUtrh(j+X7change_sources (buildbot.config.MasterConfig attribute)jUtrh(j+X/status (buildbot.config.MasterConfig attribute)jFUtrh(j+X6user_managers (buildbot.config.MasterConfig attribute)jUtrh(j+X8loadConfig() (buildbot.config.MasterConfig class method)jVUtri(j+X(BuilderConfig (class in buildbot.config)jNUtri(j+X.name (buildbot.config.BuilderConfig attribute)jUtri(j+X1factory (buildbot.config.BuilderConfig attribute)jrUtri(j+X4slavenames (buildbot.config.BuilderConfig attribute)j$Utri(j+X2builddir (buildbot.config.BuilderConfig attribute)j.Utri(j+X7slavebuilddir (buildbot.config.BuilderConfig attribute)j/Utri(j+X2category (buildbot.config.BuilderConfig attribute)jUtri(j+X3nextSlave (buildbot.config.BuilderConfig attribute)jUtri(j+X3nextBuild (buildbot.config.BuilderConfig attribute)jUtr i(j+X7canStartBuild (buildbot.config.BuilderConfig attribute)jCUtr i(j+X/locks (buildbot.config.BuilderConfig attribute)j Utr i(j+X-env (buildbot.config.BuilderConfig attribute)jUtr i(j+X4properties (buildbot.config.BuilderConfig attribute)jUtr i(j+X7mergeRequests (buildbot.config.BuilderConfig attribute)j(Utri(j+X5description (buildbot.config.BuilderConfig attribute)j,Utri(j+X#error() (in module buildbot.config)jUtri(j+X ConfigErrorsj'Utri(j+X/errors (buildbot.config.ConfigErrors attribute)jUtri(j+X0addError() (buildbot.config.ConfigErrors method)jUtri(j+X5ReconfigurableServiceMixin (class in buildbot.config)jWUtri(j+XEreconfigService() (buildbot.config.ReconfigurableServiceMixin method)jgUtri(j+X?priority (buildbot.config.ReconfigurableServiceMixin attribute)jUtriej1]j:]ri((UsingleXBuildmaster Config; statusjjtri(UsingleXstatus (Buildmaster Config)jjtri(UsingleXStatus Targets; WebStatusjyjytri(UsingleXWebStatus Status Targetjyjytri(j+X6buildbot.status.web.baseweb.WebStatus (built-in class)j+Utri(UsingleXStatus Targets; MailNotifierj~j~tri(UsingleXMailNotifier Status Targetj~j~tri(j+Xemail; MailNotifierUindex-0Utri(j+X2buildbot.status.mail.MailNotifier (built-in class)jUtr i(UsingleXStatus Targets; IRCjzjztr!i(UsingleXIRC Status Targetjzjztr"i(j+XIRCUindex-1Utr#i(j+X*buildbot.status.words.IRC (built-in class)jUtr$i(j+XProperties; from forced buildUindex-2Utr%i(UsingleXStatus Targets; PBListenerj|j|tr&i(UsingleXPBListener Status Targetj|j|tr'i(j+X2buildbot.status.client.PBListener (built-in class)j%Utr(i(UsingleXStatus Targets; StatusPushjjtr)i(UsingleXStatusPush Status Targetjjtr*i(j+X7buildbot.status.status_push.StatusPush (built-in class)j&Utr+i(UsingleXStatus Targets; HttpStatusPushj}j}tr,i(UsingleXHttpStatusPush Status Targetj}j}tr-i(UsingleX Status Targets; GerritStatusPushj{j{tr.i(UsingleXGerritStatusPush Status Targetj{j{tr/i(j+X?buildbot.status.status_gerrit.GerritStatusPush (built-in class)jUtr0iejC]r1i(jA.j'/j/j@;j+<j0j0j0j+j+j+j+j,j,jj,jk,ejL]jU]r2i((j+X"buildbot.db.buildrequests (module)X module-buildbot.db.buildrequestsUtr3i(jhX%BuildRequests; DB Connector ComponentUindex-0Utr4i(j+XAlreadyClaimedErrorjMUtr5i(j+XNotClaimedErrorjfUtr6i(j+XDBuildRequestsConnectorComponent (class in buildbot.db.buildrequests)j]Utr7i(j+XbrdictUindex-1r8iUtr9i(j+Xbridj8iUtr:i(j+XTgetBuildRequest() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)j!Utr;i(j+XUgetBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtri(j+XSQLite; limitationsUindex-3Utr?i(j+XYreclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jDUtr@i(j+XYunclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)j2UtrAi(j+XZcompleteBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtrBi(j+X[unclaimExpiredRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)jUtrCi(j+Xbuildbot.db.builds (module)Xmodule-buildbot.db.buildsUtrDi(jhXBuilds; DB Connector ComponentUindex-4UtrEi(j+X6BuildsConnectorComponent (class in buildbot.db.builds)j0UtrFi(j+XbdictUindex-5rGiUtrHi(j+XbidjGiUtrIi(j+X?getBuild() (buildbot.db.builds.BuildsConnectorComponent method)jUtrJi(j+XJgetBuildsForRequest() (buildbot.db.builds.BuildsConnectorComponent method)jZUtrKi(j+X?addBuild() (buildbot.db.builds.BuildsConnectorComponent method)jUtrLi(j+XCfinishBuilds() (buildbot.db.builds.BuildsConnectorComponent method)jtUtrMi(j+Xbuildbot.db.buildsets (module)Xmodule-buildbot.db.buildsetsUtrNi(jhX!Buildsets; DB Connector ComponentUindex-6UtrOi(j+X<BuildsetsConnectorComponent (class in buildbot.db.buildsets)jUtrPi(j+XbsdictUindex-7rQiUtrRi(j+XbsidjQiUtrSi(j+XHaddBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrTi(j+XMcompleteBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrUi(j+XHgetBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)j>UtrVi(j+XIgetBuildsets() (buildbot.db.buildsets.BuildsetsConnectorComponent method)j:UtrWi(j+XRgetBuildsetProperties() (buildbot.db.buildsets.BuildsetsConnectorComponent method)jUtrXi(j+Xbuildbot.db.changes (module)Xmodule-buildbot.db.changesUtrYi(jhXChanges; DB Connector ComponentUindex-8UtrZi(j+X8ChangesConnectorComponent (class in buildbot.db.changes)jUtr[i(j+XchdictUindex-9r\iUtr]i(j+Xchangeidj\iUtr^i(j+XBaddChange() (buildbot.db.changes.ChangesConnectorComponent method)jYUtr_i(j+XBgetChange() (buildbot.db.changes.ChangesConnectorComponent method)jFUtr`i(j+XFgetChangeUids() (buildbot.db.changes.ChangesConnectorComponent method)jUtrai(j+XIgetRecentChanges() (buildbot.db.changes.ChangesConnectorComponent method)jpUtrbi(j+XJgetLatestChangeid() (buildbot.db.changes.ChangesConnectorComponent method)jUtrci(j+Xbuildbot.db.schedulers (module)Xmodule-buildbot.db.schedulersUtrdi(jhX"Schedulers; DB Connector ComponentUindex-10Utrei(j+X>SchedulersConnectorComponent (class in buildbot.db.schedulers)jUtrfi(j+XobjectidUindex-11Utrgi(j+XNclassifyChanges() (buildbot.db.schedulers.SchedulersConnectorComponent method)jUtrhi(j+XWgetChangeClassifications() (buildbot.db.schedulers.SchedulersConnectorComponent method)jUtrii(j+X!buildbot.db.sourcestamps (module)Xmodule-buildbot.db.sourcestampsUtrji(jhX$SourceStamps; DB Connector ComponentUindex-12Utrki(j+XBSourceStampsConnectorComponent (class in buildbot.db.sourcestamps)jUtrli(j+XssidUindex-13rmiUtrni(j+XssdictjmiUtroi(j+XQaddSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)j Utrpi(j+XQgetSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)jUtrqi(j+XRgetSourceStamps() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)jUtrri(j+X$buildbot.db.sourcestampsets (module)X"module-buildbot.db.sourcestampsetsUtrsi(jhX'SourceStampSets; DB Connector ComponentUindex-14Utrti(j+XHSourceStampSetsConnectorComponent (class in buildbot.db.sourcestampsets)jmUtrui(j+XZaddSourceStampSet() (buildbot.db.sourcestampsets.SourceStampSetsConnectorComponent method)jCUtrvi(j+Xbuildbot.db.state (module)Xmodule-buildbot.db.stateUtrwi(jhXState; DB Connector ComponentUindex-15Utrxi(j+X4StateConnectorComponent (class in buildbot.db.state)jUtryi(j+XobjectidUindex-16rziUtr{i(j+XobjdictjziUtr|i(j+X@getObjectId() (buildbot.db.state.StateConnectorComponent method)j Utr}i(j+X=getState() (buildbot.db.state.StateConnectorComponent method)j Utr~i(j+X=setState() (buildbot.db.state.StateConnectorComponent method)jQUtri(j+Xbuildbot.db.users (module)Xmodule-buildbot.db.usersUtri(jhXUsers; DB Connector ComponentUindex-17Utri(j+X4UsersConnectorComponent (class in buildbot.db.users)j'Utri(j+XCfindUserByAttr() (buildbot.db.users.UsersConnectorComponent method)jPUtri(j+X<getUser() (buildbot.db.users.UsersConnectorComponent method)jOUtri(j+XFgetUserByUsername() (buildbot.db.users.UsersConnectorComponent method)jwUtri(j+X=getUsers() (buildbot.db.users.UsersConnectorComponent method)jUtri(j+X?updateUser() (buildbot.db.users.UsersConnectorComponent method)jUtri(j+X?removeUser() (buildbot.db.users.UsersConnectorComponent method)jRUtri(j+XDidentifierToUid() (buildbot.db.users.UsersConnectorComponent method)j/Utri(j+Xbuildbot.db.connector (module)Xmodule-buildbot.db.connectorUtri(j+X,DBConnector (class in buildbot.db.connector)jUtri(j+Xbuildbot.db.base (module)Xmodule-buildbot.db.baseUtri(j+X0DBConnectorComponent (class in buildbot.db.base)j&Utri(j+X4db (buildbot.db.base.DBConnectorComponent attribute)jUtri(j+Xbuildbot.db.pool (module)Xmodule-buildbot.db.poolUtri(j+X(DBThreadPool (class in buildbot.db.pool)j<Utri(j+X+do() (buildbot.db.pool.DBThreadPool method)jUtri(j+X7do_with_engine() (buildbot.db.pool.DBThreadPool method)j6Utri(j+Xbuildbot.db.model (module)Xmodule-buildbot.db.modelUtri(j+X"Model (class in buildbot.db.model)jVUtri(j+X,metadata (buildbot.db.model.Model attribute)j1Utri(j+X-is_current() (buildbot.db.model.Model method)jUtri(j+X*upgrade() (buildbot.db.model.Model method)jHUtri(j+X%cached() (in module buildbot.db.base)jXUtri(j+XMySQL; limitationsUindex-18Utri(j+XMySQL; limitationsUindex-19Utri(j+XSQLite; limitationsUindex-20Utri(j+XMySQL; limitationsUindex-21Utri(j+XMySQL; limitationsUindex-22Utriej^]ri((UsingleXBuildmaster Config; buildersjjtri(UsingleXbuilders (Buildmaster Config)jjtri(j+XPATHUindex-0riUtri(j+Xenvironment variable; PATHjiUtri(j+XBuilds; mergingUindex-1Utri(j+XProperties; builderUindex-2Utri(j+XBuilds; mergingUindex-3Utri(j+XBuilds; priorityUindex-4Utriejg]ri((j+XBuildstep ParameterUindex-0Utri(j+X"Buildstep Parameter; haltOnFailureUindex-1Utri(j+X$Buildstep Parameter; flunkOnWarningsUindex-2Utri(j+X#Buildstep Parameter; flunkOnFailureUindex-3Utri(j+X#Buildstep Parameter; warnOnWarningsUindex-4Utri(j+X"Buildstep Parameter; warnOnFailureUindex-5Utri(j+XBuildstep Parameter; alwaysRunUindex-6Utri(j+XBuildstep Parameter; doStepIfUindex-7Utri(j+XBuildstep Parameter; hideStepIfUindex-8Utri(j+XBuildstep Parameter; locksUindex-9Utri(j+Xbuildbot.steps.source (module)Xmodule-buildbot.steps.sourceUtri(UsingleXBuild Steps; Mercurialjjtri(UsingleXMercurial Build Stepjjtri(j+XJbuildbot.steps.source.mercurial.Mercurial (class in buildbot.steps.source)jUtri(UsingleXBuild Steps; Gitjjtri(UsingleXGit Build Stepjjtri(j+X>buildbot.steps.source.git.Git (class in buildbot.steps.source)jIUtri(UsingleXBuild Steps; SVNjjtri(UsingleXSVN Build Stepjjtri(j+X>buildbot.steps.source.svn.SVN (class in buildbot.steps.source)jUtri(UsingleXBuild Steps; CVSjjtri(UsingleXCVS Build Stepjjtri(j+X>buildbot.steps.source.cvs.CVS (class in buildbot.steps.source)jUtri(UsingleXBuild Steps; Bzrjjtri(UsingleXBzr Build Stepjjtri(j+X>buildbot.steps.source.bzr.Bzr (class in buildbot.steps.source)jJUtri(UsingleXBuild Steps; P4jjtri(UsingleX P4 Build Stepjjtri(j+X<buildbot.steps.source.p4.P4 (class in buildbot.steps.source)jHUtri(UsingleXBuild Steps; Repojjtri(UsingleXRepo Build Stepjjtri(j+X@buildbot.steps.source.repo.Repo (class in buildbot.steps.source)jBUtri(j+XWbuildbot.steps.source.repo.RepoDownloadsFromProperties (class in buildbot.steps.source)j2Utri(j+XYbuildbot.steps.source.repo.RepoDownloadsFromChangeSource (class in buildbot.steps.source)jUtri(jhX#Gerrit integration; Repo Build StepUindex-10Utri(UsingleXBuild Steps; CVS (Slave-Side)jjtri(UsingleXCVS (Slave-Side) Build Stepjjtri(UsingleXBuild Steps; SVN (Slave-Side)jjtri(UsingleXSVN (Slave-Side) Build Stepjjtri(UsingleXBuild Steps; Darcs (Slave-Side)jjtri(UsingleXDarcs (Slave-Side) Build Stepjjtri(UsingleX#Build Steps; Mercurial (Slave-Side)jjtri(UsingleX!Mercurial (Slave-Side) Build Stepjjtri(UsingleXBuild Steps; Bzr (Slave-Side)jjtri(UsingleXBzr (Slave-Side) Build Stepjjtri(UsingleXBuild Steps; P4 (Slave-Side)jjtri(UsingleXP4 (Slave-Side) Build Stepjjtri(UsingleXBuild Steps; Git (Slave-Side)jjtri(UsingleXGit (Slave-Side) Build Stepjjtri(jhX/Gerrit integration; Git (Slave-Side) Build StepUindex-11Utri(UsingleXBuild Steps; BK (Slave-Side)jjtri(UsingleXBK (Slave-Side) Build Stepjjtri(UsingleXBuild Steps; Repo (Slave-Side)jjtri(UsingleXRepo (Slave-Side) Build Stepjjtri(j+X;buildbot.steps.source.Repo (class in buildbot.steps.source)jUtri(jhX0Gerrit integration; Repo (Slave-Side) Build StepUindex-12Utri(UsingleX"Build Steps; Monotone (Slave-Side)jjtri(UsingleX Monotone (Slave-Side) Build Stepjjtri(UsingleXBuild Steps; ShellCommandjjtri(UsingleXShellCommand Build Stepjjtri(j+XBbuildbot.steps.shell.ShellCommand (class in buildbot.steps.source)jUtri(j+X PYTHONPATHUindex-13riUtri(j+X environment variable; PYTHONPATHjiUtri(j+X PYTHONPATHUindex-14riUtri(j+X environment variable; PYTHONPATHjiUtri(j+X PYTHONPATHUindex-15riUtri(j+X environment variable; PYTHONPATHjiUtri(j+XPATHUindex-16riUtri(j+Xenvironment variable; PATHjiUtri(UsingleXBuild Steps; Configurejjtri(UsingleXConfigure Build Stepjjtri(j+X?buildbot.steps.shell.Configure (class in buildbot.steps.source)jUtri(UsingleXBuild Steps; Compilejjtri(UsingleXCompile Build Stepjjtri(j+XProperties; warnings-countUindex-17Utri(j+X Visual StudioUindex-18riUtri(j+X Visual C++jiUtri(UsingleXBuild Steps; VC6jjtri(UsingleXVC6 Build Stepjjtri(UsingleXBuild Steps; VC7jjtri(UsingleXVC7 Build Stepjjtri(UsingleXBuild Steps; VC8jjtri(UsingleXVC8 Build Stepjjtrj(UsingleXBuild Steps; VC9jjtrj(UsingleXVC9 Build Stepjjtrj(UsingleXBuild Steps; VC10jjtrj(UsingleXVC10 Build Stepjjtrj(UsingleXBuild Steps; VC11jjtrj(UsingleXVC11 Build Stepjjtrj(UsingleXBuild Steps; VS2003jjtrj(UsingleXVS2003 Build Stepjjtrj(UsingleXBuild Steps; VS2005jjtr j(UsingleXVS2005 Build Stepjjtr j(UsingleXBuild Steps; VS2008jjtr j(UsingleXVS2008 Build Stepjjtr j(UsingleXBuild Steps; VS2010jjtr j(UsingleXVS2010 Build Stepjjtrj(UsingleXBuild Steps; VS2012jjtrj(UsingleXVS2012 Build Stepjjtrj(UsingleXBuild Steps; VCExpress9j j trj(UsingleXVCExpress9 Build Stepj j trj(UsingleXBuild Steps; MsBuildjjtrj(UsingleXMsBuild Build Stepjjtrj(j+XPATHUindex-19rjUtrj(j+Xenvironment variable; PATHjjUtrj(j+XINCLUDEUindex-20rjUtrj(j+Xenvironment variable; INCLUDEjjUtrj(j+XLIBUindex-21rjUtrj(j+Xenvironment variable; LIBjjUtrj(j+XPATHUindex-22rjUtrj(j+Xenvironment variable; PATHjjUtr j(UsingleXBuild Steps; Testjjtr!j(UsingleXTest Build Stepjjtr"j(UsingleXBuild Steps; TreeSizejjtr#j(UsingleXTreeSize Build Stepjjtr$j(j+XProperties; tree-size-KiBUindex-23Utr%j(UsingleXBuild Steps; PerlModuleTestj j tr&j(UsingleXPerlModuleTest Build Stepj j tr'j(UsingleXBuild Steps; MTRjjtr(j(UsingleXMTR Build Stepjjtr)j(UsingleX Build Steps; SubunitShellCommandjjtr*j(UsingleXSubunitShellCommand Build Stepjjtr+j(j+XKbuildbot.steps.subunit.SubunitShellCommand (class in buildbot.steps.source)jUUtr,j(UsingleXBuild Steps; FileExistsjjtr-j(UsingleXFileExists Build Stepjjtr.j(UsingleXBuild Steps; CopyDirectoryjjtr/j(UsingleXCopyDirectory Build Stepjjtr0j(UsingleXBuild Steps; RemoveDirectoryjjtr1j(UsingleXRemoveDirectory Build Stepjjtr2j(UsingleXBuild Steps; MakeDirectoryjjtr3j(UsingleXMakeDirectory Build Stepjjtr4j(UsingleXBuild Steps; BuildEPYDocjjtr5j(UsingleXBuildEPYDoc Build Stepjjtr6j(j+XBbuildbot.steps.python.BuildEPYDoc (class in buildbot.steps.source)jUtr7j(UsingleXBuild Steps; PyFlakesjjtr8j(UsingleXPyFlakes Build Stepjjtr9j(j+X?buildbot.steps.python.PyFlakes (class in buildbot.steps.source)jUtr:j(UsingleXBuild Steps; Sphinxjjtr;j(UsingleXSphinx Build Stepjjtrj(UsingleXPyLint Build Stepjjtr?j(UsingleXBuild Steps; Trialjjtr@j(UsingleXTrial Build StepjjtrAj(j+XDbuildbot.steps.python_twisted.Trial (class in buildbot.steps.source)jUtrBj(j+X PYTHONPATHUindex-24rCjUtrDj(j+X environment variable; PYTHONPATHjCjUtrEj(UsingleXBuild Steps; RemovePYCsjjtrFj(UsingleXRemovePYCs Build StepjjtrGj(j+XIbuildbot.steps.python_twisted.RemovePYCs (class in buildbot.steps.source)j?UtrHj(j+X File TransferUindex-25UtrIj(UsingleXBuild Steps; FileUploadjjtrJj(UsingleXFileUpload Build StepjjtrKj(UsingleXBuild Steps; FileDownloadjjtrLj(UsingleXFileDownload Build StepjjtrMj(j+XCbuildbot.steps.transfer.FileUpload (class in buildbot.steps.source)j$UtrNj(j+XEbuildbot.steps.transfer.FileDownload (class in buildbot.steps.source)jTUtrOj(UsingleXBuild Steps; DirectoryUploadjjtrPj(UsingleXDirectoryUpload Build StepjjtrQj(j+XHbuildbot.steps.transfer.DirectoryUpload (class in buildbot.steps.source)jUUtrRj(UsingleXBuild Steps; StringDownloadjjtrSj(UsingleXStringDownload Build StepjjtrTj(UsingleXBuild Steps; JSONStringDownloadjjtrUj(UsingleXJSONStringDownload Build StepjjtrVj(UsingleX#Build Steps; JSONPropertiesDownloadjjtrWj(UsingleX!JSONPropertiesDownload Build StepjjtrXj(j+XGbuildbot.steps.transfer.StringDownload (class in buildbot.steps.source)jbUtrYj(j+XKbuildbot.steps.transfer.JSONStringDownload (class in buildbot.steps.source)jUtrZj(j+XObuildbot.steps.transfer.JSONPropertiesDownload (class in buildbot.steps.source)jdUtr[j(j+X"Properties; JSONPropertiesDownloadUindex-26Utr\j(UsingleXBuild Steps; MasterShellCommandjjtr]j(UsingleXMasterShellCommand Build Stepjjtr^j(j+XIbuildbot.steps.master.MasterShellCommand (class in buildbot.steps.source)jUtr_j(j+XPATHUindex-27r`jUtraj(j+Xenvironment variable; PATHj`jUtrbj(UsingleXBuild Steps; LogRenderablejjtrcj(UsingleXLogRenderable Build Stepjjtrdj(j+XDbuildbot.steps.master.LogRenderable (class in buildbot.steps.source)jcUtrej(j+XProperties; from stepsUindex-28Utrfj(UsingleXBuild Steps; SetPropertyj j trgj(UsingleXSetProperty Build Stepj j trhj(j+XBbuildbot.steps.master.SetProperty (class in buildbot.steps.source)jUtrij(UsingleX#Build Steps; SetPropertyFromCommandjjtrjj(UsingleX!SetPropertyFromCommand Build Stepjjtrkj(j+XLbuildbot.steps.shell.SetPropertyFromCommand (class in buildbot.steps.source)jUtrlj(UsingleX!Build Steps; SetPropertiesFromEnvjjtrmj(UsingleXSetPropertiesFromEnv Build Stepjjtrnj(j+XJbuildbot.steps.slave.SetPropertiesFromEnv (class in buildbot.steps.source)j3Utroj(j+XTMPUindex-29rpjUtrqj(j+Xenvironment variable; TMPjpjUtrrj(j+X!Properties; triggering schedulersUindex-30Utrsj(UsingleXBuild Steps; Triggerjjtrtj(UsingleXTrigger Build Stepjjtruj(UsingleXBuild Steps; RpmBuildjjtrvj(UsingleXRpmBuild Build Stepjjtrwj(UsingleXBuild Steps; RpmLintjjtrxj(UsingleXRpmLint Build Stepjjtryj(UsingleXBuild Steps; MockBuildSRPMjjtrzj(UsingleXMockBuildSRPM Build Stepjjtr{j(UsingleXBuild Steps; MockRebuildjjtr|j(UsingleXMockRebuild Build Stepjjtr}j(UsingleXBuild Steps; DebPbuilderjjtr~j(UsingleXDebPbuilder Build Stepjjtrj(UsingleXBuild Steps; DebCowbuilderjjtrj(UsingleXDebCowbuilder Build Stepjjtrj(UsingleXBuild Steps; DebLintianjjtrj(UsingleXDebLintian Build Stepjjtrj(UsingleXBuild Steps; HLintjjtrj(UsingleXHLint Build Stepjjtrj(UsingleXBuild Steps; MaxQjjtrj(UsingleXMaxQ Build Stepjjtrjejp]jy]j]j]j]j]rj(j+X PropertiesUindex-0rjUtrjaj]j]rj(j+X0buildbot.status.logfile.LogFile (built-in class)jTUtrjaj]rj((j+X#buildbot.process.buildstep (module)X!module-buildbot.process.buildstepUtrj(j+X/BuildStep (class in buildbot.process.buildstep)jUtrj(j+X5name (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+X6locks (buildbot.process.buildstep.BuildStep attribute)j-Utrj(j+X@progressMetrics (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+X<useProgress (buildbot.process.buildstep.BuildStep attribute)juUtrj(j+X9doStepIf (buildbot.process.buildstep.BuildStep attribute)jSUtrj(j+X;hideStepIf (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+X>haltOnFailure (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+X@flunkOnWarnings (buildbot.process.buildstep.BuildStep attribute)jRUtrj(j+X?flunkOnFailure (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+X?warnOnWarnings (buildbot.process.buildstep.BuildStep attribute)j#Utrj(j+X>warnOnFailure (buildbot.process.buildstep.BuildStep attribute)joUtrj(j+X:alwaysRun (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+X8setBuild() (buildbot.process.buildstep.BuildStep method)jeUtrj(j+X6build (buildbot.process.buildstep.BuildStep attribute)j4Utrj(j+X=setBuildSlave() (buildbot.process.buildstep.BuildStep method)j%Utrj(j+X;buildslave (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+XAsetDefaultWorkdir() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X=setStepStatus() (buildbot.process.buildstep.BuildStep method)jWUtrj(j+X<step_status (buildbot.process.buildstep.BuildStep attribute)jUtrj(j+X=setupProgress() (buildbot.process.buildstep.BuildStep method)j)Utrj(j+X9progress (buildbot.process.buildstep.BuildStep attribute)jMUtrj(j+X9startStep() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X5start() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X8finished() (buildbot.process.buildstep.BuildStep method)j;Utrj(j+X6failed() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X9interrupt() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X8stopped (buildbot.process.buildstep.BuildStep attribute)jOUtrj(j+X8describe() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X;setProgress() (buildbot.process.buildstep.BuildStep method)j#Utrj(j+X<slaveVersion() (buildbot.process.buildstep.BuildStep method)j-Utrj(j+XGslaveVersionIsOlderThan() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X<getSlaveName() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X:runCommand() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X6addURL() (buildbot.process.buildstep.BuildStep method)jnUtrj(j+X6addLog() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X6getLog() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X>addCompleteLog() (buildbot.process.buildstep.BuildStep method)j9Utrj(j+X:addHTMLLog() (buildbot.process.buildstep.BuildStep method)jUtrj(j+X>addLogObserver() (buildbot.process.buildstep.BuildStep method)jlUtrj(j+X6LoggingBuildStep (class in buildbot.process.buildstep)jUtrj(j+X@logfiles (buildbot.process.buildstep.LoggingBuildStep attribute)jUtrj(j+XCstartCommand() (buildbot.process.buildstep.LoggingBuildStep method)j"Utrj(j+XFcommandComplete() (buildbot.process.buildstep.LoggingBuildStep method)jUtrj(j+XDcreateSummary() (buildbot.process.buildstep.LoggingBuildStep method)jUtrj(j+XFevaluateCommand() (buildbot.process.buildstep.LoggingBuildStep method)jUtrj(j+X>getText() (buildbot.process.buildstep.LoggingBuildStep method)j1Utrj(j+X?getText2() (buildbot.process.buildstep.LoggingBuildStep method)jUtrj(j+XBuildStepFailedj8Utrjej]j]rj((j+XChange SourcesUindex-0Utrj(UsingleX!Buildmaster Config; change_sourcejjtrj(UsingleX"change_source (Buildmaster Config)jjtrj(UsingleX Change Sources; CVSMaildirSourcejvjvtrj(UsingleXCVSMaildirSource Change Sourcejvjvtrj(j+X7buildbot.changes.mail.CVSMaildirSource (built-in class)jUtrj(UsingleX+Change Sources; SVNCommitEmailMaildirSourcejtjttrj(UsingleX)SVNCommitEmailMaildirSource Change Sourcejtjttrj(j+XBbuildbot.changes.mail.SVNCommitEmailMaildirSource (built-in class)jUtrj(UsingleX.Change Sources; BzrLaunchpadEmailMaildirSourcejljltrj(UsingleX,BzrLaunchpadEmailMaildirSource Change Sourcejljltrj(j+XEbuildbot.changes.mail.BzrLaunchpadEmailMaildirSource (built-in class)jUtrj(UsingleXChange Sources; PBChangeSourcejnjntrj(UsingleXPBChangeSource Change Sourcejnjntrj(j+X3buildbot.changes.pb.PBChangeSource (built-in class)jUtrj(UsingleXChange Sources; P4Sourcejujutrj(UsingleXP4Source Change Sourcejujutrj(j+XP4PORTUindex-1rjUtrj(j+Xenvironment variable; P4PORTjjUtrj(j+XP4USERUindex-2rjUtrj(j+Xenvironment variable; P4USERjjUtrj(j+XP4PASSWDUindex-3rjUtrj(j+Xenvironment variable; P4PASSWDjjUtrj(UsingleXChange Sources; BonsaiPollerjkjktrj(UsingleXBonsaiPoller Change Sourcejkjktrj(UsingleXChange Sources; SVNPollerjsjstrj(UsingleXSVNPoller Change Sourcejsjstrj(j+X5buildbot.changes.svnpoller.SVNPoller (built-in class)jUtrj(j+XPATHUindex-4rjUtrj(j+Xenvironment variable; PATHjjUtrj(UsingleXChange Sources; BzrPollerjjjjtrj(UsingleXBzrPoller Change Sourcejjjjtrj(UsingleXChange Sources; GitPollerjqjqtrj(UsingleXGitPoller Change Sourcejqjqtrj(UsingleXChange Sources; HgPollerjmjmtrj(UsingleXHgPoller Change Sourcejmjmtrj(UsingleX"Change Sources; GerritChangeSourcejrjrtrj(UsingleX GerritChangeSource Change Sourcejrjrtrj(j+XGbuildbot.changes.gerritchangesource.GerritChangeSource (built-in class)j!Utrj(j+X#Properties; from GerritChangeSourceUindex-5Utrj(UsingleXChange Sources; Change Hooksjpjptrj(UsingleXChange Hooks Change Sourcejpjptrj(UsingleX$Change Sources; GoogleCodeAtomPollerjojotrj(UsingleX"GoogleCodeAtomPoller Change Sourcejojotrjej]uUall_docsrj}rj(h GAʾEwh#GAʾFAh,GAʾE,h5GAʾFh>GAʾEC4LhGGAʾF'hPGAʾD?hYGAʾF]FhbGAʾFnhkGAʾD2/htGAʾFRh}GAʾFӐ\hGAʾF"]hGAʾFM+hGAʾF?hGAʾERlLhGAʾEmrhGAʾDhGAʾEU>lhGAʾEP%hGAʾD7hGAʾEFP]hGAʾFhGAʾE{ylhGAʾEhhGAʾEDSjGAʾFj GAʾF]jGAʾFˑjGAʾF6Ij(GAʾEPj1GAʾEkJj:GAʾFOjCGAʾFjLGAʾFnjUGAʾE9Rj^GAʾEqijgGAʾE`BjpGAʾFjyGAʾEBI,jGAʾFήOjGAʾEZ4jGAʾD(jGAʾFjGAʾFSjGAʾECjGAʾDejGAʾEN!qjGAʾFjGAʾF؁buj}rj(jjjKjjj j jjcsphinx.util.nodes WarningStream rj)rj}rj(U_rerjcre _compile rjU+\((DEBUG|INFO|WARNING|ERROR|SEVERE)/[0-4]\)rjKRrjUwarnfuncrjNubjhjjjjjjuUfiles_to_rebuildrj}rj(jBh]rjjaRrjjBh]rkjaRrkjrh]rkjaRrkjBh]rkjaRrkjBh]rkhaRrkjBh]rkjaRr kjzh]r kjaRr kjCh]r kjpaRr kjBh]rkhaRrkjph]rkjaRrkjBh]rkjpaRrkjBh]rkhGaRrkjBh]rkjaRrkjBh]rkjaRrkjCh]rkjpaRrkjBh]rkhaRrkjBh]rkhaRrkjxh]r kjaRr!kjvh]r"kjaRr#kjBh]r$khaRr%kjCh]r&kh}aRr'kjBh]r(kjaRr)kjBh]r*khaRr+kjBh]r,khaRr-kjBh]r.khaRr/kjBh]r0kjpaRr1kjBh]r2khaRr3kjBh]r4kjaRr5kjBh]r6khaRr7kjBh]r8khaRr9kjBh]r:khaRr;kjBh]rkjpaRr?kjBh]r@kjaRrAkjBh]rBkhaRrCkjBh]rDkjaRrEkjBh]rFkjaRrGkjCh]rHkjpaRrIkjBh]rJkhaRrKkjBh]rLkhGaRrMkjBh]rNkhaRrOkjBh]rPkhaRrQkjBh]rRkjpaRrSkjBh]rTkjpaRrUkjBh]rVkhaRrWkjth]rXkjaRrYkjBh]rZkhaRr[kjBh]r\kjaRr]kjBh]r^khGaRr_kuUtoc_secnumbersr`k}U_nitpick_ignorerakh]Rrbkub.PKJtD11'buildbot-v0.8.8/.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.8/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.8q=q>}q?(hU0.8.8q@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.8/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.PKJtDqq3buildbot-v0.8.8/.doctrees/manual/cfg-global.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XsqliteqNXinput-validationqXprioritizing buildersqNXmysqlq NXglobal configurationq NX debug optionsq NX log handlingq NXdatabase specificationq NXrevision 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 linksqNXhorizonsq 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.(hUsqliteq/hUinput-validationq0hUid3q1h Umysqlq2h Uglobal-configurationq3h Uid5q4h U log-handlingq5h Uid1q6hUrevision-link-helpersq7hUcodebase-generatorq8hUmulti-master-modeq9hUid7q:hUprioritizing-buildersq;hUsite-definitionsqhUid4q?hU using-manholeq@hUdatabase-specificationqAhUdefining-global-propertiesqBhU data-lifetimeqChUmanholeqDhUmetrics-optionsqEhUid6qFhU debug-optionsqGhUrevision-linksqHh UhorizonsqIh!Uid2qJh"Usetting-the-pb-port-for-slavesqKh#U twistedconchqLh$U users-optionsqMh%UcachesqNuUchildrenqO]qPcdocutils.nodes section qQ)qR}qS(U rawsourceqTUUparentqUhUsourceqVcdocutils.nodes reprunicode qWXR/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-global.rstqXqY}qZbUtagnameq[Usectionq\U attributesq]}q^(Udupnamesq_]Uclassesq`]Ubackrefsqa]Uidsqb]qch3aUnamesqd]qeh auUlineqfKUdocumentqghhO]qh(cdocutils.nodes title qi)qj}qk(hTXGlobal ConfigurationqlhUhRhVhYh[Utitleqmh]}qn(h_]h`]ha]hb]hd]uhfKhghhO]qocdocutils.nodes Text qpXGlobal Configurationqqqr}qs(hThlhUhjubaubcdocutils.nodes paragraph qt)qu}qv(hTXKThe keys in this section affect the operations of the buildmaster globally.qwhUhRhVhYh[U paragraphqxh]}qy(h_]h`]ha]hb]hd]uhfKhghhO]qzhpXKThe keys in this section affect the operations of the buildmaster globally.q{q|}q}(hThwhUhuubaubcsphinx.addnodes index q~)q}q(hTUhUhRhVhYh[Uindexqh]}q(hb]ha]h_]h`]hd]Uentries]q((UsingleXBuildmaster Config; dbXcfg-dbqhtq(UsingleXdb (Buildmaster Config)hhtqeuhfKhghhO]ubcdocutils.nodes target q)q}q(hTUhUhRhVhYh[Utargetqh]}q(h_]h`]ha]hb]qhahd]uhfKhghhO]ubh~)q}q(hTUhUhRhVhYh[hh]}q(hb]ha]h_]h`]hd]Uentries]q((UsingleXBuildmaster Config; db_urlX cfg-db_urlqhtq(UsingleXdb_url (Buildmaster Config)hhtqeuhfKhghhO]ubh)q}q(hTUhUhRhVhYh[hh]}q(h_]h`]ha]hb]qhahd]uhfKhghhO]ubh~)q}q(hTUhUhRhVhYh[hh]}q(hb]ha]h_]h`]hd]Uentries]q((UsingleX$Buildmaster Config; db_poll_intervalXcfg-db_poll_intervalqhtq(UsingleX%db_poll_interval (Buildmaster Config)hhtqeuhfK hghhO]ubh)q}q(hTUhUhRhVhYh[hh]}q(hb]ha]h_]h`]hd]UrefidqhuhfK hghhO]ubh)q}q(hTX.. _Database-Specification:hUhRhVhYUexpect_referenced_by_nameq}h[hh]}q(hb]ha]h_]h`]hd]hhAuhfK hghUexpect_referenced_by_idq}qhhshO]ubhQ)q}q(hTUhUhRhVhYh}qhhsh[h\h]}q(h_]h`]ha]hb]q(hAhh6ehd]q(h heuhfK hghh}q(hAhhhuhO]q(hi)q}q(hTXDatabase SpecificationqhUhhVhYh[hmh]}q(h_]h`]ha]hb]hd]uhfK hghhO]qhpXDatabase Specificationqq}q(hThhUhubaubht)q}q(hTXNBuildbot 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.hUhhVhYh[hxh]}q(h_]h`]ha]hb]hd]uhfKhghhO]q(hpXBuildbot 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 qq}q(hTXBuildbot 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 hUhubcdocutils.nodes literal q)q}q(hTUh]}q(hb]ha]h_]h`]qXfileqaUrolehhd]uhUhhO]qhpX state.sqliteqDžq}q(hTX state.sqlitehUhubah[UliteralqubhpXK file of the master's base directory. Override this configuration with the q˅q}q(hTXK file of the master's base directory. Override this configuration with the hUhubcsphinx.addnodes pending_xref q)q}q(hTX:bb:cfg:`db_url`qhUhhVhYh[U pending_xrefqh]}q(UreftypeXcfgUrefwarnqԉU reftargetqXdb_urlU refdomainXbbqhb]ha]U refexplicith_]h`]hd]UrefdocqXmanual/cfg-globalquhfKhO]qh)q}q(hThh]}q(h_]h`]q(UxrefqhXbb-cfgqeha]hb]hd]uhUhhO]qhpXdb_urlqᅁq}q(hTUhUhubah[hubaubhpX parameter.q䅁q}q(hTX parameter.hUhubeubht)q}q(hTX_Buildbot accepts a database configuration in a dictionary named ``db``. All keys are optional::hUhhVhYh[hxh]}q(h_]h`]ha]hb]hd]uhfKhghhO]q(hpX@Buildbot accepts a database configuration in a dictionary named q녁q}q(hTX@Buildbot accepts a database configuration in a dictionary named hUhubh)q}q(hTX``db``h]}q(h_]h`]ha]hb]hd]uhUhhO]qhpXdbqq}q(hTUhUhubah[hubhpX. All keys are optional:qq}q(hTX. All keys are optional:hUhubeubcdocutils.nodes literal_block q)q}q(hTXSc['db'] = { 'db_url' : 'sqlite:///state.sqlite', 'db_poll_interval' : 30, }hUhhVhYh[U literal_blockqh]}q(U xml:spaceqUpreserveqhb]ha]h_]h`]hd]uhfKhghhO]qhpXSc['db'] = { 'db_url' : 'sqlite:///state.sqlite', 'db_poll_interval' : 30, }rr}r(hTUhUhubaubht)r}r(hTXThe ``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::hUhhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhghhO]r(hpXThe rr}r (hTXThe hUjubh)r }r (hTX ``db_url``h]}r (h_]h`]ha]hb]hd]uhUjhO]r hpXdb_urlrr}r(hTUhUj ubah[hubhpXd key indicates the database engine to use. The format of this parameter is completely documented at rr}r(hTXd key indicates the database engine to use. The format of this parameter is completely documented at hUjubcdocutils.nodes reference r)r}r(hTX(http://www.sqlalchemy.org/docs/dialects/rh]}r(Urefurijhb]ha]h_]h`]hd]uhUjhO]rhpX(http://www.sqlalchemy.org/docs/dialects/rr}r(hTUhUjubah[U referencerubhpX, but is generally of the form:rr}r (hTX, but is generally of the form:hUjubeubh)r!}r"(hTX6driver://[username:password@]host:port/database[?args]hUhhVhYh[hh]}r#(hhhb]ha]h_]h`]hd]uhfKhghhO]r$hpX6driver://[username:password@]host:port/database[?args]r%r&}r'(hTUhUj!ubaubht)r(}r)(hTXThe 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`.hUhhVhYh[hxh]}r*(h_]h`]ha]hb]hd]uhfK hghhO]r+(hpX The optional r,r-}r.(hTX The optional hUj(ubh)r/}r0(hTX``db_poll_interval``h]}r1(h_]h`]ha]hb]hd]uhUj(hO]r2hpXdb_poll_intervalr3r4}r5(hTUhUj/ubah[hubhpX specifies the interval, in seconds, between checks for pending tasks in the database. This parameter is generally only useful in multi-master mode. See r6r7}r8(hTX specifies the interval, in seconds, between checks for pending tasks in the database. This parameter is generally only useful in multi-master mode. See hUj(ubh)r9}r:(hTX:ref:`Multi-master-mode`r;hUj(hVhYh[hh]}r<(UreftypeXrefhԈhXmulti-master-modeU refdomainXstdr=hb]ha]U refexplicith_]h`]hd]hhuhfK hO]r>cdocutils.nodes emphasis r?)r@}rA(hTj;h]}rB(h_]h`]rC(hj=Xstd-refrDeha]hb]hd]uhUj9hO]rEhpXMulti-master-moderFrG}rH(hTUhUj@ubah[UemphasisrIubaubhpX.rJ}rK(hTX.hUj(ubeubht)rL}rM(hTXThese parameters can be specified directly in the configuration dictionary, as ``c['db_url']`` and ``c['db_poll_interval']``, although this method is deprecated.rNhUhhVhYh[hxh]}rO(h_]h`]ha]hb]hd]uhfK#hghhO]rP(hpXOThese parameters can be specified directly in the configuration dictionary, as rQrR}rS(hTXOThese parameters can be specified directly in the configuration dictionary, as hUjLubh)rT}rU(hTX``c['db_url']``h]}rV(h_]h`]ha]hb]hd]uhUjLhO]rWhpX c['db_url']rXrY}rZ(hTUhUjTubah[hubhpX and r[r\}r](hTX and hUjLubh)r^}r_(hTX``c['db_poll_interval']``h]}r`(h_]h`]ha]hb]hd]uhUjLhO]rahpXc['db_poll_interval']rbrc}rd(hTUhUj^ubah[hubhpX%, although this method is deprecated.rerf}rg(hTX%, although this method is deprecated.hUjLubeubht)rh}ri(hTXTThe following sections give additional information for particular database backends:rjhUhhVhYh[hxh]}rk(h_]h`]ha]hb]hd]uhfK%hghhO]rlhpXTThe following sections give additional information for particular database backends:rmrn}ro(hTjjhUjhubaubh~)rp}rq(hTUhUhhVhYh[hh]}rr(hb]ha]h_]h`]hd]Uentriesrs]rt(UsingleruXSQLiteUindex-0rvUtrwaUinlinerxuhfK'hghhO]ubh)ry}rz(hTUhUhhVhYh[hh]}r{(hb]ha]h_]h`]hd]hjvuhfK(hghhO]ubhQ)r|}r}(hTUhUhhVhYh}h[h\h]}r~(h_]h`]ha]hb]r(h/jvehd]rhauhfK*hghh}rjvjyshO]r(hi)r}r(hTXSQLiterhUj|hVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfK*hghhO]rhpXSQLiterr}r(hTjhUjubaubht)r}r(hTXFor sqlite databases, since there is no host and port, relative paths are specified with ``sqlite:///`` and absolute paths with ``sqlite:////``. Examples::hUj|hVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfK,hghhO]r(hpXYFor sqlite databases, since there is no host and port, relative paths are specified with rr}r(hTXYFor sqlite databases, since there is no host and port, relative paths are specified with hUjubh)r}r(hTX``sqlite:///``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX sqlite:///rr}r(hTUhUjubah[hubhpX and absolute paths with rr}r(hTX and absolute paths with hUjubh)r}r(hTX``sqlite:////``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX sqlite:////rr}r(hTUhUjubah[hubhpX . Examples:rr}r(hTX . Examples:hUjubeubh)r}r(hTX&c['db_url'] = "sqlite:///state.sqlite"hUj|hVhYh[hh]}r(hhhb]ha]h_]h`]hd]uhfK/hghhO]rhpX&c['db_url'] = "sqlite:///state.sqlite"rr}r(hTUhUjubaubht)r}r(hTX)SQLite requires no special configuration.rhUj|hVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfK1hghhO]rhpX)SQLite requires no special configuration.rr}r(hTjhUjubaubht)r}r(hTXwIf Buildbot produces "database is locked" exceptions, try adding ``serialize_access=1`` to the DB URL as a workaround::rhUj|hVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfK3hghhO]r(hpXAIf Buildbot produces "database is locked" exceptions, try adding rr}r(hTXAIf Buildbot produces "database is locked" exceptions, try adding hUjubh)r}r(hTX``serialize_access=1``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpXserialize_access=1rr}r(hTUhUjubah[hubhpX to the DB URL as a workaround:rr}r(hTX to the DB URL as a workaround:hUjubeubh)r}r(hTX9c['db_url'] = "sqlite:///state.sqlite?serialize_access=1"hUj|hVhYh[hh]}r(hhhb]ha]h_]h`]hd]uhfK5hghhO]rhpX9c['db_url'] = "sqlite:///state.sqlite?serialize_access=1"rr}r(hTUhUjubaubht)r}r(hTX2and please file a bug at http://trac.buildbot.net.rhUj|hVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfK7hghhO]r(hpXand please file a bug at rr}r(hTXand please file a bug at hUjubj)r}r(hTXhttp://trac.buildbot.netrh]}r(Urefurijhb]ha]h_]h`]hd]uhUjhO]rhpXhttp://trac.buildbot.netrr}r(hTUhUjubah[jubhpX.r}r(hTX.hUjubeubh~)r}r(hTUhUj|hVhYh[hh]}r(hb]ha]h_]h`]hd]js]r(juXMySQLUindex-1rUtrajxuhfK9hghhO]ubh)r}r(hTUhUj|hVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfK:hghhO]ubeubhQ)r}r(hTUhUhhVhYh}h[h\h]}r(h_]h`]ha]hb]r(h2jehd]rh auhfKhghhO]rhpXIc['db_url'] = "mysql://user:pass@somehost.com/database_name?max_idle=300"rr}r(hTUhUjubaubht)r}r(hTXThe ``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.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKBhghhO]r(hpXThe rr}r(hTXThe hUjubh)r}r (hTX ``max_idle``h]}r (h_]h`]ha]hb]hd]uhUjhO]r hpXmax_idler r }r(hTUhUjubah[hubhpXd argument for MySQL connections is unique to Buildbot, and should be set to something less than the rr}r(hTXd argument for MySQL connections is unique to Buildbot, and should be set to something less than the hUjubh)r}r(hTX``wait_timeout``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX wait_timeoutrr}r(hTUhUjubah[hubhpX: configured for your server. This controls the SQLAlchemy rr}r(hTX: configured for your server. This controls the SQLAlchemy hUjubh)r}r(hTX``pool_recycle``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX pool_recycler r!}r"(hTUhUjubah[hubhpX 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 r#r$}r%(hTX 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 hUjubh)r&}r'(hTXL``_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')``h]}r((h_]h`]ha]hb]hd]uhUjhO]r)hpXH_mysql_exceptions.OperationalError: (2006, 'MySQL server has gone away')r*r+}r,(hTUhUj&ubah[hubhpX, this means your r-r.}r/(hTX, this means your hUjubh)r0}r1(hTX ``max_idle``h]}r2(h_]h`]ha]hb]hd]uhUjhO]r3hpXmax_idler4r5}r6(hTUhUj0ubah[hubhpX setting is probably too high. r7r8}r9(hTX setting is probably too high. hUjubh)r:}r;(hTX.``show global variables like 'wait_timeout';``h]}r<(h_]h`]ha]hb]hd]uhUjhO]r=hpX*show global variables like 'wait_timeout';r>r?}r@(hTUhUj:ubah[hubhpX) will show what the currently configured rArB}rC(hTX) will show what the currently configured hUjubh)rD}rE(hTX``wait_timeout``h]}rF(h_]h`]ha]hb]hd]uhUjhO]rGhpX wait_timeoutrHrI}rJ(hTUhUjDubah[hubhpX is on your MySQL server.rKrL}rM(hTX is on your MySQL server.hUjubeubht)rN}rO(hTXBuildbot requires ``use_unique=True`` and ``charset=utf8``, and will add them automatically, so they do not need to be specified in ``db_url``.rPhUjhVhYh[hxh]}rQ(h_]h`]ha]hb]hd]uhfKHhghhO]rR(hpXBuildbot requires rSrT}rU(hTXBuildbot requires hUjNubh)rV}rW(hTX``use_unique=True``h]}rX(h_]h`]ha]hb]hd]uhUjNhO]rYhpXuse_unique=TruerZr[}r\(hTUhUjVubah[hubhpX and r]r^}r_(hTX and hUjNubh)r`}ra(hTX``charset=utf8``h]}rb(h_]h`]ha]hb]hd]uhUjNhO]rchpX charset=utf8rdre}rf(hTUhUj`ubah[hubhpXJ, and will add them automatically, so they do not need to be specified in rgrh}ri(hTXJ, and will add them automatically, so they do not need to be specified in hUjNubh)rj}rk(hTX ``db_url``h]}rl(h_]h`]ha]hb]hd]uhUjNhO]rmhpXdb_urlrnro}rp(hTUhUjjubah[hubhpX.rq}rr(hTX.hUjNubeubht)rs}rt(hTXqMySQL defaults to the MyISAM storage engine, but this can be overridden with the ``storage_engine`` URL argument.ruhUjhVhYh[hxh]}rv(h_]h`]ha]hb]hd]uhfKJhghhO]rw(hpXQMySQL defaults to the MyISAM storage engine, but this can be overridden with the rxry}rz(hTXQMySQL defaults to the MyISAM storage engine, but this can be overridden with the hUjsubh)r{}r|(hTX``storage_engine``h]}r}(h_]h`]ha]hb]hd]uhUjshO]r~hpXstorage_enginerr}r(hTUhUj{ubah[hubhpX URL argument.rr}r(hTX URL argument.hUjsubeubht)r}r(hTXNote 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.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKLhghhO]r(hpXnNote that, because of InnoDB's extremely short key length limitations, it cannot be used to run Buildbot. See rr}r(hTXnNote that, because of InnoDB's extremely short key length limitations, it cannot be used to run Buildbot. See hUjubj)r}r(hTX%http://bugs.mysql.com/bug.php?id=4541rh]}r(Urefurijhb]ha]h_]h`]hd]uhUjhO]rhpX%http://bugs.mysql.com/bug.php?id=4541rr}r(hTUhUjubah[jubhpX for more information.rr}r(hTX for more information.hUjubeubht)r}r(hTXGBuildbot uses temporary tables internally to manage large transactions.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKOhghhO]rhpXGBuildbot uses temporary tables internally to manage large transactions.rr}r(hTjhUjubaubht)r}r(hTXMySQL has trouble doing replication with temporary tables, so if you are using a replicated MySQL installation, you may need to handle this situation carefully. The MySQL documentation (http://dev.mysql.com/doc/refman/5.5/en/replication-features-temptables.html) recommends using ``--replicate-wild-ignore-table`` to ignore temporary tables that should not be replicated. All Buildbot temporary tables begin with ``bbtmp_``, so an option such as ``--replicate-wild-ignore-table=bbtmp_.*`` may help.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKQhghhO]r(hpXMySQL has trouble doing replication with temporary tables, so if you are using a replicated MySQL installation, you may need to handle this situation carefully. The MySQL documentation (rr}r(hTXMySQL has trouble doing replication with temporary tables, so if you are using a replicated MySQL installation, you may need to handle this situation carefully. The MySQL documentation (hUjubj)r}r(hTXKhttp://dev.mysql.com/doc/refman/5.5/en/replication-features-temptables.htmlrh]}r(Urefurijhb]ha]h_]h`]hd]uhUjhO]rhpXKhttp://dev.mysql.com/doc/refman/5.5/en/replication-features-temptables.htmlrr}r(hTUhUjubah[jubhpX) recommends using rr}r(hTX) recommends using hUjubh)r}r(hTX!``--replicate-wild-ignore-table``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX--replicate-wild-ignore-tablerr}r(hTUhUjubah[hubhpXd to ignore temporary tables that should not be replicated. All Buildbot temporary tables begin with rr}r(hTXd to ignore temporary tables that should not be replicated. All Buildbot temporary tables begin with hUjubh)r}r(hTX ``bbtmp_``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpXbbtmp_rr}r(hTUhUjubah[hubhpX, so an option such as rr}r(hTX, so an option such as hUjubh)r}r(hTX*``--replicate-wild-ignore-table=bbtmp_.*``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX&--replicate-wild-ignore-table=bbtmp_.*rr}r(hTUhUjubah[hubhpX may help.rr}r(hTX may help.hUjubeubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]js]r(juXPostgresUindex-2rUtrajxuhfKVhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfKWhghhO]ubeubhQ)r}r(hTUhUhhVhYh}h[h\h]}r(h_]h`]ha]hb]r(h>jehd]rhauhfKYhghh}rjjshO]r(hi)r}r(hTXPostgresrhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfKYhghhO]rhpXPostgresrr}r(hTjhUjubaubh)r}r(hTX5c['db_url'] = "postgresql://username@hostname/dbname"hUjhVhYh[hh]}r(jjXpythonhhhb]ha]h_]h`]hd]uhfK[hghhO]rhpX5c['db_url'] = "postgresql://username@hostname/dbname"rr}r(hTUhUjubaubht)r}r(hTX,PosgreSQL requires no special configuration.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfK_hghhO]rhpX,PosgreSQL requires no special configuration.rr}r(hTjhUjubaubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleXBuildmaster Config; multiMasterXcfg-multiMasterrjtr(UsingleX multiMaster (Buildmaster Config)jjtreuhfKbhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfKbhghhO]ubh)r}r(hTX.. _Multi-master-mode:hUjhVhYh}h[hh]}r(hb]ha]h_]h`]hd]hh9uhfKchghh}rjjshO]ubeubeubhQ)r}r(hTUhUhRhVhYh}rhjsh[h\h]}r(h_]h`]ha]hb]r(h9jhJehd]r (h!heuhfKfhghh}r (h9jjjuhO]r (hi)r }r (hTXMulti-master moderhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfKfhghhO]rhpXMulti-master moderr}r(hTjhUj ubaubht)r}r(hTXiNormally buildbot operates using a single master process that uses the configured database to save state.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhhghhO]rhpXiNormally buildbot operates using a single master process that uses the configured database to save state.rr}r(hTjhUjubaubht)r}r(hTXIt 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:rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKjhghhO]r hpXIt 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:r!r"}r#(hTjhUjubaubcdocutils.nodes block_quote r$)r%}r&(hTUhUjhVNh[U block_quoter'h]}r((h_]h`]ha]hb]hd]uhfNhghhO]r)cdocutils.nodes bullet_list r*)r+}r,(hTUh]}r-(Ubulletr.X*hb]ha]h_]h`]hd]uhUj%hO]r/(cdocutils.nodes list_item r0)r1}r2(hTXYou 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]}r3(h_]h`]ha]hb]hd]uhUj+hO]r4ht)r5}r6(hTXYou 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.r7hUj1hVhYh[hxh]}r8(h_]h`]ha]hb]hd]uhfKnhO]r9hpXYou 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.r:r;}r<(hTj7hUj5ubaubah[U list_itemr=ubj0)r>}r?(hTX^You can shut one master down to do maintenance, and other masters will continue to do builds. h]}r@(h_]h`]ha]hb]hd]uhUj+hO]rAht)rB}rC(hTX]You can shut one master down to do maintenance, and other masters will continue to do builds.rDhUj>hVhYh[hxh]}rE(h_]h`]ha]hb]hd]uhfKrhO]rFhpX]You can shut one master down to do maintenance, and other masters will continue to do builds.rGrH}rI(hTjDhUjBubaubah[j=ubeh[U bullet_listrJubaubht)rK}rL(hTX.State that is shared in the database includes:rMhUjhVhYh[hxh]}rN(h_]h`]ha]hb]hd]uhfKthghhO]rOhpX.State that is shared in the database includes:rPrQ}rR(hTjMhUjKubaubj$)rS}rT(hTUhUjhVNh[j'h]}rU(h_]h`]ha]hb]hd]uhfNhghhO]rVj*)rW}rX(hTUh]}rY(j.X*hb]ha]h_]h`]hd]uhUjShO]rZ(j0)r[}r\(hTXList of changesr]h]}r^(h_]h`]ha]hb]hd]uhUjWhO]r_ht)r`}ra(hTj]hUj[hVhYh[hxh]}rb(h_]h`]ha]hb]hd]uhfKvhO]rchpXList of changesrdre}rf(hTj]hUj`ubaubah[j=ubj0)rg}rh(hTX"Scheduler names and internal staterih]}rj(h_]h`]ha]hb]hd]uhUjWhO]rkht)rl}rm(hTjihUjghVhYh[hxh]}rn(h_]h`]ha]hb]hd]uhfKwhO]rohpX"Scheduler names and internal staterprq}rr(hTjihUjlubaubah[j=ubj0)rs}rt(hTX+Build requests, including the builder name h]}ru(h_]h`]ha]hb]hd]uhUjWhO]rvht)rw}rx(hTX*Build requests, including the builder nameryhUjshVhYh[hxh]}rz(h_]h`]ha]hb]hd]uhfKxhO]r{hpX*Build requests, including the builder namer|r}}r~(hTjyhUjwubaubah[j=ubeh[jJubaubht)r}r(hTX=Because of this shared state, you are strongly encouraged to:rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKzhghhO]rhpX=Because of this shared state, you are strongly encouraged to:rr}r(hTjhUjubaubj$)r}r(hTUhUjhVNh[j'h]}r(h_]h`]ha]hb]hd]uhfNhghhO]rj*)r}r(hTUh]}r(j.X*hb]ha]h_]h`]hd]uhUjhO]r(j0)r}r(hTXEnsure 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(h_]h`]ha]hb]hd]uhUjhO]rht)r}r(hTXEnsure 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.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfK|hO]rhpXEnsure 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(hTjhUjubaubah[j=ubj0)r}r(hTXEnsure 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(h_]h`]ha]hb]hd]uhUjhO]rht)r}r(hTXEnsure 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.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhO]rhpXEnsure 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(hTjhUjubaubah[j=ubeh[jJubaubht)r}r(hTXOne 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.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhghhO]rhpXOne 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(hTjhUjubaubht)r}r(hTX;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.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhghhO]r(hpXLTo enable multi-master mode in this configuration, you will need to set the rr}r(hTXLTo enable multi-master mode in this configuration, you will need to set the hUjubh)r}r(hTX:bb:cfg:`multiMaster`rhUjhVhYh[hh]}r(UreftypeXcfghԉhX multiMasterU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX multiMasterrr}r(hTUhUjubah[hubaubhpXf option so that buildbot doesn't warn about missing schedulers or builders. You will also need to set rr}r(hTXf option so that buildbot doesn't warn about missing schedulers or builders. You will also need to set hUjubh)r}r(hTX:bb:cfg:`db_poll_interval`rhUjhVhYh[hh]}r(UreftypeXcfghԉhXdb_poll_intervalU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpXdb_poll_intervalrr}r(hTUhUjubah[hubaubhpXZ to specify the interval (in seconds) at which masters should poll the database for tasks.rr}r(hTXZ to specify the interval (in seconds) at which masters should poll the database for tasks.hUjubeubh)r}r(hTX# 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, }hUjhVhYh[hh]}r(hhhb]ha]h_]h`]hd]uhfKhghhO]rhpX# 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(hTUhUjubaubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleXBuildmaster Config; buildbotURLXcfg-buildbotURLrjtr(UsingleX buildbotURL (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleXBuildmaster Config; titleURLX cfg-titleURLrjtr(UsingleXtitleURL (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleXBuildmaster Config; titleX cfg-titlerjtr(UsingleXtitle (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfKhghhO]ubeubhQ)r}r(hTUhUhRhVhYh}h[h\h]}r(h_]h`]ha]hb]r(h}r?(hTj8h]}r@(h_]h`]rA(hj:Xpy-classrBeha]hb]hd]uhUj6hO]rChpXhtml.WebStatusrDrE}rF(hTUhUj>ubah[hubaubhpX home page (linked to the rGrH}rI(hTX home page (linked to the hUjubh)rJ}rK(hTX:bb:cfg:`titleURL`rLhUjhVhYh[hh]}rM(UreftypeXcfghԉhXtitleURLU refdomainXbbrNhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rOh)rP}rQ(hTjLh]}rR(h_]h`]rS(hjNXbb-cfgrTeha]hb]hd]uhUjJhO]rUhpXtitleURLrVrW}rX(hTUhUjPubah[hubaubhpX;), and is embedded in the title of the waterfall HTML page.rYrZ}r[(hTX;), and is embedded in the title of the waterfall HTML page.hUjubeubht)r\}r](hTX: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.hUjhVhYh[hxh]}r^(h_]h`]ha]hb]hd]uhfKhghhO]r_(h)r`}ra(hTX:bb:cfg:`titleURL`rbhUj\hVhYh[hh]}rc(UreftypeXcfghԉhXtitleURLU refdomainXbbrdhb]ha]U refexplicith_]h`]hd]hhuhfKhO]reh)rf}rg(hTjbh]}rh(h_]h`]ri(hjdXbb-cfgrjeha]hb]hd]uhUj`hO]rkhpXtitleURLrlrm}rn(hTUhUjfubah[hubaubhpX- is a URL string that must end with a slash (rorp}rq(hTX- is a URL string that must end with a slash (hUj\ubh)rr}rs(hTX``/``h]}rt(h_]h`]ha]hb]hd]uhUj\hO]ruhpX/rv}rw(hTUhUjrubah[hubhpX"). HTML status displays will show rxry}rz(hTX"). HTML status displays will show hUj\ubh)r{}r|(hTX ``title``h]}r}(h_]h`]ha]hb]hd]uhUj\hO]r~hpXtitlerr}r(hTUhUj{ubah[hubhpX as a link to rr}r(hTX as a link to hUj\ubh)r}r(hTX:bb:cfg:`titleURL`rhUj\hVhYh[hh]}r(UreftypeXcfghԉhXtitleURLU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpXtitleURLrr}r(hTUhUjubah[hubaubhpX`. This URL is often used to provide a link from buildbot HTML pages to your project's home page.rr}r(hTX`. This URL is often used to provide a link from buildbot HTML pages to your project's home page.hUj\ubeubht)r}r(hTXBThe :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.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhghhO]r(hpXThe rr}r(hTXThe hUjubh)r}r(hTX:bb:cfg:`buildbotURL`rhUjhVhYh[hh]}r(UreftypeXcfghԉhX buildbotURLU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX buildbotURLrr}r(hTUhUjubah[hubaubhpXz string should point to the location where the buildbot's internal web server is visible. This URL must end with a slash (rr}r(hTXz string should point to the location where the buildbot's internal web server is visible. This URL must end with a slash (hUjubh)r}r(hTX``/``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX/r}r(hTUhUjubah[hubhpX?). This typically uses the port number set for the web status (rr}r(hTX?). This typically uses the port number set for the web status (hUjubh)r}r(hTX:bb:status:`WebStatus`rhUjhVhYh[hh]}r(UreftypeXstatushԉhX WebStatusU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjX bb-statusreha]hb]hd]uhUjhO]rhpX WebStatusrr}r(hTUhUjubah[hubaubhpXU): the buildbot needs your help to figure out a suitable externally-visible host URL.rr}r(hTXU): the buildbot needs your help to figure out a suitable externally-visible host URL.hUjubeubht)r}r(hTX: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.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhghhO]r(hpXEWhen status notices are sent to users (either by email or over IRC), rr}r(hTXEWhen status notices are sent to users (either by email or over IRC), hUjubh)r}r(hTX:bb:cfg:`buildbotURL`rhUjhVhYh[hh]}r(UreftypeXcfghԉhX buildbotURLU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX buildbotURLrr}r(hTUhUjubah[hubaubhpX 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(hTX 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.hUjubeubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX'Buildmaster Config; logCompressionLimitXcfg-logCompressionLimitrjtr(UsingleX(logCompressionLimit (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX(Buildmaster Config; logCompressionMethodXcfg-logCompressionMethodrjtr(UsingleX)logCompressionMethod (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleXBuildmaster Config; logMaxSizeXcfg-logMaxSizerjtr(UsingleXlogMaxSize (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX"Buildmaster Config; logMaxTailSizeXcfg-logMaxTailSizer j tr (UsingleX#logMaxTailSize (Buildmaster Config)j j tr euhfKhghhO]ubh)r }r (hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hj uhfKhghhO]ubeubhQ)r}r(hTUhUhRhVhYh}h[h\h]}r(h_]h`]ha]hb]r(h5j ehd]rh auhfKhghh}rj j shO]r(hi)r}r(hTX Log HandlingrhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfKhghhO]rhpX Log Handlingrr}r(hTjhUjubaubh)r}r(hTX~c['logCompressionLimit'] = 16384 c['logCompressionMethod'] = 'gz' c['logMaxSize'] = 1024*1024 # 1M c['logMaxTailSize'] = 32768hUjhVhYh[hh]}r (hhhb]ha]h_]h`]hd]uhfKhghhO]r!hpX~c['logCompressionLimit'] = 16384 c['logCompressionMethod'] = 'gz' c['logMaxSize'] = 1024*1024 # 1M c['logMaxTailSize'] = 32768r"r#}r$(hTUhUjubaubht)r%}r&(hTXwThe :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.hUjhVhYh[hxh]}r'(h_]h`]ha]hb]hd]uhfKhghhO]r((hpXThe r)r*}r+(hTXThe hUj%ubh)r,}r-(hTX:bb:cfg:`logCompressionLimit`r.hUj%hVhYh[hh]}r/(UreftypeXcfghԉhXlogCompressionLimitU refdomainXbbr0hb]ha]U refexplicith_]h`]hd]hhuhfKhO]r1h)r2}r3(hTj.h]}r4(h_]h`]r5(hj0Xbb-cfgr6eha]hb]hd]uhUj,hO]r7hpXlogCompressionLimitr8r9}r:(hTUhUj2ubah[hubaubhpX enables compression of build logs on disk for logs that are bigger than the given size, or disables that completely if set to r;r<}r=(hTX enables compression of build logs on disk for logs that are bigger than the given size, or disables that completely if set to hUj%ubh)r>}r?(hTX ``False``h]}r@(h_]h`]ha]hb]hd]uhUj%hO]rAhpXFalserBrC}rD(hTUhUj>ubah[hubhpX. 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.rErF}rG(hTX. 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.hUj%ubeubht)rH}rI(hTXThe :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.hUjhVhYh[hxh]}rJ(h_]h`]ha]hb]hd]uhfKhghhO]rK(hpXThe rLrM}rN(hTXThe hUjHubh)rO}rP(hTX:bb:cfg:`logCompressionMethod`rQhUjHhVhYh[hh]}rR(UreftypeXcfghԉhXlogCompressionMethodU refdomainXbbrShb]ha]U refexplicith_]h`]hd]hhuhfKhO]rTh)rU}rV(hTjQh]}rW(h_]h`]rX(hjSXbb-cfgrYeha]hb]hd]uhUjOhO]rZhpXlogCompressionMethodr[r\}r](hTUhUjUubah[hubaubhpX 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.r^r_}r`(hTX 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.hUjHubeubht)ra}rb(hTXAThe :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.hUjhVhYh[hxh]}rc(h_]h`]ha]hb]hd]uhfKhghhO]rd(hpXThe rerf}rg(hTXThe hUjaubh)rh}ri(hTX:bb:cfg:`logMaxSize`rjhUjahVhYh[hh]}rk(UreftypeXcfghԉhX logMaxSizeU refdomainXbbrlhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rmh)rn}ro(hTjjh]}rp(h_]h`]rq(hjlXbb-cfgrreha]hb]hd]uhUjhhO]rshpX logMaxSizertru}rv(hTUhUjnubah[hubaubhpX 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 rwrx}ry(hTX 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 hUjaubh)rz}r{(hTX:bb:cfg:`logMaxSize`r|hUjahVhYh[hh]}r}(UreftypeXcfghԉhX logMaxSizeU refdomainXbbr~hb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTj|h]}r(h_]h`]r(hj~Xbb-cfgreha]hb]hd]uhUjzhO]rhpX logMaxSizerr}r(hTUhUjubah[hubaubhpX[ will be truncated, and a message to this effect will be added to the log's HEADER channel.rr}r(hTX[ will be truncated, and a message to this effect will be added to the log's HEADER channel.hUjaubeubht)r}r(hTXIf :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.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhghhO]r(hpXIf rr}r(hTXIf hUjubh)r}r(hTX:bb:cfg:`logMaxSize`rhUjhVhYh[hh]}r(UreftypeXcfghԉhX logMaxSizeU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX logMaxSizerr}r(hTUhUjubah[hubaubhpX= is set, and the output from a step exceeds the maximum, the rr}r(hTX= is set, and the output from a step exceeds the maximum, the hUjubh)r}r(hTX:bb:cfg:`logMaxTailSize`rhUjhVhYh[hh]}r(UreftypeXcfghԉhXlogMaxTailSizeU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpXlogMaxTailSizerr}r(hTUhUjubah[hubaubhpX 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(hTX 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 hUjubh)r}r(hTX:bb:cfg:`logMaxSize`rhUjhVhYh[hh]}r(UreftypeXcfghԉhX logMaxSizeU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX logMaxSizerr}r(hTUhUjubah[hubaubhpX bytes and the last rr}r(hTX bytes and the last hUjubh)r}r(hTX:bb:cfg:`logMaxTailSize`rhUjhVhYh[hh]}r(UreftypeXcfghԉhXlogMaxTailSizeU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpXlogMaxTailSizerr}r(hTUhUjubah[hubaubhpX^ bytes of output. Don't set this value too high, as the the tail of the log is kept in memory.rr}r(hTX^ bytes of output. Don't set this value too high, as the the tail of the log is kept in memory.hUjubeubeubhQ)r}r(hTUhUhRhVhYh[h\h]}r(h_]h`]ha]hb]rhCahd]rhauhfKhghhO]r(hi)r}r(hTX Data LifetimerhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfKhghhO]rhpX Data Lifetimerr}r(hTjhUjubaubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX!Buildmaster Config; changeHorizonXcfg-changeHorizonrjtr(UsingleX"changeHorizon (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX Buildmaster Config; buildHorizonXcfg-buildHorizonrjtr(UsingleX!buildHorizon (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX Buildmaster Config; eventHorizonXcfg-eventHorizonrjtr(UsingleX!eventHorizon (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]r jahd]uhfKhghhO]ubh~)r }r (hTUhUjhVhYh[hh]}r (hb]ha]h_]h`]hd]Uentries]r ((UsingleXBuildmaster Config; logHorizonXcfg-logHorizonrjtr(UsingleXlogHorizon (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfKhghhO]ubhQ)r}r(hTUhUjhVhYh}h[h\h]}r(h_]h`]ha]hb]r(hIjehd]rh auhfKhghh}rjjshO]r(hi)r}r(hTXHorizonsrhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfKhghhO]rhpXHorizonsr r!}r"(hTjhUjubaubh)r#}r$(hTXuc['changeHorizon'] = 200 c['buildHorizon'] = 100 c['eventHorizon'] = 50 c['logHorizon'] = 40 c['buildCacheSize'] = 15hUjhVhYh[hh]}r%(hhhb]ha]h_]h`]hd]uhfKhghhO]r&hpXuc['changeHorizon'] = 200 c['buildHorizon'] = 100 c['eventHorizon'] = 50 c['logHorizon'] = 40 c['buildCacheSize'] = 15r'r(}r)(hTUhUj#ubaubht)r*}r+(hTXBuildbot 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,hUjhVhYh[hxh]}r-(h_]h`]ha]hb]hd]uhfKhghhO]r.hpXBuildbot 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/r0}r1(hTj,hUj*ubaubht)r2}r3(hTXThe :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.hUjhVhYh[hxh]}r4(h_]h`]ha]hb]hd]uhfKhghhO]r5(hpXThe r6r7}r8(hTXThe hUj2ubh)r9}r:(hTX:bb:cfg:`changeHorizon`r;hUj2hVhYh[hh]}r<(UreftypeXcfghԉhX changeHorizonU refdomainXbbr=hb]ha]U refexplicith_]h`]hd]hhuhfKhO]r>h)r?}r@(hTj;h]}rA(h_]h`]rB(hj=Xbb-cfgrCeha]hb]hd]uhUj9hO]rDhpX changeHorizonrErF}rG(hTUhUj?ubah[hubaubhpX 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.rHrI}rJ(hTX 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.hUj2ubeubht)rK}rL(hTX{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.hUjhVhYh[hxh]}rM(h_]h`]ha]hb]hd]uhfKhghhO]rN(hpXThe rOrP}rQ(hTXThe hUjKubh)rR}rS(hTX:bb:cfg:`buildHorizon`rThUjKhVhYh[hh]}rU(UreftypeXcfghԉhX buildHorizonU refdomainXbbrVhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rWh)rX}rY(hTjTh]}rZ(h_]h`]r[(hjVXbb-cfgr\eha]hb]hd]uhUjRhO]r]hpX buildHorizonr^r_}r`(hTUhUjXubah[hubaubhpX[ specifies the minimum number of builds for each builder which should be kept on disk. The rarb}rc(hTX[ specifies the minimum number of builds for each builder which should be kept on disk. The hUjKubh)rd}re(hTX:bb:cfg:`eventHorizon`rfhUjKhVhYh[hh]}rg(UreftypeXcfghԉhX eventHorizonU refdomainXbbrhhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rih)rj}rk(hTjfh]}rl(h_]h`]rm(hjhXbb-cfgrneha]hb]hd]uhUjdhO]rohpX eventHorizonrprq}rr(hTUhUjjubah[hubaubhpX specifies the minimum number of events to keep--events mostly describe connections and disconnections of slaves, and are seldom helpful to developers. The rsrt}ru(hTX specifies the minimum number of events to keep--events mostly describe connections and disconnections of slaves, and are seldom helpful to developers. The hUjKubh)rv}rw(hTX:bb:cfg:`logHorizon`rxhUjKhVhYh[hh]}ry(UreftypeXcfghԉhX logHorizonU refdomainXbbrzhb]ha]U refexplicith_]h`]hd]hhuhfKhO]r{h)r|}r}(hTjxh]}r~(h_]h`]r(hjzXbb-cfgreha]hb]hd]uhUjvhO]rhpX logHorizonrr}r(hTUhUj|ubah[hubaubhpXv gives the minimum number of builds for which logs should be maintained; this parameter must be less than or equal to rr}r(hTXv gives the minimum number of builds for which logs should be maintained; this parameter must be less than or equal to hUjKubh)r}r(hTX:bb:cfg:`buildHorizon`rhUjKhVhYh[hh]}r(UreftypeXcfghԉhX buildHorizonU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX buildHorizonrr}r(hTUhUjubah[hubaubhpX. Builds older than rr}r(hTX. Builds older than hUjKubh)r}r(hTX:bb:cfg:`logHorizon`rhUjKhVhYh[hh]}r(UreftypeXcfghԉhX logHorizonU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX logHorizonrr}r(hTUhUjubah[hubaubhpX but not older than rr}r(hTX but not older than hUjKubh)r}r(hTX:bb:cfg:`buildHorizon`rhUjKhVhYh[hh]}r(UreftypeXcfghԉhX buildHorizonU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX buildHorizonrr}r(hTUhUjubah[hubaubhpXb will maintain their overall status and the status of each step, but the logfiles will be deleted.rr}r(hTXb will maintain their overall status and the status of each step, but the logfiles will be deleted.hUjKubeubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleXBuildmaster Config; cachesX cfg-cachesrjtr(UsingleXcaches (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX#Buildmaster Config; changeCacheSizeXcfg-changeCacheSizerjtr(UsingleX$changeCacheSize (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfKhghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX"Buildmaster Config; buildCacheSizeXcfg-buildCacheSizerjtr(UsingleX#buildCacheSize (Buildmaster Config)jjtreuhfKhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfKhghhO]ubeubhQ)r}r(hTUhUjhVhYh}h[h\h]}r(h_]h`]ha]hb]r(hNjehd]rh%auhfKhghh}rjjshO]r(hi)r}r(hTXCachesrhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfKhghhO]rhpXCachesrr}r(hTjhUjubaubh)r}r(hTX c['caches'] = { 'Changes' : 100, # formerly c['changeCacheSize'] 'Builds' : 500, # formerly c['buildCacheSize'] 'chdicts' : 100, 'BuildRequests' : 10, 'SourceStamps' : 20, 'ssdicts' : 20, 'objectids' : 10, 'usdicts' : 100, }hUjhVhYh[hh]}r(hhhb]ha]h_]h`]hd]uhfKhghhO]rhpX 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(hTUhUjubaubht)r}r(hTX"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.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfKhghhO]r(hpXThe rr}r(hTXThe hUjubh)r}r(hTX:bb:cfg:`caches`rhUjhVhYh[hh]}r(UreftypeXcfghԉhXcachesU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfKhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpXcachesrr}r (hTUhUjubah[hubaubhpX 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.r r }r (hTX 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.hUjubeubht)r }r(hTXThe 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.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMhghhO]rhpXThe 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(hTjhUj ubaubht)r}r(hTXThe available caches are:rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMhghhO]rhpXThe available caches are:rr}r(hTjhUjubaubcdocutils.nodes definition_list r)r}r(hTUhUjhVhYh[Udefinition_listr h]}r!(h_]h`]ha]hb]hd]uhfNhghhO]r"(cdocutils.nodes definition_list_item r#)r$}r%(hTX``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. hUjhVhYh[Udefinition_list_itemr&h]}r'(h_]h`]ha]hb]hd]uhfM hO]r((cdocutils.nodes term r))r*}r+(hTX ``Changes``r,hUj$hVhYh[Utermr-h]}r.(h_]h`]ha]hb]hd]uhfM hO]r/h)r0}r1(hTj,h]}r2(h_]h`]ha]hb]hd]uhUj*hO]r3hpXChangesr4r5}r6(hTUhUj0ubah[hubaubcdocutils.nodes definition r7)r8}r9(hTUh]}r:(h_]h`]ha]hb]hd]uhUj$hO]r;(ht)r<}r=(hTXthe 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.r>hUj8hVhYh[hxh]}r?(h_]h`]ha]hb]hd]uhfMhO]r@hpXthe 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.rArB}rC(hTj>hUj<ubaubht)rD}rE(hTXrThis parameter is the same as the deprecated global parameter :bb:cfg:`changeCacheSize`. Its default value is 10.hUj8hVhYh[hxh]}rF(h_]h`]ha]hb]hd]uhfM hO]rG(hpX>This parameter is the same as the deprecated global parameter rHrI}rJ(hTX>This parameter is the same as the deprecated global parameter hUjDubh)rK}rL(hTX:bb:cfg:`changeCacheSize`rMhUjDhVhYh[hh]}rN(UreftypeXcfghԉhXchangeCacheSizeU refdomainXbbrOhb]ha]U refexplicith_]h`]hd]hhuhfM hO]rPh)rQ}rR(hTjMh]}rS(h_]h`]rT(hjOXbb-cfgrUeha]hb]hd]uhUjKhO]rVhpXchangeCacheSizerWrX}rY(hTUhUjQubah[hubaubhpX. Its default value is 10.rZr[}r\(hTX. Its default value is 10.hUjDubeubeh[U definitionr]ubeubj#)r^}r_(hTX``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. hUjhVhYh[j&h]}r`(h_]h`]ha]hb]hd]uhfMhghhO]ra(j))rb}rc(hTX ``Builds``rdhUj^hVhYh[j-h]}re(h_]h`]ha]hb]hd]uhfMhO]rfh)rg}rh(hTjdh]}ri(h_]h`]ha]hb]hd]uhUjbhO]rjhpXBuildsrkrl}rm(hTUhUjgubah[hubaubj7)rn}ro(hTUh]}rp(h_]h`]ha]hb]hd]uhUj^hO]rq(ht)rr}rs(hTX*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.hUjnhVhYh[hxh]}rt(h_]h`]ha]hb]hd]uhfMhO]ru(hpXThe rvrw}rx(hTXThe hUjrubh)ry}rz(hTX:bb:cfg:`buildCacheSize`r{hUjrhVhYh[hh]}r|(UreftypeXcfghԉhXbuildCacheSizeU refdomainXbbr}hb]ha]U refexplicith_]h`]hd]hhuhfMhO]r~h)r}r(hTj{h]}r(h_]h`]r(hj}Xbb-cfgreha]hb]hd]uhUjyhO]rhpXbuildCacheSizerr}r(hTUhUjubah[hubaubhpX 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.rr}r(hTX 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.hUjrubeubht)r}r(hTXqThis parameter is the same as the deprecated global parameter :bb:cfg:`buildCacheSize`. Its default value is 15.hUjnhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMhO]r(hpX>This parameter is the same as the deprecated global parameter rr}r(hTX>This parameter is the same as the deprecated global parameter hUjubh)r}r(hTX:bb:cfg:`buildCacheSize`rhUjhVhYh[hh]}r(UreftypeXcfghԉhXbuildCacheSizeU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfMhO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpXbuildCacheSizerr}r(hTUhUjubah[hubaubhpX. Its default value is 15.rr}r(hTX. Its default value is 15.hUjubeubeh[j]ubeubj#)r}r(hTX``chdicts`` The number of rows from the ``changes`` table to cache in memory. This value should be similar to the value for ``Changes``. hUjhVhYh[j&h]}r(h_]h`]ha]hb]hd]uhfMhghhO]r(j))r}r(hTX ``chdicts``rhUjhVhYh[j-h]}r(h_]h`]ha]hb]hd]uhfMhO]rh)r}r(hTjh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpXchdictsrr}r(hTUhUjubah[hubaubj7)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rht)r}r(hTX|The number of rows from the ``changes`` table to cache in memory. This value should be similar to the value for ``Changes``.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMhO]r(hpXThe number of rows from the rr}r(hTXThe number of rows from the hUjubh)r}r(hTX ``changes``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpXchangesrr}r(hTUhUjubah[hubhpXI table to cache in memory. This value should be similar to the value for rr}r(hTXI table to cache in memory. This value should be similar to the value for hUjubh)r}r(hTX ``Changes``h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpXChangesrr}r(hTUhUjubah[hubhpX.r}r(hTX.hUjubeubah[j]ubeubj#)r}r(hTX``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. hUjhVhYh[j&h]}r(h_]h`]ha]hb]hd]uhfMhghhO]r(j))r}r(hTX``BuildRequests``rhUjhVhYh[j-h]}r(h_]h`]ha]hb]hd]uhfMhO]rh)r}r(hTjh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX BuildRequestsrr}r(hTUhUjubah[hubaubj7)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rht)r}r(hTXThe 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.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMhO]rhpXThe 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(hTjhUjubaubah[j]ubeubj#)r}r(hTX``SourceStamps`` the number of SourceStamp objects kept in memory. This number should generally be similar to the number ``BuildRequesets``. hUjhVhYh[j&h]}r(h_]h`]ha]hb]hd]uhfMhghhO]r(j))r}r(hTX``SourceStamps``rhUjhVhYh[j-h]}r(h_]h`]ha]hb]hd]uhfMhO]rh)r}r(hTjh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX SourceStampsrr}r(hTUhUjubah[hubaubj7)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rht)r}r(hTX{the number of SourceStamp objects kept in memory. This number should generally be similar to the number ``BuildRequesets``.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMhO]r(hpXhthe number of SourceStamp objects kept in memory. This number should generally be similar to the number rr}r(hTXhthe number of SourceStamp objects kept in memory. This number should generally be similar to the number hUjubh)r }r (hTX``BuildRequesets``h]}r (h_]h`]ha]hb]hd]uhUjhO]r hpXBuildRequesetsr r}r(hTUhUj ubah[hubhpX.r}r(hTX.hUjubeubah[j]ubeubj#)r}r(hTX``ssdicts`` The number of rows from the ``sourcestamps`` table to cache in memory. This value should be similar to the value for ``SourceStamps``. hUjhVhYh[j&h]}r(h_]h`]ha]hb]hd]uhfM#hghhO]r(j))r}r(hTX ``ssdicts``rhUjhVhYh[j-h]}r(h_]h`]ha]hb]hd]uhfM#hO]rh)r}r(hTjh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpXssdictsrr }r!(hTUhUjubah[hubaubj7)r"}r#(hTUh]}r$(h_]h`]ha]hb]hd]uhUjhO]r%ht)r&}r'(hTXThe number of rows from the ``sourcestamps`` table to cache in memory. This value should be similar to the value for ``SourceStamps``.hUj"hVhYh[hxh]}r((h_]h`]ha]hb]hd]uhfM"hO]r)(hpXThe number of rows from the r*r+}r,(hTXThe number of rows from the hUj&ubh)r-}r.(hTX``sourcestamps``h]}r/(h_]h`]ha]hb]hd]uhUj&hO]r0hpX sourcestampsr1r2}r3(hTUhUj-ubah[hubhpXI table to cache in memory. This value should be similar to the value for r4r5}r6(hTXI table to cache in memory. This value should be similar to the value for hUj&ubh)r7}r8(hTX``SourceStamps``h]}r9(h_]h`]ha]hb]hd]uhUj&hO]r:hpX SourceStampsr;r<}r=(hTUhUj7ubah[hubhpX.r>}r?(hTX.hUj&ubeubah[j]ubeubj#)r@}rA(hTX``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. hUjhVhYh[j&h]}rB(h_]h`]ha]hb]hd]uhfM'hghhO]rC(j))rD}rE(hTX ``objectids``rFhUj@hVhYh[j-h]}rG(h_]h`]ha]hb]hd]uhfM'hO]rHh)rI}rJ(hTjFh]}rK(h_]h`]ha]hb]hd]uhUjDhO]rLhpX objectidsrMrN}rO(hTUhUjIubah[hubaubj7)rP}rQ(hTUh]}rR(h_]h`]ha]hb]hd]uhUj@hO]rSht)rT}rU(hTXThe 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.rVhUjPhVhYh[hxh]}rW(h_]h`]ha]hb]hd]uhfM&hO]rXhpXThe 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.rYrZ}r[(hTjVhUjTubaubah[j]ubeubj#)r\}r](hTX``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 hUjhVhYh[j&h]}r^(h_]h`]ha]hb]hd]uhfM-hghhO]r_(j))r`}ra(hTX ``usdicts``rbhUj\hVhYh[j-h]}rc(h_]h`]ha]hb]hd]uhfM-hO]rdh)re}rf(hTjbh]}rg(h_]h`]ha]hb]hd]uhUj`hO]rhhpXusdictsrirj}rk(hTUhUjeubah[hubaubj7)rl}rm(hTUh]}rn(h_]h`]ha]hb]hd]uhUj\hO]ro(ht)rp}rq(hTXThe 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.hUjlhVhYh[hxh]}rr(h_]h`]ha]hb]hd]uhfM*hO]rs(hpXThe number of rows from the rtru}rv(hTXThe number of rows from the hUjpubh)rw}rx(hTX ``users``h]}ry(h_]h`]ha]hb]hd]uhUjphO]rzhpXusersr{r|}r}(hTUhUjwubah[hubhpXk table to cache in memory. Note that for a given user there will be a row for each attribute that user has.r~r}r(hTXk table to cache in memory. Note that for a given user there will be a row for each attribute that user has.hUjpubeubht)r}r(hTXc['buildCacheSize'] = 15rhUjlhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfM-hO]rhpXc['buildCacheSize'] = 15rr}r(hTjhUjubaubeh[j]ubeubeubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX!Buildmaster Config; mergeRequestsXcfg-mergeRequestsrjtr(UsingleX"mergeRequests (Buildmaster Config)jjtreuhfM0hghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfM0hghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]js]r(juXBuilds; mergingUindex-3rUtrajxuhfM1hghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfM2hghhO]ubeubeubhQ)r}r(hTUhUhRhVhYh}h[h\h]}r(h_]h`]ha]hb]r(h=jehd]rhauhfM4hghh}rjjshO]r(hi)r}r(hTXMerging Build RequestsrhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfM4hghhO]rhpXMerging Build Requestsrr}r(hTjhUjubaubh)r}r(hTXc['mergeRequests'] = TruehUjhVhYh[hh]}r(jjXpythonhhhb]ha]h_]h`]hd]uhfM6hghhO]rhpXc['mergeRequests'] = Truerr}r(hTUhUjubaubht)r}r(hTX{This is a global default value for builders' :bb:cfg:`mergeRequests` parameter, and controls the merging of build requests.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfM:hghhO]r(hpX-This is a global default value for builders' rr}r(hTX-This is a global default value for builders' hUjubh)r}r(hTX:bb:cfg:`mergeRequests`rhUjhVhYh[hh]}r(UreftypeXcfghԉhX mergeRequestsU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfM:hO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpX mergeRequestsrr}r(hTUhUjubah[hubaubhpX7 parameter, and controls the merging of build requests.rr}r(hTX7 parameter, and controls the merging of build requests.hUjubeubht)r}r(hTXThis parameter can be overridden on a per-builder basis. See :ref:`Merging-Build-Requests` for the allowed values for this parameter.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfM<hghhO]r(hpX=This parameter can be overridden on a per-builder basis. See rr}r(hTX=This parameter can be overridden on a per-builder basis. See hUjubh)r}r(hTX:ref:`Merging-Build-Requests`rhUjhVhYh[hh]}r(UreftypeXrefhԈhXmerging-build-requestsU refdomainXstdrhb]ha]U refexplicith_]h`]hd]hhuhfM<hO]rj?)r}r(hTjh]}r(h_]h`]r(hjXstd-refreha]hb]hd]uhUjhO]rhpXMerging-Build-Requestsrr}r(hTUhUjubah[jIubaubhpX+ for the allowed values for this parameter.rr}r(hTX+ for the allowed values for this parameter.hUjubeubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]js]r(juXBuilders; priorityUindex-4rUtrajxuhfM?hghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(h_]h`]ha]hb]rjahd]uhfM@hghhO]ubh~)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleX&Buildmaster Config; prioritizeBuildersXcfg-prioritizeBuildersrjtr(UsingleX'prioritizeBuilders (Buildmaster Config)jjtreuhfMBhghhO]ubh)r}r(hTUhUjhVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfMBhghhO]ubh)r}r(hTX.. _Prioritizing-Builders:hUjhVhYh}h[hh]}r(hb]ha]h_]h`]hd]hh;uhfMChghh}rjjshO]ubeubhQ)r}r(hTUhUhRhVhYh}r hjsh[h\h]}r (h_]h`]ha]hb]r (h;jh1ehd]r (hheuhfMFhghh}r (jjh;juhO]r (hi)r }r (hTXPrioritizing Buildersr hUjhVhYh[hmh]}r (h_]h`]ha]hb]hd]uhfMFhghhO]r hpXPrioritizing Buildersr r }r (hTj hUj ubaubh)r }r (hTXedef prioritizeBuilders(buildmaster, builders): # ... c['prioritizeBuilders'] = prioritizeBuildershUjhVhYh[hh]}r (jjXpythonhhhb]ha]h_]h`]hd]uhfMHhghhO]r hpXedef prioritizeBuilders(buildmaster, builders): # ... c['prioritizeBuilders'] = prioritizeBuildersr r }r (hTUhUj ubaubht)r }r (hTX0By 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.hUjhVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMNhghhO]r (hpXBy 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 (hTXBy 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 hUj ubh)r }r (hTX:bb:cfg:`prioritizeBuilders`r hUj hVhYh[hh]}r (UreftypeXcfghԉhXprioritizeBuildersU refdomainXbbr hb]ha]U refexplicith_]h`]hd]hhuhfMNhO]r! h)r" }r# (hTj h]}r$ (h_]h`]r% (hj Xbb-cfgr& eha]hb]hd]uhUj hO]r' hpXprioritizeBuildersr( r) }r* (hTUhUj" ubah[hubaubhpX0 configuration key, which takes a callable. See r+ r, }r- (hTX0 configuration key, which takes a callable. See hUj ubh)r. }r/ (hTX!:ref:`Builder-Priority-Functions`r0 hUj hVhYh[hh]}r1 (UreftypeXrefhԈhXbuilder-priority-functionsU refdomainXstdr2 hb]ha]U refexplicith_]h`]hd]hhuhfMNhO]r3 j?)r4 }r5 (hTj0 h]}r6 (h_]h`]r7 (hj2 Xstd-refr8 eha]hb]hd]uhUj. hO]r9 hpXBuilder-Priority-Functionsr: r; }r< (hTUhUj4 ubah[jIubaubhpX for details on this callable.r= r> }r? (hTX for details on this callable.hUj ubeubht)r@ }rA (hTXBThis 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`.hUjhVhYh[hxh]}rB (h_]h`]ha]hb]hd]uhfMRhghhO]rC (hpX'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 rD rE }rF (hTX'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 hUj@ ubh)rG }rH (hTX:ref:`Prioritizing-Builds`rI hUj@ hVhYh[hh]}rJ (UreftypeXrefhԈhXprioritizing-buildsU refdomainXstdrK hb]ha]U refexplicith_]h`]hd]hhuhfMRhO]rL j?)rM }rN (hTjI h]}rO (h_]h`]rP (hjK Xstd-refrQ eha]hb]hd]uhUjG hO]rR hpXPrioritizing-BuildsrS rT }rU (hTUhUjM ubah[jIubaubhpX.rV }rW (hTX.hUj@ ubeubh~)rX }rY (hTUhUjhVhYh[hh]}rZ (hb]ha]h_]h`]hd]Uentries]r[ ((UsingleX Buildmaster Config; slavePortnumXcfg-slavePortnumr\ j\ tr] (UsingleX!slavePortnum (Buildmaster Config)j\ j\ tr^ euhfMWhghhO]ubh)r_ }r` (hTUhUjhVhYh[hh]}ra (hb]ha]h_]h`]hd]hj\ uhfMWhghhO]ubh)rb }rc (hTX#.. _Setting-the-PB-Port-for-Slaves:hUjhVhYh}h[hh]}rd (hb]ha]h_]h`]hd]hhKuhfMXhghh}re j\ j_ shO]ubeubhQ)rf }rg (hTUhUhRhVhYh}rh h"jb sh[h\h]}ri (h_]h`]ha]hb]rj (hKj\ h?ehd]rk (hh"euhfM[hghh}rl (hKjb j\ j_ uhO]rm (hi)rn }ro (hTXSetting the PB Port for Slavesrp hUjf hVhYh[hmh]}rq (h_]h`]ha]hb]hd]uhfM[hghhO]rr hpXSetting the PB Port for Slavesrs rt }ru (hTjp hUjn ubaubh)rv }rw (hTXc['slavePortnum'] = 10000hUjf hVhYh[hh]}rx (hhhb]ha]h_]h`]hd]uhfM_hghhO]ry hpXc['slavePortnum'] = 10000rz r{ }r| (hTUhUjv ubaubht)r} }r~ (hTX7The 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.r hUjf hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMahghhO]r hpX7The 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.r r }r (hTj hUj} ubaubht)r }r (hTXyIt 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 hUjf hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMehghhO]r hpXyIt 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 (hTj hUj ubaubht)r }r (hTX:bb:cfg:`slavePortnum` is a *strports* specification string, defined in the ``twisted.application.strports`` module (try ``pydoc twisted.application.strports`` to get documentation on the format).r hUjf hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhhghhO]r (h)r }r (hTX:bb:cfg:`slavePortnum`r hUj hVhYh[hh]}r (UreftypeXcfghԉhX slavePortnumU refdomainXbbr hb]ha]U refexplicith_]h`]hd]hhuhfMhhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xbb-cfgr eha]hb]hd]uhUj hO]r hpX slavePortnumr r }r (hTUhUj ubah[hubaubhpX is a r r }r (hTX is a hUj ubj?)r }r (hTX *strports*h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXstrportsr r }r (hTUhUj ubah[jIubhpX& specification string, defined in the r r }r (hTX& specification string, defined in the hUj ubh)r }r (hTX ``twisted.application.strports``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXtwisted.application.strportsr r }r (hTUhUj ubah[hubhpX module (try r r }r (hTX module (try hUj ubh)r }r (hTX&``pydoc twisted.application.strports``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpX"pydoc twisted.application.strportsr r }r (hTUhUj ubah[hubhpX% to get documentation on the format).r r }r (hTX% to get documentation on the format).hUj ubeubht)r }r (hTXVThis means that you can have the buildmaster listen on a localhost-only port by doing:r hUjf hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMjhghhO]r hpXVThis means that you can have the buildmaster listen on a localhost-only port by doing:r r }r (hTj hUj ubaubh)r }r (hTX3c['slavePortnum'] = "tcp:10000:interface=127.0.0.1"hUjf hVhYh[hh]}r (jjXpythonhhhb]ha]h_]h`]hd]uhfMlhghhO]r hpX3c['slavePortnum'] = "tcp:10000:interface=127.0.0.1"r r }r (hTUhUj ubaubht)r }r (hTXThis 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 hUjf hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMphghhO]r (hpXThis 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 (hTXThis might be useful if you only run buildslaves on the same machine, and they are all configured to contact the buildmaster at hUj ubh)r }r (hTX``localhost:10000``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXlocalhost:10000r r }r (hTUhUj ubah[hubhpX.r }r (hTX.hUj ubeubh~)r }r (hTUhUjf hVhYh[hh]}r (hb]ha]h_]h`]hd]js]r (juXProperties; globalUindex-5r Utr ajxuhfMrhghhO]ubh)r }r (hTUhUjf hVhYh[hh]}r (h_]h`]ha]hb]r j ahd]uhfMshghhO]ubh~)r }r (hTUhUjf hVhYh[hh]}r (hb]ha]h_]h`]hd]Uentries]r ((UsingleXBuildmaster Config; propertiesXcfg-propertiesr j tr (UsingleXproperties (Buildmaster Config)j j tr euhfMuhghhO]ubh)r }r (hTUhUjf hVhYh[hh]}r (hb]ha]h_]h`]hd]hj uhfMuhghhO]ubeubhQ)r }r (hTUhUhRhVhYh}h[h\h]}r (h_]h`]ha]hb]r (hBj ehd]r hauhfMwhghh}r j j shO]r (hi)r }r (hTXDefining Global Propertiesr hUj hVhYh[hmh]}r (h_]h`]ha]hb]hd]uhfMwhghhO]r hpXDefining Global Propertiesr r }r (hTj hUj ubaubht)r }r (hTXThe :bb:cfg:`properties` configuration key defines a dictionary of properties that will be available to all builds started by the buildmaster:r hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMyhghhO]r (hpXThe r r }r (hTXThe hUj ubh)r }r (hTX:bb:cfg:`properties`r hUj hVhYh[hh]}r (UreftypeXcfghԉhX propertiesU refdomainXbbr hb]ha]U refexplicith_]h`]hd]hhuhfMyhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xbb-cfgr eha]hb]hd]uhUj hO]r hpX propertiesr r }r (hTUhUj ubah[hubaubhpXv configuration key defines a dictionary of properties that will be available to all builds started by the buildmaster:r r }r (hTXv configuration key defines a dictionary of properties that will be available to all builds started by the buildmaster:hUj ubeubh)r }r (hTXQc['properties'] = { 'Widget-version' : '1.2', 'release-stage' : 'alpha' }hUj hVhYh[hh]}r! (jjXpythonhhhb]ha]h_]h`]hd]uhfM{hghhO]r" hpXQc['properties'] = { 'Widget-version' : '1.2', 'release-stage' : 'alpha' }r# r$ }r% (hTUhUj ubaubh~)r& }r' (hTUhUj hVhYh[hh]}r( (hb]ha]h_]h`]hd]Uentries]r) ((UsingleX!Buildmaster Config; debugPasswordXcfg-debugPasswordr* j* tr+ (UsingleX"debugPassword (Buildmaster Config)j* j* tr, euhfMhghhO]ubh)r- }r. (hTUhUj hVhYh[hh]}r/ (hb]ha]h_]h`]hd]hj* uhfMhghhO]ubh)r0 }r1 (hTX.. _Debug-Options:hUj hVhYh}h[hh]}r2 (hb]ha]h_]h`]hd]hhGuhfMhghh}r3 j* j- shO]ubeubhQ)r4 }r5 (hTUhUhRhVhYh}r6 hj0 sh[h\h]}r7 (h_]h`]ha]hb]r8 (hGj* h4ehd]r9 (h heuhfMhghh}r: (hGj0 j* j- uhO]r; (hi)r< }r= (hTX Debug Optionsr> hUj4 hVhYh[hmh]}r? (h_]h`]ha]hb]hd]uhfMhghhO]r@ hpX Debug OptionsrA rB }rC (hTj> hUj< ubaubht)rD }rE (hTXIf 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.)hUj4 hVhYh[hxh]}rF (h_]h`]ha]hb]hd]uhfMhghhO]rG (hpX If you set rH rI }rJ (hTX If you set hUjD ubh)rK }rL (hTX:bb:cfg:`debugPassword`rM hUjD hVhYh[hh]}rN (UreftypeXcfghԉhX debugPasswordU refdomainXbbrO hb]ha]U refexplicith_]h`]hd]hhuhfMhO]rP h)rQ }rR (hTjM h]}rS (h_]h`]rT (hjO Xbb-cfgrU eha]hb]hd]uhUjK hO]rV hpX debugPasswordrW rX }rY (hTUhUjQ ubah[hubaubhpXO, then you can connect to the buildmaster with the diagnostic tool launched by rZ r[ }r\ (hTXO, then you can connect to the buildmaster with the diagnostic tool launched by hUjD ubh)r] }r^ (hTUh]}r_ (hb]ha]h_]h`]r` Xsampra aUroleja hd]uhUjD hO]rb (hpXbuildbot debugclient rc rd }re (hTXbuildbot debugclient hUj] ubj?)rf }rg (hTXMASTERh]}rh (h_]h`]ha]hb]hd]uhUj] hO]ri hpXMASTERrj rk }rl (hTUhUjf ubah[jIubhpX:rm }rn (hTX:hUj] ubj?)ro }rp (hTXPORTh]}rq (h_]h`]ha]hb]hd]uhUj] hO]rr hpXPORTrs rt }ru (hTUhUjo ubah[jIubeh[hubhpX. 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.)rv rw }rx (hTX. 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.)hUjD ubeubht)ry }rz (hTXThe debug tool uses the same port number as the slaves, :bb:cfg:`slavePortnum`, and you may configure its authentication credentials as follows::r{ hUj4 hVhYh[hxh]}r| (h_]h`]ha]hb]hd]uhfMhghhO]r} (hpX8The debug tool uses the same port number as the slaves, r~ r }r (hTX8The debug tool uses the same port number as the slaves, hUjy ubh)r }r (hTX:bb:cfg:`slavePortnum`r hUjy hVhYh[hh]}r (UreftypeXcfghԉhX slavePortnumU refdomainXbbr hb]ha]U refexplicith_]h`]hd]hhuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xbb-cfgr eha]hb]hd]uhUj hO]r hpX slavePortnumr r }r (hTUhUj ubah[hubaubhpXB, and you may configure its authentication credentials as follows:r r }r (hTXB, and you may configure its authentication credentials as follows:hUjy ubeubh)r }r (hTX$c['debugPassword'] = "debugpassword"hUj4 hVhYh[hh]}r (hhhb]ha]h_]h`]hd]uhfMhghhO]r hpX$c['debugPassword'] = "debugpassword"r r }r (hTUhUj ubaubh~)r }r (hTUhUj4 hVhYh[hh]}r (hb]ha]h_]h`]hd]js]r (juXManholeUindex-6r Utr ajxuhfMhghhO]ubh)r }r (hTUhUj4 hVhYh[hh]}r (h_]h`]ha]hb]r j ahd]uhfMhghhO]ubh~)r }r (hTUhUj4 hVhYh[hh]}r (hb]ha]h_]h`]hd]Uentries]r ((UsingleXBuildmaster Config; manholeX cfg-manholer j tr (UsingleXmanhole (Buildmaster Config)j j tr euhfMhghhO]ubh)r }r (hTUhUj4 hVhYh[hh]}r (hb]ha]h_]h`]hd]hj uhfMhghhO]ubeubhQ)r }r (hTUhUhRhVhYh}h[h\h]}r (h_]h`]ha]hb]r (hDj ehd]r hauhfMhghh}r j j shO]r (hi)r }r (hTXManholer hUj hVhYh[hmh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r hpXManholer r }r (hTj hUj ubaubht)r }r (hTXIf 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.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpX If you set r r }r (hTX If you set hUj ubh)r }r (hTX:bb:cfg:`manhole`r hUj hVhYh[hh]}r (UreftypeXcfghԉhXmanholeU refdomainXbbr hb]ha]U refexplicith_]h`]hd]hhuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xbb-cfgr eha]hb]hd]uhUj hO]r hpXmanholer r }r (hTUhUj ubah[hubaubhpX) to an instance of one of the classes in r r }r (hTX) to an instance of one of the classes in hUj ubh)r }r (hTX``buildbot.manhole``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXbuildbot.manholer r }r (hTUhUj ubah[hubhpXi, 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 (hTXi, 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.hUj ubeubht)r }r (hTX 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.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpXThere are three separate r r }r (hTXThere are three separate hUj ubh)r }r (hTX:class:`Manhole`r hUj hVhYh[hh]}r (UreftypeXclasshԉhXManholeU refdomainXpyr hb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xpy-classr eha]hb]hd]uhUj hO]r hpXManholer r }r (hTUhUj ubah[hubaubhpX 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 (hTX 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 hUj ubh)r }r (hTUh]}r (hb]ha]h_]h`]r Xfiler aUrolej hd]uhUj hO]r hpXauthorized_keysr r }r (hTXauthorized_keyshUj ubah[hubhpX/ file which contains a list of ssh public keys.r r }r (hTX/ file which contains a list of ssh public keys.hUj ubeubcdocutils.nodes note r )r }r (hTXUsing any Manhole requires that ``pycrypto`` and ``pyasn1`` be installed. These are not part of the normal Buildbot dependencies.hUj hVhYh[Unoter h]}r (h_]h`]ha]hb]hd]uhfNhghhO]r ht)r }r (hTXUsing any Manhole requires that ``pycrypto`` and ``pyasn1`` be installed. These are not part of the normal Buildbot dependencies.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhO]r (hpX Using any Manhole requires that r r }r (hTX Using any Manhole requires that hUj ubh)r }r (hTX ``pycrypto``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXpycryptor r }r (hTUhUj ubah[hubhpX and r r }r (hTX and hUj ubh)r }r (hTX ``pyasn1``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXpyasn1r r! }r" (hTUhUj ubah[hubhpXF be installed. These are not part of the normal Buildbot dependencies.r# r$ }r% (hTXF be installed. These are not part of the normal Buildbot dependencies.hUj ubeubaubj)r& }r' (hTUhUj hVhYh[j h]}r( (h_]h`]ha]hb]hd]uhfNhghhO]r) (j#)r* }r+ (hTX `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. hUj& hVhYh[j&h]}r, (h_]h`]ha]hb]hd]uhfMhO]r- (j))r. }r/ (hTX`manhole.AuthorizedKeysManhole`r0 hUj* hVhYh[j-h]}r1 (h_]h`]ha]hb]hd]uhfMhO]r2 cdocutils.nodes title_reference r3 )r4 }r5 (hTj0 h]}r6 (h_]h`]ha]hb]hd]uhUj. hO]r7 hpXmanhole.AuthorizedKeysManholer8 r9 }r: (hTUhUj4 ubah[Utitle_referencer; ubaubj7)r< }r= (hTUh]}r> (h_]h`]ha]hb]hd]uhUj* hO]r? ht)r@ }rA (hTXYou 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.hUj< hVhYh[hxh]}rB (h_]h`]ha]hb]hd]uhfMhO]rC (hpX`You construct this with the name of a file that contains one SSH public key per line, just like rD rE }rF (hTX`You construct this with the name of a file that contains one SSH public key per line, just like hUj@ ubh)rG }rH (hTUh]}rI (hb]ha]h_]h`]rJ XfilerK aUrolejK hd]uhUj@ hO]rL hpX~/.ssh/authorized_keysrM rN }rO (hTX~/.ssh/authorized_keyshUjG ubah[hubhpXn. If you provide a non-absolute filename, it will be interpreted relative to the buildmaster's base directory.rP rQ }rR (hTXn. If you provide a non-absolute filename, it will be interpreted relative to the buildmaster's base directory.hUj@ ubeubah[j]ubeubj#)rS }rT (hTX`manhole.PasswordManhole` This one accepts SSH connections but asks for a username and password when authenticating. It accepts only one such pair. hUj& hVhYh[j&h]}rU (h_]h`]ha]hb]hd]uhfMhghhO]rV (j))rW }rX (hTX`manhole.PasswordManhole`rY hUjS hVhYh[j-h]}rZ (h_]h`]ha]hb]hd]uhfMhO]r[ j3 )r\ }r] (hTjY h]}r^ (h_]h`]ha]hb]hd]uhUjW hO]r_ hpXmanhole.PasswordManholer` ra }rb (hTUhUj\ ubah[j; ubaubj7)rc }rd (hTUh]}re (h_]h`]ha]hb]hd]uhUjS hO]rf ht)rg }rh (hTXyThis one accepts SSH connections but asks for a username and password when authenticating. It accepts only one such pair.ri hUjc hVhYh[hxh]}rj (h_]h`]ha]hb]hd]uhfMhO]rk hpXyThis one accepts SSH connections but asks for a username and password when authenticating. It accepts only one such pair.rl rm }rn (hTji hUjg ubaubah[j]ubeubj#)ro }rp (hTX`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. hUj& hVhYh[j&h]}rq (h_]h`]ha]hb]hd]uhfMhghhO]rr (j))rs }rt (hTX`manhole.TelnetManhole`ru hUjo hVhYh[j-h]}rv (h_]h`]ha]hb]hd]uhfMhO]rw j3 )rx }ry (hTju h]}rz (h_]h`]ha]hb]hd]uhUjs hO]r{ hpXmanhole.TelnetManholer| r} }r~ (hTUhUjx ubah[j; ubaubj7)r }r (hTUh]}r (h_]h`]ha]hb]hd]uhUjo hO]r ht)r }r (hTXThis 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 hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhO]r hpXThis 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 (hTj hUj ubaubah[j]ubeubeubh)r }r (hTX # 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")hUj hVhYh[hh]}r (hhhb]ha]h_]h`]hd]uhfMhghhO]r hpX # 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 (hTUhUj ubaubht)r }r (hTXThe :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. ::hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpXThe r r }r (hTXThe hUj ubh)r }r (hTX:class:`Manhole`r hUj hVhYh[hh]}r (UreftypeXclasshԉhXManholeU refdomainXpyr hb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xpy-classr eha]hb]hd]uhUj hO]r hpXManholer r }r (hTUhUj ubah[hubaubhpX 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 (hTX 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 hUj ubj3 )r }r (hTX`lo0`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXlo0r r }r (hTUhUj ubah[j; ubhpX, r r }r (hTX, hUj ubj3 )r }r (hTX `localhost`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpX localhostr r }r (hTUhUj ubah[j; ubhpXQ, or 127.0.0.1) to restrict access to clients which are running on the same host.r r }r (hTXQ, or 127.0.0.1) to restrict access to clients which are running on the same host.hUj ubeubh)r }r (hTX|from buildbot.manhole import PasswordManhole c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")hUj hVhYh[hh]}r (hhhb]ha]h_]h`]hd]uhfMhghhO]r hpX|from buildbot.manhole import PasswordManhole c['manhole'] = PasswordManhole("tcp:9999:interface=127.0.0.1","admin","passwd")r r }r (hTUhUj ubaubht)r }r (hTXTo 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.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpX To have the r r }r (hTX To have the hUj ubh)r }r (hTX:class:`Manhole`r hUj hVhYh[hh]}r (UreftypeXclasshԉhXManholeU refdomainXpyr hb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xpy-classr eha]hb]hd]uhUj hO]r hpXManholer r }r (hTUhUj ubah[hubaubhpX listen on all interfaces, use r r }r (hTX listen on all interfaces, use hUj ubh)r }r (hTX``"tcp:9999"``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpX "tcp:9999"r r }r (hTUhUj ubah[hubhpX. or simply 9999. This port specification uses r r }r (hTX. or simply 9999. This port specification uses hUj ubh)r }r (hTX ``twisted.application.strports``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXtwisted.application.strportsr r }r (hTUhUj ubah[hubhpXK, so you can make it listen on SSL or even UNIX-domain sockets if you want.r r }r (hTXK, so you can make it listen on SSL or even UNIX-domain sockets if you want.hUj ubeubht)r }r (hTX\Note that using any :class:`Manhole` requires that the `TwistedConch`_ package be installed.r hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpXNote that using any r r }r (hTXNote that using any hUj ubh)r }r (hTX:class:`Manhole`r hUj hVhYh[hh]}r (UreftypeXclasshԉhXManholeU refdomainXpyr hb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xpy-classr eha]hb]hd]uhUj hO]r hpXManholer r }r (hTUhUj ubah[hubaubhpX requires that the r r }r (hTX requires that the hUj ubj)r }r (hTX`TwistedConch`_Uresolvedr KhUj h[jh]}r (UnameX TwistedConchUrefurir X/http://twistedmatrix.com/trac/wiki/TwistedConchr hb]ha]h_]h`]hd]uhO]r hpX TwistedConchr r }r (hTUhUj ubaubhpX package be installed.r r }r (hTX package be installed.hUj ubeubht)r }r (hTX]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:hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpXThe 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 (hTXThe 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 hUj ubj3 )r! }r" (hTX`host key mismatch`h]}r# (h_]h`]ha]hb]hd]uhUj hO]r$ hpXhost key mismatchr% r& }r' (hTUhUj! ubah[j; ubhpX, 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* (hTX, 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 hUj ubh)r+ }r, (hTUh]}r- (hb]ha]h_]h`]r. Xfiler/ aUrolej/ hd]uhUj hO]r0 hpX .ssh/configr1 r2 }r3 (hTX .ssh/confighUj+ ubah[hubhpX file:r4 r5 }r6 (hTX file:hUj ubeubh)r7 }r8 (hTXHost 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 adminhUj hVhYh[hh]}r9 (jjXnonehhhb]ha]h_]h`]hd]uhfMhghhO]r: hpXHost 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; r< }r= (hTUhUj7 ubaubhQ)r> }r? (hTUhUj hVhYh[h\h]}r@ (h_]h`]ha]hb]rA h@ahd]rB hauhfMhghhO]rC (hi)rD }rE (hTX Using ManholerF hUj> hVhYh[hmh]}rG (h_]h`]ha]hb]hd]uhfMhghhO]rH hpX Using ManholerI rJ }rK (hTjF hUjD ubaubht)rL }rM (hTXAfter 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.hUj> hVhYh[hxh]}rN (h_]h`]ha]hb]hd]uhfMhghhO]rO (hpX{After you have connected to a manhole instance, you will find yourself at a Python prompt. You have access to two objects: rP rQ }rR (hTX{After you have connected to a manhole instance, you will find yourself at a Python prompt. You have access to two objects: hUjL ubh)rS }rT (hTX ``master``h]}rU (h_]h`]ha]hb]hd]uhUjL hO]rV hpXmasterrW rX }rY (hTUhUjS ubah[hubhpX (the BuildMaster) and rZ r[ }r\ (hTX (the BuildMaster) and hUjL ubh)r] }r^ (hTX ``status``h]}r_ (h_]h`]ha]hb]hd]uhUjL hO]r` hpXstatusra rb }rc (hTUhUj] ubah[hubhpXl (the master's Status object). Most interesting objects on the master can be reached from these two objects.rd re }rf (hTXl (the master's Status object). Most interesting objects on the master can be reached from these two objects.hUjL ubeubht)rg }rh (hTXiTo aid in navigation, the ``show`` method is defined. It displays the non-method attributes of an object.hUj> hVhYh[hxh]}ri (h_]h`]ha]hb]hd]uhfMhghhO]rj (hpXTo aid in navigation, the rk rl }rm (hTXTo aid in navigation, the hUjg ubh)rn }ro (hTX``show``h]}rp (h_]h`]ha]hb]hd]uhUjg hO]rq hpXshowrr rs }rt (hTUhUjn ubah[hubhpXG method is defined. It displays the non-method attributes of an object.ru rv }rw (hTXG method is defined. It displays the non-method attributes of an object.hUjg ubeubht)rx }ry (hTX#A manhole session might look like::rz hUj> hVhYh[hxh]}r{ (h_]h`]ha]hb]hd]uhfMhghhO]r| hpX"A manhole session might look like:r} r~ }r (hTX"A manhole session might look like:hUjx ubaubh)r }r (hTX_>>> 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'hUj> hVhYh[hh]}r (hhhb]ha]h_]h`]hd]uhfMhghhO]r hpX_>>> 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 (hTUhUj ubaubh~)r }r (hTUhUj> hVhYh[hh]}r (hb]ha]h_]h`]hd]Uentries]r ((UsingleXBuildmaster Config; metricsX cfg-metricsr j tr (UsingleXmetrics (Buildmaster Config)j j tr euhfMhghhO]ubh)r }r (hTUhUj> hVhYh[hh]}r (hb]ha]h_]h`]hd]hj uhfMhghhO]ubeubeubhQ)r }r (hTUhUhRhVhYh}h[h\h]}r (h_]h`]ha]hb]r (hEj ehd]r hauhfMhghh}r j j shO]r (hi)r }r (hTXMetrics Optionsr hUj hVhYh[hmh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r hpXMetrics Optionsr r }r (hTj hUj ubaubh)r }r (hTX:c['metrics'] = dict(log_interval=10, periodic_interval=10)hUj hVhYh[hh]}r (hhhb]ha]h_]h`]hd]uhfMhghhO]r hpX:c['metrics'] = dict(log_interval=10, periodic_interval=10)r r }r (hTUhUj ubaubht)r }r (hTX: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.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (h)r }r (hTX:bb:cfg:`metrics`r hUj hVhYh[hh]}r (UreftypeXcfghԉhXmetricsU refdomainXbbr hb]ha]U refexplicith_]h`]hd]hhuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xbb-cfgr eha]hb]hd]uhUj hO]r hpXmetricsr r }r (hTUhUj ubah[hubaubhpXR can be a dictionary that configures various aspects of the metrics subsystem. If r r }r (hTXR can be a dictionary that configures various aspects of the metrics subsystem. If hUj ubh)r }r (hTX:bb:cfg:`metrics`r hUj hVhYh[hh]}r (UreftypeXcfghԉhXmetricsU refdomainXbbr hb]ha]U refexplicith_]h`]hd]hhuhfMhO]r h)r }r (hTj h]}r (h_]h`]r (hj Xbb-cfgr eha]hb]hd]uhUj hO]r hpXmetricsr r }r (hTUhUj ubah[hubaubhpX is r r }r (hTX is hUj ubh)r }r (hTX``None``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXNoner r }r (hTUhUj ubah[hubhpXB, then metrics collection, logging and reporting will be disabled.r r }r (hTXB, then metrics collection, logging and reporting will be disabled.hUj ubeubht)r }r (hTX``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.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (h)r }r (hTX``log_interval``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpX log_intervalr r }r (hTUhUj ubah[hubhpXa determines how often metrics should be logged to twistd.log. It defaults to 60s. If set to 0 or r r }r (hTXa determines how often metrics should be logged to twistd.log. It defaults to 60s. If set to 0 or hUj ubh)r }r (hTX``None``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXNoner r }r (hTUhUj ubah[hubhpXU, then logging of metrics will be disabled. This value can be changed via a reconfig.r r }r (hTXU, then logging of metrics will be disabled. This value can be changed via a reconfig.hUj ubeubht)r }r (hTX&``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.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (h)r }r (hTX``periodic_interval``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXperiodic_intervalr r }r (hTUhUj ubah[hubhpX 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 r r }r (hTX 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 hUj ubh)r }r (hTX``None``h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXNoner r }r (hTUhUj ubah[hubhpXc, then periodic collection of this data is disabled. This value can also be changed via a reconfig.r r }r (hTXc, then periodic collection of this data is disabled. This value can also be changed via a reconfig.hUj ubeubht)r }r (hTXURead more about metrics in the :ref:`Metrics` section in the developer documentation.r hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpXRead more about metrics in the r r }r (hTXRead more about metrics in the hUj ubh)r }r (hTX:ref:`Metrics`r hUj hVhYh[hh]}r (UreftypeXrefhԈhXmetricsU refdomainXstdr hb]ha]U refexplicith_]h`]hd]hhuhfMhO]r j?)r }r (hTj h]}r (h_]h`]r (hj Xstd-refr eha]hb]hd]uhUj hO]r hpXMetricsr r }r (hTUhUj ubah[jIubaubhpX( section in the developer documentation.r r! }r" (hTX( section in the developer documentation.hUj ubeubh~)r# }r$ (hTUhUj hVhYh[hh]}r% (hb]ha]h_]h`]hd]Uentries]r& ((UsingleX!Buildmaster Config; user_managersXcfg-user_managersr' j' tr( (UsingleX"user_managers (Buildmaster Config)j' j' tr) euhfMhghhO]ubh)r* }r+ (hTUhUj hVhYh[hh]}r, (hb]ha]h_]h`]hd]hj' uhfMhghhO]ubh)r- }r. (hTX.. _Users-Options:hUj hVhYh}h[hh]}r/ (hb]ha]h_]h`]hd]hhMuhfM hghh}r0 j' j* shO]ubeubhQ)r1 }r2 (hTUhUhRhVhYh}r3 h$j- sh[h\h]}r4 (h_]h`]ha]hb]r5 (hMj' hFehd]r6 (hh$euhfM hghh}r7 (j' j* hMj- uhO]r8 (hi)r9 }r: (hTX Users Optionsr; hUj1 hVhYh[hmh]}r< (h_]h`]ha]hb]hd]uhfM hghhO]r= hpX Users Optionsr> r? }r@ (hTj; hUj9 ubaubh)rA }rB (hTX from buildbot.process.users import manual c['user_managers'] = [] c['user_managers'].append(manual.CommandlineUserManager(username="user", passwd="userpw", port=9990))hUj1 hVhYh[hh]}rC (hhhb]ha]h_]h`]hd]uhfMhghhO]rD hpX from buildbot.process.users import manual c['user_managers'] = [] c['user_managers'].append(manual.CommandlineUserManager(username="user", passwd="userpw", port=9990))rE rF }rG (hTUhUjA ubaubht)rH }rI (hTX=: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.hUj1 hVhYh[hxh]}rJ (h_]h`]ha]hb]hd]uhfMhghhO]rK (h)rL }rM (hTX:bb:cfg:`user_managers`rN hUjH hVhYh[hh]}rO (UreftypeXcfghԉhX user_managersU refdomainXbbrP hb]ha]U refexplicith_]h`]hd]hhuhfMhO]rQ h)rR }rS (hTjN h]}rT (h_]h`]rU (hjP Xbb-cfgrV eha]hb]hd]uhUjL hO]rW hpX user_managersrX rY }rZ (hTUhUjR ubah[hubaubhpXN contains a list of ways to manually manage User Objects within Buildbot (see r[ r\ }r] (hTXN contains a list of ways to manually manage User Objects within Buildbot (see hUjH ubh)r^ }r_ (hTX:ref:`User-Objects`r` hUjH hVhYh[hh]}ra (UreftypeXrefhԈhX user-objectsU refdomainXstdrb hb]ha]U refexplicith_]h`]hd]hhuhfMhO]rc j?)rd }re (hTj` h]}rf (h_]h`]rg (hjb Xstd-refrh eha]hb]hd]uhUj^ hO]ri hpX User-Objectsrj rk }rl (hTUhUjd ubah[jIubaubhpX/). Currently implemented is a commandline tool rm rn }ro (hTX/). Currently implemented is a commandline tool hUjH ubj3 )rp }rq (hTX`buildbot user`h]}rr (h_]h`]ha]hb]hd]uhUjH hO]rs hpX buildbot userrt ru }rv (hTUhUjp ubah[j; ubhpX, described at length in rw rx }ry (hTX, described at length in hUjH ubh)rz }r{ (hTX:bb:cmdline:`user`r| hUjH hVhYh[hh]}r} (UreftypeXcmdlinehԉhXuserU refdomainXbbr~ hb]ha]U refexplicith_]h`]hd]hhuhfMhO]r h)r }r (hTj| h]}r (h_]h`]r (hj~ X bb-cmdliner eha]hb]hd]uhUjz hO]r hpXuserr r }r (hTUhUj ubah[hubaubhpX\. In the future, a web client will also be able to manage User Objects and their attributes.r r }r (hTX\. In the future, a web client will also be able to manage User Objects and their attributes.hUjH ubeubht)r }r (hTXAs shown above, to enable the `buildbot user` tool, you must initialize a `CommandlineUserManager` instance in your `master.cfg`. `CommandlineUserManager` instances require the following arguments:hUj1 hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhghhO]r (hpXAs shown above, to enable the r r }r (hTXAs shown above, to enable the hUj ubj3 )r }r (hTX`buildbot user`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpX buildbot userr r }r (hTUhUj ubah[j; ubhpX tool, you must initialize a r r }r (hTX tool, you must initialize a hUj ubj3 )r }r (hTX`CommandlineUserManager`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXCommandlineUserManagerr r }r (hTUhUj ubah[j; ubhpX instance in your r r }r (hTX instance in your hUj ubj3 )r }r (hTX `master.cfg`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpX master.cfgr r }r (hTUhUj ubah[j; ubhpX. r r }r (hTX. hUj ubj3 )r }r (hTX`CommandlineUserManager`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXCommandlineUserManagerr r }r (hTUhUj ubah[j; ubhpX+ instances require the following arguments:r r }r (hTX+ instances require the following arguments:hUj ubeubj)r }r (hTUhUj1 hVhYh[j h]}r (h_]h`]ha]hb]hd]uhfNhghhO]r (j#)r }r (hTX``username`` This is the `username` that will be registered on the PB connection and need to be used when calling `buildbot user`. hUj hVhYh[j&h]}r (h_]h`]ha]hb]hd]uhfMhO]r (j))r }r (hTX ``username``r hUj hVhYh[j-h]}r (h_]h`]ha]hb]hd]uhfMhO]r h)r }r (hTj h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXusernamer r }r (hTUhUj ubah[hubaubj7)r }r (hTUh]}r (h_]h`]ha]hb]hd]uhUj hO]r ht)r }r (hTXuThis is the `username` that will be registered on the PB connection and need to be used when calling `buildbot user`.hUj hVhYh[hxh]}r (h_]h`]ha]hb]hd]uhfMhO]r (hpX This is the r r }r (hTX This is the hUj ubj3 )r }r (hTX `username`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXusernamer r }r (hTUhUj ubah[j; ubhpXO that will be registered on the PB connection and need to be used when calling r r }r (hTXO that will be registered on the PB connection and need to be used when calling hUj ubj3 )r }r (hTX`buildbot user`h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpX buildbot userr r }r (hTUhUj ubah[j; ubhpX.r }r (hTX.hUj ubeubah[j]ubeubj#)r }r (hTX``passwd`` This is the `passwd` that will be registered on the PB connection and need to be used when calling `buildbot user`. hUj hVhYh[j&h]}r (h_]h`]ha]hb]hd]uhfM!hghhO]r (j))r }r (hTX ``passwd``r hUj hVhYh[j-h]}r (h_]h`]ha]hb]hd]uhfM!hO]r h)r }r (hTj h]}r (h_]h`]ha]hb]hd]uhUj hO]r hpXpasswdr r }r (hTUhUj ubah[hubaubj7)r }r (hTUh]}r (h_]h`]ha]hb]hd]uhUj hO]rht)r}r(hTXsThis is the `passwd` that will be registered on the PB connection and need to be used when calling `buildbot user`.hUj hVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfM!hO]r(hpX This is the rr}r(hTX This is the hUjubj3 )r}r (hTX`passwd`h]}r (h_]h`]ha]hb]hd]uhUjhO]r hpXpasswdr r }r(hTUhUjubah[j; ubhpXO that will be registered on the PB connection and need to be used when calling rr}r(hTXO that will be registered on the PB connection and need to be used when calling hUjubj3 )r}r(hTX`buildbot user`h]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX buildbot userrr}r(hTUhUjubah[j; ubhpX.r}r(hTX.hUjubeubah[j]ubeubj#)r}r(hTX{``port`` The PB connection `port` must be different than `c['slavePortnum']` and be specified when calling `buildbot user` hUj hVhYh[j&h]}r(h_]h`]ha]hb]hd]uhfM$hghhO]r(j))r}r (hTX``port``r!hUjhVhYh[j-h]}r"(h_]h`]ha]hb]hd]uhfM$hO]r#h)r$}r%(hTj!h]}r&(h_]h`]ha]hb]hd]uhUjhO]r'hpXportr(r)}r*(hTUhUj$ubah[hubaubj7)r+}r,(hTUh]}r-(h_]h`]ha]hb]hd]uhUjhO]r.ht)r/}r0(hTXqThe PB connection `port` must be different than `c['slavePortnum']` and be specified when calling `buildbot user`hUj+hVhYh[hxh]}r1(h_]h`]ha]hb]hd]uhfM$hO]r2(hpXThe PB connection r3r4}r5(hTXThe PB connection hUj/ubj3 )r6}r7(hTX`port`h]}r8(h_]h`]ha]hb]hd]uhUj/hO]r9hpXportr:r;}r<(hTUhUj6ubah[j; ubhpX must be different than r=r>}r?(hTX must be different than hUj/ubj3 )r@}rA(hTX`c['slavePortnum']`h]}rB(h_]h`]ha]hb]hd]uhUj/hO]rChpXc['slavePortnum']rDrE}rF(hTUhUj@ubah[j; ubhpX and be specified when calling rGrH}rI(hTX and be specified when calling hUj/ubj3 )rJ}rK(hTX`buildbot user`h]}rL(h_]h`]ha]hb]hd]uhUj/hO]rMhpX buildbot userrNrO}rP(hTUhUjJubah[j; ubeubah[j]ubeubeubh~)rQ}rR(hTUhUj1 hVhYh[hh]}rS(hb]ha]h_]h`]hd]Uentries]rT((UsingleXBuildmaster Config; validationXcfg-validationrUjUtrV(UsingleXvalidation (Buildmaster Config)jUjUtrWeuhfM'hghhO]ubh)rX}rY(hTUhUj1 hVhYh[hh]}rZ(hb]ha]h_]h`]hd]hjUuhfM'hghhO]ubh)r[}r\(hTX.. _Input-Validation:hUj1 hVhYh}h[hh]}r](hb]ha]h_]h`]hd]hh0uhfM(hghh}r^jUjXshO]ubeubhQ)r_}r`(hTUhUhRhVhYh}rahj[sh[h\h]}rb(h_]h`]ha]hb]rc(h0jUh:ehd]rd(hheuhfM+hghh}re(jUjXh0j[uhO]rf(hi)rg}rh(hTXInput ValidationrihUj_hVhYh[hmh]}rj(h_]h`]ha]hb]hd]uhfM+hghhO]rkhpXInput Validationrlrm}rn(hTjihUjgubaubh)ro}rp(hTXimport 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\.\-\/\~:]*$'), }hUj_hVhYh[hh]}rq(hhhb]ha]h_]h`]hd]uhfM/hghhO]rrhpXimport 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\.\-\/\~:]*$'), }rsrt}ru(hTUhUjoubaubht)rv}rw(hTX 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.rxhUj_hVhYh[hxh]}ry(h_]h`]ha]hb]hd]uhfM7hghhO]rzhpX 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.r{r|}r}(hTjxhUjvubaubht)r~}r(hTXThe 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.rhUj_hVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfM;hghhO]rhpXThe 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.rr}r(hTjhUj~ubaubh~)r}r(hTUhUj_hVhYh[hh]}r(hb]ha]h_]h`]hd]Uentries]r((UsingleXBuildmaster Config; revlinkX cfg-revlinkrjtr(UsingleXrevlink (Buildmaster Config)jjtreuhfM?hghhO]ubh)r}r(hTUhUj_hVhYh[hh]}r(hb]ha]h_]h`]hd]hjuhfM?hghhO]ubeubhQ)r}r(hTUhUhRhVhYh}h[h\h]}r(h_]h`]ha]hb]r(hHjehd]rhauhfMAhghh}rjjshO]r(hi)r}r(hTXRevision LinksrhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfMAhghhO]rhpXRevision Linksrr}r(hTjhUjubaubht)r}r(hTXThe :bb:cfg:`revlink` parameter is used to create links from revision IDs in the web status to a web-view of your source control system. The parameter's value must be a callable.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMChghhO]r(hpXThe rr}r(hTXThe hUjubh)r}r(hTX:bb:cfg:`revlink`rhUjhVhYh[hh]}r(UreftypeXcfghԉhXrevlinkU refdomainXbbrhb]ha]U refexplicith_]h`]hd]hhuhfMChO]rh)r}r(hTjh]}r(h_]h`]r(hjXbb-cfgreha]hb]hd]uhUjhO]rhpXrevlinkrr}r(hTUhUjubah[hubaubhpX parameter is used to create links from revision IDs in the web status to a web-view of your source control system. The parameter's value must be a callable.rr}r(hTX parameter is used to create links from revision IDs in the web status to a web-view of your source control system. The parameter's value must be a callable.hUjubeubht)r}r(hTXfBy default, Buildbot is configured to generate revlinks for a number of open source hosting platforms.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMFhghhO]rhpXfBy default, Buildbot is configured to generate revlinks for a number of open source hosting platforms.rr}r(hTjhUjubaubht)r}r(hTXThe callable takes the revision id and repository argument, and should return an URL to the revision. Note that the revision id may not always be in the form you expect, so code defensively. In particular, a revision of "??" may be supplied when no other information is available.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMHhghhO]rhpXThe callable takes the revision id and repository argument, and should return an URL to the revision. Note that the revision id may not always be in the form you expect, so code defensively. In particular, a revision of "??" may be supplied when no other information is available.rr}r(hTjhUjubaubht)r}r(hTXNote that :class:`SourceStamp`\s that are not created from version-control changes (e.g., those created by a Nightly or Periodic scheduler) may have an empty repository string, if the repository is not known to the scheduler.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMLhghhO]r(hpX Note that rr}r(hTX Note that hUjubh)r}r(hTX:class:`SourceStamp`rhUjhVhYh[hh]}r(UreftypeXclasshԉhX SourceStampU refdomainXpyrhb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfMLhO]rh)r}r(hTjh]}r(h_]h`]r(hjXpy-classreha]hb]hd]uhUjhO]rhpX SourceStamprr}r(hTUhUjubah[hubaubhpXs that are not created from version-control changes (e.g., those created by a Nightly or Periodic scheduler) may have an empty repository string, if the repository is not known to the scheduler.rr}r(hTX\s that are not created from version-control changes (e.g., those created by a Nightly or Periodic scheduler) may have an empty repository string, if the repository is not known to the scheduler.hUjubeubhQ)r}r(hTUhUjhVhYh[h\h]}r(h_]h`]ha]hb]rh7ahd]rhauhfMOhghhO]r(hi)r}r(hTXRevision Link HelpersrhUjhVhYh[hmh]}r(h_]h`]ha]hb]hd]uhfMOhghhO]rhpXRevision Link Helpersrr}r(hTjhUjubaubht)r}r(hTXNBuildbot provides two helpers for generating revision links. :class:`buildbot.revlinks.RevlinkMatcher` takes a list of regular expressions, and replacement text. The regular expressions should all have the same number of capture groups. The replacement text should have sed-style references to that capture groups (i.e. '\1' for the first capture group), and a single '%s' reference, for the revision ID. The repository given is tried against each regular expression in turn. The results are the substituted into the replacement text, along with the revision ID to obtain the revision link.hUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfMQhghhO]r(hpX=Buildbot provides two helpers for generating revision links. rr}r(hTX=Buildbot provides two helpers for generating revision links. hUjubh)r}r(hTX):class:`buildbot.revlinks.RevlinkMatcher`rhUjhVhYh[hh]}r(UreftypeXclasshԉhX buildbot.revlinks.RevlinkMatcherU refdomainXpyrhb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfMQhO]rh)r}r(hTjh]}r(h_]h`]r(hjXpy-classreha]hb]hd]uhUjhO]rhpX buildbot.revlinks.RevlinkMatcherrr}r(hTUhUjubah[hubaubhpX takes a list of regular expressions, and replacement text. The regular expressions should all have the same number of capture groups. The replacement text should have sed-style references to that capture groups (i.e. '1' for the first capture group), and a single '%s' reference, for the revision ID. The repository given is tried against each regular expression in turn. The results are the substituted into the replacement text, along with the revision ID to obtain the revision link.rr}r(hTX takes a list of regular expressions, and replacement text. The regular expressions should all have the same number of capture groups. The replacement text should have sed-style references to that capture groups (i.e. '\1' for the first capture group), and a single '%s' reference, for the revision ID. The repository given is tried against each regular expression in turn. The results are the substituted into the replacement text, along with the revision ID to obtain the revision link.hUjubeubh)r }r (hTXfrom buildbot import revlinks c['revlink'] = revlinks.RevlinkMatch([r'git://notmuchmail.org/git/(.*)'], r'http://git.notmuchmail.org/git/\1/commit/%s')hUjhVhYh[hh]}r (hhhb]ha]h_]h`]hd]uhfMZhghhO]r hpXfrom buildbot import revlinks c['revlink'] = revlinks.RevlinkMatch([r'git://notmuchmail.org/git/(.*)'], r'http://git.notmuchmail.org/git/\1/commit/%s')r r}r(hTUhUj ubaubht)r}r(hTX:class:`buildbot.revlinks.RevlinkMultiplexer` takes a list of revision link callables, and tries each in turn, returning the first successful match.rhUjhVhYh[hxh]}r(h_]h`]ha]hb]hd]uhfM^hghhO]r(h)r}r(hTX-:class:`buildbot.revlinks.RevlinkMultiplexer`rhUjhVhYh[hh]}r(UreftypeXclasshԉhX$buildbot.revlinks.RevlinkMultiplexerU refdomainXpyrhb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfM^hO]rh)r}r(hTjh]}r(h_]h`]r(hjXpy-classreha]hb]hd]uhUjhO]r hpX$buildbot.revlinks.RevlinkMultiplexerr!r"}r#(hTUhUjubah[hubaubhpXg takes a list of revision link callables, and tries each in turn, returning the first successful match.r$r%}r&(hTXg takes a list of revision link callables, and tries each in turn, returning the first successful match.hUjubeubh)r'}r((hTXA.. _TwistedConch: http://twistedmatrix.com/trac/wiki/TwistedConchU referencedr)KhUjhVhYh[hh]}r*(j j hb]r+hLaha]h_]h`]hd]r,h#auhfM`hghhO]ubh~)r-}r.(hTUhUjhVhYh[hh]}r/(hb]ha]h_]h`]hd]Uentries]r0((UsingleX%Buildmaster Config; codebaseGeneratorXcfg-codebaseGeneratorr1j1tr2(UsingleX&codebaseGenerator (Buildmaster Config)j1j1tr3euhfMchghhO]ubh)r4}r5(hTUhUjhVhYh[hh]}r6(hb]ha]h_]h`]hd]hj1uhfMchghhO]ubeubeubhQ)r7}r8(hTUhUhRhVhYh}h[h\h]}r9(h_]h`]ha]hb]r:(h8j1ehd]r;hauhfMehghh}r<j1j4shO]r=(hi)r>}r?(hTXCodebase Generatorr@hUj7hVhYh[hmh]}rA(h_]h`]ha]hb]hd]uhfMehghhO]rBhpXCodebase GeneratorrCrD}rE(hTj@hUj>ubaubh)rF}rG(hTXall_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'] = codebaseGeneratorhUj7hVhYh[hh]}rH(hhhb]ha]h_]h`]hd]uhfMihghhO]rIhpXall_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(hTUhUjFubaubht)rM}rN(hTXFor 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.hUj7hVhYh[hxh]}rO(h_]h`]ha]hb]hd]uhfMwhghhO]rP(hpXFor any incoming change, the rQrR}rS(hTXFor any incoming change, the hUjMubh)rT}rU(hTX:ref:`codebase`rVhUjMhVhYh[hh]}rW(UreftypeXrefhԈhX attr-codebaseU refdomainXstdrXhb]ha]U refexplicith_]h`]hd]hhuhfMwhO]rYj?)rZ}r[(hTjVh]}r\(h_]h`]r](hjXXstd-refr^eha]hb]hd]uhUjThO]r_hpXcodebaser`ra}rb(hTUhUjZubah[jIubaubhpXI 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(hTXI 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.hUjMubeubht)rf}rg(hTXThe `codebaseGenerator` accepts a change dictionary as produced by the :py:class:`buildbot.db.changes.ChangesConnectorComponent `, with a changeid equal to `None`.rhhUj7hVhYh[hxh]}ri(h_]h`]ha]hb]hd]uhfM|hghhO]rj(hpXThe rkrl}rm(hTXThe hUjfubj3 )rn}ro(hTX`codebaseGenerator`h]}rp(h_]h`]ha]hb]hd]uhUjfhO]rqhpXcodebaseGeneratorrrrs}rt(hTUhUjnubah[j; ubhpX0 accepts a change dictionary as produced by the rurv}rw(hTX0 accepts a change dictionary as produced by the hUjfubh)rx}ry(hTXW:py:class:`buildbot.db.changes.ChangesConnectorComponent `rzhUjfhVhYh[hh]}r{(UreftypeXclasshԉhXchanges connector componentU refdomainXpyr|hb]ha]U refexplicith_]h`]hd]hhj;Nj<NuhfM|hO]r}h)r~}r(hTjzh]}r(h_]h`]r(hj|Xpy-classreha]hb]hd]uhUjxhO]rhpX-buildbot.db.changes.ChangesConnectorComponentrr}r(hTUhUj~ubah[hubaubhpX, with a changeid equal to rr}r(hTX, with a changeid equal to hUjfubj3 )r}r(hTX`None`h]}r(h_]h`]ha]hb]hd]uhUjfhO]rhpXNonerr}r(hTUhUjubah[j; ubhpX.r}r(hTX.hUjfubeubeubeubahTUU transformerrNU footnote_refsr}rUrefnamesr}rX twistedconch]rj asUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rhghU current_linerNUtransform_messagesr]r(cdocutils.nodes system_message r)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypeUINFOruhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX,Hyperlink target "cfg-db" is not referenced.rr}r(hTUhUjubah[hxubah[Usystem_messagerubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX0Hyperlink target "cfg-db_url" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineK UtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX:Hyperlink target "cfg-db_poll_interval" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineK UtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX<Hyperlink target "database-specification" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineK(UtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX-Hyperlink target "index-0" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineK:UtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX-Hyperlink target "index-1" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKWUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX-Hyperlink target "index-2" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKbUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX5Hyperlink target "cfg-multiMaster" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKcUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX7Hyperlink target "multi-master-mode" is not referenced.rr}r (hTUhUjubah[hxubah[jubj)r }r (hTUh]}r (h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]r ht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUj hO]rhpX5Hyperlink target "cfg-buildbotURL" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX2Hyperlink target "cfg-titleURL" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r }r!(hTUh]}r"(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]r#ht)r$}r%(hTUh]}r&(h_]h`]ha]hb]hd]uhUj hO]r'hpX/Hyperlink target "cfg-title" is not referenced.r(r)}r*(hTUhUj$ubah[hxubah[jubj)r+}r,(hTUh]}r-(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]r.ht)r/}r0(hTUh]}r1(h_]h`]ha]hb]hd]uhUj+hO]r2hpX=Hyperlink target "cfg-logCompressionLimit" is not referenced.r3r4}r5(hTUhUj/ubah[hxubah[jubj)r6}r7(hTUh]}r8(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]r9ht)r:}r;(hTUh]}r<(h_]h`]ha]hb]hd]uhUj6hO]r=hpX>Hyperlink target "cfg-logCompressionMethod" is not referenced.r>r?}r@(hTUhUj:ubah[hxubah[jubj)rA}rB(hTUh]}rC(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rDht)rE}rF(hTUh]}rG(h_]h`]ha]hb]hd]uhUjAhO]rHhpX4Hyperlink target "cfg-logMaxSize" is not referenced.rIrJ}rK(hTUhUjEubah[hxubah[jubj)rL}rM(hTUh]}rN(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rOht)rP}rQ(hTUh]}rR(h_]h`]ha]hb]hd]uhUjLhO]rShpX8Hyperlink target "cfg-logMaxTailSize" is not referenced.rTrU}rV(hTUhUjPubah[hxubah[jubj)rW}rX(hTUh]}rY(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rZht)r[}r\(hTUh]}r](h_]h`]ha]hb]hd]uhUjWhO]r^hpX7Hyperlink target "cfg-changeHorizon" is not referenced.r_r`}ra(hTUhUj[ubah[hxubah[jubj)rb}rc(hTUh]}rd(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]reht)rf}rg(hTUh]}rh(h_]h`]ha]hb]hd]uhUjbhO]rihpX6Hyperlink target "cfg-buildHorizon" is not referenced.rjrk}rl(hTUhUjfubah[hxubah[jubj)rm}rn(hTUh]}ro(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rpht)rq}rr(hTUh]}rs(h_]h`]ha]hb]hd]uhUjmhO]rthpX6Hyperlink target "cfg-eventHorizon" is not referenced.rurv}rw(hTUhUjqubah[hxubah[jubj)rx}ry(hTUh]}rz(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]r{ht)r|}r}(hTUh]}r~(h_]h`]ha]hb]hd]uhUjxhO]rhpX4Hyperlink target "cfg-logHorizon" is not referenced.rr}r(hTUhUj|ubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX0Hyperlink target "cfg-caches" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX9Hyperlink target "cfg-changeCacheSize" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineKUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX8Hyperlink target "cfg-buildCacheSize" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineM0UtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX7Hyperlink target "cfg-mergeRequests" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineM2UtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX-Hyperlink target "index-3" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineM@UtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX-Hyperlink target "index-4" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMBUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX<Hyperlink target "cfg-prioritizeBuilders" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMCUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX;Hyperlink target "prioritizing-builders" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMWUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX6Hyperlink target "cfg-slavePortnum" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMXUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpXDHyperlink target "setting-the-pb-port-for-slaves" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMsUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX-Hyperlink target "index-5" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMuUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX4Hyperlink target "cfg-properties" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r (h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMUtypejuhO]r ht)r }r (hTUh]}r (h_]h`]ha]hb]hd]uhUjhO]rhpX7Hyperlink target "cfg-debugPassword" is not referenced.rr}r(hTUhUj ubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMUtypejuhO]rht)r}r(hTUh]}r(h_]h`]ha]hb]hd]uhUjhO]rhpX3Hyperlink target "debug-options" is not referenced.rr}r(hTUhUjubah[hxubah[jubj)r}r(hTUh]}r(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMUtypejuhO]r ht)r!}r"(hTUh]}r#(h_]h`]ha]hb]hd]uhUjhO]r$hpX-Hyperlink target "index-6" is not referenced.r%r&}r'(hTUhUj!ubah[hxubah[jubj)r(}r)(hTUh]}r*(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMUtypejuhO]r+ht)r,}r-(hTUh]}r.(h_]h`]ha]hb]hd]uhUj(hO]r/hpX1Hyperlink target "cfg-manhole" is not referenced.r0r1}r2(hTUhUj,ubah[hxubah[jubj)r3}r4(hTUh]}r5(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMUtypejuhO]r6ht)r7}r8(hTUh]}r9(h_]h`]ha]hb]hd]uhUj3hO]r:hpX1Hyperlink target "cfg-metrics" is not referenced.r;r<}r=(hTUhUj7ubah[hxubah[jubj)r>}r?(hTUh]}r@(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMUtypejuhO]rAht)rB}rC(hTUh]}rD(h_]h`]ha]hb]hd]uhUj>hO]rEhpX7Hyperlink target "cfg-user_managers" is not referenced.rFrG}rH(hTUhUjBubah[hxubah[jubj)rI}rJ(hTUh]}rK(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineM UtypejuhO]rLht)rM}rN(hTUh]}rO(h_]h`]ha]hb]hd]uhUjIhO]rPhpX3Hyperlink target "users-options" is not referenced.rQrR}rS(hTUhUjMubah[hxubah[jubj)rT}rU(hTUh]}rV(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineM'UtypejuhO]rWht)rX}rY(hTUh]}rZ(h_]h`]ha]hb]hd]uhUjThO]r[hpX4Hyperlink target "cfg-validation" is not referenced.r\r]}r^(hTUhUjXubah[hxubah[jubj)r_}r`(hTUh]}ra(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineM(UtypejuhO]rbht)rc}rd(hTUh]}re(h_]h`]ha]hb]hd]uhUj_hO]rfhpX6Hyperlink target "input-validation" is not referenced.rgrh}ri(hTUhUjcubah[hxubah[jubj)rj}rk(hTUh]}rl(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineM?UtypejuhO]rmht)rn}ro(hTUh]}rp(h_]h`]ha]hb]hd]uhUjjhO]rqhpX1Hyperlink target "cfg-revlink" is not referenced.rrrs}rt(hTUhUjnubah[hxubah[jubj)ru}rv(hTUh]}rw(h_]UlevelKhb]ha]UsourcehYh`]hd]UlineMcUtypejuhO]rxht)ry}rz(hTUh]}r{(h_]h`]ha]hb]hd]uhUjuhO]r|hpX;Hyperlink target "cfg-codebaseGenerator" is not referenced.r}r~}r(hTUhUjyubah[hxubah[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_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_sourcerUR/var/build/user_builds/buildbot/checkouts/v0.8.8/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(hhh/j|j j j jjjjjhhh8j7j j jjh2jhBj jUj_h0j_h7jjjjjj j hFj1 h:j_h?jf h4j4 hJjh1jjjh6hhjj* j4 h5jh=jjjhAhjjjjj j hhhDj jjhGj4 j' j1 hIjjjjjjjhKjf jjj1j7h@j> hLj'jjjjj\ jf hMj1 hEj hNjuUsubstitution_namesr}rh[hgh]}r(h_]hb]ha]UsourcehYh`]hd]uU footnotesr]rUrefidsr}r(jU]rjXaj ]rj aj ]rj ah0]rj[aj]rjaj]rjah9]rjajv]rjyaj]rjaj]rjaj]rjaj\ ]rj_ aj]rjaj* ]rj- aj ]rj ahA]rhaj]rjaj]rjaj ]rj ah]rhah;]rjahG]rj0 aj' ]rj* aj]rjahK]rjb aj1]rj4ahM]rj- auub.PKJtD  5buildbot-v0.8.8/.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.8/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-9.0.0 or later on the master, and Twisted-8.1.0 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-9.0.0 or later on the master, and Twisted-8.1.0 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]uheK2hfhhg]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 auheK7hfhhg]rk(hi)rl}rm(hLXWindows SupportrnhMhhThWhYhmh[}ro(h]]h^]h_]h`]hc]uheK7hfhhg]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]uheK9hfhhg]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]uheKAhfhhg]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]uheKChg]rhpX@Twisted requires PyWin32 in order to spawn processes on Windows.rr}r(hLjhMjubaubaubheubhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUbuildmaster-requirementsruheKEhfhhg]ubshYhZh[}r(h]]h^]h_]h`]r(jUid4rehc]r(hAh&euheKHhfhh}rjhshg]r(hi)r}r(hLXBuildmaster RequirementsrhMhhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKHhfhhg]rhpXBuildmaster Requirementsrr}r(hLjhMjubaubh)r}r(hLXsqlite3: http://www.sqlite.orgrhMhhThWhYhh[}r(h]]h^]h_]h`]hc]uheKJhfhhg]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]uheKLhg]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]uheKQhfhhg]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]uheKShg]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]uheKVhfhhg]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]uheKXhg]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]uheKbhfhhg]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]uheKdhg]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]uheKghfhhg]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]uheKihg]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]uheKohfhhg]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]uheKqhg]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}uheKuhfhhg]ubshYhZh[}r~(h]]h^]h_]h`]r(j}Uid5rehc]r(h.heuheKxhfhh}rj}hshg]r(hi)r}r(hLXInstalling the coderhMhhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKxhfhhg]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(hLXCThe easiest way to install Buildbot is using 'pip'. For the master:rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpXCThe easiest way to install Buildbot is using 'pip'. For the master:rr}r(hLjhMjubaubcdocutils.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(hLUhMjubaubeubhN)r}r(hLUhMhhThWhYhZh[}r(h]]h^]h_]h`]rUinstallation-from-tarballsrahc]rhauheKhfhhg]r(hi)r}r(hLXInstallation From TarballsrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpXInstallation From Tarballsrr}r(hLjhMjubaubh)r}r(hLXBuildbot and Buildslave are installed using the standard Python `distutils `_ process. For either component, after unpacking the tarball, the process is:hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpX@Buildbot and Buildslave are installed using the standard Python rr}r(hLX@Buildbot and Buildslave are installed using the standard Python hMjubh)r}r(hLX<`distutils `_h[}r(Unameh j5X-http://docs.python.org/library/distutils.htmlrh`]h_]h]]h^]hc]uhMjhg]rhpX distutilsrr}r(hLUhMjubahYhubht)r}r(hLX0 hQKhMjhYhwh[}r (Urefurijh`]r U distutilsr ah_]h]]h^]hc]r h auhg]ubhpXL process. For either component, after unpacking the tarball, the process is:r r}r(hLXL process. For either component, after unpacking the tarball, the process is:hMjubeubj)r}r(hLX-python setup.py build python setup.py installhMjhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rhpX-python setup.py build python setup.py installrr}r(hLUhMjubaubh)r}r(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`.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheKhfhhg]r(hpXiwhere the install step may need to be done as root. This will put the bulk of the code in somewhere like rr}r(hLXiwhere the install step may need to be done as root. This will put the bulk of the code in somewhere like hMjubh)r}r(hLUh[}r (h`]h_]h]]h^]r!Xfiler"aUrolej"hc]uhMjhg]r#hpX)/usr/lib/pythonx.y/site-packages/buildbotr$r%}r&(hLX)/usr/lib/pythonx.y/site-packages/buildbothMjubahYhubhpX. It will also install the r'r(}r)(hLX. It will also install the hMjubcdocutils.nodes strong r*)r+}r,(hLX:command:`buildbot`h[}r-(h]]h^]r.Ucommandr/ah_]h`]hc]uhMjhg]r0hpXbuildbotr1r2}r3(hLUhMj+ubahYUstrongr4ubhpX command-line tool in r5r6}r7(hLX command-line tool in hMjubh)r8}r9(hLUh[}r:(h`]h_]h]]h^]r;Xfiler<aUrolej<hc]uhMjhg]r=hpX/usr/bin/buildbotr>r?}r@(hLX/usr/bin/buildbothMj8ubahYhubhpX.rA}rB(hLX.hMjubeubh)rC}rD(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.hMjhThWhYhh[}rE(h]]h^]h_]h`]hc]uheKhfhhg]rF(hpXIf the environment variable rGrH}rI(hLXIf the environment variable hMjCubh)rJ}rK(hLX``$NO_INSTALL_REQS``h[}rL(h]]h^]h_]h`]hc]uhMjChg]rMhpX$NO_INSTALL_REQSrNrO}rP(hLUhMjJubahYhubhpX is set to rQrR}rS(hLX is set to hMjCubh)rT}rU(hLX``1``h[}rV(h]]h^]h_]h`]hc]uhMjChg]rWhpX1rX}rY(hLUhMjTubahYhubhpX, then rZr[}r\(hLX, then hMjCubh)r]}r^(hLUh[}r_(h`]h_]h]]h^]r`XfileraaUrolejahc]uhMjChg]rbhpXsetup.pyrcrd}re(hLXsetup.pyhMj]ubahYhubhpXp will not try to install Buildbot's requirements. This is usually only useful when building a Buildbot package.rfrg}rh(hLXp will not try to install Buildbot's requirements. This is usually only useful when building a Buildbot package.hMjCubeubh)ri}rj(hLXJTo test this, shift to a different directory (like :file:`/tmp`), and run:rkhMjhThWhYhh[}rl(h]]h^]h_]h`]hc]uheKhfhhg]rm(hpX3To test this, shift to a different directory (like rnro}rp(hLX3To test this, shift to a different directory (like hMjiubh)rq}rr(hLUh[}rs(h`]h_]h]]h^]rtXfileruaUrolejuhc]uhMjihg]rvhpX/tmprwrx}ry(hLX/tmphMjqubahYhubhpX ), and run:rzr{}r|(hLX ), and run:hMjiubeubj)r}}r~(hLX,buildbot --version # or buildslave --versionhMjhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rhpX,buildbot --version # or buildslave --versionrr}r(hLUhMj}ubaubh)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.hMjhThWhYhh[}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`.hMjhThWhYhh[}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 hMjubj*)r}r(hLX:command:`buildbot`h[}r(h]]h^]rj/ah_]h`]hc]uhMjhg]rhpXbuildbotrr}r(hLUhMjubahYj4ubhpX 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(UxrefrjX std-envvarreh_]h`]hc]uhMjhg]rhpXPATHrr}r(hLUhMjubahYhubaubhpX.r}r(hLX.hMjubeubht)r}r(hLX!.. _Installation-in-a-Virtualenv:hMjhThWhYhwh[}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 VirtualenvrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheKhfhhg]rhpXInstallation in a Virtualenvrr}r(hLjhMjubaubh)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 rr}r(hLXTIf you cannot or do not wish to install the buildbot into a site-wide location like hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX/usrrr}r(hLX/usrhMjubahYhubhpX or rr}r(hLX or hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpX /usr/localrr}r (hLX /usr/localhMjubahYhubhpXd, you can also install it into the account's home directory or any other location using a tool like r r }r (hLXd, you can also install it into the account's home directory or any other location using a tool like hMjubh)r }r(hLX6`virtualenv `_h[}r(Unamehj5X&http://pypi.python.org/pypi/virtualenvrh`]h_]h]]h^]hc]uhMjhg]rhpX virtualenvrr}r(hLUhMj ubahYhubht)r}r(hLX) hQKhMjhYhwh[}r(Urefurijh`]rU virtualenvrah_]h]]h^]hc]rhauhg]ubhpX.r}r(hLX.hMjubeubht)r}r(hLX%.. _Running-Buildbots-Tests-optional:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyU running-buildbots-tests-optionalr uheKhfhhg]ubeubeubhN)r!}r"(hLUhMhRhThWh}}r#h,jshYhZh[}r$(h]]h^]h_]h`]r%(U!running-buildbot-s-tests-optionalr&j ehc]r'(h=h,euheKhfhh}r(j jshg]r)(hi)r*}r+(hLX#Running Buildbot's Tests (optional)r,hMj!hThWhYhmh[}r-(h]]h^]h_]h`]hc]uheKhfhhg]r.hpX#Running Buildbot's Tests (optional)r/r0}r1(hLj,hMj*ubaubh)r2}r3(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[}r4(h]]h^]h_]h`]hc]uheKhfhhg]r5(hpXSIf you wish, you can run the buildbot unit test suite. First, ensure you have the r6r7}r8(hLXSIf you wish, you can run the buildbot unit test suite. First, ensure you have the hMj2ubh)r9}r:(hLX*`mock `_h[}r;(Unameh%j5X http://pypi.python.org/pypi/mockr<h`]h_]h]]h^]hc]uhMj2hg]r=hpXmockr>r?}r@(hLUhMj9ubahYhubht)rA}rB(hLX# hQKhMj2hYhwh[}rC(Urefurij<h`]rDUmockrEah_]h]]h^]hc]rFh%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 rGrH}rI(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 hMj2ubh)rJ}rK(hLX``mock``h[}rL(h]]h^]h_]h`]hc]uhMj2hg]rMhpXmockrNrO}rP(hLUhMjJubahYhubhpX package! You can check withrQrR}rS(hLX package! You can check withhMj2ubeubj)rT}rU(hLX python -mmockhMj!hThWhYjh[}rV(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rWhpX python -mmockrXrY}rZ(hLUhMjTubaubh)r[}r\(hLXThen, run the tests:r]hMj!hThWhYhh[}r^(h]]h^]h_]h`]hc]uheKhfhhg]r_hpXThen, run the tests:r`ra}rb(hLj]hMj[ubaubj)rc}rd(hLXHPYTHONPATH=. trial buildbot.test # or PYTHONPATH=. trial buildslave.testhMj!hThWhYjh[}re(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rfhpXHPYTHONPATH=. trial buildbot.test # or PYTHONPATH=. trial buildslave.testrgrh}ri(hLUhMjcubaubh)rj}rk(hLX5Nothing should fail, although a few might be skipped.rlhMj!hThWhYhh[}rm(h]]h^]h_]h`]hc]uheKhfhhg]rnhpX5Nothing should fail, although a few might be skipped.rorp}rq(hLjlhMjjubaubh)rr}rs(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[}rt(h]]h^]h_]h`]hc]uheKhfhhg]ru(hpX:If any of the tests fail for reasons other than a missing rvrw}rx(hLX:If any of the tests fail for reasons other than a missing hMjrubh)ry}rz(hLX``mock``h[}r{(h]]h^]h_]h`]hc]uhMjrhg]r|hpXmockr}r~}r(hLUhMjyubahYhubhpX, 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 hMjrubh)r}r(hLX``PYTHONPATH``h[}r(h]]h^]h_]h`]hc]uhMjrhg]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.hMjrubeubht)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(jjXstd-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]rhpXrootrr}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 rr}r(hLX(Once you've picked a directory, use the hMjubh)r}r(hLX``buildbot create-master``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbot create-masterrr}r(hLUhMjubahYhubhpXD command to create the directory and populate it with startup files:rr}r(hLXD command to create the directory and populate it with startup files:hMjubeubj)r}r(hLX!buildbot create-master -r basedirhMjhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheKhfhhg]rhpX!buildbot create-master -r basedirrr}r(hLUhMjubaubh)r}r(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]uheKhfhhg]r(hpXYou will need to create a rr}r(hLXYou will need to create a hMjubj)r}r(hLX):ref:`configuration file `rhMjhThWhYjh[}r(UreftypeXrefjjX configurationU refdomainXstdr h`]h_]U refexplicith]]h^]hc]jjuheKhg]r h)r }r (hLjh[}r (h]]h^]r(jj Xstd-refreh_]h`]hc]uhMjhg]rhpXconfiguration filerr}r(hLUhMj ubahYhubaubhpX 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 rr}r(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 hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]rhpXmaster.cfg.samplerr}r(hLXmaster.cfg.samplehMjubahYhubhpX, which can be copied to r r!}r"(hLX, which can be copied to hMjubh)r#}r$(hLUh[}r%(h`]h_]h]]h^]r&Xfiler'aUrolej'hc]uhMjhg]r(hpX master.cfgr)r*}r+(hLX master.cfghMj#ubahYhubhpX" and edited to suit your purposes.r,r-}r.(hLX" and edited to suit your purposes.hMjubeubh)r/}r0(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[}r1(h]]h^]h_]h`]hc]uheMhfhhg]r2(hpX5(Internal details: This command creates a file named r3r4}r5(hLX5(Internal details: This command creates a file named hMj/ubh)r6}r7(hLUh[}r8(h`]h_]h]]h^]r9Xfiler:aUrolej:hc]uhMj/hg]r;hpX buildbot.tacr<r=}r>(hLX buildbot.tachMj6ubahYhubhpX\ that contains all the state necessary to create the buildmaster. Twisted has a tool called r?r@}rA(hLX\ that contains all the state necessary to create the buildmaster. Twisted has a tool called hMj/ubh)rB}rC(hLX ``twistd``h[}rD(h]]h^]h_]h`]hc]uhMj/hg]rEhpXtwistdrFrG}rH(hLUhMjBubahYhubhpX 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). rIrJ}rK(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). hMj/ubh)rL}rM(hLUh[}rN(h`]h_]h]]h^]rOXfilerPaUrolejPhc]uhMj/hg]rQhpX/usr/bin/buildbotrRrS}rT(hLX/usr/bin/buildbothMjLubahYhubhpX is a front end which runs rUrV}rW(hLX is a front end which runs hMj/ubcdocutils.nodes title_reference rX)rY}rZ(hLX`twistd`h[}r[(h]]h^]h_]h`]hc]uhMj/hg]r\hpXtwistdr]r^}r_(hLUhMjYubahYUtitle_referencer`ubhpX for you.)rarb}rc(hLX for you.)hMj/ubeubhN)rd}re(hLUhMjhThWhYhZh[}rf(h]]h^]h_]h`]rgUusing-a-database-serverrhahc]rih auheM hfhhg]rj(hi)rk}rl(hLXUsing A Database ServerrmhMjdhThWhYhmh[}rn(h]]h^]h_]h`]hc]uheM hfhhg]rohpXUsing A Database Serverrprq}rr(hLjmhMjkubaubh)rs}rt(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.hMjdhThWhYhh[}ru(h]]h^]h_]h`]hc]uheM hfhhg]rv(hpXrIf you want to use a database server (e.g., MySQL or Postgres) as the database backend for your Buildbot, add the rwrx}ry(hLXrIf you want to use a database server (e.g., MySQL or Postgres) as the database backend for your Buildbot, add the hMjsubh)rz}r{(hLX``--db``h[}r|(h]]h^]h_]h`]hc]uhMjshg]r}hpX--dbr~r}r(hLUhMjzubahYhubhpX option to the rr}r(hLX option to the hMjsubh)r}r(hLX``create-master``h[}r(h]]h^]h_]h`]hc]uhMjshg]rhpX create-masterrr}r(hLUhMjubahYhubhpX invocation to specify the rr}r(hLX invocation to specify the hMjsubj)r}r(hLX1:ref:`connection string `rhMjshThWhYjh[}r(UreftypeXrefjjXdatabase-specificationU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheM hg]rh)r}r(hLjh[}r(h]]h^]r(jjXstd-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 hMjsubh)r}r(hLX ``db_url``h[}r(h]]h^]h_]h`]hc]uhMjshg]rhpXdb_urlrr}r(hLUhMjubahYhubhpX of the rr}r(hLX of the hMjsubj)r}r(hLX :bb:cfg:`db`rhMjshThWhYjh[}r(UreftypeXcfgjjXdbU refdomainXbbrh`]h_]U refexplicith]]h^]hc]jjuheM hg]rh)r}r(hLjh[}r(h]]h^]r(jjXbb-cfgreh_]h`]hc]uhMjhg]rhpXdbrr}r(hLUhMjubahYhubaubhpX& parameter in your configuration file.rr}r(hLX& parameter in your configuration file.hMjsubeubhN)r}r(hLUhMjdhThWhYhZh[}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/rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXMySQL-python: rr}r(hLXMySQL-python: hMjubh)r}r(hLX$http://mysql-python.sourceforge.net/rh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]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.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhg]rhpX{To communicate with MySQL, SQLAlchemy requires MySQL-python. Any reasonably recent version of MySQL-python should suffice.rr}r(hLjhMjubaubaubh)r}r(hLX&The most common choice for Postgres isrhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX&The most common choice for Postgres isrr}r(hLjhMjubaubh)r}r(hLX"Psycopg: http://initd.org/psycopg/rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheM!hfhhg]r(hpX Psycopg: rr}r(hLX Psycopg: hMjubh)r}r(hLXhttp://initd.org/psycopg/rh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpXhttp://initd.org/psycopg/rr}r(hLUhMjubahYhubeubj)r}r(hLUhMjhThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXdSQLAlchemy uses Psycopg to communicate with Postgres. Any reasonably recent version should suffice.r hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheM#hg]rhpXdSQLAlchemy uses Psycopg to communicate with Postgres. Any reasonably recent version should suffice.rr}r(hLj hMj ubaubaubeubeubhN)r}r(hLUhMjhThWhYhZh[}r(h]]h^]h_]h`]rUbuildmaster-optionsrahc]rh!auheM'hfhhg]r(hi)r}r(hLXBuildmaster OptionsrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheM'hfhhg]rhpXBuildmaster Optionsrr }r!(hLjhMjubaubh)r"}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.hMjhThWhYhh[}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 hMj"ubh)r)}r*(hLX``create-master``h[}r+(h]]h^]h_]h`]hc]uhMj"hg]r,hpX create-masterr-r.}r/(hLUhMj)ubahYhubhpX command. You can also type r0r1}r2(hLX command. You can also type hMj"ubh)r3}r4(hLX!``buildbot create-master --help``h[}r5(h]]h^]h_]h`]hc]uhMj"hg]r6hpXbuildbot create-master --helpr7r8}r9(hLUhMj3ubahYhubhpX! for an up-to-the-moment summary.r:r;}r<(hLX! for an up-to-the-moment summary.hMj"ubeubh)r=}r>(hLX ``--force``r?hMjhThWhYhh[}r@(h]]h^]h_]h`]hc]uheM,hfhhg]rAh)rB}rC(hLj?h[}rD(h]]h^]h_]h`]hc]uhMj=hg]rEhpX--forcerFrG}rH(hLUhMjBubahYhubaubj)rI}rJ(hLUhMjhThWhYjh[}rK(h]]h^]h_]h`]hc]uheNhfhhg]rLh)rM}rN(hLXSWith this option, @command{create-master} will re-use an existing master directory.rOhMjIhThWhYhh[}rP(h]]h^]h_]h`]hc]uheM.hg]rQhpXSWith this option, @command{create-master} will re-use an existing master directory.rRrS}rT(hLjOhMjMubaubaubh)rU}rV(hLX``--no-logrotate``rWhMjhThWhYhh[}rX(h]]h^]h_]h`]hc]uheM1hfhhg]rYh)rZ}r[(hLjWh[}r\(h]]h^]h_]h`]hc]uhMjUhg]r]hpX--no-logrotater^r_}r`(hLUhMjZubahYhubaubj)ra}rb(hLUhMjhThWhYjh[}rc(h]]h^]h_]h`]hc]uheNhfhhg]rdh)re}rf(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.rghMjahThWhYhh[}rh(h]]h^]h_]h`]hc]uheM3hg]rihpXThis 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.rjrk}rl(hLjghMjeubaubaubh)rm}rn(hLX``--relocatable``rohMjhThWhYhh[}rp(h]]h^]h_]h`]hc]uheM7hfhhg]rqh)rr}rs(hLjoh[}rt(h]]h^]h_]h`]hc]uhMjmhg]ruhpX --relocatablervrw}rx(hLUhMjrubahYhubaubj)ry}rz(hLUhMjhThWhYjh[}r{(h]]h^]h_]h`]hc]uheNhfhhg]r|h)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.rhMjyhThWhYhh[}r(h]]h^]h_]h`]hc]uheM9hg]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(hLjhMj}ubaubaubh)r}r(hLX ``--config``rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheM<hfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX--configrr}r(hLUhMjubahYhubaubj)r}r(hLUhMjhThWhYjh[}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]uheM>hg]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``rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMAhfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX --log-sizerr}r(hLUhMjubahYhubaubj)r}r(hLUhMjhThWhYjh[}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]uheMChg]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``rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMFhfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX --log-countrr}r(hLUhMjubahYhubaubj)r}r(hLUhMjhThWhYjh[}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 @code{None} to keep all @file{twistd.log} files around. The default is 10.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMHhg]rhpXThis is the number of log rotations to keep around. You can either specify a number or @code{None} to keep all @file{twistd.log} files around. The default is 10.rr}r(hLjhMjubaubaubh)r}r(hLX``--db``rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMLhfhhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX--dbrr}r(hLUhMjubahYhubaubj)r}r(hLUhMjhThWhYjh[}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.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMNhg]rhpXpThe database that the Buildmaster should use. Note that the same value must be added to the configuration file.rr}r(hLjhMjubaubaubht)r}r(hLX&.. _Upgrading-an-Existing-Buildmaster:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyU!upgrading-an-existing-buildmasterruheMQhfhhg]ubeubeubhN)r}r(hLUhMhRhThWh}}rh jshYhZh[}r(h]]h^]h_]h`]r(jUid8rehc]r(hh euheMThfhh}rjjshg]r(hi)r}r(hLX!Upgrading an Existing BuildmasterrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMThfhhg]rhpX!Upgrading an Existing Buildmasterrr}r(hLjhMjubaubh)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.rhMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMVhfhhg]rhpX>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.rr}r(hLjhMjubaubj)r}r(hLXbuildbot upgrade-master basedirhMjhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheM\hfhhg]rhpXbuildbot upgrade-master basedirrr}r(hLUhMjubaubh)r }r (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.hMjhThWhYhh[}r (h]]h^]h_]h`]hc]uheM`hfhhg]r (hpX!This command will also scan your r r}r(hLX!This command will also scan your hMj ubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMj hg]rhpX master.cfgrr}r(hLX master.cfghMjubahYhubhpX 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.rr}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.hMj ubeubh)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.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhhfhhg]r(hpXThe r r!}r"(hLXThe hMjubh)r#}r$(hLX``upgrade-master``h[}r%(h]]h^]h_]h`]hc]uhMjhg]r&hpXupgrade-masterr'r(}r)(hLUhMj#ubahYhubhpXu command is idempotent. It is safe to run it multiple times. After each upgrade of the buildbot code, you should use r*r+}r,(hLXu command is idempotent. It is safe to run it multiple times. After each upgrade of the buildbot code, you should use hMjubh)r-}r.(hLX``upgrade-master``h[}r/(h]]h^]h_]h`]hc]uhMjhg]r0hpXupgrade-masterr1r2}r3(hLUhMj-ubahYhubhpX on all your buildmasters.r4r5}r6(hLX on all your buildmasters.hMjubeubh)r7}r8(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.r9hMjhThWhYhh[}r:(h]]h^]h_]h`]hc]uheMlhfhhg]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>(hLj9hMj7ubaubh)r?}r@(hLXwBeyond this general information, read all of the sections below that apply to versions through which you are upgrading.rAhMjhThWhYhh[}rB(h]]h^]h_]h`]hc]uheMphfhhg]rChpXwBeyond this general information, read all of the sections below that apply to versions through which you are upgrading.rDrE}rF(hLjAhMj?ubaubht)rG}rH(hLX'.. _Buildmaster-Version-specific-Notes:hMjhThWhYhwh[}rI(h`]h_]h]]h^]hc]hyU"buildmaster-version-specific-notesrJuheMshfhhg]ubhN)rK}rL(hLUhQKhMjhThWh}}rMh5jGshYhZh[}rN(h]]rOXversion-specific notesrPah^]h_]h`]rQ(Uversion-specific-notesrRjJehc]rSh5auheMvhfhh}rTjJjGshg]rU(hi)rV}rW(hLXVersion-specific NotesrXhMjKhThWhYhmh[}rY(h]]h^]h_]h`]hc]uheMvhfhhg]rZhpXVersion-specific Notesr[r\}r](hLjXhMjVubaubhN)r^}r_(hLUhMjKhThWhYhZh[}r`(h]]h^]h_]h`]raU)upgrading-a-buildmaster-to-buildbot-0-7-6rbahc]rchauheMyhfhhg]rd(hi)re}rf(hLX)Upgrading a Buildmaster to Buildbot-0.7.6rghMj^hThWhYhmh[}rh(h]]h^]h_]h`]hc]uheMyhfhhg]rihpX)Upgrading a Buildmaster to Buildbot-0.7.6rjrk}rl(hLjghMjeubaubh)rm}rn(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.hMj^hThWhYhh[}ro(h]]h^]h_]h`]hc]uheM{hfhhg]rp(hpX!The 0.7.6 release introduced the rqrr}rs(hLX!The 0.7.6 release introduced the hMjmubh)rt}ru(hLUh[}rv(h`]h_]h]]h^]rwXfilerxaUrolejxhc]uhMjmhg]ryhpX public_html/rzr{}r|(hLX public_html/hMjtubahYhubhpX directory, which contains r}r~}r(hLX directory, which contains hMjmubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjmhg]rhpX index.htmlrr}r(hLX index.htmlhMjubahYhubhpX and other files served by the rr}r(hLX and other files served by the hMjmubh)r}r(hLX ``WebStatus``h[}r(h]]h^]h_]h`]hc]uhMjmhg]rhpX WebStatusrr}r(hLUhMjubahYhubhpX and rr}r(hLX and hMjmubh)r}r(hLX ``Waterfall``h[}r(h]]h^]h_]h`]hc]uhMjmhg]rhpX Waterfallrr}r(hLUhMjubahYhubhpX status displays. The rr}r(hLX status displays. The hMjmubh)r}r(hLX``upgrade-master``h[}r(h]]h^]h_]h`]hc]uhMjmhg]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. hMjmubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjmhg]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.hMjmubeubeubhN)r}r(hLUhMjKhThWhYhZh[}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 rr}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(hLUhMjubahYhubhpX 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 (rr}r(hLX0The upgrade process renames the Changes pickle (hMjubh)r}r(hLX``$basedir/changes.pck``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX$basedir/changes.pckrr}r(hLUhMjubahYhubhpX) to rr}r(hLX) to hMjubh)r}r(hLX``changes.pck.old``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXchanges.pck.oldrr}r(hLUhMjubahYhubhpX 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 (rr}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 (hMjubh)r}r(hLX``state.sqlite``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX state.sqliterr}r(hLUhMjubahYhubhpX).rr}r(hLX).hMjubeubeubhN)r}r(hLUhMjKhThWhYhZh[}r(h]]h^]h_]h`]rU$upgrading-into-a-non-sqlite-databaser ahc]r h$auheMhfhhg]r (hi)r }r (hLX$Upgrading into a non-SQLite databaserhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX$Upgrading into a non-SQLite databaserr}r(hLjhMj ubaubh)r}r(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:hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXEIf you are not using sqlite, you will need to add an entry into your rr}r(hLXEIf you are not using sqlite, you will need to add an entry into your hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]r hpX master.cfgr!r"}r#(hLX master.cfghMjubahYhubhpXI to reflect the database version you are using. The upgrade process does r$r%}r&(hLXI to reflect the database version you are using. The upgrade process does hMjubh)r'}r((hLX*not*h[}r)(h]]h^]h_]h`]hc]uhMjhg]r*hpXnotr+r,}r-(hLUhMj'ubahYhubhpX edit your r.r/}r0(hLX edit your hMjubh)r1}r2(hLUh[}r3(h`]h_]h]]h^]r4Xfiler5aUrolej5hc]uhMjhg]r6hpX master.cfgr7r8}r9(hLX master.cfghMj1ubahYhubhpX for you. So something like:r:r;}r<(hLX for you. So something like:hMjubeubj)r=}r>(hLXO# for using mysql: c['db_url'] = 'mysql://bbuser:@localhost/buildbot'hMjhThWhYjh[}r?(jjXpythonjjh`]h_]h]]h^]hc]uheMhfhhg]r@hpXO# for using mysql: c['db_url'] = 'mysql://bbuser:@localhost/buildbot'rArB}rC(hLUhMj=ubaubh)rD}rE(hLXxOnce the parameter has been added, invoke ``upgrade-master``. This will extract the DB url from your configuration file.hMjhThWhYhh[}rF(h]]h^]h_]h`]hc]uheMhfhhg]rG(hpX*Once the parameter has been added, invoke rHrI}rJ(hLX*Once the parameter has been added, invoke hMjDubh)rK}rL(hLX``upgrade-master``h[}rM(h]]h^]h_]h`]hc]uhMjDhg]rNhpXupgrade-masterrOrP}rQ(hLUhMjKubahYhubhpX<. This will extract the DB url from your configuration file.rRrS}rT(hLX<. This will extract the DB url from your configuration file.hMjDubeubj)rU}rV(hLXbuildbot upgrade-masterhMjhThWhYjh[}rW(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rXhpXbuildbot upgrade-masterrYrZ}r[(hLUhMjUubaubh)r\}r](hLXISee :ref:`Database-Specification` for more options to specify a database.r^hMjhThWhYhh[}r_(h]]h^]h_]h`]hc]uheMhfhhg]r`(hpXSee rarb}rc(hLXSee hMj\ubj)rd}re(hLX:ref:`Database-Specification`rfhMj\hThWhYjh[}rg(UreftypeXrefjjXdatabase-specificationU refdomainXstdrhh`]h_]U refexplicith]]h^]hc]jjuheMhg]rih)rj}rk(hLjfh[}rl(h]]h^]rm(jjhXstd-refrneh_]h`]hc]uhMjdhg]rohpXDatabase-Specificationrprq}rr(hLUhMjjubahYhubaubhpX( for more options to specify a database.rsrt}ru(hLX( for more options to specify a database.hMj\ubeubhN)rv}rw(hLUhMjhThWhYhZh[}rx(h]]h^]h_]h`]ryUchange-encoding-issuesrzahc]r{h4auheMhfhhg]r|(hi)r}}r~(hLXChange Encoding IssuesrhMjvhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXChange Encoding Issuesrr}r(hLjhMj}ubaubh)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`.hMjvhThWhYhh[}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:hMjvhThWhYhh[}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(jjXstd-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.oldhMjvhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpX$ 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.oldrr}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.rhMjvhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXIf 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.rr}r(hLjhMjubaubht)r}r(hLX-.. _Upgrading-a-Buildmaster-to-Later-Version:hMjvhThWhYhwh[}r(h`]h_]h]]h^]hc]hyU(upgrading-a-buildmaster-to-later-versionruheMhfhhg]ubeubeubhN)r}r(hLUhMjKhThWh}}rh#jshYhZh[}r(h]]h^]h_]h`]r(U)upgrading-a-buildmaster-to-later-versionsrjehc]r(hh#euheMhfhh}rjjshg]r(hi)r}r(hLX)Upgrading a Buildmaster to Later VersionsrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpX)Upgrading a Buildmaster to Later Versionsrr}r(hLjhMjubaubh)r}r(hLX]Up to Buildbot version |version|, no further steps beyond those described above are required.hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXUp to Buildbot version rr}r(hLXUp to Buildbot version hMjubhpX0.8.8rr}r(hLU0.8.8rhTNheNhfhhMjubhpX=, no further steps beyond those described above are required.rr}r(hLX=, no further steps beyond those described above are required.hMjubeubht)r}r(hLX.. _Creating-a-buildslave:hMjhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUcreating-a-buildslaveruheMhfhhg]ubeubeubeubhN)r}r(hLUhMhRhThWh}}rhjshYhZh[}r(h]]h^]h_]h`]r(jUid9rehc]r(h+heuheMhfhh}rjjshg]r(hi)r}r(hLXCreating a buildslaverhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMhfhhg]rhpXCreating a buildslaver r }r (hLjhMjubaubh)r }r (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.r hMjhThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r 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.r r }r (hLj hMj ubaubh)r }r (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.hMjhThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (hpX;The buildbot exists to make sure that the project's stated r r }r (hLX;The buildbot exists to make sure that the project's stated hMj ubh)r }r (hLX``how to build it``h[}r (h]]h^]h_]h`]hc]uhMj hg]r hpXhow to build itr r }r (hLUhMj 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 (r 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 (hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r! hpXREADMEr" r# }r$ (hLXREADMEhMj ubahYhubhpX, r% r& }r' (hLX, hMj ubh)r( }r) (hLUh[}r* (h`]h_]h]]h^]r+ Xfiler, aUrolej, hc]uhMj hg]r- hpXINSTALLr. r/ }r0 (hLXINSTALLhMj( 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.r1 r2 }r3 (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.hMj ubeubh)r4 }r5 (hLX4Here's a good checklist for setting up a buildslave:r6 hMjhThWhYhh[}r7 (h]]h^]h_]h`]hc]uheMhfhhg]r8 hpX4Here's a good checklist for setting up a buildslave:r9 r: }r; (hLj6 hMj4 ubaubcdocutils.nodes enumerated_list r< )r= }r> (hLUhMjhThWhYUenumerated_listr? h[}r@ (UsuffixrA U.h`]h_]h]]UprefixrB Uh^]hc]UenumtyperC UarabicrD uheMhfhhg]rE cdocutils.nodes list_item rF )rG }rH (hLXSet up the account hMj= hThWhYU list_itemrI h[}rJ (h]]h^]h_]h`]hc]uheNhfhhg]rK h)rL }rM (hLXSet up the accountrN hMjG hThWhYhh[}rO (h]]h^]h_]h`]hc]uheMhg]rP hpXSet up the accountrQ rR }rS (hLjN hMjL ubaubaubaubj)rT }rU (hLUhMjhThWhYjh[}rV (h]]h^]h_]h`]hc]uheNhfhhg]rW h)rX }rY (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.hMjT hThWhYhh[}rZ (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 hMjX ubh)r_ }r` (hLX ``buildbot``h[}ra (h]]h^]h_]h`]hc]uhMjX hg]rb hpXbuildbotrc rd }re (hLUhMj_ ubahYhubhpX or rf rg }rh (hLX or hMjX ubh)ri }rj (hLX``buildslave``h[}rk (h]]h^]h_]h`]hc]uhMjX hg]rl hpX buildslaverm rn }ro (hLUhMji 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.rp rq }rr (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.hMjX ubeubaubj< )rs }rt (hLUhMjhThWhYj? h[}ru (jA U.Ustartrv Kh`]h_]h]]jB Uh^]hc]jC jD uheMhfhhg]rw jF )rx }ry (hLXInstall the buildbot code hMjs hThWhYjI h[}rz (h]]h^]h_]h`]hc]uheNhfhhg]r{ h)r| }r} (hLXInstall the buildbot coder~ hMjx hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXInstall the buildbot coder r }r (hLj~ hMj| ubaubaubaubj)r }r (hLUhMjhThWhYjh[}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 (jj 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 (hLUhMjhThWhYj? h[}r (jA U.jv Kh`]h_]h]]jB Uh^]hc]jC jD uheMhfhhg]r jF )r }r (hLXSet up the host hMj hThWhYjI 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 (hLUhMjhThWhYjh[}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 (hLUhMjhThWhYj? h[}r (jA U.jv Kh`]h_]h]]jB Uh^]hc]jC jD uheMhfhhg]r jF )r }r (hLXTest the build process hMj hThWhYjI h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXTest the build processr hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXTest the build processr r }r (hLj hMj ubaubaubaubj)r }r (hLUhMjhThWhYjh[}r (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.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r (hpXFollow the instructions in the r r }r (hLXFollow the instructions in the hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r hpXINSTALLr r }r (hLXINSTALLhMj 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.r r }r (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< )r }r (hLUhMjhThWhYj? h[}r (jA U.jv Kh`]h_]h]]jB Uh^]hc]jC jD uheMhfhhg]r jF )r }r (hLXChoose a base directory hMj hThWhYjI h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXChoose a base directoryr hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhg]r hpXChoose a base directoryr r }r (hLj hMj ubaubaubaubj)r }r (hLUhMjhThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r! }r" (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[}r# (h]]h^]h_]h`]hc]uheM hg]r$ (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 r% r& }r' (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 hMj! ubh)r( }r) (hLUh[}r* (h`]h_]h]]h^]r+ Xfiler, aUrolej, hc]uhMj! hg]r- hpX ~/Buildbotr. r/ }r0 (hLX ~/BuildbothMj( ubahYhubhpX or r1 r2 }r3 (hLX or hMj! ubh)r4 }r5 (hLUh[}r6 (h`]h_]h]]h^]r7 Xfiler8 aUrolej8 hc]uhMj! hg]r9 hpX~/Buildslaves/fooprojectr: r; }r< (hLX~/Buildslaves/fooprojecthMj4 ubahYhubhpX is appropriate.r= r> }r? (hLX is appropriate.hMj! ubeubaubj< )r@ }rA (hLUhMjhThWhYj? h[}rB (jA U.jv Kh`]h_]h]]jB Uh^]hc]jC jD uheMhfhhg]rC jF )rD }rE (hLX5Get the buildmaster host/port, botname, and password hMj@ hThWhYjI h[}rF (h]]h^]h_]h`]hc]uheNhfhhg]rG h)rH }rI (hLX4Get the buildmaster host/port, botname, and passwordrJ hMjD hThWhYhh[}rK (h]]h^]h_]h`]hc]uheMhg]rL hpX4Get the buildmaster host/port, botname, and passwordrM rN }rO (hLjJ hMjH ubaubaubaubj)rP }rQ (hLUhMjhTNhYjh[}rR (h]]h^]h_]h`]hc]uheNhfhhg]rS (h)rT }rU (hLXWhen the buildbot admin configures the buildmaster to accept and use your buildslave, they will provide you with the following pieces of information:rV hMjP hThWhYhh[}rW (h]]h^]h_]h`]hc]uheMhg]rX hpXWhen the buildbot admin configures the buildmaster to accept and use your buildslave, they will provide you with the following pieces of information:rY rZ }r[ (hLjV hMjT ubaubcdocutils.nodes bullet_list r\ )r] }r^ (hLUh[}r_ (Ubulletr` X*h`]h_]h]]h^]hc]uhMjP hg]ra (jF )rb }rc (hLXyour buildslave's namerd h[}re (h]]h^]h_]h`]hc]uhMj] hg]rf h)rg }rh (hLjd hMjb hThWhYhh[}ri (h]]h^]h_]h`]hc]uheMhg]rj hpXyour buildslave's namerk rl }rm (hLjd hMjg ubaubahYjI ubjF )rn }ro (hLX(the password assigned to your buildslaverp h[}rq (h]]h^]h_]h`]hc]uhMj] hg]rr h)rs }rt (hLjp hMjn hThWhYhh[}ru (h]]h^]h_]h`]hc]uheMhg]rv hpX(the password assigned to your buildslaverw rx }ry (hLjp hMjs ubaubahYjI ubjF )rz }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 hMjz 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~ ubaubahYjI ubehYU bullet_listr ubeubj< )r }r (hLUhMjhThWhYj? h[}r (jA U.jv Kh`]h_]h]]jB Uh^]hc]jC jD uheMhfhhg]r jF )r }r (hLXCreate the buildslave hMj hThWhYjI 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 (hLUhMjhThWhYjh[}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]uheMhg]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]uheMhg]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]uheMhg]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 r r }r (hLX: file that contains all the information you passed to the hMj ubj*)r }r (hLX:command:`buildbot`h[}r (h]]h^]r j/ah_]h`]hc]uhMj hg]r hpXbuildbotr r }r (hLUhMj ubahYj4ubhpX command.r r }r (hLX command.hMj ubeubeubj< )r }r (hLUhMjhThWhYj? h[}r (jA U.jv Kh`]h_]h]]jB Uh^]hc]jC jD uheM#hfhhg]r jF )r }r (hLXFill in the hostinfo files hMj hThWhYjI h[}r (h]]h^]h_]h`]hc]uheNhfhhg]r h)r }r (hLXFill in the hostinfo filesr hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheM#hg]r hpXFill in the hostinfo filesr r }r (hLj hMj ubaubaubaubj)r }r (hLUhMjhThWhYjh[}r (h]]h^]h_]h`]hc]uheNhfhhg]r (h)r }r (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.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheM%hg]r (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 r r }r (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 hMj ubh)r }r (hLUh[}r (h`]h_]h]]h^]r Xfiler aUrolej hc]uhMj hg]r hpXinfor r }r (hLXinfohMj ubahYhubhpXn subdirectory of the buildbot's base directory. You should edit these to correctly describe you and your host.r! r" }r# (hLXn subdirectory of the buildbot's base directory. You should edit these to correctly describe you and your host.hMj ubeubh)r$ }r% (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).hMj hThWhYhh[}r& (h]]h^]h_]h`]hc]uheM-hg]r' (h)r( }r) (hLUh[}r* (h`]h_]h]]h^]r+ Xfiler, aUrolej, hc]uhMj$ hg]r- (h)r. }r/ (hLXBASEDIRh[}r0 (h]]h^]h_]h`]hc]uhMj( hg]r1 hpXBASEDIRr2 r3 }r4 (hLUhMj. ubahYhubhpX /info/adminr5 r6 }r7 (hLX /info/adminhMj( ubehYhubhpX9 should contain your name and email address. This is the r8 r9 }r: (hLX9 should contain your name and email address. This is the hMj$ ubh)r; }r< (hLX``buildslave admin address``h[}r= (h]]h^]h_]h`]hc]uhMj$ hg]r> hpXbuildslave admin addressr? r@ }rA (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).rB rC }rD (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).hMj$ ubeubh)rE }rF (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.hMj hThWhYhh[}rG (h]]h^]h_]h`]hc]uheM2hg]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/hostrV rW }rX (hLX /info/hosthMjI 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.rY rZ }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.hMjE 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.hMj hThWhYhh[}r^ (h]]h^]h_]h`]hc]uheM7hg]r_ (hpX The optional r` ra }rb (hLX The optional hMj\ ubh)rc }rd (hLUh[}re (h`]h_]h]]h^]rf Xfilerg aUrolejg hc]uhMj\ hg]rh (h)ri }rj (hLXBASEDIRh[}rk (h]]h^]h_]h`]hc]uhMjc hg]rl hpXBASEDIRrm rn }ro (hLUhMji ubahYhubhpX/info/access_urirp rq }rr (hLX/info/access_urihMjc ubehYhubhpXR can specify a URI which will connect a user to the machine. Many systems accept rs rt }ru (hLXR can specify a URI which will connect a user to the machine. Many systems accept hMj\ ubh)rv }rw (hLX``ssh://hostname``h[}rx (h]]h^]h_]h`]hc]uhMj\ hg]ry hpXssh://hostnamerz r{ }r| (hLUhMjv 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.hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheM;hg]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:hMjhThWhYhwh[}r (h`]h_]h]]h^]hc]hyUbuildslave-optionsr uheM?hfhhg]ubhN)r }r (hLUhMjhThWh}}r h6j shYhZh[}r (h]]h^]h_]h`]r (j Uid10r ehc]r (hh6euheMBhfhh}r j j shg]r (hi)r }r (hLXBuildslave Optionsr hMj hThWhYhmh[}r (h]]h^]h_]h`]hc]uheMBhfhhg]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]uheMDhfhhg]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]uheMJhfhhg]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 (h`]r j ah_]h]]h^]hc]Ufirstr uheMVhfhhg]r (csphinx.addnodes desc_name r )r }r (hLj hMj hThWhYU desc_namer h[}r (h]]h^]h_]h`]hc]uheMVhfhhg]r hpX--no-logrotater r }r (hLUhMj ubaubcsphinx.addnodes desc_addname r )r }r (hLXhMj hThWhYU desc_addnamer h[}r (h]]h^]h_]h`]hc]uheMVhfhhg]ubeubcsphinx.addnodes desc_content r )r }r (hLUhMj hThWhYU desc_contentr h[}r (h]]h^]h_]h`]hc]uheMVhfhhg]r h)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.r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMRhfhhg]r 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.r r }r (hLj hMj ubaubaubeubj)r }r (hLUhMj hThWhYjh[}r (h`]h_]h]]h^]hc]Uentries]r (j X5buildslave-create-slave command line option; --useptyX)cmdoption-buildslave-create-slave--useptyr 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--useptyr hMj hThWhYj h[}r (h`]r j ah_]h]]h^]hc]j uheM]hfhhg]r (j )r }r (hLj hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheM]hfhhg]r! hpX--useptyr" r# }r$ (hLUhMj ubaubj )r% }r& (hLXhMj hThWhYj h[}r' (h]]h^]h_]h`]hc]uheM]hfhhg]ubeubj )r( }r) (hLUhMj hThWhYj h[}r* (h]]h^]h_]h`]hc]uheM]hfhhg]r+ h)r, }r- (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.r. hMj( hThWhYhh[}r/ (h]]h^]h_]h`]hc]uheMYhfhhg]r0 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.r1 r2 }r3 (hLj. hMj, ubaubaubeubj)r4 }r5 (hLUhMj hThWhYjh[}r6 (h`]h_]h]]h^]hc]Uentries]r7 (j X4buildslave-create-slave command line option; --umaskX(cmdoption-buildslave-create-slave--umaskr8 Utr9 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--umaskrA hMj: hThWhYj h[}rB (h`]rC j8 ah_]h]]h^]hc]j uheMjhfhhg]rD (j )rE }rF (hLjA hMj? hThWhYj h[}rG (h]]h^]h_]h`]hc]uheMjhfhhg]rH hpX--umaskrI rJ }rK (hLUhMjE ubaubj )rL }rM (hLXhMj? hThWhYj h[}rN (h]]h^]h_]h`]hc]uheMjhfhhg]ubeubj )rO }rP (hLUhMj: hThWhYj h[}rQ (h]]h^]h_]h`]hc]uheMjhfhhg]rR h)rS }rT (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.hMjO hThWhYhh[}rU (h]]h^]h_]h`]hc]uheM`hfhhg]rV (hpXlThis is a string (generally an octal representation of an integer) which will cause the buildslave process' rW rX }rY (hLXlThis is a string (generally an octal representation of an integer) which will cause the buildslave process' hMjS ubh)rZ }r[ (hLX ``umask``h[}r\ (h]]h^]h_]h`]hc]uhMjS hg]r] hpXumaskr^ r_ }r` (hLUhMjZ ubahYhubhpX3 value to be set shortly after initialization. The ra rb }rc (hLX3 value to be set shortly after initialization. The hMjS ubh)rd }re (hLX ``twistd``h[}rf (h]]h^]h_]h`]hc]uhMjS hg]rg hpXtwistdrh ri }rj (hLUhMjd 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 rk rl }rm (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 hMjS ubh)rn }ro (hLX``--umask=022``h[}rp (h]]h^]h_]h`]hc]uhMjS hg]rq hpX --umask=022rr rs }rt (hLUhMjn ubahYhubhpXd to tell the buildslave to fix the umask after twistd clobbers it. If you want build products to be ru rv }rw (hLXd to tell the buildslave to fix the umask after twistd clobbers it. If you want build products to be hMjS ubh)rx }ry (hLX *writable*h[}rz (h]]h^]h_]h`]hc]uhMjS hg]r{ hpXwritabler| r} }r~ (hLUhMjx ubahYhubhpX by other accounts too, use r r }r (hLX by other accounts too, use hMjS ubh)r }r (hLX``--umask=000``h[}r (h]]h^]h_]h`]hc]uhMjS 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.hMjS 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 (h`]r j ah_]h]]h^]hc]j uheMyhfhhg]r (j )r }r (hLj hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMyhfhhg]r hpX --keepaliver r }r (hLUhMj ubaubj )r }r (hLXhMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMyhfhhg]ubeubj )r }r (hLUhMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMyhfhhg]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]uheMmhfhhg]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]uheMshfhhg]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 (h`]r j ah_]h]]h^]hc]j uheMhfhhg]r (j )r }r (hLj hMj hThWhYj 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]ubeubj )r }r (hLUhMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r h)r }r (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.r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheM|hfhhg]r 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.r r }r (hLj hMj 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 )r }r (hLUhMj hThWhYj h[}r (j j Xstdh`]h_]h]]h^]hc]j Xoptionr j j uheNhfhhg]r (j )r }r (hLX --log-sizer hMj hThWhYj h[}r (h`]r j ah_]h]]h^]hc]j uheMhfhhg]r (j )r }r (hLj hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpX --log-sizer r }r (hLUhMj ubaubj )r }r (hLXhMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]ubeubj )r }r (hLUhMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r h)r }r (hLX?This is the size in bytes when to rotate the Twisted log files.r hMj hThWhYhh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpX?This is the size in bytes when to rotate the Twisted log files.r r }r (hLj hMj ubaubaubeubj)r }r (hLUhMj hThWhYjh[}r (h`]h_]h]]h^]hc]Uentries]r (j X8buildslave-create-slave command line option; --log-countX,cmdoption-buildslave-create-slave--log-countr 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 --log-countr( hMj! hThWhYj h[}r) (h`]r* j ah_]h]]h^]hc]j uheMhfhhg]r+ (j )r, }r- (hLj( hMj& hThWhYj h[}r. (h]]h^]h_]h`]hc]uheMhfhhg]r/ hpX --log-countr0 r1 }r2 (hLUhMj, ubaubj )r3 }r4 (hLXhMj& hThWhYj h[}r5 (h]]h^]h_]h`]hc]uheMhfhhg]ubeubj )r6 }r7 (hLUhMj! hThWhYj h[}r8 (h]]h^]h_]h`]hc]uheMhfhhg]r9 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.hMj6 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)rA }rB (hLX``None``h[}rC (h]]h^]h_]h`]hc]uhMj: hg]rD hpXNonerE rF }rG (hLUhMjA ubahYhubhpX to keep all rH rI }rJ (hLX to keep all hMj: ubh)rK }rL (hLUh[}rM (h`]h_]h]]h^]rN XfilerO aUrolejO hc]uhMj: hg]rP hpX twistd.logrQ rR }rS (hLX twistd.loghMjK ubahYhubhpX! files around. The default is 10.rT rU }rV (hLX! files around. The default is 10.hMj: ubeubaubeubj)rW }rX (hLUhMj hThWhYjh[}rY (h`]h_]h]]h^]hc]Uentries]rZ (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]ra (j )rb }rc (hLX--allow-shutdownrd hMj] hThWhYj h[}re (h`]rf j[ ah_]h]]h^]hc]j uheMhfhhg]rg (j )rh }ri (hLjd hMjb hThWhYj h[}rj (h]]h^]h_]h`]hc]uheMhfhhg]rk hpX--allow-shutdownrl rm }rn (hLUhMjh ubaubj )ro }rp (hLXhMjb hThWhYj h[}rq (h]]h^]h_]h`]hc]uheMhfhhg]ubeubj )rr }rs (hLXNCan also be passed directly to the BuildSlave constructor in buildbot.tac. Ifrt hMj] hThWhYj h[}ru (h`]h_]h]]h^]hc]j uheMhfhhg]rv j )rw }rx (hLjt hMjr hThWhYj h[}ry (h]]h^]h_]h`]hc]uheMhfhhg]rz hpXNCan also be passed directly to the BuildSlave constructor in buildbot.tac. Ifr{ r| }r} (hLUhMjw ubaubaubj )r~ }r (hLXNset, it allows the buildslave to initiate a graceful shutdown, meaning that itr hMj] hThWhYj h[}r (h`]h_]h]]h^]hc]j uheMhfhhg]r j )r }r (hLj hMj~ hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpXNset, it allows the buildslave to initiate a graceful shutdown, meaning that itr r }r (hLUhMj ubaubaubj )r }r (hLXMwill ask the master to shut down the slave when the current build, if any, isr hMj] hThWhYj h[}r (h`]h_]h]]h^]hc]j uheMhfhhg]r j )r }r (hLj hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpXMwill ask the master to shut down the slave when the current build, if any, isr r }r (hLUhMj ubaubaubj )r }r (hLX complete.r hMj] hThWhYj h[}r (h`]h_]h]]h^]hc]j uheMhfhhg]r j )r }r (hLj hMj hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpX complete.r r }r (hLUhMj ubaubaubj )r }r (hLUhMj] hThWhYj h[}r (h]]h^]h_]h`]hc]uheMhfhhg]r (h)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]r hpXNoner r }r (hLUhMj ubahYhubhpX., in which case this feature will be disabled.r r }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 hMj ubaubeubeubht)r }r (hLX#.. _Other-Buildslave-Configuration:hMj hThWhYhwh[}r (h`]h_]h]]h^]hc]hyUother-buildslave-configurationr uheMhfhhg]ubeubhN)r }r (hLUhMjhThWh}}r h/j shYhZh[}r (h]]h^]h_]h`]r (j Uid11r ehc]r (hh/euheMhfhh}r j j shg]r (hi)r }r (hLXOther Buildslave Configurationr hMj hThWhYhmh[}r (h]]h^]h_]h`]hc]uheMhfhhg]r hpXOther Buildslave Configurationr r}r(hLj hMj ubaubcdocutils.nodes definition_list r)r}r(hLUhMj hThWhYUdefinition_listrh[}r(h]]h^]h_]h`]hc]uheNhfhhg]rcdocutils.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. hMjhThWhYUdefinition_list_itemr h[}r (h]]h^]h_]h`]hc]uheMhg]r (cdocutils.nodes term r)r}r(hLX``unicode_encoding``rhMj hThWhYUtermrh[}r(h]]h^]h_]h`]hc]uheMhg]rh)r}r(hLjh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXunicode_encodingrr}r(hLUhMjubahYhubaubcdocutils.nodes definition r)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMj hg]r (h)r!}r"(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.r#hMjhThWhYhh[}r$(h]]h^]h_]h`]hc]uheMhg]r%hpXThis 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.r&r'}r((hLj#hMj!ubaubh)r)}r*(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.hMjhThWhYhh[}r+(h]]h^]h_]h`]hc]uheMhg]r,(hpX#The default value is what Python's r-r.}r/(hLX#The default value is what Python's hMj)ubj)r0}r1(hLX#:func:`sys.getfilesystemencoding()`r2hMj)hThWhYjh[}r3(UreftypeXfuncjjXsys.getfilesystemencodingU refdomainXpyr4h`]h_]U refexplicith]]h^]hc]jjUpy:classr5NU py:moduler6NuheMhg]r7h)r8}r9(hLj2h[}r:(h]]h^]r;(jj4Xpy-funcr<eh_]h`]hc]uhMj0hg]r=hpXsys.getfilesystemencodingr>r?}r@(hLUhMj8ubahYhubaubhpXi returns, which on Windows is 'mbcs', on Mac OSX is 'utf-8', and on Unix depends on your locale settings.rArB}rC(hLXi returns, which on Windows is 'mbcs', on Mac OSX is 'utf-8', and on Unix depends on your locale settings.hMj)ubeubh)rD}rE(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.hMjhThWhYhh[}rF(h]]h^]h_]h`]hc]uheMhg]rG(hpXLIf you need a different encoding, this can be changed in your build slave's rHrI}rJ(hLXLIf you need a different encoding, this can be changed in your build slave's hMjDubh)rK}rL(hLUh[}rM(h`]h_]h]]h^]rNXfilerOaUrolejOhc]uhMjDhg]rPhpX buildbot.tacrQrR}rS(hLX buildbot.tachMjKubahYhubhpX file by adding a rTrU}rV(hLX file by adding a hMjDubh)rW}rX(hLX``unicode_encoding``h[}rY(h]]h^]h_]h`]hc]uhMjDhg]rZhpXunicode_encodingr[r\}r](hLUhMjWubahYhubhpX) argument to the BuildSlave constructor.r^r_}r`(hLX) argument to the BuildSlave constructor.hMjDubeubehYU definitionraubeubaubj)rb}rc(hLXs = BuildSlave(buildmaster_host, port, slavename, passwd, basedir, keepalive, usepty, umask=umask, maxdelay=maxdelay, unicode_encoding='utf-8', allow_shutdown='signal')hMj hThWhYjh[}rd(jjXpythonjjh`]h_]h]]h^]hc]uheMhfhhg]rehpXs = BuildSlave(buildmaster_host, port, slavename, passwd, basedir, keepalive, usepty, umask=umask, maxdelay=maxdelay, unicode_encoding='utf-8', allow_shutdown='signal')rfrg}rh(hLUhMjbubaubht)ri}rj(hLX%.. _Upgrading-an-Existing-Buildslave:hMj hThWhYhwh[}rk(h`]h_]h]]h^]hc]hyU upgrading-an-existing-buildslaverluheMhfhhg]ubeubeubhN)rm}rn(hLUhMhRhThWh}}roh1jishYhZh[}rp(h]]h^]h_]h`]rq(jlUid12rrehc]rs(hh1euheMhfhh}rtjljishg]ru(hi)rv}rw(hLX Upgrading an Existing BuildslaverxhMjmhThWhYhmh[}ry(h]]h^]h_]h`]hc]uheMhfhhg]rzhpX Upgrading an Existing Buildslaver{r|}r}(hLjxhMjvubaubh)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 runrhMjmhThWhYhh[}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(hLjhMj~ubaubj)r}r(hLX0buildslave upgrade-slave /path/to/buildslave/dirhMjmhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rhpX0buildslave upgrade-slave /path/to/buildslave/dirrr}r(hLUhMjubaubht)r}r(hLX&.. _Buildslave-Version-specific-Notes:hMjmhThWhYhwh[}r(h`]h_]h]]h^]hc]hyU!buildslave-version-specific-notesruheMhfhhg]ubhN)r}r(hLUhQKhMjmhThWh}}rhjshYhZh[}r(h]]rjPah^]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 rr}r(hLXdIf you are running a version later than 0.8.1, then you can skip the remainder of this section: the hMjubh)r}r(hLX```upgrade-slave``h[}r(h]]h^]h_]h`]hc]uhMjhg]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.hMjubeubh)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^]rXfileraUrolejhc]uhMjhg]rhpX buildbot.tacrr}r(hLX buildbot.tachMjubahYhubhpX 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 rr }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]rhpXbuildslave create-slaverr}r(hLUhMj ubahYhubhpX.r}r(hLX.hMjubeubh)r}r(hLXtIf deleting the slave directory is problematic, the change to :file:`buildbot.tac` is simple. On line 3, replace ::hMjhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX>If deleting the slave directory is problematic, the change to rr}r(hLX>If deleting the slave directory is problematic, the change to hMjubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMjhg]r hpX buildbot.tacr!r"}r#(hLX buildbot.tachMjubahYhubhpX is simple. On line 3, replacer$r%}r&(hLX is simple. On line 3, replacehMjubeubj)r'}r((hLX)from buildbot.slave.bot import BuildSlavehMjhThWhYjh[}r)(jjh`]h_]h]]h^]hc]uheMhfhhg]r*hpX)from buildbot.slave.bot import BuildSlaver+r,}r-(hLUhMj'ubaubh)r.}r/(hLXwith ::r0hMjhThWhYhh[}r1(h]]h^]h_]h`]hc]uheMhfhhg]r2hpXwithr3r4}r5(hLXwithhMj.ubaubj)r6}r7(hLX%from buildslave.bot import BuildSlavehMjhThWhYjh[}r8(jjh`]h_]h]]h^]hc]uheMhfhhg]r9hpX%from buildslave.bot import BuildSlaver:r;}r<(hLUhMj6ubaubh)r=}r>(hLX8After this change, the buildslave should start as usual.r?hMjhThWhYhh[}r@(h]]h^]h_]h`]hc]uheMhfhhg]rAhpX8After this change, the buildslave should start as usual.rBrC}rD(hLj?hMj=ubaubht)rE}rF(hLX.. _Launching-the-daemons:hMjhThWhYhwh[}rG(h`]h_]h]]h^]hc]hyUlaunching-the-daemonsrHuheMhfhhg]ubeubeubeubhN)rI}rJ(hLUhMhRhThWh}}rKh"jEshYhZh[}rL(h]]h^]h_]h`]rM(jHUid14rNehc]rO(hCh"euheMhfhh}rPjHjEshg]rQ(hi)rR}rS(hLXLaunching the daemonsrThMjIhThWhYhmh[}rU(h]]h^]h_]h`]hc]uheMhfhhg]rVhpXLaunching the daemonsrWrX}rY(hLjThMjRubaubh)rZ}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:hMjIhThWhYhh[}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 r^r_}r`(hLXrBoth the buildmaster and the buildslave run as daemon programs. To launch them, pass the working directory to the hMjZubj*)ra}rb(hLX:command:`buildbot`h[}rc(h]]h^]rdj/ah_]h`]hc]uhMjZhg]rehpXbuildbotrfrg}rh(hLUhMjaubahYj4ubhpX and rirj}rk(hLX and hMjZubj*)rl}rm(hLX:command:`buildslave`h[}rn(h]]h^]roj/ah_]h`]hc]uhMjZhg]rphpX buildslaverqrr}rs(hLUhMjlubahYj4ubhpX commands, as appropriate:rtru}rv(hLX commands, as appropriate:hMjZubeubj)rw}rx(hLX^# start a master buildbot start [ BASEDIR ] # start a slave buildslave start [ SLAVE_BASEDIR ]hMjIhThWhYjh[}ry(jjXbashjjh`]h_]h]]h^]hc]uheMhfhhg]rzhpX^# start a master buildbot start [ BASEDIR ] # start a slave buildslave start [ SLAVE_BASEDIR ]r{r|}r}(hLUhMjwubaubh)r~}r(hLXThe *BASEDIR* is option and can be omitted if the current directory contains the buildbot configuration (the :file:`buildbot.tac` file).hMjIhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpXThe rr}r(hLXThe hMj~ubh)r}r(hLX *BASEDIR*h[}r(h]]h^]h_]h`]hc]uhMj~hg]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 hMj~ubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMj~hg]rhpX buildbot.tacrr}r(hLX buildbot.tachMjubahYhubhpX file).rr}r(hLX file).hMj~ubeubj)r}r(hLXbuildbot starthMjIhThWhYjh[}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.hMjIhThWhYhh[}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.rhMjIhThWhYhh[}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]_hMjIhThWhYhh[}r(h]]h^]h_]h`]hc]uheM hfhhg]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 hMjubj*)r}r(hLX:command:`cron`h[}r(h]]h^]rj/ah_]h`]hc]uhMjhg]rhpXcronrr}r(hLUhMjubahYj4ubhpX, 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]rhpX@rebootrr}r(hLUhMjubahYhubhpX 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 ]hMjIhThWhYjh[}r(jjXnonejjh`]h_]h]]h^]hc]uheMhfhhg]rhpX"@reboot buildbot start [ BASEDIR ]rr}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.hMjIhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(hpX When you run rr }r (hLX When you run hMjubj*)r }r (hLX:command:`crontab`h[}r (h]]h^]rj/ah_]h`]hc]uhMjhg]rhpXcrontabrr}r(hLUhMj ubahYj4ubhpX 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.rr}r(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.hMjubeubh)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 :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.hMjIhThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]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 rr}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 hMjubj)r}r(hLUh[}r(h`]h_]h]]h^]hc]j]r ((jXPATHr!Uindex-1r"Utr#(jXenvironment variable; PATHj"Utr$euhMjhg]hYjubht)r%}r&(hLUh[}r'(h]]h^]h_]h`]r(j"ahc]uhMjhg]hYhwubj)r)}r*(hLX:envvar:`PATH`r+hMjhThWhYjh[}r,(UreftypeXenvvarjjj!U refdomainXstdr-h`]h_]U refexplicith]]h^]hc]jjuheMhg]r.h)r/}r0(hLj+h[}r1(h]]h^]r2(jj-X std-envvarr3eh_]h`]hc]uhMj)hg]r4hpXPATHr5r6}r7(hLUhMj/ubahYhubaubhpX 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 r8r9}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 hMjubh)r;}r<(hLUh[}r=(h`]h_]h]]h^]r>Xfiler?aUrolej?hc]uhMjhg]r@hpX twistd.logrArB}rC(hLX twistd.loghMj;ubahYhubhpXQ to make sure the slave actually started correctly. Common problems here are for rDrE}rF(hLXQ to make sure the slave actually started correctly. Common problems here are for hMjubh)rG}rH(hLUh[}rI(h`]h_]h]]h^]rJXfilerKaUrolejKhc]uhMjhg]rLhpX /usr/localrMrN}rO(hLX /usr/localhMjGubahYhubhpX or rPrQ}rR(hLX or hMjubh)rS}rT(hLUh[}rU(h`]h_]h]]h^]rVXfilerWaUrolejWhc]uhMjhg]rXhpX~/binrYrZ}r[(hLX~/binhMjSubahYhubhpX to not be on your r\r]}r^(hLX to not be on your hMjubj)r_}r`(hLUh[}ra(h`]h_]h]]h^]hc]j]rb((jXPATHrcUindex-2rdUtre(jXenvironment variable; PATHjdUtrfeuhMjhg]hYjubht)rg}rh(hLUh[}ri(h]]h^]h_]h`]rjjdahc]uhMjhg]hYhwubj)rk}rl(hLX:envvar:`PATH`rmhMjhThWhYjh[}rn(UreftypeXenvvarjjjcU refdomainXstdroh`]h_]U refexplicith]]h^]hc]jjuheMhg]rph)rq}rr(hLjmh[}rs(h]]h^]rt(jjoX std-envvarrueh_]h`]hc]uhMjkhg]rvhpXPATHrwrx}ry(hLUhMjqubahYhubaubhpX , or for rzr{}r|(hLX , or for hMjubj)r}}r~(hLUh[}r(h`]h_]h]]h^]hc]j]r((jX PYTHONPATHrUindex-3rUtr(jX environment variable; PYTHONPATHjUtreuhMjhg]hYjubht)r}r(hLUh[}r(h]]h^]h_]h`]rjahc]uhMjhg]hYhwubj)r}r(hLX:envvar:`PYTHONPATH`rhMjhThWhYjh[}r(UreftypeXenvvarjjjU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheMhg]rh)r}r(hLjh[}r(h]]h^]r(jjX std-envvarreh_]h`]hc]uhMjhg]rhpX PYTHONPATHrr}r(hLUhMjubahYhubaubhpX$ to not be set correctly. Sometimes rr}r(hLX$ to not be set correctly. Sometimes hMjubj)r}r(hLUh[}r(h`]h_]h]]h^]hc]j]r((jXHOMErUindex-4rUtr(jXenvironment variable; HOMEjUtreuhMjhg]hYjubht)r}r(hLUh[}r(h]]h^]h_]h`]rjahc]uhMjhg]hYhwubj)r}r(hLX:envvar:`HOME`rhMjhThWhYjh[}r(UreftypeXenvvarjjjU refdomainXstdrh`]h_]U refexplicith]]h^]hc]jjuheMhg]rh)r}r(hLjh[}r(h]]h^]r(jjX std-envvarreh_]h`]hc]uhMjhg]rhpXHOMErr}r(hLUhMjubahYhubaubhpX is messed up too.rr}r(hLX is messed up too.hMjubeubh)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`).hMjIhThWhYhh[}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).rhMjIhThWhYhh[}r(h]]h^]h_]h`]hc]uheM,hfhhg]rhpXBuildbot 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).rr}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 defaultshMjIhThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheM3hfhhg]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:hMjIhThWhYhwh[}r(h`]h_]h]]h^]hc]hyUlogfilesruheMHhfhhg]ubeubhN)r}r(hLUhQKhMhRhThWh}}rh>jshYhZh[}r(h]]rXlogfilesrah^]h_]h`]r(jUid16rehc]rh>auheMKhfhh}rjjshg]r(hi)r}r(hLXLogfilesrhMjhThWhYhmh[}r(h]]h^]h_]h`]hc]uheMKhfhhg]rhpXLogfilesrr}r (hLjhMjubaubh)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]uheMMhfhhg]r (hpX@While a buildbot daemon runs, it emits text to a logfile, named rr}r(hLX@While a buildbot daemon runs, it emits text to a logfile, named hMj ubh)r}r(hLUh[}r(h`]h_]h]]h^]rXfileraUrolejhc]uhMj hg]rhpX twistd.logrr}r(hLX twistd.loghMjubahYhubhpX. A command like rr}r(hLX. A command like hMj ubh)r}r(hLX``tail -f twistd.log``h[}r(h]]h^]h_]h`]hc]uhMj hg]r hpXtail -f twistd.logr!r"}r#(hLUhMjubahYhubhpX2 is useful to watch the command output as it runs.r$r%}r&(hLX2 is useful to watch the command output as it runs.hMj ubeubh)r'}r((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.r)hMjhThWhYhh[}r*(h]]h^]h_]h`]hc]uheMQhfhhg]r+hpXThe 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.r,r-}r.(hLj)hMj'ubaubht)r/}r0(hLX .. _Shutdown:hMjhThWhYhwh[}r1(h`]h_]h]]h^]hc]hyUshutdownr2uheMVhfhhg]ubeubhN)r3}r4(hLUhQKhMhRhThWh}}r5hj/shYhZh[}r6(h]]r7Xshutdownr8ah^]h_]h`]r9(j2Uid17r:ehc]r;hauheMYhfhh}r<j2j/shg]r=(hi)r>}r?(hLXShutdownr@hMj3hThWhYhmh[}rA(h]]h^]h_]h`]hc]uheMYhfhhg]rBhpXShutdownrCrD}rE(hLj@hMj>ubaubh)rF}rG(hLX2To stop a buildmaster or buildslave manually, use:rHhMj3hThWhYhh[}rI(h]]h^]h_]h`]hc]uheM[hfhhg]rJhpX2To stop a buildmaster or buildslave manually, use:rKrL}rM(hLjHhMjFubaubj)rN}rO(hLX@buildbot stop [ BASEDIR ] # or buildslave stop [ SLAVE_BASEDIR ]hMj3hThWhYjh[}rP(jjXbashjjh`]h_]h]]h^]hc]uheM]hfhhg]rQhpX@buildbot stop [ BASEDIR ] # or buildslave stop [ SLAVE_BASEDIR ]rRrS}rT(hLUhMjNubaubh)rU}rV(hLXbThis simply looks for the :file:`twistd.pid` file and kills whatever process is identified within.hMj3hThWhYhh[}rW(h]]h^]h_]h`]hc]uheMchfhhg]rX(hpXThis simply looks for the rYrZ}r[(hLXThis simply looks for the hMjUubh)r\}r](hLUh[}r^(h`]h_]h]]h^]r_Xfiler`aUrolej`hc]uhMjUhg]rahpX twistd.pidrbrc}rd(hLX twistd.pidhMj\ubahYhubhpX6 file and kills whatever process is identified within.rerf}rg(hLX6 file and kills whatever process is identified within.hMjUubeubh)rh}ri(hLXAt system shutdown, all processes are sent a ``SIGKILL``. The buildmaster and buildslave will respond to this by shutting down normally.hMj3hThWhYhh[}rj(h]]h^]h_]h`]hc]uheMfhfhhg]rk(hpX-At system shutdown, all processes are sent a rlrm}rn(hLX-At system shutdown, all processes are sent a hMjhubh)ro}rp(hLX ``SIGKILL``h[}rq(h]]h^]h_]h`]hc]uhMjhhg]rrhpXSIGKILLrsrt}ru(hLUhMjoubahYhubhpXP. The buildmaster and buildslave will respond to this by shutting down normally.rvrw}rx(hLXP. The buildmaster and buildslave will respond to this by shutting down normally.hMjhubeubh)ry}rz(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:hMj3hThWhYhh[}r{(h]]h^]h_]h`]hc]uheMjhfhhg]r|(hpX"The buildmaster will respond to a r}r~}r(hLX"The buildmaster will respond to a hMjyubh)r}r(hLX ``SIGHUP``h[}r(h]]h^]h_]h`]hc]uhMjyhg]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:hMjyubeubj)r}r(hLXbuildbot reconfig [ BASEDIR ]hMj3hThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMohfhhg]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:hMj3hThWhYhh[}r(h]]h^]h_]h`]hc]uheMshfhhg]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 ]hMj3hThWhYjh[}r(jjXbashjjh`]h_]h]]h^]hc]uheMyhfhhg]rhpXbuildbot restart [ BASEDIR ]rr}r(hLUhMjubaubh)r}r(hLX,Buildslaves can similarly be restarted with:rhMj3hThWhYhh[}r(h]]h^]h_]h`]hc]uheM}hfhhg]rhpX,Buildslaves can similarly be restarted with:rr}r(hLjhMjubaubj)r}r(hLXbuildslave restart [ BASEDIR ]hMj3hThWhYjh[}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.hMj3hThWhYhh[}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]rhpXbuildbot reconfigrr}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.hMj3hThWhYhh[}r(h]]h^]h_]h`]hc]uheMhfhhg]r(h)r}r(hLX``buildbot restart``h[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXbuildbot restartrr}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.rr}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.hMj3hThWhYhh[}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 hMjubj)r}r(hLX:bb:status:`WebStatus`rhMjhThWhYjh[}r(UreftypeXstatusjjX WebStatusU refdomainXbbrh`]h_]U refexplicith]]h^]hc]jjuheMhg]rh)r}r(hLjh[}r(h]]h^]r(jjX bb-statusreh_]h`]hc]uhMjhg]rhpX WebStatusrr}r(hLUhMjubahYhubaubhpX 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.rr}r(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.hMjubeubht)r }r!(hLX.. _Maintenance:hMj3hThWhYhwh[}r"(h`]h_]h]]h^]hc]hyU maintenancer#uheMhfhhg]ubeubhN)r$}r%(hLUhQKhMhRhThWh}}r&h*j shYhZh[}r'(h]]r(X maintenancer)ah^]h_]h`]r*(j#Uid18r+ehc]r,h*auheMhfhh}r-j#j shg]r.(hi)r/}r0(hLX Maintenancer1hMj$hThWhYhmh[}r2(h]]h^]h_]h`]hc]uheMhfhhg]r3hpX Maintenancer4r5}r6(hLj1hMj/ubaubh)r7}r8(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.r9hMj$hThWhYhh[}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>(hLj9hMj7ubaubh)r?}r@(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.rAhMj$hThWhYhh[}rB(h]]h^]h_]h`]hc]uheMhfhhg]rChpXIf 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.rDrE}rF(hLjAhMj?ubaubh)rG}rH(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:hMj$hThWhYhh[}rI(h]]h^]h_]h`]hc]uheMhfhhg]rJ(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 rKrL}rM(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 hMjGubh)rN}rO(hLUh[}rP(h`]h_]h]]h^]rQXfilerRaUrolejRhc]uhMjGhg]rShpX buildbot.tacrTrU}rV(hLX buildbot.tachMjNubahYhubhpX* and other support files alone, for which rWrX}rY(hLX* and other support files alone, for which hMjGubj*)rZ}r[(hLX:command:`find`h[}r\(h]]h^]r]j/ah_]h`]hc]uhMjGhg]r^hpXfindr_r`}ra(hLUhMjZubahYj4ubhpX's rbrc}rd(hLX's hMjGubh)re}rf(hLX ``-mindepth``h[}rg(h]]h^]h_]h`]hc]uhMjGhg]rhhpX -mindepthrirj}rk(hLUhMjeubahYhubhpX_ argument helps skip everything in the top directory. You can use something like the following:rlrm}rn(hLX_ argument helps skip everything in the top directory. You can use something like the following:hMjGubeubj)ro}rp(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 {} \;hMj$hThWhYjh[}rq(jjXnonejjh`]h_]h]]h^]hc]uheMhfhhg]rrhpX@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 {} \;rsrt}ru(hLUhMjoubaubh)rv}rw(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``.hMj$hThWhYhh[}rx(h]]h^]h_]h`]hc]uheMhfhhg]ry(hpXSAlternatively, you can configure a maximum number of old logs to be kept using the rzr{}r|(hLXSAlternatively, you can configure a maximum number of old logs to be kept using the hMjvubh)r}}r~(hLX``--log-count``h[}r(h]]h^]h_]h`]hc]uhMjvhg]rhpX --log-countrr}r(hLUhMj}ubahYhubhpX" command line option when running rr}r(hLX" command line option when running hMjvubh)r}r(hLX``buildslave create-slave``h[}r(h]]h^]h_]h`]hc]uhMjvhg]rhpXbuildslave create-slaverr}r(hLUhMjubahYhubhpX or rr}r(hLX or hMjvubh)r}r(hLX``buildbot create-master``h[}r(h]]h^]h_]h`]hc]uhMjvhg]rhpXbuildbot create-masterrr}r(hLUhMjubahYhubhpX.r}r(hLX.hMjvubeubht)r}r(hLX.. _Troubleshooting:hMj$hThWhYhwh[}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(hr?}r@(hLX< specification (note that Python will do tilde-expansion on hMjubj)rA}rB(hLUh[}rC(h`]h_]h]]h^]hc]j]rD((jX PYTHONPATHrEUindex-7rFUtrG(jX environment variable; PYTHONPATHjFUtrHeuhMjhg]hYjubht)rI}rJ(hLUh[}rK(h]]h^]h_]h`]rLjFahc]uhMjhg]hYhwubj)rM}rN(hLX:envvar:`PYTHONPATH`rOhMjhThWhYjh[}rP(UreftypeXenvvarjjjEU refdomainXstdrQh`]h_]U refexplicith]]h^]hc]jjuheMhg]rRh)rS}rT(hLjOh[}rU(h]]h^]rV(jjQX std-envvarrWeh_]h`]hc]uhMjMhg]rXhpX PYTHONPATHrYrZ}r[(hLUhMjSubahYhubaubhpXH 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[}ra(jjXnonejjh`]h_]h]]h^]hc]uheMhfhhg]rbhpX^@reboot PYTHONPATH=~/lib/python /usr/local/bin/buildbot \ start /usr/home/buildbot/basedirrcrd}re(hLUhMj_ubaubh)rf}rg(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[}rh(h]]h^]h_]h`]hc]uheMhfhhg]ri(hpXTake the time to get the rjrk}rl(hLXTake the time to get the hMjfubh)rm}rn(hLX ``@reboot``h[}ro(h]]h^]h_]h`]hc]uhMjfhg]rphpX@rebootrqrr}rs(hLUhMjmubahYhubhpX 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.rtru}rv(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.hMjfubeubht)rw}rx(hLX".. _Connecting-to-the-buildmaster:hMjhThWhYhwh[}ry(h`]h_]h]]h^]hc]hyUconnecting-to-the-buildmasterrzuheMhfhhg]ubeubhN)r{}r|(hLUhMjhThWh}}r}hjwshYhZh[}r~(h]]h^]h_]h`]r(jzUid21rehc]r(h2heuheMhfhh}rjzjwshg]r(hi)r}r(hLXConnecting to the buildmasterrhMj{hThWhYhmh[}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.hMj{hThWhYhh[}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.hMj{hThWhYhh[}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``: hMj{hThWhYUfootnoterh[}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:hMj{hThWhYhwh[}r(h`]h_]h]]h^]hc]hyUcontrib-scriptsruheMhfhhg]ubeubhN)r}r(hLUhMjhThWh}}rh@jshYhZh[}r(h]]h^]h_]h`]r(jUid22rehc]r(h h@euheMhfhh}rjjshg]r(hi)r}r(hLXContrib ScriptsrhMjhThWhYhmh[}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.hMjhThWhYhh[}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^]rXfileraUrolejhc]uhMjhg]rhpXcontrib/rr}r(hLXcontrib/hMjubahYhubhpXP 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/contribrh[}r(Urefurijh`]h_]h]]h^]hc]uhMjhg]rhpX>http://github.com/buildbot/buildbot/tree/master/master/contribrr}r(hLUhMj ubahYhubhpX.r}r(hLX.hMjubeubht)r}r(hLXA.. _TwistedConch: http://twistedmatrix.com/trac/wiki/TwistedConchhQKhMjhThWhYhwh[}r(j5jWh`]rU twistedconchrah_]h]]h^]hc]rh-auheMhfhhg]ubht)r}r(hLXA.. _TwistedWords: http://twistedmatrix.com/trac/wiki/TwistedWordshQKhMjhThWhYhwh[}r(j5jLh`]rU twistedwordsr ah_]h]]h^]hc]r!hauheMhfhhg]ubht)r"}r#(hLX?.. _TwistedMail: http://twistedmatrix.com/trac/wiki/TwistedMailhQKhMjhThWhYhwh[}r$(j5j6h`]r%U twistedmailr&ah_]h]]h^]hc]r'h)auheMhfhhg]ubht)r(}r)(hLX=.. _TwistedWeb: http://twistedmatrix.com/trac/wiki/TwistedWebhQKhMjhThWhYhwh[}r*(j5jAh`]r+U twistedwebr,ah_]h]]h^]hc]r-h0auheMhfhhg]ubeubeubeubhThWh}}r.hhshYhZh[}r/(h]]r0X requirementsr1ah^]h_]h`]r2(hUid2r3ehc]r4hauheKhfhh}r5hhshg]r6(hi)r7}r8(hLX Requirementsr9hMhOhThWhYhmh[}r:(h]]h^]h_]h`]hc]uheKhfhhg]r;hpX Requirementsr<r=}r>(hLj9hMj7ubaubhhheubhThWhYUsystem_messager?h[}r@(h]]UlevelKh`]h_]rAj3aUsourcehWh^]hc]UlineKUtypeUINFOrBuheKhfhhg]rCh)rD}rE(hLUh[}rF(h]]h^]h_]h`]hc]uhMhJhg]rGhpX/Duplicate implicit target name: "requirements".rHrI}rJ(hLUhMjDubahYhubaubhI)rK}rL(hLUhMjhThWhYj?h[}rM(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuheMhfhhg]rNh)rO}rP(hLUh[}rQ(h]]h^]h_]h`]hc]uhMjKhg]rRhpX:Enumerated list start value not ordinal-1: "2" (ordinal 2)rSrT}rU(hLUhMjOubahYhubaubhI)rV}rW(hLUhMjhThWhYj?h[}rX(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuheMhfhhg]rYh)rZ}r[(hLUh[}r\(h]]h^]h_]h`]hc]uhMjVhg]r]hpX:Enumerated list start value not ordinal-1: "3" (ordinal 3)r^r_}r`(hLUhMjZubahYhubaubhI)ra}rb(hLUhMjhThWhYj?h[}rc(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuheMhfhhg]rdh)re}rf(hLUh[}rg(h]]h^]h_]h`]hc]uhMjahg]rhhpX:Enumerated list start value not ordinal-1: "4" (ordinal 4)rirj}rk(hLUhMjeubahYhubaubhI)rl}rm(hLUhMjhThWhYj?h[}rn(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuheMhfhhg]roh)rp}rq(hLUh[}rr(h]]h^]h_]h`]hc]uhMjlhg]rshpX:Enumerated list start value not ordinal-1: "5" (ordinal 5)rtru}rv(hLUhMjpubahYhubaubhI)rw}rx(hLUhMjhThWhYj?h[}ry(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuheMhfhhg]rzh)r{}r|(hLUh[}r}(h]]h^]h_]h`]hc]uhMjwhg]r~hpX:Enumerated list start value not ordinal-1: "6" (ordinal 6)rr}r(hLUhMj{ubahYhubaubhI)r}r(hLUhMjhThWhYj?h[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuheMhfhhg]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(hLUhMjhThWhYj?h[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuheM#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(hLUhMjhThWhYj?h[}r(h]]UlevelKh`]h_]rjaUsourcehWh^]hc]UlineMUtypejBuheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX9Duplicate implicit target name: "version-specific notes".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMjhThWhYj?h[}r(h]]UlevelKh`]h_]rjaUsourcehWh^]hc]UlineMKUtypejBuheMKhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX+Duplicate implicit target name: "logfiles".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMj3hThWhYj?h[}r(h]]UlevelKh`]h_]rj:aUsourcehWh^]hc]UlineMYUtypejBuheMYhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX+Duplicate implicit target name: "shutdown".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMj$hThWhYj?h[}r(h]]UlevelKh`]h_]rj+aUsourcehWh^]hc]UlineMUtypejBuheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX.Duplicate implicit target name: "maintenance".rr}r(hLUhMjubahYhubaubhI)r}r(hLUhMjhThWhYj?h[}r(h]]UlevelKh`]h_]rjaUsourcehWh^]hc]UlineMUtypejBuheMhfhhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX2Duplicate implicit target name: "troubleshooting".rr}r(hLUhMjubahYhubaubeUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hjhjhj2h j h Nh jih jh jhjhjhjhjhj hj hjhjhjhjzhjhhhjhjbhjrhj}hjhj h jhh!jh"jHh#jh$j h%jEh&jh'jh(jh)j&h*j#h+jh,j h-jh.jh/j h0j,h1jlh2jh3hbh4jzh5jJh6j h7hzh8hh9jh:hh;jhjh?jh@jhAjhBhhCjNhDjuhg]rhRahLUU transformerrNU footnote_refsr}rXf1r]rjasUrefnamesr}r(j]rjaX twistedweb]rj>aX twistedmail]rj1aX twistedwords]rjIaX twistedconch]rjTauUsymbol_footnotesr]rUautofootnote_refsr]rjaUsymbol_footnote_refsr]rU citationsr]rhfhU current_linerNUtransform_messagesr]r(hI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX9Hyperlink target "buildbot-components" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX2Hyperlink target "requirements" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r (h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuhg]r h)r }r (hLUh[}r (h]]h^]h_]h`]hc]uhMjhg]rhpX9Hyperlink target "common-requirements" is not referenced.rr}r(hLUhMj ubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKEUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX>Hyperlink target "buildmaster-requirements" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKuUtypejBuhg]r h)r!}r"(hLUh[}r#(h]]h^]h_]h`]hc]uhMjhg]r$hpX9Hyperlink target "installing-the-code" is not referenced.r%r&}r'(hLUhMj!ubahYhubahYj?ubhI)r(}r)(hLUh[}r*(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuhg]r+h)r,}r-(hLUh[}r.(h]]h^]h_]h`]hc]uhMj(hg]r/hpX-Hyperlink target "index-0" is not referenced.r0r1}r2(hLUhMj,ubahYhubahYj?ubhI)r3}r4(hLUh[}r5(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuhg]r6h)r7}r8(hLUh[}r9(h]]h^]h_]h`]hc]uhMj3hg]r:hpXBHyperlink target "installation-in-a-virtualenv" is not referenced.r;r<}r=(hLUhMj7ubahYhubahYj?ubhI)r>}r?(hLUh[}r@(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuhg]rAh)rB}rC(hLUh[}rD(h]]h^]h_]h`]hc]uhMj>hg]rEhpXFHyperlink target "running-buildbots-tests-optional" is not referenced.rFrG}rH(hLUhMjBubahYhubahYj?ubhI)rI}rJ(hLUh[}rK(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineKUtypejBuhg]rLh)rM}rN(hLUh[}rO(h]]h^]h_]h`]hc]uhMjIhg]rPhpX<Hyperlink target "creating-a-buildmaster" is not referenced.rQrR}rS(hLUhMjMubahYhubahYj?ubhI)rT}rU(hLUh[}rV(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMQUtypejBuhg]rWh)rX}rY(hLUh[}rZ(h]]h^]h_]h`]hc]uhMjThg]r[hpXGHyperlink target "upgrading-an-existing-buildmaster" is not referenced.r\r]}r^(hLUhMjXubahYhubahYj?ubhI)r_}r`(hLUh[}ra(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMsUtypejBuhg]rbh)rc}rd(hLUh[}re(h]]h^]h_]h`]hc]uhMj_hg]rfhpXHHyperlink target "buildmaster-version-specific-notes" is not referenced.rgrh}ri(hLUhMjcubahYhubahYj?ubhI)rj}rk(hLUh[}rl(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rmh)rn}ro(hLUh[}rp(h]]h^]h_]h`]hc]uhMjjhg]rqhpXNHyperlink target "upgrading-a-buildmaster-to-later-version" is not referenced.rrrs}rt(hLUhMjnubahYhubahYj?ubhI)ru}rv(hLUh[}rw(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rxh)ry}rz(hLUh[}r{(h]]h^]h_]h`]hc]uhMjuhg]r|hpX;Hyperlink target "creating-a-buildslave" is not referenced.r}r~}r(hLUhMjyubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineM?UtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX8Hyperlink target "buildslave-options" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXDHyperlink target "other-buildslave-configuration" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXFHyperlink target "upgrading-an-existing-buildslave" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpXGHyperlink target "buildslave-version-specific-notes" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX;Hyperlink target "launching-the-daemons" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-1" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-2" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-3" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX-Hyperlink target "index-4" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMHUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX.Hyperlink target "logfiles" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMVUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX.Hyperlink target "shutdown" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX1Hyperlink target "maintenance" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r (hLUh[}r (h]]h^]h_]h`]hc]uhMjhg]r hpX5Hyperlink target "troubleshooting" is not referenced.r r }r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r(h]]h^]h_]h`]hc]uhMjhg]rhpX=Hyperlink target "starting-the-buildslave" is not referenced.rr}r(hLUhMjubahYhubahYj?ubhI)r}r(hLUh[}r(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rh)r}r(hLUh[}r (h]]h^]h_]h`]hc]uhMjhg]r!hpX-Hyperlink target "index-5" is not referenced.r"r#}r$(hLUhMjubahYhubahYj?ubhI)r%}r&(hLUh[}r'(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]r(h)r)}r*(hLUh[}r+(h]]h^]h_]h`]hc]uhMj%hg]r,hpX-Hyperlink target "index-6" is not referenced.r-r.}r/(hLUhMj)ubahYhubahYj?ubhI)r0}r1(hLUh[}r2(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]r3h)r4}r5(hLUh[}r6(h]]h^]h_]h`]hc]uhMj0hg]r7hpX-Hyperlink target "index-7" is not referenced.r8r9}r:(hLUhMj4ubahYhubahYj?ubhI)r;}r<(hLUh[}r=(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]r>h)r?}r@(hLUh[}rA(h]]h^]h_]h`]hc]uhMj;hg]rBhpXCHyperlink target "connecting-to-the-buildmaster" is not referenced.rCrD}rE(hLUhMj?ubahYhubahYj?ubhI)rF}rG(hLUh[}rH(h]]UlevelKh`]h_]UsourcehWh^]hc]UlineMUtypejBuhg]rIh)rJ}rK(hLUh[}rL(h]]h^]h_]h`]hc]uhMjFhg]rMhpX5Hyperlink target "contrib-scripts" is not referenced.rNrO}rP(hLUhMjJubahYhubahYj?ubeUreporterrQNUid_startrRKU autofootnotesrS]rTjaU citation_refsrU}rVUindirect_targetsrW]rXUsettingsrY(cdocutils.frontend Values rZor[}r\(Ufootnote_backlinksr]KUrecord_dependenciesr^NU rfc_base_urlr_Uhttp://tools.ietf.org/html/r`U tracebackraUpep_referencesrbNUstrip_commentsrcNU toc_backlinksrdUentryreU language_coderfUenrgU datestamprhNU report_levelriKU _destinationrjNU halt_levelrkKU strip_classesrlNhmNUerror_encoding_error_handlerrmUbackslashreplacernUdebugroNUembed_stylesheetrpUoutput_encoding_error_handlerrqUstrictrrU sectnum_xformrsKUdump_transformsrtNU docinfo_xformruKUwarning_streamrvNUpep_file_url_templaterwUpep-%04drxUexit_status_levelryKUconfigrzNUstrict_visitorr{NUcloak_email_addressesr|Utrim_footnote_reference_spacer}Uenvr~NUdump_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.8/master/docs/manual/installation.rstrUgettext_compactrU generatorrNUdump_internalsrNU smart_quotesrU pep_base_urlrUhttp://www.python.org/dev/peps/rUsyntax_highlightrUlongrUinput_encoding_error_handlerrjrUauto_id_prefixrUidrUdoctitle_xformrUstrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(jjj j j jjjjjjjjhjjjjjjhzh{jjj j jjj j jRjKjjj&j!jjjjjjjzj{jjjjjjjjjhjhj3hOhhj}hhh{jjjjj(j+jFjIjjj"j%jdjgj j!jihjljmj j hbhRjjjjj jhhj j j[ jb jjj2j3jjj j j j jrjmjjjNjIjjj#j$j:j3j+j$jjjjj8 j? jjj j j j jjj jjjhhOj j& jHjIjEjAjjj&j"jzjvj,j(jbj^jJjKjjjj{jjjjjhjduUsubstitution_namesr}rhYhfh[}r(h]]h`]h_]UsourcehWh^]hc]uU footnotesr]rUrefidsr}r(j]rjaj]rjaj]rjaj]rjaj]rjaj2]rj/aj]rjajz]rjwah]rhaj}]rhaj#]rj ajH]rjEaj]rjaj]rhaj ]rjajl]rjiaj]rjajJ]rjGaj ]rj ahz]rhuaj]rjaj]rjaj ]rj ah]rhaj]rjauub.PKJtD52buildbot-v0.8.8/.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.8/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.8/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]Ufile_insertion_enabledqU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startrKUidsr}r(h(hh1huUsubstitution_namesr}rhh*h }r(h$]h"]h#]Usourcehh%]h&]uU footnotesr]rUrefidsr}r h(]r hasub.PKJtD;z;z7buildbot-v0.8.8/.doctrees/manual/cfg-properties.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xinterpolate-dictstyleqXwithpropertiesqXsource-stamp-attributesqXcommon-build-propertiesq X interpolateq Xwithproperties-dictstyleq Xcustom renderablesq NXsource stamp attributesq NXrendererqXcommon build propertiesqNXusing properties in stepsqNXpropertyqX propertiesquUsubstitution_defsq}qUparse_messagesq]q(cdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhhUsourceq cdocutils.nodes reprunicode q!XV/var/build/user_builds/buildbot/checkouts/v0.8.8/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-(Uidsq.]Ubackrefsq/]Udupnamesq0]Uclassesq1]Unamesq2]Urefidq3U propertiesq4uUlineq5KUdocumentq6hUexpect_referenced_by_idq7}q8Uindex-0q9h')q:}q;(hUhhh h#h*h+h,}q<(h.]h/]h0]h1]h2]h3h9uh5Kh6hUchildrenq=]ubsh=]ubsh*Usectionq>h,}q?(h0]q@X propertiesqAah1]h/]h.]qB(h4h9Uid1qCeh2]qDhauh5Kh6hh7}qE(h9h:h4h(uh=]qF(cdocutils.nodes title qG)qH}qI(hX PropertiesqJhhh h#h*UtitleqKh,}qL(h0]h1]h/]h.]h2]uh5Kh6hh=]qMcdocutils.nodes Text qNX PropertiesqOqP}qQ(hhJhhHubaubcdocutils.nodes paragraph qR)qS}qT(hXBuild properties are a generalized way to provide configuration information to build steps; see :ref:`Build-Properties` for the conceptual overview of properties.hhh h#h*U paragraphqUh,}qV(h0]h1]h/]h.]h2]uh5Kh6hh=]qW(hNX`Build properties are a generalized way to provide configuration information to build steps; see qXqY}qZ(hX`Build properties are a generalized way to provide configuration information to build steps; see hhSubcsphinx.addnodes pending_xref q[)q\}q](hX:ref:`Build-Properties`q^hhSh h#h*U pending_xrefq_h,}q`(UreftypeXrefUrefwarnqaU reftargetqbXbuild-propertiesU refdomainXstdqch.]h/]U refexplicith0]h1]h2]UrefdocqdXmanual/cfg-propertiesqeuh5Kh=]qfcdocutils.nodes emphasis qg)qh}qi(hh^h,}qj(h0]h1]qk(UxrefqlhcXstd-refqmeh/]h.]h2]uhh\h=]qnhNXBuild-Propertiesqoqp}qq(hUhhhubah*UemphasisqrubaubhNX+ for the conceptual overview of properties.qsqt}qu(hX+ for the conceptual overview of properties.hhSubeubhR)qv}qw(hXSome 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:qxhhh h#h*hUh,}qy(h0]h1]h/]h.]h2]uh5K h6hh=]qzhNXSome 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:q{q|}q}(hhxhhvubaubcdocutils.nodes bullet_list q~)q}q(hUhhh h#h*U bullet_listqh,}q(UbulletqX*h.]h/]h0]h1]h2]uh5Kh6hh=]q(cdocutils.nodes list_item q)q}q(hXT:bb:cfg:`global configuration ` -- These properties apply to all builds.hhh h#h*U list_itemqh,}q(h0]h1]h/]h.]h2]uh5Nh6hh=]qhR)q}q(hXT:bb:cfg:`global configuration ` -- These properties apply to all builds.hhh h#h*hUh,}q(h0]h1]h/]h.]h2]uh5Kh=]q(h[)q}q(hX+:bb:cfg:`global configuration `qhhh h#h*h_h,}q(UreftypeXcfghahbX propertiesU refdomainXbbqh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]qcdocutils.nodes literal q)q}q(hhh,}q(h0]h1]q(hlhXbb-cfgqeh/]h.]h2]uhhh=]qhNXglobal configurationqq}q(hUhhubah*UliteralqubaubhNX) -- These properties apply to all builds.qq}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(h0]h1]h/]h.]h2]uh5Nh6hh=]qhR)q}q(hX:ref:`schedulers ` -- A scheduler can specify properties that become available to all builds it starts.hhh h#h*hUh,}q(h0]h1]h/]h.]h2]uh5Kh=]q(h[)q}q(hX*:ref:`schedulers `qhhh h#h*h_h,}q(UreftypeXrefhahbXconfiguring-schedulersU refdomainXstdqh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]qhg)q}q(hhh,}q(h0]h1]q(hlhXstd-refqeh/]h.]h2]uhhh=]qhNX schedulersqq}q(hUhhubah*hrubaubhNXU -- A scheduler can specify properties that become available to all builds it starts.qq}q(hXU -- A scheduler can specify properties that become available to all builds it starts.hhubeubaubh)q}q(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,}q(h0]h1]h/]h.]h2]uh5Nh6hh=]qhR)q}q(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*hUh,}q(h0]h1]h/]h.]h2]uh5Kh=]q(h[)q}q(hX:ref:`changes `qhhh h#h*h_h,}q(UreftypeXrefhahbXchange-sourcesU refdomainXstdqh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]qhg)q}q(hhh,}q(h0]h1]q(hlhXstd-refqeh/]h.]h2]uhhh=]qhNXchangesqхq}q(hUhhubah*hrubaubhNX -- A change can have properties attached to it, supplying extra information gathered by the change source. This is most commonly used with the qԅq}q(hX -- A change can have properties attached to it, supplying extra information gathered by the change source. This is most commonly used with the hhubh[)q}q(hX:bb:cmdline:`sendchange`qhhh h#h*h_h,}q(UreftypeXcmdlinehahbX sendchangeU refdomainXbbqh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]qh)q}q(hhh,}q(h0]h1]q(hlhX bb-cmdlineqeh/]h.]h2]uhhh=]qhNX sendchangeqㅁq}q(hUhhubah*hubaubhNX command.q慁q}q(hX command.hhubeubaubh)q}q(hXc:bb:status:`forced builds ` -- The "Force Build" form allows users to specify propertieshhh h#h*hh,}q(h0]h1]h/]h.]h2]uh5Nh6hh=]qhR)q}q(hXc:bb:status:`forced builds ` -- The "Force Build" form allows users to specify propertieshhh h#h*hUh,}q(h0]h1]h/]h.]h2]uh5Kh=]q(h[)q}q(hX&:bb:status:`forced builds `qhhh h#h*h_h,}q(UreftypeXstatushahbX WebStatusU refdomainXbbqh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]qh)q}q(hhh,}q(h0]h1]q(hlhX bb-statusqeh/]h.]h2]uhhh=]qhNX forced buildsqq}q(hUhhubah*hubaubhNX= -- The "Force Build" form allows users to specify propertiesrr}r(hX= -- The "Force Build" form allows users to specify propertieshhubeubaubh)r}r(hX`:bb:cfg:`buildslaves ` -- A buildslave can pass properties on to the builds it performs.hhh h#h*hh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]rhR)r}r(hX`:bb:cfg:`buildslaves ` -- A buildslave can pass properties on to the builds it performs.hjh h#h*hUh,}r (h0]h1]h/]h.]h2]uh5Kh=]r (h[)r }r (hX:bb:cfg:`buildslaves `r hjh h#h*h_h,}r(UreftypeXcfghahbXslavesU refdomainXbbrh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]rh)r}r(hj h,}r(h0]h1]r(hljXbb-cfgreh/]h.]h2]uhj h=]rhNX buildslavesrr}r(hUhjubah*hubaubhNXB -- A buildslave can pass properties on to the builds it performs.rr}r(hXB -- A buildslave can pass properties on to the builds it performs.hjubeubaubh)r}r(hXg:ref:`builds ` -- A build automatically sets a number of properties on itself.hhh h#h*hh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]r hR)r!}r"(hXg:ref:`builds ` -- A build automatically sets a number of properties on itself.hjh h#h*hUh,}r#(h0]h1]h/]h.]h2]uh5Kh=]r$(h[)r%}r&(hX':ref:`builds `r'hj!h h#h*h_h,}r((UreftypeXrefhahbXcommon-build-propertiesU refdomainXstdr)h.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]r*hg)r+}r,(hj'h,}r-(h0]h1]r.(hlj)Xstd-refr/eh/]h.]h2]uhj%h=]r0hNXbuildsr1r2}r3(hUhj+ubah*hrubaubhNX@ -- A build automatically sets a number of properties on itself.r4r5}r6(hX@ -- A build automatically sets a number of properties on itself.hj!ubeubaubh)r7}r8(hXX:bb:cfg:`builders ` -- A builder can set properties on all the builds it runs.hhh h#h*hh,}r9(h0]h1]h/]h.]h2]uh5Nh6hh=]r:hR)r;}r<(hXX:bb:cfg:`builders ` -- A builder can set properties on all the builds it runs.hj7h h#h*hUh,}r=(h0]h1]h/]h.]h2]uh5Kh=]r>(h[)r?}r@(hX:bb:cfg:`builders `rAhj;h h#h*h_h,}rB(UreftypeXcfghahbXbuildersU refdomainXbbrCh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]rDh)rE}rF(hjAh,}rG(h0]h1]rH(hljCXbb-cfgrIeh/]h.]h2]uhj?h=]rJhNXbuildersrKrL}rM(hUhjEubah*hubaubhNX; -- A builder can set properties on all the builds it runs.rNrO}rP(hX; -- A builder can set properties on all the builds it runs.hj;ubeubaubh)rQ}rR(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,}rS(h0]h1]h/]h.]h2]uh5Nh6hh=]rThR)rU}rV(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.hjQh h#h*hUh,}rW(h0]h1]h/]h.]h2]uh5Kh=]rX(h[)rY}rZ(hX:ref:`steps `r[hjUh h#h*h_h,}r\(UreftypeXrefhahbX build-stepsU refdomainXstdr]h.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]r^hg)r_}r`(hj[h,}ra(h0]h1]rb(hlj]Xstd-refrceh/]h.]h2]uhjYh=]rdhNXstepsrerf}rg(hUhj_ubah*hrubaubhNXx -- The steps of a build can set properties that are available to subsequent steps. In particular, source steps set the rhri}rj(hXx -- The steps of a build can set properties that are available to subsequent steps. In particular, source steps set the hjUubcdocutils.nodes title_reference rk)rl}rm(hX`got_revision`h,}rn(h0]h1]h/]h.]h2]uhjUh=]rohNX got_revisionrprq}rr(hUhjlubah*Utitle_referencersubhNX property.rtru}rv(hX property.hjUubeubaubeubhR)rw}rx(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.ryhhh h#h*hUh,}rz(h0]h1]h/]h.]h2]uh5K"h6hh=]r{hNXIf 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.r|r}}r~(hjyhjwubaubhR)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*hUh,}r(h0]h1]h/]h.]h2]uh5K&h6hh=]rhNXProperties 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(h.]h/]h0]h1]h2]Uentriesr]r(UsinglerXProperties; Common PropertiesUindex-1rUtraUinlineruh5K)h6hh=]ubh')r}r(hUhhh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5K*h6hh=]ubh')r}r(hX.. _Common-Build-Properties:hhh h#h%}h*h+h,}r(h.]h/]h0]h1]h2]h3Ucommon-build-propertiesruh5K+h6hh7}rjjsh=]ubh)r}r(hUhhh h#h%}rh jsh*h>h,}r(h0]h1]h/]h.]r(jjUid2reh2]r(hh euh5K.h6hh7}r(jjjjuh=]r(hG)r}r(hXCommon Build Propertiesrhjh h#h*hKh,}r(h0]h1]h/]h.]h2]uh5K.h6hh=]rhNXCommon Build Propertiesrr}r(hjhjubaubhR)r}r(hXaThe following build properties are set when the build is started, and are available to all steps.rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5K0h6hh=]rhNXaThe 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(h.]h/]h0]h1]h2]j]r(jXProperties; got_revisionUindex-2rUtrajuh5K3h6hh=]ubh')r}r(hUhjh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5K4h6hh=]ubcdocutils.nodes definition_list r)r}r(hUhjh h#h%}h*Udefinition_listrh,}r(h0]h1]h/]h.]rjah2]uh5Nh6hh7}rjjsh=]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(h0]h1]h/]h.]h2]uh5K>h=]r(cdocutils.nodes term r)r}r(hX``got_revision``rhjh h#h*Utermrh,}r(h0]h1]h/]h.]h2]uh5K>h=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNX got_revisionrr}r(hUhjubah*hubaubcdocutils.nodes definition r)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]r(hR)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.hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5K6h=]r(hNXThis property is set when a rr}r(hXThis property is set when a hjubh[)r}r(hX:class:`Source`rhjh h#h*h_h,}r(UreftypeXclasshahbXSourceU refdomainXpyrh.]h/]U refexplicith0]h1]h2]hdheUpy:classrNU py:modulerNuh5K6h=]rh)r}r(hjh,}r(h0]h1]r(hljXpy-classreh/]h.]h2]uhjh=]rhNXSourcerr}r(hUhjubah*hubaubhNX 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 rr}r(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 hjubh)r}r(hX ``revision``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXrevisionrr}r(hUhjubah*hubhNX., except for non-absolute sourcestamps, where rr}r(hX., except for non-absolute sourcestamps, where hjubh)r}r(hX``got_revision``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX got_revisionrr}r(hUhjubah*hubhNX} indicates what revision was current when the checkout was performed. This can be used to rebuild the same source code later.r r }r (hX} indicates what revision was current when the checkout was performed. This can be used to rebuild the same source code later.hjubeubcdocutils.nodes note r )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.h,}r(h0]h1]h/]h.]h2]uhjh=]rhR)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.rhj h h#h*hUh,}r(h0]h1]h/]h.]h2]uh5K:h=]rhNXFor some VC systems (Darcs in particular), the revision is a large string containing newlines, and is not suitable for interpolation into a filename.rr}r(hjhjubaubah*UnoterubhR)r}r(hXuFor multi-codebase builds (where codebase is not the default `''`), this property is a dictionary, keyed by codebase.hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5K>h=]r(hNX=For multi-codebase builds (where codebase is not the default rr}r (hX=For multi-codebase builds (where codebase is not the default hjubjk)r!}r"(hX`''`h,}r#(h0]h1]h/]h.]h2]uhjh=]r$hNX''r%r&}r'(hUhj!ubah*jsubhNX4), this property is a dictionary, keyed by codebase.r(r)}r*(hX4), this property is a dictionary, keyed by codebase.hjubeubeh*U definitionr+ubeubaubj)r,}r-(hUhjh h#h*jh,}r.(h.]h/]h0]h1]h2]j]r/(jXProperties; buildernameUindex-3r0Utr1ajuh5K@h6hh=]ubh')r2}r3(hUhjh h#h*h+h,}r4(h.]h/]h0]h1]h2]h3j0uh5KAh6hh=]ubj)r5}r6(hUhjh h#h%}h*jh,}r7(h0]h1]h/]h.]r8j0ah2]uh5Nh6hh7}r9j0j2sh=]r:j)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. hj5h h#h*jh,}r=(h0]h1]h/]h.]h2]uh5KEh=]r>(j)r?}r@(hX``buildername``rAhj;h h#h*jh,}rB(h0]h1]h/]h.]h2]uh5KEh=]rCh)rD}rE(hjAh,}rF(h0]h1]h/]h.]h2]uhj?h=]rGhNX buildernamerHrI}rJ(hUhjDubah*hubaubj)rK}rL(hUh,}rM(h0]h1]h/]h.]h2]uhj;h=]rNhR)rO}rP(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.hjKh h#h*hUh,}rQ(h0]h1]h/]h.]h2]uh5KCh=]rR(hNX&This is a string that indicates which rSrT}rU(hX&This is a string that indicates which hjOubh[)rV}rW(hX:class:`Builder`rXhjOh h#h*h_h,}rY(UreftypeXclasshahbXBuilderU refdomainXpyrZh.]h/]U refexplicith0]h1]h2]hdhejNjNuh5KCh=]r[h)r\}r](hjXh,}r^(h0]h1]r_(hljZXpy-classr`eh/]h.]h2]uhjVh=]rahNXBuilderrbrc}rd(hUhj\ubah*hubaubhNXc the build was a part of. The combination of buildername and buildnumber uniquely identify a build.rerf}rg(hXc the build was a part of. The combination of buildername and buildnumber uniquely identify a build.hjOubeubah*j+ubeubaubj)rh}ri(hUhjh h#h*jh,}rj(h.]h/]h0]h1]h2]j]rk(jXProperties; buildnumberUindex-4rlUtrmajuh5KGh6hh=]ubh')rn}ro(hUhjh h#h*h+h,}rp(h.]h/]h0]h1]h2]h3jluh5KHh6hh=]ubj)rq}rr(hUhjh h#h%}h*jh,}rs(h0]h1]h/]h.]rtjlah2]uh5Nh6hh7}rujljnsh=]rvj)rw}rx(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. hjqh h#h*jh,}ry(h0]h1]h/]h.]h2]uh5KLh=]rz(j)r{}r|(hX``buildnumber``r}hjwh h#h*jh,}r~(h0]h1]h/]h.]h2]uh5KLh=]rh)r}r(hj}h,}r(h0]h1]h/]h.]h2]uhj{h=]rhNX buildnumberrr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjwh=]rhR)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*hUh,}r(h0]h1]h/]h.]h2]uh5KJh=]r(hNX(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*h_h,}r(UreftypeXclasshahbXBuilderU refdomainXpyrh.]h/]U refexplicith0]h1]h2]hdhejNjNuh5KJh=]rh)r}r(hjh,}r(h0]h1]r(hljXpy-classreh/]h.]h2]uhjh=]rhNXBuilderrr}r(hUhjubah*hubaubhNX, (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*h_h,}r(UreftypeXclasshahbXBuilderU refdomainXpyrh.]h/]U refexplicith0]h1]h2]hdhejNjNuh5KJh=]rh)r}r(hjh,}r(h0]h1]r(hljXpy-classreh/]h.]h2]uhjh=]rhNXBuilderrr}r(hUhjubah*hubaubhNXS 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*j+ubeubaubj)r}r(hUhjh h#h*jh,}r(h.]h/]h0]h1]h2]j]r(jXProperties; slavenameUindex-5rUtrajuh5KNh6hh=]ubh')r}r(hUhjh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5KOh6hh=]ubj)r}r(hUhjh h#h%}h*jh,}r(h0]h1]h/]h.]rjah2]uh5Nh6hh7}rjjsh=]rj)r}r(hXZ``slavename`` This is a string which identifies which buildslave the build is running on. hjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5KRh=]r(j)r}r(hX ``slavename``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5KRh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNX slavenamerr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]rhR)r}r(hXKThis is a string which identifies which buildslave the build is running on.rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5KQh=]rhNXKThis is a string which identifies which buildslave the build is running on.rr}r(hjhjubaubah*j+ubeubaubj)r}r(hUhjh h#h*jh,}r(h.]h/]h0]h1]h2]j]r(jXProperties; schedulerUindex-6rUtrajuh5KTh6hh=]ubh')r}r(hUhjh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5KUh6hh=]ubj)r}r(hUhjh h#h%}h*jh,}r(h0]h1]h/]h.]rjah2]uh5Nh6hh7}rjjsh=]r(j)r}r(hXv``scheduler`` If the build was started from a scheduler, then this property will contain the name of that scheduler. hjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5KYh=]r(j)r}r(hX ``scheduler``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5KYh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNX schedulerrr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]rhR)r}r(hXfIf the build was started from a scheduler, then this property will contain the name of that scheduler.rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5KWh=]rhNXfIf the build was started from a scheduler, then this property will contain the name of that scheduler.r r }r (hjhjubaubah*j+ubeubj)r }r (hXb``workdir`` The absolute path of the base working directory on the slave, of the current builder. hjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5K]h6hh=]r(j)r}r(hX ``workdir``rhj h h#h*jh,}r(h0]h1]h/]h.]h2]uh5K]h=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNXworkdirrr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhj h=]rhR)r }r!(hXUThe absolute path of the base working directory on the slave, of the current builder.r"hjh h#h*hUh,}r#(h0]h1]h/]h.]h2]uh5K\h=]r$hNXUThe absolute path of the base working directory on the slave, of the current builder.r%r&}r'(hj"hj ubaubah*j+ubeubeubj)r(}r)(hUhjh h#h*jh,}r*(h.]h/]h0]h1]h2]j]r+(jXProperties; workdirUindex-7r,Utr-ajuh5K_h6hh=]ubh')r.}r/(hUhjh h#h*h+h,}r0(h.]h/]h0]h1]h2]h3j,uh5K`h6hh=]ubhR)r1}r2(hXFor single codebase builds, where the codebase is `''`, the following :ref:`Source-Stamp-Attributes` are also available as properties: ``branch``, ``revision``, ``repository``, and ``project`` .r3hjh h#h%}h*hUh,}r4(h0]h1]h/]h.]r5j,ah2]uh5Kah6hh7}r6j,j.sh=]r7(hNX2For single codebase builds, where the codebase is r8r9}r:(hX2For single codebase builds, where the codebase is hj1ubjk)r;}r<(hX`''`h,}r=(h0]h1]h/]h.]h2]uhj1h=]r>hNX''r?r@}rA(hUhj;ubah*jsubhNX, the following rBrC}rD(hX, the following hj1ubh[)rE}rF(hX:ref:`Source-Stamp-Attributes`rGhj1h h#h*h_h,}rH(UreftypeXrefhahbXsource-stamp-attributesU refdomainXstdrIh.]h/]U refexplicith0]h1]h2]hdheuh5Kah=]rJhg)rK}rL(hjGh,}rM(h0]h1]rN(hljIXstd-refrOeh/]h.]h2]uhjEh=]rPhNXSource-Stamp-AttributesrQrR}rS(hUhjKubah*hrubaubhNX# are also available as properties: rTrU}rV(hX# are also available as properties: hj1ubh)rW}rX(hX ``branch``h,}rY(h0]h1]h/]h.]h2]uhj1h=]rZhNXbranchr[r\}r](hUhjWubah*hubhNX, r^r_}r`(hX, hj1ubh)ra}rb(hX ``revision``h,}rc(h0]h1]h/]h.]h2]uhj1h=]rdhNXrevisionrerf}rg(hUhjaubah*hubhNX, rhri}rj(hX, hj1ubh)rk}rl(hX``repository``h,}rm(h0]h1]h/]h.]h2]uhj1h=]rnhNX repositoryrorp}rq(hUhjkubah*hubhNX, and rrrs}rt(hX, and hj1ubh)ru}rv(hX ``project``h,}rw(h0]h1]h/]h.]h2]uhj1h=]rxhNXprojectryrz}r{(hUhjuubah*hubhNX .r|r}}r~(hX .hj1ubeubh')r}r(hX.. _Source-Stamp-Attributes:hjh h#h*h+h,}r(h.]h/]h0]h1]h2]h3Usource-stamp-attributesruh5Kch6hh=]ubeubh)r}r(hUhhh h#h%}rhjsh*h>h,}r(h0]h1]h/]h.]r(jUid3reh2]r(h heuh5Kfh6hh7}rjjsh=]r(hG)r}r(hXSource Stamp Attributesrhjh h#h*hKh,}r(h0]h1]h/]h.]h2]uh5Kfh6hh=]rhNXSource Stamp Attributesrr}r(hjhjubaubj)r}r(hUhjh h#h*jh,}r(h.]h/]h0]h1]h2]j]r(jXProperties; branchUindex-8rUtrajuh5Khh6hh=]ubh')r}r(hUhjh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5Kih6hh=]ubhR)r}r(hX?``branch`` ``revision`` ``repository`` ``project`` ``codebase``hjh h#h%}h*hUh,}r(h0]h1]h/]h.]rjah2]uh5Kjh6hh7}rjjsh=]r(h)r}r(hX ``branch``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXbranchrr}r(hUhjubah*hubhNX r}r(hX hjubh)r}r(hX ``revision``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXrevisionrr}r(hUhjubah*hubhNX r}r(hX hjubh)r}r(hX``repository``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX repositoryrr}r(hUhjubah*hubhNX r}r(hX hjubh)r}r(hX ``project``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXprojectrr}r(hUhjubah*hubhNX r}r(hX hjubh)r}r(hX ``codebase``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXcodebaserr}r(hUhjubah*hubeubcdocutils.nodes block_quote r)r}r(hUhjh h#h*U block_quoterh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]rhR)r}r(hX<For details of these attributes see :doc:`/manual/concepts`.hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kph=]r(hNX$For details of these attributes see rr}r(hX$For details of these attributes see hjubh[)r}r(hX:doc:`/manual/concepts`rhjh h#h*h_h,}r(UreftypeXdocrhahbX/manual/conceptsU refdomainUh.]h/]U refexplicith0]h1]h2]hdheuh5Kph=]rh)r}r(hjh,}r(h0]h1]r(hljeh/]h.]h2]uhjh=]rhNX/manual/conceptsrr}r(hUhjubah*hubaubhNX.r}r(hX.hjubeubaubhR)r}r(hX ``changes``rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Krh6hh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNXchangesrr}r(hUhjubah*hubaubj)r}r(hUhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]rhR)r}r(hX`This attribute is a list of dictionaries reperesnting the changes that make up this sourcestamp.rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kth=]rhNX`This attribute is a list of dictionaries reperesnting the changes that make up this sourcestamp.rr}r(hjhjubaubaubhR)r}r(hX```has_patch`` ``patch_level`` ``patch_body`` ``patch_subdir`` ``patch_author`` ``patch_comment``hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kvh6hh=]r(h)r}r(hX ``has_patch``h,}r (h0]h1]h/]h.]h2]uhjh=]r hNX has_patchr r }r (hUhjubah*hubhNX r}r(hX hjubh)r}r(hX``patch_level``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX patch_levelrr}r(hUhjubah*hubhNX r}r(hX hjubh)r}r(hX``patch_body``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX patch_bodyrr}r(hUhjubah*hubhNX r }r!(hX hjubh)r"}r#(hX``patch_subdir``h,}r$(h0]h1]h/]h.]h2]uhjh=]r%hNX patch_subdirr&r'}r((hUhj"ubah*hubhNX r)}r*(hX hjubh)r+}r,(hX``patch_author``h,}r-(h0]h1]h/]h.]h2]uhjh=]r.hNX patch_authorr/r0}r1(hUhj+ubah*hubhNX r2}r3(hX hjubh)r4}r5(hX``patch_comment``h,}r6(h0]h1]h/]h.]h2]uhjh=]r7hNX patch_commentr8r9}r:(hUhj4ubah*hubeubj)r;}r<(hUhjh h#h*jh,}r=(h0]h1]h/]h.]h2]uh5Nh6hh=]r>hR)r?}r@(hXcThese attributes are set if the source stamp was created by a :ref:`try scheduler`.hj;h h#h*hUh,}rA(h0]h1]h/]h.]h2]uh5K}h=]rB(hNX>These attributes are set if the source stamp was created by a rCrD}rE(hX>These attributes are set if the source stamp was created by a hj?ubh[)rF}rG(hX$:ref:`try scheduler`rHhj?h h#h*h_h,}rI(UreftypeXrefhahbXtry-schedulersU refdomainXstdrJh.]h/]U refexplicith0]h1]h2]hdheuh5K}h=]rKhg)rL}rM(hjHh,}rN(h0]h1]rO(hljJXstd-refrPeh/]h.]h2]uhjFh=]rQhNX try schedulerrRrS}rT(hUhjLubah*hrubaubhNX.rU}rV(hX.hj?ubeubaubeubh)rW}rX(hUhhh h#h*h>h,}rY(h0]h1]h/]h.]rZUusing-properties-in-stepsr[ah2]r\hauh5Kh6hh=]r](hG)r^}r_(hXUsing Properties in Stepsr`hjWh h#h*hKh,}ra(h0]h1]h/]h.]h2]uh5Kh6hh=]rbhNXUsing Properties in Stepsrcrd}re(hj`hj^ubaubhR)rf}rg(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.hjWh h#h*hUh,}rh(h0]h1]h/]h.]h2]uh5Kh6hh=]ri(hNXFor 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 rjrk}rl(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 hjfubh)rm}rn(hX``master.cfg``h,}ro(h0]h1]h/]h.]h2]uhjfh=]rphNX master.cfgrqrr}rs(hUhjmubah*hubhNX with placeholders. When the step is executed, these placeholders will be replaced using the current values of the build properties.rtru}rv(hX with placeholders. When the step is executed, these placeholders will be replaced using the current values of the build properties.hjfubeubj )rw}rx(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.hjWh h#h*jh,}ry(h0]h1]h/]h.]h2]uh5Nh6hh=]rz(hR)r{}r|(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::hjwh h#h*hUh,}r}(h0]h1]h/]h.]h2]uh5Kh=]r~hNXProperties 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:rr}r(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:hj{ubaubcdocutils.nodes literal_block r)r}r(hX;if Property('release_train') == 'alpha': f.addStep(...)hjwh*U literal_blockrh,}r(U xml:spacerUpreserverh.]h/]h0]h1]h2]uh5Kh=]rhNX;if Property('release_train') == 'alpha': f.addStep(...)rr}r(hUhjubaubhR)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.hjwh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh=]r(hNXOThis 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(h0]h1]h/]h.]h2]uhjh=]rhNXifrr}r(hUhjubah*hubhNX 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.hjubeubeubhR)r}r(hXzYou can use build properties in most step parameters. Please file bugs for any parameters which do not accept properties.rhjWh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]rhNXzYou can use build properties in most step parameters. Please file bugs for any parameters which do not accept properties.rr}r(hjhjubaubj)r}r(hUhjWh h#h*jh,}r(h.]h/]h0]h1]h2]j]r(jXProperties; PropertyUindex-9rUtrajuh5Kh6hh=]ubh')r}r(hUhjWh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5Kh6hh=]ubh')r}r(hX .. _Property:hjWh h#h%}h*h+h,}r(h.]h/]h0]h1]h2]h3Upropertyruh5Kh6hh7}rjjsh=]ubh)r}r(hUhKhjWh h#h%}rhjsh*h>h,}r(h0]rXpropertyrah1]h/]h.]r(jjUid4reh2]rhauh5Kh6hh7}r(jjjjuh=]r(hG)r}r(hXPropertyrhjh h#h*hKh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]rhNXPropertyrr}r(hjhjubaubhR)r}r(hXUThe simplest form of annotation is to wrap the property name with :class:`Property`::hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(hNXBThe 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*h_h,}r(UreftypeXclasshahbXPropertyU refdomainXpyrh.]h/]U refexplicith0]h1]h2]hdhejNjNuh5Kh=]rh)r}r(hjh,}r(h0]h1]r(hljXpy-classreh/]h.]h2]uhjh=]rhNXPropertyrr}r(hUhjubah*hubaubhNX:r}r(hX:hjubeubj)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*jh,}r(jjh.]h/]h0]h1]h2]uh5Kh6hh=]rhNXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import Property f.addStep(ShellCommand(command=[ 'echo', 'buildername:', Property('buildername') ]))rr}r(hUhjubaubhR)r}r(hXKYou can specify a default value by passing a ``default`` keyword argument::rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(hNX-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(h0]h1]h/]h.]h2]uhjh=]rhNXdefaultrr}r(hUhjubah*hubhNX keyword argument:rr}r(hX keyword argument:hjubeubj)r}r(hXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none') ]))hjh h#h*jh,}r(jjh.]h/]h0]h1]h2]uh5Kh6hh=]rhNXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none') ]))rr}r(hUhjubaubhR)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*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(hNXlThe 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(h0]h1]h/]h.]h2]uhjh=]r hNXFalser r }r (hUhjubah*hubhNX. The r r}r(hX. The hjubh)r}r(hX``defaultWhenFalse``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXdefaultWhenFalserr}r(hUhjubah*hubhNX argument can be set to rr}r(hX argument can be set to hjubh)r}r(hX ``False``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXFalserr}r (hUhjubah*hubhNXP to force buildbot to use the default argument only if the parameter is not set:r!r"}r#(hXP to force buildbot to use the default argument only if the parameter is not set:hjubeubj)r$}r%(hXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none', defaultWhenFalse=False) ]))hjh h#h*jh,}r&(jjh.]h/]h0]h1]h2]uh5Kh6hh=]r'hNXf.addStep(ShellCommand(command=[ 'echo', 'warnings:', Property('warnings', default='none', defaultWhenFalse=False) ]))r(r)}r*(hUhj$ubaubhR)r+}r,(hX:The default value can reference other properties, e.g., ::r-hjh h#h*hUh,}r.(h0]h1]h/]h.]h2]uh5Kh6hh=]r/hNX7The default value can reference other properties, e.g.,r0r1}r2(hX7The default value can reference other properties, e.g.,hj+ubaubj)r3}r4(hX@command=Property('command', default=Property('default-command'))hjh h#h*jh,}r5(jjh.]h/]h0]h1]h2]uh5Kh6hh=]r6hNX@command=Property('command', default=Property('default-command'))r7r8}r9(hUhj3ubaubj)r:}r;(hUhjh h#h*jh,}r<(h.]h/]h0]h1]h2]j]r=(jXProperties; InterpolateUindex-10r>Utr?ajuh5Kh6hh=]ubh')r@}rA(hUhjh h#h*h+h,}rB(h.]h/]h0]h1]h2]h3j>uh5Kh6hh=]ubh')rC}rD(hX.. _Interpolate:hjh h#h%}h*h+h,}rE(h.]h/]h0]h1]h2]h3U interpolaterFuh5Kh6hh7}rGj>j@sh=]ubeubh)rH}rI(hUhKhjWh h#h%}rJh jCsh*h>h,}rK(h0]rLX interpolaterMah1]h/]h.]rN(jFj>Uid5rOeh2]rPh auh5Kh6hh7}rQ(j>j@jFjCuh=]rR(hG)rS}rT(hX InterpolaterUhjHh h#h*hKh,}rV(h0]h1]h/]h.]h2]uh5Kh6hh=]rWhNX InterpolaterXrY}rZ(hjUhjSubaubhR)r[}r\(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`.hjHh h#h*hUh,}r](h0]h1]h/]h.]h2]uh5Kh6hh=]r^(h[)r_}r`(hX:class:`Property`rahj[h h#h*h_h,}rb(UreftypeXclasshahbXPropertyU refdomainXpyrch.]h/]U refexplicith0]h1]h2]hdhejNjNuh5Kh=]rdh)re}rf(hjah,}rg(h0]h1]rh(hljcXpy-classrieh/]h.]h2]uhj_h=]rjhNXPropertyrkrl}rm(hUhjeubah*hubaubhNXb can only be used to replace an entire argument: in the example above, it replaces an argument to rnro}rp(hXb can only be used to replace an entire argument: in the example above, it replaces an argument to hj[ubh)rq}rr(hX``echo``h,}rs(h0]h1]h/]h.]h2]uhj[h=]rthNXechorurv}rw(hUhjqubah*hubhNX^. Often, properties need to be interpolated into strings, instead. The tool for that job is rxry}rz(hX^. Often, properties need to be interpolated into strings, instead. The tool for that job is hj[ubh[)r{}r|(hX:ref:`Interpolate`r}hj[h h#h*h_h,}r~(UreftypeXrefhahbX interpolateU refdomainXstdrh.]h/]U refexplicith0]h1]h2]hdheuh5Kh=]rhg)r}r(hj}h,}r(h0]h1]r(hljXstd-refreh/]h.]h2]uhj{h=]rhNX Interpolaterr}r(hUhjubah*hrubaubhNX.r}r(hX.hj[ubeubhR)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"). ::hjHh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(hNX\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(h0]h1]h/]h.]h2]uhjh=]rhNX%(prop:)srr}r(hUhjubah*hubhNX 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").hjubeubj)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' ]))hjHh h#h*jh,}r(jjh.]h/]h0]h1]h2]uh5Kh6hh=]rhNXfrom 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(hUhjubaubhR)r}r(hXXThis example will result in a ``make`` command with an argument like ``REVISION=12098``.hjHh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(hNXThis example will result in a rr}r(hXThis example will result in a hjubh)r}r(hX``make``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXmakerr}r(hUhjubah*hubhNX command with an argument like rr}r(hX command with an argument like hjubh)r}r(hX``REVISION=12098``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXREVISION=12098rr}r(hUhjubah*hubhNX.r}r(hX.hjubeubh')r}r(hX.. _Interpolate-DictStyle:hjHh h#h*h+h,}r(h.]h/]h0]h1]h2]h3Uinterpolate-dictstyleruh5Kh6hh=]ubhR)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.rhjHh h#h%}rhjsh*hUh,}r(h0]h1]h/]h.]rjah2]rhauh5Kh6hh7}rjjsh=]rhNXThe 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(hjhjubaubhR)r}r(hX&The following selectors are supported.rhjHh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]rhNX&The following selectors are supported.rr}r(hjhjubaubj)r}r(hUhjHh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]r(j)r}r(hX,``prop`` The key is the name of a property. hjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh=]r(j)r}r(hX``prop``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNXproprr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]rhR)r}r(hX"The key is the name of a property.rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh=]rhNX"The key is the name of a property.rr}r(hjhjubaubah*j+ubeubj)r}r(hXP``src`` The key is a codebase and source stamp attribute, separated by a colon. hjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(j)r}r(hX``src``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNXsrcrr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]r hR)r }r (hXGThe key is a codebase and source stamp attribute, separated by a colon.r hjh h#h*hUh,}r (h0]h1]h/]h.]h2]uh5Kh=]rhNXGThe key is a codebase and source stamp attribute, separated by a colon.rr}r(hj hj ubaubah*j+ubeubj)r}r(hXG``kw`` The key refers to a keyword argument passed to ``Interpolate``. hjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(j)r}r(hX``kw``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNXkwrr }r!(hUhjubah*hubaubj)r"}r#(hUh,}r$(h0]h1]h/]h.]h2]uhjh=]r%hR)r&}r'(hX?The key refers to a keyword argument passed to ``Interpolate``.hj"h h#h*hUh,}r((h0]h1]h/]h.]h2]uh5Kh=]r)(hNX/The key refers to a keyword argument passed to r*r+}r,(hX/The key refers to a keyword argument passed to hj&ubh)r-}r.(hX``Interpolate``h,}r/(h0]h1]h/]h.]h2]uhj&h=]r0hNX Interpolater1r2}r3(hUhj-ubah*hubhNX.r4}r5(hX.hj&ubeubah*j+ubeubeubhR)r6}r7(hX;The following ways of interpreting the value are available.r8hjHh h#h*hUh,}r9(h0]h1]h/]h.]h2]uh5Kh6hh=]r:hNX;The following ways of interpreting the value are available.r;r<}r=(hj8hj6ubaubj)r>}r?(hUhjHh h#h*jh,}r@(h0]h1]h/]h.]h2]uh5Nh6hh=]rA(j)rB}rC(hX``-replacement`` If the key exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(prop:propname:-)s``). This is the default. hj>h h#h*jh,}rD(h0]h1]h/]h.]h2]uh5Kh=]rE(j)rF}rG(hX``-replacement``rHhjBh h#h*jh,}rI(h0]h1]h/]h.]h2]uh5Kh=]rJh)rK}rL(hjHh,}rM(h0]h1]h/]h.]h2]uhjFh=]rNhNX -replacementrOrP}rQ(hUhjKubah*hubaubj)rR}rS(hUh,}rT(h0]h1]h/]h.]h2]uhjBh=]rUhR)rV}rW(hXIf the key exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(prop:propname:-)s``). This is the default.hjRh h#h*hUh,}rX(h0]h1]h/]h.]h2]uh5Kh=]rY(hNX?If the key exists, substitute its value; otherwise, substitute rZr[}r\(hX?If the key exists, substitute its value; otherwise, substitute hjVubh)r]}r^(hX``replacement``h,}r_(h0]h1]h/]h.]h2]uhjVh=]r`hNX replacementrarb}rc(hUhj]ubah*hubhNX. rdre}rf(hX. hjVubh)rg}rh(hX``replacement``h,}ri(h0]h1]h/]h.]h2]uhjVh=]rjhNX replacementrkrl}rm(hUhjgubah*hubhNX may be empty (rnro}rp(hX may be empty (hjVubh)rq}rr(hX``%(prop:propname:-)s``h,}rs(h0]h1]h/]h.]h2]uhjVh=]rthNX%(prop:propname:-)srurv}rw(hUhjqubah*hubhNX). This is the default.rxry}rz(hX). This is the default.hjVubeubah*j+ubeubj)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``. hj>h h#h*jh,}r}(h0]h1]h/]h.]h2]uh5Kh6hh=]r~(j)r}r(hX``~replacement``rhj{h h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNX ~replacementrr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhj{h=]rhR)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*hUh,}r(h0]h1]h/]h.]h2]uh5Kh=]r(hNXLike rr}r(hXLike hjubh)r}r(hX``-replacement``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX -replacementrr}r(hUhjubah*hubhNXQ, 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(h0]h1]h/]h.]h2]uhjh=]rhNXTruerr}r(hUhjubah*hubhNX. Python considers rr}r(hX. Python considers hjubh)r}r(hX``None``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXNonerr}r(hUhjubah*hubhNXW, 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(h0]h1]h/]h.]h2]uhjh=]rhNX replacementrr}r(hUhjubah*hubhNX.r}r(hX.hjubeubah*j+ubeubj)r}r(hXg``+replacement`` If the key exists, substitute ``replacement``; otherwise, substitute an empty string. hj>h h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]r(j)r}r(hX``+replacement``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNX +replacementrr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]rhR)r}r(hXUIf the key exists, substitute ``replacement``; otherwise, substitute an empty string.hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh=]r(hNXIf the key exists, substitute rr}r(hXIf the key exists, substitute hjubh)r}r(hX``replacement``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX replacementrr}r(hUhjubah*hubhNX(; otherwise, substitute an empty string.rr}r(hX(; otherwise, substitute an empty string.hjubeubah*j+ubeubeubhR)r}r(hX"``?|sub_if_exists|sub_if_missing``rhjHh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5Kh6hh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNX?|sub_if_exists|sub_if_missingrr}r(hUhjubah*hubaubj)r}r(hUhjHh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]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(h0]h1]h/]h.]h2]uh5Kh=]r(j)r}r(hX``#?|sub_if_true|sub_if_false``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Kh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNX#?|sub_if_true|sub_if_falserr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]rhR)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*hUh,}r(h0]h1]h/]h.]h2]uh5Kh=]r (hNXFTernary substitution, depending on either the key being present (with r r }r (hXFTernary substitution, depending on either the key being present (with hjubh)r }r(hX``?``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX?r}r(hUhj ubah*hubhNX , similar to rr}r(hX , similar to hjubh)r}r(hX``+``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX+r}r(hUhjubah*hubhNX ) or being rr}r(hX ) or being hjubh)r}r (hX``True``h,}r!(h0]h1]h/]h.]h2]uhjh=]r"hNXTruer#r$}r%(hUhjubah*hubhNX (with r&r'}r((hX (with hjubh)r)}r*(hX``#?``h,}r+(h0]h1]h/]h.]h2]uhjh=]r,hNX#?r-r.}r/(hUhj)ubah*hubhNX, like r0r1}r2(hX, like hjubh)r3}r4(hX``~``h,}r5(h0]h1]h/]h.]h2]uhjh=]r6hNX~r7}r8(hUhj3ubah*hubhNXG). Notice that there is a pipe immediately following the question mark r9r:}r;(hXG). Notice that there is a pipe immediately following the question mark hjubhg)r<}r=(hX*and*h,}r>(h0]h1]h/]h.]h2]uhjh=]r?hNXandr@rA}rB(hUhj<ubah*hrubhNX 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 rCrD}rE(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)rF}rG(hX``(``h,}rH(h0]h1]h/]h.]h2]uhjh=]rIhNX(rJ}rK(hUhjFubah*hubhNX can be used.rLrM}rN(hX can be used.hjubeubah*j+ubeubaubhR)rO}rP(hXbAlthough these are similar to shell substitutions, no other substitutions are currently supported.rQhjHh h#h*hUh,}rR(h0]h1]h/]h.]h2]uh5Kh6hh=]rShNXbAlthough these are similar to shell substitutions, no other substitutions are currently supported.rTrU}rV(hjQhjOubaubhR)rW}rX(hX Example ::rYhjHh h#h*hUh,}rZ(h0]h1]h/]h.]h2]uh5Kh6hh=]r[hNXExampler\r]}r^(hXExamplehjWubaubj)r_}r`(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' ]))hjHh h#h*jh,}ra(jjh.]h/]h0]h1]h2]uh5Kh6hh=]rbhNXfrom 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' ]))rcrd}re(hUhj_ubaubhR)rf}rg(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::hjHh h#h*hUh,}rh(h0]h1]h/]h.]h2]uh5Mh6hh=]ri(hNX In addition, rjrk}rl(hX In addition, hjfubh)rm}rn(hX``Interpolate``h,}ro(h0]h1]h/]h.]h2]uhjfh=]rphNX Interpolaterqrr}rs(hUhjmubah*hubhNX7 supports using positional string interpolation. Here, rtru}rv(hX7 supports using positional string interpolation. Here, hjfubh)rw}rx(hX``%s``h,}ry(h0]h1]h/]h.]h2]uhjfh=]rzhNX%sr{r|}r}(hUhjwubah*hubhNX{ is used as a placeholder, and the substitutions (which may themselves be placeholders), are given as subsequent arguments:r~r}r(hX{ is used as a placeholder, and the substitutions (which may themselves be placeholders), are given as subsequent arguments:hjfubeubj)r}r(hX.. note:rhjHh h#h*jh,}r(jjh.]h/]h0]h1]h2]uh5Mh6hh=]rhNX.. note:rr}r(hUhjubaubj)r}r(hUhjHh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]rhR)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*hUh,}r(h0]h1]h/]h.]h2]uh5M h=]r(hNX9Like Python, you can use either positional interpolation rr}r(hX9Like Python, you can use either positional interpolation hjubhg)r}r(hX*or*h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXorrr}r(hUhjubah*hrubhNXN 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(h0]h1]h/]h.]h2]uhjh=]rhNX1Interpolate("foo-%(src::revision)s-%s", "branch")rr}r(hUhjubah*hubhNX.r}r(hX.hjubeubaubj)r}r(hUhjHh h#h*jh,}r(h.]h/]h0]h1]h2]j]r(jXProperties; RendererUindex-11rUtrajuh5M h6hh=]ubh')r}r(hUhjHh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5Mh6hh=]ubh')r}r(hX .. _Renderer:hjHh h#h%}h*h+h,}r(h.]h/]h0]h1]h2]h3Urendererruh5Mh6hh7}rjjsh=]ubeubh)r}r(hUhKhjWh h#h%}rhjsh*h>h,}r(h0]rXrendererrah1]h/]h.]r(jjUid6reh2]rhauh5Mh6hh7}r(jjjjuh=]r(hG)r}r(hXRendererrhjh h#h*hKh,}r(h0]h1]h/]h.]h2]uh5Mh6hh=]rhNXRendererrr}r(hjhjubaubhR)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*hUh,}r(h0]h1]h/]h.]h2]uh5Mh6hh=]r(hNXWhile 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(h0]h1]h/]h.]h2]uhjh=]rhNXrendererrr}r(hUhjubah*hubhNX 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*h_h,}r(UreftypeXclasshahbXbuildbot.interfaces.IPropertiesU refdomainXpyrh.]h/]U refexplicith0]h1]h2]hdhejNjNuh5Mh=]rh)r}r(hjh,}r(h0]h1]r(hljXpy-classreh/]h.]h2]uhjh=]rhNX IPropertiesrr}r(hUhjubah*hubaubhNXX 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:hjubeubj)r}r(hX. @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*jh,}r(jjh.]h/]h0]h1]h2]uh5Mh6hh=]rhNX. @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(hUhjubaubhR)r}r(hXRYou can think of ``renderer`` as saying "call this function when the step starts".rhjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5M$h6hh=]r(hNXYou can think of rr}r(hXYou can think of hjubh)r}r(hX ``renderer``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXrendererrr}r(hUhjubah*hubhNX5 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(h.]h/]h0]h1]h2]j]r(jXProperties; WithPropertiesUindex-12rUtr ajuh5M&h6hh=]ubh')r }r (hUhjh h#h*h+h,}r (h.]h/]h0]h1]h2]h3juh5M'h6hh=]ubh')r }r(hX.. _WithProperties:hjh h#h%}h*h+h,}r(h.]h/]h0]h1]h2]h3Uwithpropertiesruh5M(h6hh7}rjj sh=]ubeubh)r}r(hUhKhjWh h#h%}rhj sh*h>h,}r(h0]rXwithpropertiesrah1]h/]h.]r(jjUid7reh2]rhauh5M+h6hh7}r(jj jj uh=]r(hG)r}r(hXWithPropertiesrhjh h#h*hKh,}r (h0]h1]h/]h.]h2]uh5M+h6hh=]r!hNXWithPropertiesr"r#}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*Uwarningr(h,}r)(h0]h1]h/]h.]h2]uh5Nh6hh=]r*hR)r+}r,(hX}This placeholder is deprecated. It is an older version of :ref:`Interpolate`. It exists for compatibility with older configs.hj&h h#h*hUh,}r-(h0]h1]h/]h.]h2]uh5M/h=]r.(hNX:This placeholder is deprecated. It is an older version of r/r0}r1(hX:This placeholder is deprecated. It is an older version of hj+ubh[)r2}r3(hX:ref:`Interpolate`r4hj+h h#h*h_h,}r5(UreftypeXrefhahbX interpolateU refdomainXstdr6h.]h/]U refexplicith0]h1]h2]hdheuh5M/h=]r7hg)r8}r9(hj4h,}r:(h0]h1]r;(hlj6Xstd-refr<eh/]h.]h2]uhj2h=]r=hNX Interpolater>r?}r@(hUhj8ubah*hrubaubhNX1. It exists for compatibility with older configs.rArB}rC(hX1. It exists for compatibility with older configs.hj+ubeubaubhR)rD}rE(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*hUh,}rF(h0]h1]h/]h.]h2]uh5M2h6hh=]rG(hNXOThe simplest use of this class is with positional string interpolation. Here, rHrI}rJ(hXOThe simplest use of this class is with positional string interpolation. Here, hjDubh)rK}rL(hX``%s``h,}rM(h0]h1]h/]h.]h2]uhjDh=]rNhNX%srOrP}rQ(hUhjKubah*hubhNXP is used as a placeholder, and property names are given as subsequent arguments:rRrS}rT(hXP is used as a placeholder, and property names are given as subsequent arguments:hjDubeubj)rU}rV(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*jh,}rW(jjh.]h/]h0]h1]h2]uh5M6h6hh=]rXhNX 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"]))rYrZ}r[(hUhjUubaubhR)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*hUh,}r^(h0]h1]h/]h.]h2]uh5M=h6hh=]r_(hNXIf this r`ra}rb(hXIf this hj\ubh[)rc}rd(hX:class:`BuildStep`rehj\h h#h*h_h,}rf(UreftypeXclasshahbX BuildStepU refdomainXpyrgh.]h/]U refexplicith0]h1]h2]hdhejNjNuh5M=h=]rhh)ri}rj(hjeh,}rk(h0]h1]rl(hljgXpy-classrmeh/]h.]h2]uhjch=]rnhNX BuildSteprorp}rq(hUhjiubah*hubaubhNXS were used in a tree obtained from Git, it would create a tarball with a name like rrrs}rt(hXS were used in a tree obtained from Git, it would create a tarball with a name like hj\ubh)ru}rv(hUh,}rw(h.]h/]h0]h1]rxXfileryaUrolejyh2]uhj\h=]rzhNX<build-master-a7d3a333db708e786edb34b6af646edd8d4d3ad9.tar.gzr{r|}r}(hX<build-master-a7d3a333db708e786edb34b6af646edd8d4d3ad9.tar.gzhjuubah*hubhNX.r~}r(hX.hj\ubeubj)r}r(hUhjh h#h*jh,}r(h.]h/]h0]h1]h2]j]r(jXunsupported format characterUindex-13rUtrajuh5MAh6hh=]ubh')r}r(hUhjh h#h*h+h,}r(h.]h/]h0]h1]h2]h3juh5MBh6hh=]ubhR)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*hUh,}r(h0]h1]h/]h.]rjah2]uh5MCh6hh7}rjjsh=]r(hNX\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(h0]h1]h/]h.]h2]uhjh=]rhNX %(propname)srr}r(hUhjubah*hubhNX 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").hjubeubj)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*jh,}r(jjh.]h/]h0]h1]h2]uh5MIh6hh=]rhNXfrom buildbot.steps.shell import ShellCommand from buildbot.process.properties import WithProperties f.addStep(ShellCommand(command=[ 'make', WithProperties('REVISION=%(got_revision)s'), 'dist' ]))rr}r(hUhjubaubhR)r}r(hXXThis example will result in a ``make`` command with an argument like ``REVISION=12098``.hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5MNh6hh=]r(hNXThis example will result in a rr}r(hXThis example will result in a hjubh)r}r(hX``make``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXmakerr}r(hUhjubah*hubhNX command with an argument like rr}r(hX command with an argument like hjubh)r}r(hX``REVISION=12098``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXREVISION=12098rr}r(hUhjubah*hubhNX.r}r(hX.hjubeubh')r}r(hX.. _WithProperties-DictStyle:hjh h#h*h+h,}r(h.]h/]h0]h1]h2]h3Uwithproperties-dictstyleruh5MQh6hh=]ubhR)r}r(hXbThe dictionary-style interpolation supports a number of more advanced syntaxes in the parentheses.rhjh h#h%}rh jsh*hUh,}r(h0]h1]h/]h.]rjah2]rh auh5MSh6hh7}rjjsh=]rhNXbThe dictionary-style interpolation supports a number of more advanced syntaxes in the parentheses.rr}r(hjhjubaubj)r}r(hUhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5Nh6hh=]r(j)r}r(hX``propname:-replacement`` If ``propname`` exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(propname:-)s``) hjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5MYh=]r(j)r}r(hX``propname:-replacement``rhjh h#h*jh,}r(h0]h1]h/]h.]h2]uh5MYh=]rh)r}r(hjh,}r(h0]h1]h/]h.]h2]uhjh=]rhNXpropname:-replacementrr}r(hUhjubah*hubaubj)r}r(hUh,}r(h0]h1]h/]h.]h2]uhjh=]rhR)r}r(hXIf ``propname`` exists, substitute its value; otherwise, substitute ``replacement``. ``replacement`` may be empty (``%(propname:-)s``)hjh h#h*hUh,}r(h0]h1]h/]h.]h2]uh5MWh=]r(hNXIf rr}r(hXIf hjubh)r}r(hX ``propname``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNXpropnamerr}r(hUhjubah*hubhNX5 exists, substitute its value; otherwise, substitute rr}r(hX5 exists, substitute its value; otherwise, substitute hjubh)r}r(hX``replacement``h,}r(h0]h1]h/]h.]h2]uhjh=]rhNX replacementrr}r(hUhjubah*hubhNX. rr}r(hX. hjubh)r }r (hX``replacement``h,}r (h0]h1]h/]h.]h2]uhjh=]r hNX replacementr r }r (hUhj ubah*hubhNX may be empty (r r }r (hX may be empty (hjubh)r }r (hX``%(propname:-)s``h,}r (h0]h1]h/]h.]h2]uhjh=]r hNX%(propname:-)sr r }r (hUhj ubah*hubhNX)r }r (hX)hjubeubah*j+ubeubj)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``. hjh h#h*jh,}r (h0]h1]h/]h.]h2]uh5M_h6hh=]r (j)r }r (hX``propname:~replacement``r hj h h#h*jh,}r (h0]h1]h/]h.]h2]uh5M_h=]r h)r }r (hj h,}r (h0]h1]h/]h.]h2]uhj h=]r hNXpropname:~replacementr r! }r" (hUhj ubah*hubaubj)r# }r$ (hUh,}r% (h0]h1]h/]h.]h2]uhj h=]r& hR)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*hUh,}r) (h0]h1]h/]h.]h2]uh5M\h=]r* (hNXLike r+ r, }r- (hXLike hj' ubh)r. }r/ (hX``propname:-replacement``h,}r0 (h0]h1]h/]h.]h2]uhj' h=]r1 hNXpropname:-replacementr2 r3 }r4 (hUhj. ubah*hubhNX-, but only substitutes the value of property r5 r6 }r7 (hX-, but only substitutes the value of property hj' ubh)r8 }r9 (hX ``propname``h,}r: (h0]h1]h/]h.]h2]uhj' h=]r; hNXpropnamer< r= }r> (hUhj8 ubah*hubhNX& if it is something Python regards as r? r@ }rA (hX& if it is something Python regards as hj' ubh)rB }rC (hX``True``h,}rD (h0]h1]h/]h.]h2]uhj' h=]rE hNXTruerF rG }rH (hUhjB ubah*hubhNX. Python considers rI rJ }rK (hX. Python considers hj' ubh)rL }rM (hX``None``h,}rN (h0]h1]h/]h.]h2]uhj' h=]rO hNXNonerP rQ }rR (hUhjL ubah*hubhNXW, 0, empty lists, and the empty string to be false, so such values will be replaced by rS rT }rU (hXW, 0, empty lists, and the empty string to be false, so such values will be replaced by hj' ubh)rV }rW (hX``replacement``h,}rX (h0]h1]h/]h.]h2]uhj' h=]rY hNX replacementrZ r[ }r\ (hUhjV ubah*hubhNX.r] }r^ (hX.hj' ubeubah*j+ubeubj)r_ }r` (hXu``propname:+replacement`` If ``propname`` exists, substitute ``replacement``; otherwise, substitute an empty string. hjh h#h*jh,}ra (h0]h1]h/]h.]h2]uh5Mch6hh=]rb (j)rc }rd (hX``propname:+replacement``re hj_ h h#h*jh,}rf (h0]h1]h/]h.]h2]uh5Mch=]rg h)rh }ri (hje h,}rj (h0]h1]h/]h.]h2]uhjc h=]rk hNXpropname:+replacementrl rm }rn (hUhjh ubah*hubaubj)ro }rp (hUh,}rq (h0]h1]h/]h.]h2]uhj_ h=]rr hR)rs }rt (hXZIf ``propname`` exists, substitute ``replacement``; otherwise, substitute an empty string.hjo h h#h*hUh,}ru (h0]h1]h/]h.]h2]uh5Mbh=]rv (hNXIf rw rx }ry (hXIf hjs ubh)rz }r{ (hX ``propname``h,}r| (h0]h1]h/]h.]h2]uhjs h=]r} hNXpropnamer~ r }r (hUhjz ubah*hubhNX exists, substitute r r }r (hX exists, substitute hjs ubh)r }r (hX``replacement``h,}r (h0]h1]h/]h.]h2]uhjs h=]r hNX replacementr r }r (hUhj ubah*hubhNX(; otherwise, substitute an empty string.r r }r (hX(; otherwise, substitute an empty string.hjs ubeubah*j+ubeubeubhR)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*hUh,}r (h0]h1]h/]h.]h2]uh5Meh6hh=]r (hNXgAlthough 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 (h0]h1]h/]h.]h2]uhj h=]r hNX replacementr r }r (hUhj ubah*hubhNX0 in the above cannot contain more substitutions.r r }r (hX0 in the above cannot contain more substitutions.hj ubeubhR)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*hUh,}r (h0]h1]h/]h.]h2]uh5Mih6hh=]r (hNX?Note: like Python, you can use either positional interpolation r r }r (hX?Note: like Python, you can use either positional interpolation hj ubhg)r }r (hX*or*h,}r (h0]h1]h/]h.]h2]uhj h=]r hNXorr r }r (hUhj ubah*hrubhNXM 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 (h0]h1]h/]h.]h2]uhj h=]r hNX/WithProperties("foo-%(revision)s-%s", "branch")r r }r (hUhj ubah*hubhNX.r }r (hX.hj ubeubeubh)r }r (hUhjWh h#h*h>h,}r (h0]h1]h/]h.]r Ucustom-renderablesr ah2]r h auh5Mnh6hh=]r (hG)r }r (hXCustom Renderablesr hj h h#h*hKh,}r (h0]h1]h/]h.]h2]uh5Mnh6hh=]r hNXCustom Renderablesr r }r (hj hj ubaubhR)r }r (hX|If the options described above are not sufficient, more complex substitutions can be achieved by writing custom renderables.r hj h h#h*hUh,}r (h0]h1]h/]h.]h2]uh5Mph6hh=]r hNX|If the options described above are not sufficient, more complex substitutions can be achieved by writing custom renderables.r r }r (hj hj ubaubhR)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*hUh,}r (h0]h1]h/]h.]h2]uh5Mrh6hh=]r (hNX&Renderables are objects providing the r r }r (hX&Renderables are objects providing the hj ubh[)r }r (hX):class:`~buildbot.interfaces.IRenderable`r hj h h#h*h_h,}r (UreftypeXclasshahbXbuildbot.interfaces.IRenderableU refdomainXpyr h.]h/]U refexplicith0]h1]h2]hdhejNjNuh5Mrh=]r h)r }r (hj h,}r (h0]h1]r (hlj Xpy-classr eh/]h.]h2]uhj h=]r hNX IRenderabler r }r (hUhj ubah*hubaubhNX> interface. That interface is simple - objects must provide a r r }r (hX> interface. That interface is simple - objects must provide a hj ubjk)r }r (hX`getRenderingFor`h,}r (h0]h1]h/]h.]h2]uhj h=]r hNXgetRenderingForr r }r (hUhj ubah*jsubhNX2 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`r hj h h#h*h_h,}r (UreftypeXclasshahbXbuildbot.interfaces.IPropertiesU refdomainXpyr h.]h/]U refexplicith0]h1]h2]hdhejNjNuh5Mrh=]r h)r }r (hj h,}r (h0]h1]r (hlj Xpy-classr eh/]h.]h2]uhj h=]r hNX IPropertiesr r }r (hUhj ubah*hubaubhNX 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:r r }r (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 ubeubj)r }r (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*jh,}r (jjh.]h/]h0]h1]h2]uh5Mxh6hh=]r hNX,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()])r r }r (hUhj ubaubhR)r }r (hXor, more practically, ::r hj h h#h*hUh,}r (h0]h1]h/]h.]h2]uh5Mh6hh=]r hNXor, more practically,r r }r (hXor, more practically,hj ubaubj)r }r (hXclass Now(object): implements(IRenderable) def getRenderingFor(self, props) return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)', now=Now())])hj h h#h*jh,}r (jjh.]h/]h0]h1]h2]uh5Mh6hh=]r hNXclass Now(object): implements(IRenderable) def getRenderingFor(self, props) return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)', now=Now())])r r }r (hUhj ubaubhR)r }r (hXThis is equivalent to::r hj h h#h*hUh,}r (h0]h1]h/]h.]h2]uh5Mh6hh=]r hNXThis is equivalent to:r r! }r" (hXThis is equivalent to:hj ubaubj)r# }r$ (hXx@renderer def now(props): return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)', now=now)])hj h h#h*jh,}r% (jjh.]h/]h0]h1]h2]uh5Mh6hh=]r& hNXx@renderer def now(props): return time.clock() ShellCommand(command=['make', Interpolate('TIME=%(kw:now)', now=now)])r' r( }r) (hUhj# ubaubhR)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*hUh,}r- (h0]h1]h/]h.]h2]uh5Mh6hh=]r. (hNXNote that a custom renderable must be instantiated (and its constructor can take whatever arguments you'd like), whereas a function decorated with r/ r0 }r1 (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[)r2 }r3 (hX:func:`renderer`r4 hj* h h#h*h_h,}r5 (UreftypeXfunchahbXrendererU refdomainXpyr6 h.]h/]U refexplicith0]h1]h2]hdhejNjNuh5Mh=]r7 h)r8 }r9 (hj4 h,}r: (h0]h1]r; (hlj6 Xpy-funcr< eh/]h.]h2]uhj2 h=]r= hNXrendererr> r? }r@ (hUhj8 ubah*hubaubhNX can be used directly.rA rB }rC (hX can be used directly.hj* ubeubeubeubeubh h#h*Usystem_messagerD h,}rE (h0]UlevelKh.]h/]rF hCaUsourceh#h1]h2]UlineKUtypeUINFOrG uh5Kh6hh=]rH hR)rI }rJ (hUh,}rK (h0]h1]h/]h.]h2]uhhh=]rL hNX-Duplicate implicit target name: "properties".rM rN }rO (hUhjI ubah*hUubaubh)rP }rQ (hUhjh h#h*jD h,}rR (h0]UlevelKh.]h/]rS jaUsourceh#h1]h2]UlineKUtypejG uh5Kh6hh=]rT hR)rU }rV (hUh,}rW (h0]h1]h/]h.]h2]uhjP h=]rX hNX+Duplicate implicit target name: "property".rY rZ }r[ (hUhjU ubah*hUubaubh)r\ }r] (hUhjHh h#h*jD h,}r^ (h0]UlevelKh.]h/]r_ jOaUsourceh#h1]h2]UlineKUtypejG uh5Kh6hh=]r` hR)ra }rb (hUh,}rc (h0]h1]h/]h.]h2]uhj\ h=]rd hNX.Duplicate implicit target name: "interpolate".re rf }rg (hUhja ubah*hUubaubh)rh }ri (hUhjh h#h*jD h,}rj (h0]UlevelKh.]h/]rk jaUsourceh#h1]h2]UlineMUtypejG uh5Mh6hh=]rl hR)rm }rn (hUh,}ro (h0]h1]h/]h.]h2]uhjh h=]rp hNX+Duplicate implicit target name: "renderer".rq rr }rs (hUhjm ubah*hUubaubh)rt }ru (hUhjh h#h*jD h,}rv (h0]UlevelKh.]h/]rw jaUsourceh#h1]h2]UlineM+UtypejG uh5M+h6hh=]rx hR)ry }rz (hUh,}r{ (h0]h1]h/]h.]h2]uhjt h=]r| hNX1Duplicate implicit target name: "withproperties".r} r~ }r (hUhjy ubah*hUubaubeUcurrent_sourcer NU decorationr NUautofootnote_startr KUnameidsr }r (hjhjhjh jh jFh jh j h jhjhjhj[hjhh4uh=]r (j)r }r (hUhhh h#h*jh,}r (h.]h/]h0]h1]h2]j]r (jX Propertiesh9Utr ajuh5Kh6hh=]ubh:h(hehUU transformerr NU footnote_refsr }r Urefnamesr }r Usymbol_footnotesr ]r Uautofootnote_refsr ]r Usymbol_footnote_refsr ]r U citationsr ]r h6hU current_liner NUtransform_messagesr ]r (h)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-0" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX0Hyperlink target "properties" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineK*UtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-1" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineK+UtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX=Hyperlink target "common-build-properties" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineK4UtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-2" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKAUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-3" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKHUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-4" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKOUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-5" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-6" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineK`UtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-7" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKcUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX=Hyperlink target "source-stamp-attributes" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKiUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX-Hyperlink target "index-8" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r! (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUtypejG uh=]r" hR)r# }r$ (hUh,}r% (h0]h1]h/]h.]h2]uhj h=]r& hNX-Hyperlink target "index-9" is not referenced.r' r( }r) (hUhj# ubah*hUubah*jD ubh)r* }r+ (hUh,}r, (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUtypejG uh=]r- hR)r. }r/ (hUh,}r0 (h0]h1]h/]h.]h2]uhj* h=]r1 hNX.Hyperlink target "property" is not referenced.r2 r3 }r4 (hUhj. ubah*hUubah*jD ubh)r5 }r6 (hUh,}r7 (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUtypejG uh=]r8 hR)r9 }r: (hUh,}r; (h0]h1]h/]h.]h2]uhj5 h=]r< hNX.Hyperlink target "index-10" is not referenced.r= r> }r? (hUhj9 ubah*hUubah*jD ubh)r@ }rA (hUh,}rB (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUtypejG uh=]rC hR)rD }rE (hUh,}rF (h0]h1]h/]h.]h2]uhj@ h=]rG hNX1Hyperlink target "interpolate" is not referenced.rH rI }rJ (hUhjD ubah*hUubah*jD ubh)rK }rL (hUh,}rM (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineKUtypejG uh=]rN hR)rO }rP (hUh,}rQ (h0]h1]h/]h.]h2]uhjK h=]rR hNX;Hyperlink target "interpolate-dictstyle" is not referenced.rS rT }rU (hUhjO ubah*hUubah*jD ubh)rV }rW (hUh,}rX (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineMUtypejG uh=]rY hR)rZ }r[ (hUh,}r\ (h0]h1]h/]h.]h2]uhjV h=]r] hNX.Hyperlink target "index-11" is not referenced.r^ r_ }r` (hUhjZ ubah*hUubah*jD ubh)ra }rb (hUh,}rc (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineMUtypejG uh=]rd hR)re }rf (hUh,}rg (h0]h1]h/]h.]h2]uhja h=]rh hNX.Hyperlink target "renderer" is not referenced.ri rj }rk (hUhje ubah*hUubah*jD ubh)rl }rm (hUh,}rn (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineM'UtypejG uh=]ro hR)rp }rq (hUh,}rr (h0]h1]h/]h.]h2]uhjl h=]rs hNX.Hyperlink target "index-12" is not referenced.rt ru }rv (hUhjp ubah*hUubah*jD ubh)rw }rx (hUh,}ry (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineM(UtypejG uh=]rz hR)r{ }r| (hUh,}r} (h0]h1]h/]h.]h2]uhjw h=]r~ hNX4Hyperlink target "withproperties" is not referenced.r r }r (hUhj{ ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineMBUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX.Hyperlink target "index-13" is not referenced.r r }r (hUhj ubah*hUubah*jD ubh)r }r (hUh,}r (h0]UlevelKh.]h/]Usourceh#h1]h2]UlineMQUtypejG uh=]r hR)r }r (hUh,}r (h0]h1]h/]h.]h2]uhj h=]r hNX>Hyperlink target "withproperties-dictstyle" is not referenced.r r }r (hUhj ubah*hUubah*jD 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 NhKNUerror_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 UV/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-properties.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 (jjjjj j jjjjjjj[jWjjjjjjjOjHjjjjj>jHhChjljqjjjjj,j1h9hjjjjj0j5jjjjjjjFjHjjh4hjjjjjjuUsubstitution_namesr }r h*h6h,}r (h0]h.]h/]Usourceh#h1]h2]uU footnotesr ]r Urefidsr }r (j]r jaj]r jaj]r jaj]r jaj]r j aj]r jaj>]r j@aj]r jajl]r jnaj]r jaj]r jaj,]r j.ah9]r h:aj]r jaj]r jaj0]r j2aj]r jaj]r jaj]r j ajF]r jCah4]r h(aj]r jaj]r jauub.PKJtDU̽̽2buildbot-v0.8.8/.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.8/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*X ``SIGHUP``h3}r@(h5]h6]h7]h8]h:]uh+j7h%]rAhFXSIGHUPrBrC}rD(h*Uh+j>ubah1hiubhFX signal to it: the rErF}rG(h*X signal to it: the h+j7ubhm)rH}rI(h*X:command:`buildbot`h3}rJ(h5]h6]rKhrah7]h8]h:]uh+j7h%]rLhFXbuildbotrMrN}rO(h*Uh+jHubah1hwubhFX tool has a shortcut for this:rPrQ}rR(h*X tool has a shortcut for this:h+j7ubeubjJ)rS}rT(h*Xbuildbot reconfig BASEDIRh+j)h,h/h1jMh3}rU(jjXnonehhh8]h7]h5]h6]h:]uh(h5]h6]r?(hj:Xpy-classr@eh7]h8]h:]uh+j6h%]rAhFXBuilderrBrC}rD(h*Uh+j<ubah1hiubaubhFX or rErF}rG(h*X or h+j/ubh{)rH}rI(h*X:class:`Scheduler`rJh+j/h,h/h1hh3}rK(UreftypeXclasshhX SchedulerU refdomainXpyrLh8]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:]hhuhNUstrict_visitorr?NUcloak_email_addressesr@Utrim_footnote_reference_spacerAUenvrBNUdump_pseudo_xmlrCNUexpose_internalsrDNUsectsubtitle_xformrEU source_linkrFNUrfc_referencesrGNUoutput_encodingrHUutf-8rIU source_urlrJNUinput_encodingrKU utf-8-sigrLU_disable_configrMNU id_prefixrNUU tab_widthrOKUerror_encodingrPUUTF-8rQU_sourcerRUQ/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-intro.rstrSUgettext_compactrTU generatorrUNUdump_internalsrVNU smart_quotesrWU pep_base_urlrXUhttp://www.python.org/dev/peps/rYUsyntax_highlightrZUlongr[Uinput_encoding_error_handlerr\j6Uauto_id_prefixr]Uidr^Udoctitle_xformr_Ustrip_elements_with_classesr`NU _config_filesra]Ufile_insertion_enabledrbU raw_enabledrcKU dump_settingsrdNubUsymbol_footnote_startreKUidsrf}rg(hjhjHhjhjHhjhhh"j h!hh h(h$jh#j)uUsubstitution_namesrh}rih1h=h3}rj(h5]h8]h7]Usourceh/h6]h:]uU footnotesrk]rlUrefidsrm}rn(h]rojah!]rphah]rqjEauub.PKJtD ?8buildbot-v0.8.8/.doctrees/manual/cfg-buildslaves.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xwhen buildslaves go missingqNXcommon optionsqNX$get an account in an openstack cloudqNXlibvirtq Xec2q X0configure the master with an ec2latentbuildslaveq NX openstackq Xlatent buildslavesq NXsetting up libvirtqNX6configure the master with an openstacklatentbuildslaveqNXwhen-buildslaves-go-missingqXconfiguring your masterqNX5amazon web services elastic compute cloud ("aws ec2")qNXconfiguring your base imageqNX buildslavesqXcreate an imageqNXmaster-slave tcp keepaliveqNX'openstack compute administration manualqXbuildslave optionsqNXget an aws ec2 accountqNXdangers with latent buildslavesqNX create an amiqNXec2 getting started guideqXlatent-buildslavesquUsubstitution_defsq}qUparse_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 q,XW/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-buildslaves.rstq-q.}q/bUexpect_referenced_by_nameq0}Utagnameq1Usectionq2U attributesq3}q4(Udupnamesq5]q6X buildslavesq7aUclassesq8]Ubackrefsq9]Uidsq:]q;(X cfg-slavesq]uUlineq?KUdocumentq@hUexpect_referenced_by_idqA}qBh]UrefidqHh]uh?Kh@hhI]qQcdocutils.nodes Text qRX BuildslavesqSqT}qU(h%hNh&hLubaubcdocutils.nodes paragraph qV)qW}qX(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+h.h1U paragraphqYh3}qZ(h5]h8]h9]h:]h>]uh?K h@hhI]q[(hRXThe q\q]}q^(h%XThe h&hWubcsphinx.addnodes pending_xref q_)q`}qa(h%X:bb:cfg:`slaves`qbh&hWh+h.h1U pending_xrefqch3}qd(UreftypeXcfgUrefwarnqeU reftargetqfXslavesU refdomainXbbqgh:]h9]U refexplicith5]h8]h>]UrefdocqhXmanual/cfg-buildslavesqiuh?K hI]qjcdocutils.nodes literal qk)ql}qm(h%hbh3}qn(h5]h8]qo(UxrefqphgXbb-cfgqqeh9]h:]h>]uh&h`hI]qrhRXslavesqsqt}qu(h%Uh&hlubah1UliteralqvubaubhRX configuration key specifies a list of known buildslaves. In the common case, each buildslave is defined by an instance of the qwqx}qy(h%X configuration key specifies a list of known buildslaves. In the common case, each buildslave is defined by an instance of the h&hWubh_)qz}q{(h%X:class:`BuildSlave`q|h&hWh+h.h1hch3}q}(UreftypeXclasshehfX BuildSlaveU refdomainXpyq~h:]h9]U refexplicith5]h8]h>]hhhiUpy:classqNU py:moduleqNuh?K hI]qhk)q}q(h%h|h3}q(h5]h8]q(hph~Xpy-classqeh9]h:]h>]uh&hzhI]qhRX BuildSlaveqq}q(h%Uh&hubah1hvubaubhRX 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&hWubeubhV)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&h(h+h.h1hYh3}q(h5]h8]h9]h:]h>]uh?Kh@hhI]q(hRXA qq}q(h%XA h&hubh_)q}q(h%X:class:`BuildSlave`qh&hh+h.h1hch3}q(UreftypeXclasshehfX BuildSlaveU refdomainXpyqh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?KhI]qhk)q}q(h%hh3}q(h5]h8]q(hphXpy-classqeh9]h:]h>]uh&hhI]qhRX BuildSlaveqq}q(h%Uh&hubah1hvubaubhRX instance is created with a qq}q(h%X instance is created with a h&hubhk)q}q(h%X ``slavename``h3}q(h5]h8]h9]h:]h>]uh&hhI]qhRX slavenameqq}q(h%Uh&hubah1hvubhRX and a qq}q(h%X and a h&hubhk)q}q(h%X``slavepassword``h3}q(h5]h8]h9]h:]h>]uh&hhI]qhRX slavepasswordqq}q(h%Uh&hubah1hvubhRXy. These are the same two values that need to be provided to the buildslave administrator when they create the buildslave.qq}q(h%Xy. These are the same two values that need to be provided to the buildslave administrator when they create the buildslave.h&hubeubhV)q}q(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.qh&h(h+h.h1hYh3}q(h5]h8]h9]h:]h>]uh?Kh@hhI]qhRXThe 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.qq}q(h%hh&hubaubhV)q}q(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&h(h+h.h1hYh3}q(h5]h8]h9]h:]h>]uh?Kh@hhI]q(hRXBuildslaves 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 qDžq}q(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&hubh_)q}q(h%X:ref:`Logfiles`qh&hh+h.h1hch3}q(UreftypeXrefhehfXlogfilesU refdomainXstdqh:]h9]U refexplicith5]h8]h>]hhhiuh?KhI]qcdocutils.nodes emphasis q)q}q(h%hh3}q(h5]h8]q(hphXstd-refqeh9]h:]h>]uh&hhI]qhRXLogfilesqׅq}q(h%Uh&hubah1UemphasisqubaubhRX).qۅq}q(h%X).h&hubeubhV)q}q(h%X0A configuration for two slaves would look like::qh&h(h+h.h1hYh3}q(h5]h8]h9]h:]h>]uh?Kh@hhI]qhRX/A configuration for two slaves would look like:qㅁq}q(h%X/A configuration for two slaves would look like:h&hubaubcdocutils.nodes literal_block q)q}q(h%Xfrom buildbot.buildslave import BuildSlave c['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd'), BuildSlave('bot-bsd', 'bsdpasswd'), ]h&h(h+h.h1U literal_blockqh3}q(U xml:spaceqUpreserveqh:]h9]h5]h8]h>]uh?Kh@hhI]qhRXfrom buildbot.buildslave import BuildSlave c['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd'), BuildSlave('bot-bsd', 'bsdpasswd'), ]qq}q(h%Uh&hubaubh')q}q(h%Uh&h(h+h.h1h2h3}q(h5]h8]h9]h:]qUbuildslave-optionsqah>]qhauh?K&h@hhI]q(hK)q}q(h%XBuildSlave Optionsqh&hh+h.h1hOh3}q(h5]h8]h9]h:]h>]uh?K&h@hhI]qhRXBuildSlave Optionsqq}q(h%hh&hubaubcsphinx.addnodes index r)r}r(h%Uh&hh+h.h1Uindexrh3}r(h:]h9]h5]h8]h>]Uentriesr]r(UsinglerXProperties; from buildslaveUindex-0rUtr aUinliner uh?K(h@hhI]ubhC)r }r (h%Uh&hh+h.h1hFh3}r (h:]h9]h5]h8]h>]hHjuh?K)h@hhI]ubhV)r}r(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&hh+h.h0}h1hYh3}r(h5]h8]h9]h:]rjah>]uh?K*h@hhA}rjj shI]r(h_)r}r(h%X:class:`BuildSlave`rh&jh+h.h1hch3}r(UreftypeXclasshehfX BuildSlaveU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?K*hI]rhk)r}r(h%jh3}r(h5]h8]r(hpjXpy-classreh9]h:]h>]uh&jhI]rhRX BuildSlaver r!}r"(h%Uh&jubah1hvubaubhRX. objects can also be created with an optional r#r$}r%(h%X. objects can also be created with an optional h&jubhk)r&}r'(h%X``properties``h3}r((h5]h8]h9]h:]h>]uh&jhI]r)hRX propertiesr*r+}r,(h%Uh&j&ubah1hvubhRXy argument, a dictionary specifying properties that will be available to any builds performed on this slave. For example:r-r.}r/(h%Xy argument, a dictionary specifying properties that will be available to any builds performed on this slave. For example:h&jubeubh)r0}r1(h%Xpc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', properties={ 'os':'solaris' }), ]h&hh+h.h1hh3}r2(hhh:]h9]h5]h8]h>]uh?K.h@hhI]r3hRXpc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', properties={ 'os':'solaris' }), ]r4r5}r6(h%Uh&j0ubaubj)r7}r8(h%Uh&hh+h.h1jh3}r9(h:]h9]h5]h8]h>]j]r:(jX"Build Slaves; limiting concurrencyUindex-1r;Utr<aj uh?K3h@hhI]ubhC)r=}r>(h%Uh&hh+h.h1hFh3}r?(h:]h9]h5]h8]h>]hHj;uh?K4h@hhI]ubhV)r@}rA(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&hh+h.h0}h1hYh3}rB(h5]h8]h9]h:]rCj;ah>]uh?K5h@hhA}rDj;j=shI]rE(hRXThe rFrG}rH(h%XThe h&j@ubh_)rI}rJ(h%X:class:`BuildSlave`rKh&j@h+h.h1hch3}rL(UreftypeXclasshehfX BuildSlaveU refdomainXpyrMh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?K5hI]rNhk)rO}rP(h%jKh3}rQ(h5]h8]rR(hpjMXpy-classrSeh9]h:]h>]uh&jIhI]rThRX BuildSlaverUrV}rW(h%Uh&jOubah1hvubaubhRX' constructor can also take an optional rXrY}rZ(h%X' constructor can also take an optional h&j@ubhk)r[}r\(h%X``max_builds``h3}r](h5]h8]h9]h:]h>]uh&j@hI]r^hRX max_buildsr_r`}ra(h%Uh&j[ubah1hvubhRXM parameter to limit the number of builds that it will execute simultaneously:rbrc}rd(h%XM parameter to limit the number of builds that it will execute simultaneously:h&j@ubeubh)re}rf(h%XLc['slaves'] = [ BuildSlave("bot-linux", "linuxpassword", max_builds=2) ]h&hh+h.h1hh3}rg(hhh:]h9]h5]h8]h>]uh?K9h@hhI]rhhRXLc['slaves'] = [ BuildSlave("bot-linux", "linuxpassword", max_builds=2) ]rirj}rk(h%Uh&jeubaubh')rl}rm(h%Uh&hh+h.h1h2h3}rn(h5]h8]h9]h:]roUmaster-slave-tcp-keepaliverpah>]rqhauh?K>h@hhI]rr(hK)rs}rt(h%XMaster-Slave TCP Keepaliveruh&jlh+h.h1hOh3}rv(h5]h8]h9]h:]h>]uh?K>h@hhI]rwhRXMaster-Slave TCP Keepaliverxry}rz(h%juh&jsubaubhV)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.r}h&jlh+h.h1hYh3}r~(h5]h8]h9]h:]h>]uh?K@h@hhI]rhRXBy 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%j}h&j{ubaubhV)r}r(h%X}The interval can be modified by specifying the interval in seconds using the ``keepalive_interval`` parameter of BuildSlave::h&jlh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KEh@hhI]r(hRXMThe 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&jubhk)r}r(h%X``keepalive_interval``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXkeepalive_intervalrr}r(h%Uh&jubah1hvubhRX parameter of BuildSlave:rr}r(h%X parameter of BuildSlave:h&jubeubh)r}r(h%Xfc['slaves'] = [ BuildSlave('bot-linux', 'linuxpasswd', keepalive_interval=3600), ]h&jlh+h.h1hh3}r(hhh:]h9]h5]h8]h>]uh?KHh@hhI]rhRXfc['slaves'] = [ BuildSlave('bot-linux', 'linuxpasswd', keepalive_interval=3600), ]rr}r(h%Uh&jubaubhV)r}r(h%XMThe interval can be set to ``None`` to disable this functionality altogether.h&jlh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KMh@hhI]r(hRXThe interval can be set to rr}r(h%XThe interval can be set to h&jubhk)r}r(h%X``None``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXNonerr}r(h%Uh&jubah1hvubhRX* to disable this functionality altogether.rr}r(h%X* to disable this functionality altogether.h&jubeubhC)r}r(h%X .. _When-Buildslaves-Go-Missing:h&jlh+h.h1hFh3}r(h:]h9]h5]h8]h>]hHUwhen-buildslaves-go-missingruh?KPh@hhI]ubeubh')r}r(h%Uh&hh+h.h0}rhjsh1h2h3}r(h5]h8]h9]h:]r(jUid2reh>]r(hheuh?KSh@hhA}rjjshI]r(hK)r}r(h%XWhen Buildslaves Go Missingrh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?KSh@hhI]rhRXWhen Buildslaves Go Missingrr}r(h%jh&jubaubhV)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.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KUh@hhI]rhRXSometimes, 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.rr}r(h%jh&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KZh@hhI]r(hRXIf 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 rr}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&jubhk)r}r(h%X``notify_on_missing=``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXnotify_on_missing=rr}r(h%Uh&jubah1hvubhRX argument to the rr}r(h%X argument to the h&jubh_)r}r(h%X:class:`BuildSlave`rh&jh+h.h1hch3}r(UreftypeXclasshehfX BuildSlaveU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?KZhI]rhk)r}r(h%jh3}r(h5]h8]r(hpjXpy-classreh9]h:]h>]uh&jhI]rhRX BuildSlaverr}r(h%Uh&jubah1hvubaubhRXO definition. This value can be a single email address, or a list of addresses:rr}r(h%XO definition. This value can be a single email address, or a list of addresses:h&jubeubh)r}r(h%Xvc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing="bob@example.com"), ]h&jh+h.h1hh3}r(hhh:]h9]h5]h8]h>]uh?K`h@hhI]rhRXvc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing="bob@example.com"), ]rr}r(h%Uh&jubaubhV)r}r(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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Keh@hhI]r(hRXBy 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 rr}r(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&jubhk)r}r(h%X``missing_timeout=``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXmissing_timeout=rr}r(h%Uh&jubah1hvubhRX7 and give it a number of seconds (the default is 3600).rr}r(h%X7 and give it a number of seconds (the default is 3600).h&jubeubhV)r}r(h%XzYou can have the buildmaster send email to multiple recipients: just provide a list of addresses instead of a single one::h&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kkh@hhI]rhRXyYou can have the buildmaster send email to multiple recipients: just provide a list of addresses instead of a single one:rr }r (h%XyYou can have the buildmaster send email to multiple recipients: just provide a list of addresses instead of a single one:h&jubaubh)r }r (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+h.h1hh3}r (hhh:]h9]h5]h8]h>]uh?Knh@hhI]rhRXc['slaves'] = [ BuildSlave('bot-solaris', 'solarispasswd', notify_on_missing=["bob@example.com", "alice@example.org"], missing_timeout=300, # notify after 5 minutes ), ]rr}r(h%Uh&j ubaubhV)r}r(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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kvh@hhI]r(hRX#The email sent this way will use a rr}r(h%X#The email sent this way will use a h&jubh_)r}r(h%X:class:`MailNotifier`rh&jh+h.h1hch3}r(UreftypeXclasshehfX MailNotifierU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?KvhI]rhk)r}r (h%jh3}r!(h5]h8]r"(hpjXpy-classr#eh9]h:]h>]uh&jhI]r$hRX MailNotifierr%r&}r'(h%Uh&jubah1hvubaubhRX (see r(r)}r*(h%X (see h&jubh_)r+}r,(h%X:bb:status:`MailNotifier`r-h&jh+h.h1hch3}r.(UreftypeXstatushehfX MailNotifierU refdomainXbbr/h:]h9]U refexplicith5]h8]h>]hhhiuh?KvhI]r0hk)r1}r2(h%j-h3}r3(h5]h8]r4(hpj/X bb-statusr5eh9]h:]h>]uh&j+hI]r6hRX MailNotifierr7r8}r9(h%Uh&j1ubah1hvubaubhRXR) status target, if one is configured. This provides a way for you to control the r:r;}r<(h%XR) status target, if one is configured. This provides a way for you to control the h&jubh)r=}r>(h%X*from*h3}r?(h5]h8]h9]h:]h>]uh&jhI]r@hRXfromrArB}rC(h%Uh&j=ubah1hubhRX5 address of the email, as well as the relayhost (aka rDrE}rF(h%X5 address of the email, as well as the relayhost (aka h&jubh)rG}rH(h%X *smarthost*h3}rI(h5]h8]h9]h:]h>]uh&jhI]rJhRX smarthostrKrL}rM(h%Uh&jGubah1hubhRX") to use as an SMTP server. If no rNrO}rP(h%X") to use as an SMTP server. If no h&jubh_)rQ}rR(h%X:class:`MailNotifier`rSh&jh+h.h1hch3}rT(UreftypeXclasshehfX MailNotifierU refdomainXpyrUh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?KvhI]rVhk)rW}rX(h%jSh3}rY(h5]h8]rZ(hpjUXpy-classr[eh9]h:]h>]uh&jQhI]r\hRX MailNotifierr]r^}r_(h%Uh&jWubah1hvubaubhRXm is configured on this buildmaster, the buildslave-missing emails will be sent using a default configuration.r`ra}rb(h%Xm is configured on this buildmaster, the buildslave-missing emails will be sent using a default configuration.h&jubeubhV)rc}rd(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+h.h1hYh3}re(h5]h8]h9]h:]h>]uh?K}h@hhI]rf(hRX Note that if you want to have a rgrh}ri(h%X Note that if you want to have a h&jcubh_)rj}rk(h%X:class:`MailNotifier`rlh&jch+h.h1hch3}rm(UreftypeXclasshehfX MailNotifierU refdomainXpyrnh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?K}hI]rohk)rp}rq(h%jlh3}rr(h5]h8]rs(hpjnXpy-classrteh9]h:]h>]uh&jjhI]ruhRX MailNotifierrvrw}rx(h%Uh&jpubah1hvubaubhRXV for buildslave-missing emails but not for regular build emails, just create one with ryrz}r{(h%XV for buildslave-missing emails but not for regular build emails, just create one with h&jcubhk)r|}r}(h%X``builders=[]``h3}r~(h5]h8]h9]h:]h>]uh&jchI]rhRX builders=[]rr}r(h%Uh&j|ubah1hvubhRX , as follows:rr}r(h%X , as follows:h&jcubeubh)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+h.h1hh3}r(hhh:]h9]h5]h8]h>]uh?Kh@hhI]rhRXWfrom 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+h.h1jh3}r(h:]h9]h5]h8]h>]j]r(jXBuildSlaves; latentUindex-2rUtraj uh?Kh@hhI]ubhC)r}r(h%Uh&jh+h.h1hFh3}r(h:]h9]h5]h8]h>]hHjuh?Kh@hhI]ubhC)r}r(h%X.. _Latent-Buildslaves:h&jh+h.h0}h1hFh3}r(h:]h9]h5]h8]h>]hHUlatent-buildslavesruh?Kh@hhA}rjjshI]ubeubeubh')r}r(h%Uh&h(h+h.h0}rhjsh1h2h3}r(h5]h8]h9]h:]r(jjUid3reh>]r(h heuh?Kh@hhA}r(jjjjuhI]r(hK)r}r(h%XLatent Buildslavesrh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRXLatent Buildslavesrr}r(h%jh&jubaubhV)r}r(h%XThe standard buildbot model has slaves started manually. The previous section described how to configure the master for this approach.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRXThe standard buildbot model has slaves started manually. The previous section described how to configure the master for this approach.rr}r(h%jh&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRXAnother 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&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRXThe 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+h.h1h2h3}r(h5]h8]h9]h:]rUcommon-optionsrah>]rhauh?Kh@hhI]r(hK)r}r(h%XCommon Optionsrh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRXCommon Optionsrr}r(h%jh&jubaubhV)r}r(h%X?The following options are available for all latent buildslaves.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRX?The following options are available for all latent buildslaves.rr}r(h%jh&jubaubcdocutils.nodes definition_list r)r}r(h%Uh&jh+h.h1Udefinition_listrh3}r(h5]h8]h9]h:]h>]uh?Nh@hhI]rcdocutils.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&jh+h.h1Udefinition_list_itemrh3}r(h5]h8]h9]h:]h>]uh?KhI]r(cdocutils.nodes term r)r}r(h%X``build_wait_timeout``rh&jh+h.h1Utermrh3}r(h5]h8]h9]h:]h>]uh?KhI]rhk)r}r(h%jh3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXbuild_wait_timeoutrr}r(h%Uh&jubah1hvubaubcdocutils.nodes definition r)r}r(h%Uh3}r(h5]h8]h9]h:]h>]uh&jhI]rhV)r}r(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.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KhI]rhRXThis 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.rr}r(h%jh&jubaubah1U definitionrubeubaubj)r}r(h%Uh&jh+h.h1jh3}r(h:]h9]h5]h8]h>]j]r((jXAWS EC2Uindex-3rUtr(jXBuildSlaves; AWS EC2jUtr ej uh?Kh@hhI]ubhC)r }r (h%Uh&jh+h.h1hFh3}r (h:]h9]h5]h8]h>]hHjuh?Kh@hhI]ubeubh')r }r(h%Uh&jh+h.h0}h1h2h3}r(h5]h8]h9]h:]r(U1amazon-web-services-elastic-compute-cloud-aws-ec2rjeh>]rhauh?Kh@hhA}rjj shI]r(hK)r}r(h%X5Amazon Web Services Elastic Compute Cloud ("AWS EC2")rh&j h+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRX5Amazon Web Services Elastic Compute Cloud ("AWS EC2")rr}r(h%jh&jubaubhV)r}r(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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]r (cdocutils.nodes reference r!)r"}r#(h%X#`EC2 `_h3}r$(UnameXEC2Urefurir%Xhttp://aws.amazon.com/ec2/r&h:]h9]h5]h8]h>]uh&jhI]r'hRXEC2r(r)}r*(h%Uh&j"ubah1U referencer+ubhC)r,}r-(h%X h*Kh&jh1hFh3}r.(Urefurij&h:]r/Uec2r0ah9]h5]h8]h>]r1h auhI]ubhRX 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.r2r3}r4(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&jubeubh')r5}r6(h%Uh&j h+h.h1h2h3}r7(h5]h8]h9]h:]r8Uget-an-aws-ec2-accountr9ah>]r:hauh?Kh@hhI]r;(hK)r<}r=(h%XGet an AWS EC2 Accountr>h&j5h+h.h1hOh3}r?(h5]h8]h9]h:]h>]uh?Kh@hhI]r@hRXGet an AWS EC2 AccountrArB}rC(h%j>h&j<ubaubhV)rD}rE(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:rFh&j5h+h.h1hYh3}rG(h5]h8]h9]h:]h>]uh?Kh@hhI]rHhRXTo 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:rIrJ}rK(h%jFh&jDubaubcdocutils.nodes block_quote rL)rM}rN(h%Uh&j5h+Nh1U block_quoterOh3}rP(h5]h8]h9]h:]h>]uh?Nh@hhI]rQcdocutils.nodes enumerated_list rR)rS}rT(h%Uh3}rU(UsuffixrVU.h:]h9]h5]UprefixrWUh8]h>]UenumtyperXUarabicrYuh&jMhI]rZ(cdocutils.nodes list_item r[)r\}r](h%XLGo to http://aws.amazon.com/ and click to "Sign Up Now" for an AWS account. h3}r^(h5]h8]h9]h:]h>]uh&jShI]r_hV)r`}ra(h%XKGo to http://aws.amazon.com/ and click to "Sign Up Now" for an AWS account.h&j\h+h.h1hYh3}rb(h5]h8]h9]h:]h>]uh?KhI]rc(hRXGo to rdre}rf(h%XGo to h&j`ubj!)rg}rh(h%Xhttp://aws.amazon.com/rih3}rj(Urefurijih:]h9]h5]h8]h>]uh&j`hI]rkhRXhttp://aws.amazon.com/rlrm}rn(h%Uh&jgubah1j+ubhRX/ and click to "Sign Up Now" for an AWS account.rorp}rq(h%X/ and click to "Sign Up Now" for an AWS account.h&j`ubeubah1U list_itemrrubj[)rs}rt(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. h3}ru(h5]h8]h9]h:]h>]uh&jShI]rvhV)rw}rx(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.ryh&jsh+h.h1hYh3}rz(h5]h8]h9]h:]h>]uh?KhI]r{hRXOnce 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.r|r}}r~(h%jyh&jwubaubah1jrubj[)r}r(h%XgYou must enter a valid credit card before you will be able to use EC2. Do that under 'Payment Method'. h3}r(h5]h8]h9]h:]h>]uh&jShI]rhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KhI]rhRXfYou must enter a valid credit card before you will be able to use EC2. Do that under 'Payment Method'.rr}r(h%jh&jubaubah1jrubj[)r}r(h%XoMake sure you're signed up for EC2 by going to 'Your Account'->'Account Activity' and verifying EC2 is listed. h3}r(h5]h8]h9]h:]h>]uh&jShI]rhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KhI]rhRXnMake sure you're signed up for EC2 by going to 'Your Account'->'Account Activity' and verifying EC2 is listed.rr}r(h%jh&jubaubah1jrubeh1Uenumerated_listrubaubeubh')r}r(h%Uh&j h+h.h1h2h3}r(h5]h8]h9]h:]rU create-an-amirah>]rhauh?Kh@hhI]r(hK)r}r(h%X Create an AMIrh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRX Create an AMIrr}r(h%jh&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRXNow 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&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]r(hRX;Creating an AMI is out of the scope of this document. The rr}r(h%X;Creating an AMI is out of the scope of this document. The h&jubj!)r}r(h%Xc`EC2 Getting Started Guide `_h3}r(UnameXEC2 Getting Started Guidej%XDhttp://docs.amazonwebservices.com/AWSEC2/latest/GettingStartedGuide/rh:]h9]h5]h8]h>]uh&jhI]rhRXEC2 Getting Started Guiderr}r(h%Uh&jubah1j+ubhC)r}r(h%XG h*Kh&jh1hFh3}r(Urefurijh:]rUec2-getting-started-guiderah9]h5]h8]h>]rhauhI]ubhRXD 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&jubeubjL)r}r(h%Uh&jh+Nh1jOh3}r(h5]h8]h9]h:]h>]uh?Nh@hhI]rcdocutils.nodes bullet_list r)r}r(h%Uh3}r(UbulletrX*h:]h9]h5]h8]h>]uh&jhI]r(j[)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`). h3}r(h5]h8]h9]h:]h>]uh&jhI]rhV)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&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KhI]r(hRXWhen an instance of the image starts, it needs to automatically start a buildbot slave that connects to your master (to create a buildbot slave, rr}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, h&jubh_)r}r(h%X:ref:`Creating-a-buildslave`rh&jh+h.h1hch3}r(UreftypeXrefhehfXcreating-a-buildslaveU refdomainXstdrh:]h9]U refexplicith5]h8]h>]hhhiuh?KhI]rh)r}r(h%jh3}r(h5]h8]r(hpjXstd-refreh9]h:]h>]uh&jhI]rhRXCreating-a-buildslaverr}r(h%Uh&jubah1hubaubhRX; to make a daemon, rr}r(h%X; to make a daemon, h&jubh_)r}r(h%X:ref:`Launching-the-daemons`rh&jh+h.h1hch3}r(UreftypeXrefhehfXlaunching-the-daemonsU refdomainXstdrh:]h9]U refexplicith5]h8]h>]hhhiuh?KhI]rh)r}r(h%jh3}r(h5]h8]r(hpjXstd-refreh9]h:]h>]uh&jhI]rhRXLaunching-the-daemonsrr}r(h%Uh&jubah1hubaubhRX).rr}r(h%X).h&jubeubah1jrubj[)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. h3}r(h5]h8]h9]h:]h>]uh&jhI]rhV)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.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?KhI]rhRXYou 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 r }r (h%jh&jubaubah1jrubeh1U bullet_listr ubaubeubh')r }r(h%Uh&j h+h.h1h2h3}r(h5]h8]h9]h:]rU0configure-the-master-with-an-ec2latentbuildslaverah>]rh auh?Kh@hhI]r(hK)r}r(h%X0Configure the Master with an EC2LatentBuildSlaverh&j h+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]rhRX0Configure the Master with an EC2LatentBuildSlaverr}r(h%jh&jubaubhV)r}r(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.rh&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Kh@hhI]r hRXNow let's assume you have an AMI that should work with the EC2LatentBuildSlave. It's now time to set up your buildbot master configuration.r!r"}r#(h%jh&jubaubhV)r$}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&j h+h.h1hYh3}r&(h5]h8]h9]h:]h>]uh?Kh@hhI]r'(hRX: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&j$ubcdocutils.nodes title_reference r+)r,}r-(h%X`Access Key Id`h3}r.(h5]h8]h9]h:]h>]uh&j$hI]r/hRX Access Key Idr0r1}r2(h%Uh&j,ubah1Utitle_referencer3ubhRX and the r4r5}r6(h%X and the h&j$ubj+)r7}r8(h%X`Secret Access Key`h3}r9(h5]h8]h9]h:]h>]uh&j$hI]r:hRXSecret Access Keyr;r<}r=(h%Uh&j7ubah1j3ubhRX. 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:r>r?}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&j$ubeubjL)rA}rB(h%Uh&j h+Nh1jOh3}rC(h5]h8]h9]h:]h>]uh?Nh@hhI]rDj)rE}rF(h%Uh3}rG(jX*h:]h9]h5]h8]h>]uh&jAhI]rH(j[)rI}rJ(h%XWhile logged into your AWS account, find the "Access Identifiers" link (either on the left, or via "Your Account" -> "Access Identifiers". h3}rK(h5]h8]h9]h:]h>]uh&jEhI]rLhV)rM}rN(h%XWhile logged into your AWS account, find the "Access Identifiers" link (either on the left, or via "Your Account" -> "Access Identifiers".rOh&jIh+h.h1hYh3}rP(h5]h8]h9]h:]h>]uh?KhI]rQhRXWhile logged into your AWS account, find the "Access Identifiers" link (either on the left, or via "Your Account" -> "Access Identifiers".rRrS}rT(h%jOh&jMubaubah1jrubj[)rU}rV(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``\. h3}rW(h5]h8]h9]h:]h>]uh&jEhI]rXhV)rY}rZ(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&jUh+h.h1hYh3}r[(h5]h8]h9]h:]h>]uh?KhI]r\(hRXOn 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 r]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 h&jYubhk)r`}ra(h%X``identifier``h3}rb(h5]h8]h9]h:]h>]uh&jYhI]rchRX identifierrdre}rf(h%Uh&j`ubah1hvubhRX and the second one your rgrh}ri(h%X and the second one your h&jYubhk)rj}rk(h%X``secret_identifier``h3}rl(h5]h8]h9]h:]h>]uh&jYhI]rmhRXsecret_identifierrnro}rp(h%Uh&jjubah1hvubhRX.rq}rr(h%X\.h&jYubeubah1jrubeh1j ubaubhV)rs}rt(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&j h+h.h1hYh3}ru(h5]h8]h9]h:]h>]uh?Kh@hhI]rv(hRXDWhen 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 rwrx}ry(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&jsubhk)rz}r{(h%X ``m1.small``h3}r|(h5]h8]h9]h:]h>]uh&jshI]r}hRXm1.smallr~r}r(h%Uh&jzubah1hvubhRX, rr}r(h%X, h&jsubhk)r}r(h%X ``m1.large``h3}r(h5]h8]h9]h:]h>]uh&jshI]rhRXm1.largerr}r(h%Uh&jubah1hvubhRX, rr}r(h%X, h&jsubhk)r}r(h%X ``m1.xlarge``h3}r(h5]h8]h9]h:]h>]uh&jshI]rhRX m1.xlargerr}r(h%Uh&jubah1hvubhRX, rr}r(h%X, h&jsubhk)r}r(h%X ``c1.medium``h3}r(h5]h8]h9]h:]h>]uh&jshI]rhRX c1.mediumrr}r(h%Uh&jubah1hvubhRX, and rr}r(h%X, and h&jsubhk)r}r(h%X ``c1.xlarge``h3}r(h5]h8]h9]h:]h>]uh&jshI]rhRX c1.xlargerr}r(h%Uh&jubah1hvubhRX@; see the EC2 documentation for descriptions of these machines).rr}r(h%X@; see the EC2 documentation for descriptions of these machines).h&jsubeubhV)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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRXHere 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&jubaubh)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&j h+h.h1hh3}r(hhh:]h9]h5]h8]h>]uh?Mh@hhI]rhRXOfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', ami='ami-12345', identifier='publickey', secret_identifier='privatekey' )]rr}r(h%Uh&jubaubhV)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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?M h@hhI]r(hRXThe rr}r(h%XThe h&jubhk)r}r(h%X``ami``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXamirr}r(h%Uh&jubah1hvubhRX? 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&jubhk)r}r(h%X``identifier``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRX identifierrr}r(h%Uh&jubah1hvubhRX argument specifies the AWS rr}r(h%X argument specifies the AWS h&jubj+)r}r(h%X`Access Key Id`h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRX Access Key Idrr}r(h%Uh&jubah1j3ubhRX , and the rr}r(h%X , and the h&jubhk)r}r(h%X``secret_identifier``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXsecret_identifierrr}r(h%Uh&jubah1hvubhRX specifies the AWS rr}r(h%X specifies the AWS h&jubj+)r}r(h%X`Secret Access Key.`h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXSecret Access Key.rr}r(h%Uh&jubah1j3ubhRXM Both the AMI and the account information can be specified in alternate ways.rr}r(h%XM Both the AMI and the account information can be specified in alternate ways.h&jubeubcdocutils.nodes note r)r}r(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&j h+h.h1Unoterh3}r(h5]h8]h9]h:]h>]uh?Nh@hhI]rhV)r}r(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&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]r(hRXWhoever has your rr}r(h%XWhoever has your h&jubhk)r}r(h%X``identifier``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRX identifierrr}r(h%Uh&jubah1hvubhRX and rr}r (h%X and h&jubhk)r }r (h%X``secret_identifier``h3}r (h5]h8]h9]h:]h>]uh&jhI]r hRXsecret_identifierrr}r(h%Uh&j ubah1hvubhRX= 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.rr}r(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&jubeubaubhV)r}r(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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(hRXBy default, you can make an rr}r(h%XBy default, you can make an h&jubhk)r}r(h%Uh3}r(h:]h9]h5]h8]rXfileraUrolejh>]uh&jhI]r hRX.ec2r!r"}r#(h%X.ec2h&jubah1hvubhRXo directory in the home folder of the user running the buildbot master. In that directory, create a file called r$r%}r&(h%Xo directory in the home folder of the user running the buildbot master. In that directory, create a file called h&jubhk)r'}r((h%Uh3}r)(h:]h9]h5]h8]r*Xfiler+aUrolej+h>]uh&jhI]r,hRXaws_idr-r.}r/(h%Xaws_idh&j'ubah1hvubhRX. 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.r0r1}r2(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&jubeubh)r3}r4(h%Xfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', ami='ami-12345')]h&j h+h.h1hh3}r5(hhh:]h9]h5]h8]h>]uh?Mh@hhI]r6hRXfrom buildbot.buildslave.ec2 import EC2LatentBuildSlave c['slaves'] = [EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', ami='ami-12345')]r7r8}r9(h%Uh&j3ubaubhV)r:}r;(h%XmIf you want to put the key information in another file, use the ``aws_id_file_path`` initialization argument.h&j h+h.h1hYh3}r<(h5]h8]h9]h:]h>]uh?M!h@hhI]r=(hRX@If you want to put the key information in another file, use the r>r?}r@(h%X@If you want to put the key information in another file, use the h&j:ubhk)rA}rB(h%X``aws_id_file_path``h3}rC(h5]h8]h9]h:]h>]uh&j:hI]rDhRXaws_id_file_pathrErF}rG(h%Uh&jAubah1hvubhRX initialization argument.rHrI}rJ(h%X initialization argument.h&j:ubeubhV)rK}rL(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.rMh&j h+h.h1hYh3}rN(h5]h8]h9]h:]h>]uh?M$h@hhI]rOhRXPrevious 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.rPrQ}rR(h%jMh&jKubaubhV)rS}rT(h%XjIn all cases, the AMI that sorts last by its location (the S3 bucket and manifest name) will be preferred.rUh&j h+h.h1hYh3}rV(h5]h8]h9]h:]h>]uh?M)h@hhI]rWhRXjIn all cases, the AMI that sorts last by its location (the S3 bucket and manifest name) will be preferred.rXrY}rZ(h%jUh&jSubaubhV)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&j h+h.h1hYh3}r](h5]h8]h9]h:]h>]uh?M,h@hhI]r^hRXOne 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).r_r`}ra(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&j[ubaubh)rb}rc(h%Xofrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', valid_ami_owners=[11111111111, 22222222222], identifier='publickey', secret_identifier='privatekey' )h&j h+h.h1hh3}rd(hhh:]h9]h5]h8]h>]uh?M0h@hhI]rehRXofrom buildbot.buildslave.ec2 import EC2LatentBuildSlave bot1 = EC2LatentBuildSlave('bot1', 'sekrit', 'm1.large', valid_ami_owners=[11111111111, 22222222222], identifier='publickey', secret_identifier='privatekey' )rfrg}rh(h%Uh&jbubaubhV)ri}rj(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&j h+h.h1hYh3}rk(h5]h8]h9]h:]h>]uh?M8h@hhI]rlhRXThe 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).rmrn}ro(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&jiubaubh)rp}rq(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&j h+h.h1hh3}rr(hhh:]h9]h5]h8]h>]uh?M;h@hhI]rshRXfrom 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')rtru}rv(h%Uh&jpubaubhV)rw}rx(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&j h+h.h1hYh3}ry(h5]h8]h9]h:]h>]uh?MAh@hhI]rzhRXThe regular expression can specify a group, which will be preferred for the sorting. Only the first group is used; subsequent groups are ignored.r{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&jwubaubh)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&j h+h.h1hh3}r(hhh:]h9]h5]h8]h>]uh?MDh@hhI]rhRXfrom 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&j~ubaubhV)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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MJh@hhI]rhRXbIf 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&jubaubh)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&j h+h.h1hh3}r(hhh:]h9]h5]h8]h>]uh?MMh@hhI]rhRXfrom 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&jubaubhV)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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MSh@hhI]r(hRXZIn 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&jubhk)r}r(h%X``elastic_ip``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRX elastic_iprr}r(h%Uh&jubah1hvubhRX argument.rr}r(h%X argument.h&jubeubh)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&j h+h.h1hh3}r(hhh:]h9]h5]h8]h>]uh?MYh@hhI]rhRXfrom 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&jubaubhV)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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mah@hhI]r(hRXThe rr}r(h%XThe h&jubh_)r}r(h%X:class:`EC2LatentBuildSlave`rh&jh+h.h1hch3}r(UreftypeXclasshehfXEC2LatentBuildSlaveU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?MahI]rhk)r}r(h%jh3}r(h5]h8]r(hpjXpy-classreh9]h:]h>]uh&jhI]rhRXEC2LatentBuildSlaverr}r(h%Uh&jubah1hvubaubhRX4 supports all other configuration from the standard rr}r(h%X4 supports all other configuration from the standard h&jubh_)r}r(h%X:class:`BuildSlave`rh&jh+h.h1hch3}r(UreftypeXclasshehfX BuildSlaveU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?MahI]rhk)r}r(h%jh3}r(h5]h8]r(hpjXpy-classreh9]h:]h>]uh&jhI]rhRX BuildSlaverr}r(h%Uh&jubah1hvubaubhRX. The rr}r(h%X. The h&jubhk)r}r(h%X``missing_timeout``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXmissing_timeoutrr}r(h%Uh&jubah1hvubhRX and rr}r(h%X and h&jubhk)r}r(h%X``notify_on_missing``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXnotify_on_missingrr}r(h%Uh&jubah1hvubhRX specify how long to wait for an EC2 instance to attach before considering the attempt to have failed, and email addresses to alert, respectively. rr}r(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&jubhk)r}r(h%X``missing_timeout``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXmissing_timeoutrr}r(h%Uh&jubah1hvubhRX defaults to 20 minutes.rr}r(h%X defaults to 20 minutes.h&jubeubhV)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&j h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mgh@hhI]r(hk)r}r(h%X``keypair_name``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRX keypair_namerr}r(h%Uh&jubah1hvubhRX and rr}r(h%X and h&jubhk)r}r(h%X``security_name``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRX security_namerr}r(h%Uh&jubah1hvubhRXV allow you to specify different names for these AWS EC2 values. They both default to r r }r (h%XV allow you to specify different names for these AWS EC2 values. They both default to h&jubhk)r }r (h%X``latent_buildbot_slave``h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXlatent_buildbot_slaverr}r(h%Uh&j ubah1hvubhRX.r}r(h%X.h&jubeubj)r}r(h%Uh&j h+h.h1jh3}r(h:]h9]h5]h8]h>]j]r((jXlibvirtUindex-4rUtr(jXBuildSlaves; libvirtjUtrej uh?Mjh@hhI]ubhC)r}r(h%Uh&j h+h.h1hFh3}r(h:]h9]h5]h8]h>]hHjuh?Mmh@hhI]ubeubeubh')r}r (h%Uh*Kh&jh+h.h0}h1h2h3}r!(h5]r"Xlibvirtr#ah8]h9]h:]r$(Ulibvirtr%jeh>]uh?Moh@hhA}r&jjshI]r'(hK)r(}r)(h%XLibvirtr*h&jh+h.h1hOh3}r+(h5]h8]h9]h:]h>]uh?Moh@hhI]r,hRXLibvirtr-r.}r/(h%j*h&j(ubaubhV)r0}r1(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+h.h1hYh3}r2(h5]h8]h9]h:]h>]uh?Mqh@hhI]r3(j!)r4}r5(h%X$`libvirt `_h3}r6(Unamej#j%Xhttp://www.libvirt.org/r7h:]h9]h5]h8]h>]uh&j0hI]r8hRXlibvirtr9r:}r;(h%Uh&j4ubah1j+ubhC)r<}r=(h%X h*Kh&j0h1hFh3}r>(Urefurij7h:]r?Uid4r@ah9]h5]h8]h>]rAj#auhI]ubhRX 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.rBrC}rD(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&j0ubeubhV)rE}rF(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.rGh&jh+h.h1hYh3}rH(h5]h8]h9]h:]h>]uh?Muh@hhI]rIhRXThis 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.rJrK}rL(h%jGh&jEubaubhV)rM}rN(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.rOh&jh+h.h1hYh3}rP(h5]h8]h9]h:]h>]uh?Mxh@hhI]rQhRXThe 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.rRrS}rT(h%jOh&jMubaubh')rU}rV(h%Uh&jh+h.h1h2h3}rW(h5]h8]h9]h:]rXUsetting-up-libvirtrYah>]rZhauh?M}h@hhI]r[(hK)r\}r](h%XSetting up libvirtr^h&jUh+h.h1hOh3}r_(h5]h8]h9]h:]h>]uh?M}h@hhI]r`hRXSetting up libvirtrarb}rc(h%j^h&j\ubaubhV)rd}re(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.rfh&jUh+h.h1hYh3}rg(h5]h8]h9]h:]h>]uh?Mh@hhI]rhhRXWe 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.rirj}rk(h%jfh&jdubaubjL)rl}rm(h%Uh&jUh+Nh1jOh3}rn(h5]h8]h9]h:]h>]uh?Nh@hhI]roj)rp}rq(h%Uh3}rr(jX*h:]h9]h5]h8]h>]uh&jlhI]rs(j[)rt}ru(h%XfIf you are running on Ubuntu, your master should run Lucid. Libvirt and apparmor are buggy on Karmic. h3}rv(h5]h8]h9]h:]h>]uh&jphI]rwhV)rx}ry(h%XeIf you are running on Ubuntu, your master should run Lucid. Libvirt and apparmor are buggy on Karmic.rzh&jth+h.h1hYh3}r{(h5]h8]h9]h:]h>]uh?MhI]r|hRXeIf you are running on Ubuntu, your master should run Lucid. Libvirt and apparmor are buggy on Karmic.r}r~}r(h%jzh&jxubaubah1jrubj[)r}r(h%XfIf you are using the system libvirt, your buildbot master user will need to be in the libvirtd group. h3}r(h5]h8]h9]h:]h>]uh&jphI]rhV)r}r(h%XeIf you are using the system libvirt, your buildbot master user will need to be in the libvirtd group.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]rhRXeIf you are using the system libvirt, your buildbot master user will need to be in the libvirtd group.rr}r(h%jh&jubaubah1jrubj[)r}r(h%XRIf you are using KVM, your buildbot master user will need to be in the KVM group. h3}r(h5]h8]h9]h:]h>]uh&jphI]rhV)r}r(h%XQIf you are using KVM, your buildbot master user will need to be in the KVM group.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]rhRXQIf you are using KVM, your buildbot master user will need to be in the KVM group.rr}r(h%jh&jubaubah1jrubj[)r}r(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? h3}r(h5]h8]h9]h:]h>]uh&jphI]rhV)r}r(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&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]r(hRX7You need to think carefully about your virtual network rr}r(h%X7You need to think carefully about your virtual network h&jubh)r}r(h%X*first*h3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXfirstrr}r(h%Uh&jubah1hubhRX[. 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&jubeubah1jrubeh1j ubaubeubh')r}r(h%Uh&jh+h.h1h2h3}r(h5]h8]h9]h:]rUconfiguring-your-base-imagerah>]rhauh?Mh@hhI]r(hK)r}r(h%XConfiguring your base imagerh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRXConfiguring your base imagerr}r(h%jh&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRXYou 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&jubaubhV)r}r(h%XWBecause this image may need updating a lot, we strongly suggest scripting its creation.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRXWBecause this image may need updating a lot, we strongly suggest scripting its creation.rr}r(h%jh&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRX#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&jubaubhV)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+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(hRXHDoing 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&jubhk)r}r(h%Uh3}r(h:]h9]h5]h8]rXfileraUrolejh>]uh&jhI]rhRX vmbuilderrr}r(h%X vmbuilderh&jubah1hvubhRX script and a rr}r(h%X script and a h&jubhk)r}r(h%Uh3}r(h:]h9]h5]h8]rXfileraUrolejh>]uh&jhI]rhRX network.xmlrr}r(h%X network.xmlh&jubah1hvubhRX& file to create such a DHCP server in rr}r(h%X& file to create such a DHCP server in h&jubhk)r}r(h%Uh3}r(h:]h9]h5]h8]rXfileraUrolejh>]uh&jhI]rhRXcontrib/rr}r(h%Xcontrib/h&jubah1hvubhRX (rr}r(h%X (h&jubh_)r}r(h%X:ref:`Contrib-Scripts`rh&jh+h.h1hch3}r(UreftypeXrefhehfXcontrib-scriptsU refdomainXstdrh:]h9]U refexplicith5]h8]h>]hhhiuh?MhI]rh)r}r(h%jh3}r(h5]h8]r(hpjXstd-refr eh9]h:]h>]uh&jhI]r hRXContrib-Scriptsr r }r (h%Uh&jubah1hubaubhRX) that should get you started:rr}r(h%X) that should get you started:h&jubeubh)r}r(h%XEsudo apt-get install ubuntu-vm-builder sudo contrib/libvirt/vmbuilderh&jh+h.h1hh3}r(UlinenosrUlanguagerXbashhhh:]h9]h5]h8]h>]uh?Mh@hhI]rhRXEsudo apt-get install ubuntu-vm-builder sudo contrib/libvirt/vmbuilderrr}r(h%Uh&jubaubhV)r}r(h%XDShould create an :file:`ubuntu/` folder with a suitable image in it.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(hRXShould create an rr }r!(h%XShould create an h&jubhk)r"}r#(h%Uh3}r$(h:]h9]h5]h8]r%Xfiler&aUrolej&h>]uh&jhI]r'hRXubuntu/r(r)}r*(h%Xubuntu/h&j"ubah1hvubhRX$ folder with a suitable image in it.r+r,}r-(h%X$ folder with a suitable image in it.h&jubeubh)r.}r/(h%XMvirsh net-define contrib/libvirt/network.xml virsh net-start buildbot-networkh&jh+h.h1hh3}r0(jjXnonehhh:]h9]h5]h8]h>]uh?Mh@hhI]r1hRXMvirsh net-define contrib/libvirt/network.xml virsh net-start buildbot-networkr2r3}r4(h%Uh&j.ubaubhV)r5}r6(h%XPShould set up a KVM compatible libvirt network for your buildbot VM's to run on.r7h&jh+h.h1hYh3}r8(h5]h8]h9]h:]h>]uh?Mh@hhI]r9hRXPShould set up a KVM compatible libvirt network for your buildbot VM's to run on.r:r;}r<(h%j7h&j5ubaubeubh')r=}r>(h%Uh&jh+h.h1h2h3}r?(h5]h8]h9]h:]r@Uconfiguring-your-masterrAah>]rBhauh?Mh@hhI]rC(hK)rD}rE(h%XConfiguring your MasterrFh&j=h+h.h1hOh3}rG(h5]h8]h9]h:]h>]uh?Mh@hhI]rHhRXConfiguring your MasterrIrJ}rK(h%jFh&jDubaubhV)rL}rM(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&j=h+h.h1hYh3}rN(h5]h8]h9]h:]h>]uh?Mh@hhI]rO(hRXlIf you want to add a simple on demand VM to your setup, you only need the following. We set the username to rPrQ}rR(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&jLubhk)rS}rT(h%X ``minion1``h3}rU(h5]h8]h9]h:]h>]uh&jLhI]rVhRXminion1rWrX}rY(h%Uh&jSubah1hvubhRX, the password to rZr[}r\(h%X, the password to h&jLubhk)r]}r^(h%X ``sekrit``h3}r_(h5]h8]h9]h:]h>]uh&jLhI]r`hRXsekritrarb}rc(h%Uh&j]ubah1hvubhRX. The base image is called rdre}rf(h%X. The base image is called h&jLubhk)rg}rh(h%X``base_image``h3}ri(h5]h8]h9]h:]h>]uh&jLhI]rjhRX base_imagerkrl}rm(h%Uh&jgubah1hvubhRX 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.rnro}rp(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&jLubeubh)rq}rr(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&j=h+h.h1hh3}rs(hhh:]h9]h5]h8]h>]uh?Mh@hhI]rthRXfrom buildbot.buildslave.libvirt import LibVirtSlave, Connection c['slaves'] = [LibVirtSlave('minion1', 'sekrit', Connection("qemu:///session"), '/home/buildbot/images/minion1', '/home/buildbot/images/base_image')]rurv}rw(h%Uh&jqubaubhV)rx}ry(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&j=h+h.h1hYh3}rz(h5]h8]h9]h:]h>]uh?Mh@hhI]r{(hRX#You can use virt-manager to define r|r}}r~(h%X#You can use virt-manager to define h&jxubhk)r}r(h%X ``minion1``h3}r(h5]h8]h9]h:]h>]uh&jxhI]rhRXminion1rr}r(h%Uh&jubah1hvubhRXW with the correct hardware. If you don't, buildbot won't be able to find a VM to start.rr}r(h%XW with the correct hardware. If you don't, buildbot won't be able to find a VM to start.h&jxubeubhV)r}r(h%X6:class:`LibVirtSlave` accepts the following arguments:rh&j=h+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(h_)r}r(h%X:class:`LibVirtSlave`rh&jh+h.h1hch3}r(UreftypeXclasshehfX LibVirtSlaveU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?MhI]rhk)r}r(h%jh3}r(h5]h8]r(hpjXpy-classreh9]h:]h>]uh&jhI]rhRX LibVirtSlaverr}r(h%Uh&jubah1hvubaubhRX! accepts the following arguments:rr}r(h%X! accepts the following arguments:h&jubeubj)r}r(h%Uh&j=h+h.h1jh3}r(h5]h8]h9]h:]h>]uh?Nh@hhI]r(j)r}r(h%XG``name`` Both a buildbot username and the name of the virtual machine. h&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?MhI]r(j)r}r(h%X``name``rh&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?MhI]rhk)r}r(h%jh3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXnamerr}r(h%Uh&jubah1hvubaubj)r}r(h%Uh3}r(h5]h8]h9]h:]h>]uh&jhI]rhV)r}r(h%X=Both a buildbot username and the name of the virtual machine.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]rhRX=Both a buildbot username and the name of the virtual machine.rr}r(h%jh&jubaubah1jubeubj)r}r(h%XF``password`` A password for the buildbot to login to the master with. h&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(j)r}r(h%X ``password``rh&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?MhI]rhk)r}r(h%jh3}r(h5]h8]h9]h:]h>]uh&jhI]rhRXpasswordrr}r(h%Uh&jubah1hvubaubj)r}r(h%Uh3}r(h5]h8]h9]h:]h>]uh&jhI]rhV)r}r(h%X8A password for the buildbot to login to the master with.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]rhRX8A password for the buildbot to login to the master with.rr}r(h%jh&jubaubah1jubeubj)r}r(h%XL``connection`` :class:`Connection` instance wrapping connection to libvirt. h&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(j)r}r(h%X``connection``rh&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?MhI]rhk)r}r(h%jh3}r(h5]h8]h9]h:]h>]uh&jhI]rhRX connectionrr}r(h%Uh&jubah1hvubaubj)r}r(h%Uh3}r(h5]h8]h9]h:]h>]uh&jhI]rhV)r}r(h%X<:class:`Connection` instance wrapping connection to libvirt.h&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]r(h_)r}r(h%X:class:`Connection`rh&jh+h.h1hch3}r(UreftypeXclasshehfX ConnectionU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?MhI]rhk)r}r(h%jh3}r(h5]h8]r(hpjXpy-classreh9]h:]h>]uh&jhI]rhRX Connectionrr}r(h%Uh&jubah1hvubaubhRX) instance wrapping connection to libvirt.rr}r(h%X) instance wrapping connection to libvirt.h&jubeubah1jubeubj)r}r(h%XX``hd_image`` The path to a libvirt disk image, normally in qcow2 format when using KVM. h&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r (j)r }r (h%X ``hd_image``r h&jh+h.h1jh3}r (h5]h8]h9]h:]h>]uh?MhI]rhk)r}r(h%j h3}r(h5]h8]h9]h:]h>]uh&j hI]rhRXhd_imagerr}r(h%Uh&jubah1hvubaubj)r}r(h%Uh3}r(h5]h8]h9]h:]h>]uh&jhI]rhV)r}r(h%XJThe path to a libvirt disk image, normally in qcow2 format when using KVM.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?MhI]rhRXJThe path to a libvirt disk image, normally in qcow2 format when using KVM.rr }r!(h%jh&jubaubah1jubeubj)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&jh+h.h1jh3}r$(h5]h8]h9]h:]h>]uh?Mh@hhI]r%(j)r&}r'(h%X``base_image``r(h&j"h+h.h1jh3}r)(h5]h8]h9]h:]h>]uh?MhI]r*hk)r+}r,(h%j(h3}r-(h5]h8]h9]h:]h>]uh&j&hI]r.hRX base_imager/r0}r1(h%Uh&j+ubah1hvubaubj)r2}r3(h%Uh3}r4(h5]h8]h9]h:]h>]uh&j"hI]r5hV)r6}r7(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.r8h&j2h+h.h1hYh3}r9(h5]h8]h9]h:]h>]uh?MhI]r:hRXIf 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%j8h&j6ubaubah1jubeubj)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&jh+h.h1jh3}r@(h5]h8]h9]h:]h>]uh?Mh@hhI]rA(j)rB}rC(h%X``xml``rDh&j>h+h.h1jh3}rE(h5]h8]h9]h:]h>]uh?MhI]rFhk)rG}rH(h%jDh3}rI(h5]h8]h9]h:]h>]uh&jBhI]rJhRXxmlrKrL}rM(h%Uh&jGubah1hvubaubj)rN}rO(h%Uh3}rP(h5]h8]h9]h:]h>]uh&j>hI]rQhV)rR}rS(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&jNh+h.h1hYh3}rT(h5]h8]h9]h:]h>]uh?MhI]rU(hRX_If a VM isn't predefined in virt-manager, then you can instead provide XML like that used with rVrW}rX(h%X_If a VM isn't predefined in virt-manager, then you can instead provide XML like that used with h&jRubhk)rY}rZ(h%X``virsh define``h3}r[(h5]h8]h9]h:]h>]uh&jRhI]r\hRX virsh definer]r^}r_(h%Uh&jYubah1hvubhRX]. The VM will be created automatically when needed, and destroyed when not needed any longer.r`ra}rb(h%X]. The VM will be created automatically when needed, and destroyed when not needed any longer.h&jRubeubah1jubeubeubeubeubh')rc}rd(h%Uh*Kh&jh+h.h1h2h3}re(h5]rfX openstackrgah8]h9]h:]rhU openstackriah>]uh?Mh@hhI]rj(hK)rk}rl(h%X OpenStackrmh&jch+h.h1hOh3}rn(h5]h8]h9]h:]h>]uh?Mh@hhI]rohRX OpenStackrprq}rr(h%jmh&jkubaubhV)rs}rt(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&jch+h.h1hYh3}ru(h5]h8]h9]h:]h>]uh?Mh@hhI]rv(j!)rw}rx(h%X$`OpenStack `_h3}ry(UnameX OpenStackj%Xhttp://openstack.org/rzh:]h9]h5]h8]h>]uh&jshI]r{hRX OpenStackr|r}}r~(h%Uh&jwubah1j+ubhC)r}r(h%X h*Kh&jsh1hFh3}r(Urefurijzh:]rUid5rah9]h5]h8]h>]rjgauhI]ubhRX 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.rr}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&jsubeubh')r}r(h%Uh&jch+h.h1h2h3}r(h5]h8]h9]h:]rU$get-an-account-in-an-openstack-cloudrah>]rhauh?Mh@hhI]r(hK)r}r(h%X$Get an Account in an OpenStack cloudrh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRX$Get an Account in an OpenStack cloudrr}r(h%jh&jubaubhV)r}r(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.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRXSetting 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}r(h%jh&jubaubeubh')r}r(h%Uh&jch+h.h1h2h3}r(h5]h8]h9]h:]rUcreate-an-imagerah>]rhauh?Mh@hhI]r(hK)r}r(h%XCreate an Imagerh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRXCreate an Imagerr}r(h%jh&jubaubhV)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&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(hRXOpenStack supports a large number of image formats. OpenStack maintains a short list of prebuilt images; if the desired image is not listed, The rr}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&jubj!)r}r(h%Xw`OpenStack Compute Administration Manual `_h3}r(UnameX'OpenStack Compute Administration Manualj%XJhttp://docs.openstack.org/trunk/openstack-compute/admin/content/index.htmlrh:]h9]h5]h8]h>]uh&jhI]rhRX'OpenStack Compute Administration Manualrr}r(h%Uh&jubah1j+ubhC)r}r(h%XM h*Kh&jh1hFh3}r(Urefurijh:]rU'openstack-compute-administration-manualrah9]h5]h8]h>]rhauhI]ubhRX 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.rr}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&jubeubeubh')r}r(h%Uh&jch+h.h1h2h3}r(h5]h8]h9]h:]rU6configure-the-master-with-an-openstacklatentbuildslaverah>]rhauh?Mh@hhI]r(hK)r}r(h%X6Configure the Master with an OpenStackLatentBuildSlaverh&jh+h.h1hOh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRX6Configure the Master with an OpenStackLatentBuildSlaverr}r(h%jh&jubaubhV)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.rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]rhRXWith 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.rr}r(h%jh&jubaubhV)r}r(h%XC:class:`OpenStackLatentBuildSlave` accepts the following arguments:rh&jh+h.h1hYh3}r(h5]h8]h9]h:]h>]uh?Mh@hhI]r(h_)r}r(h%X":class:`OpenStackLatentBuildSlave`rh&jh+h.h1hch3}r(UreftypeXclasshehfXOpenStackLatentBuildSlaveU refdomainXpyrh:]h9]U refexplicith5]h8]h>]hhhihNhNuh?MhI]rhk)r}r(h%jh3}r(h5]h8]r(hpjXpy-classreh9]h:]h>]uh&jhI]rhRXOpenStackLatentBuildSlaverr}r(h%Uh&jubah1hvubaubhRX! accepts the following arguments:rr}r(h%X! accepts the following arguments:h&jubeubj)r}r(h%Uh&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?Nh@hhI]r(j)r}r(h%X``name`` The buildslave name. h&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?MhI]r(j)r}r(h%X``name``rh&jh+h.h1jh3}r(h5]h8]h9]h:]h>]uh?MhI]r hk)r }r (h%jh3}r (h5]h8]h9]h:]h>]uh&jhI]r hRXnamer r }r (h%Uh&j ubah1hvubaubj)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&jhI]r hV)r }r (h%XThe buildslave name.r h&j h+h.h1hYh3}r (h5]h8]h9]h:]h>]uh?MhI]r hRXThe buildslave name.r r }r (h%j h&j ubaubah1jubeubj)r }r (h%XH``password`` A password for the buildslave to login to the master with. h&jh+h.h1jh3}r (h5]h8]h9]h:]h>]uh?Mh@hhI]r (j)r }r (h%X ``password``r h&j h+h.h1jh3}r (h5]h8]h9]h:]h>]uh?MhI]r hk)r }r (h%j h3}r (h5]h8]h9]h:]h>]uh&j hI]r hRXpasswordr! r" }r# (h%Uh&j ubah1hvubaubj)r$ }r% (h%Uh3}r& (h5]h8]h9]h:]h>]uh&j hI]r' hV)r( }r) (h%X:A password for the buildslave to login to the master with.r* h&j$ h+h.h1hYh3}r+ (h5]h8]h9]h:]h>]uh?MhI]r, hRX:A password for the buildslave to login to the master with.r- r. }r/ (h%j* h&j( ubaubah1jubeubj)r0 }r1 (h%X2``flavor`` The flavor ID to use for the instance. h&jh+h.h1jh3}r2 (h5]h8]h9]h:]h>]uh?Mh@hhI]r3 (j)r4 }r5 (h%X ``flavor``r6 h&j0 h+h.h1jh3}r7 (h5]h8]h9]h:]h>]uh?MhI]r8 hk)r9 }r: (h%j6 h3}r; (h5]h8]h9]h:]h>]uh&j4 hI]r< hRXflavorr= r> }r? (h%Uh&j9 ubah1hvubaubj)r@ }rA (h%Uh3}rB (h5]h8]h9]h:]h>]uh&j0 hI]rC hV)rD }rE (h%X&The flavor ID to use for the instance.rF h&j@ h+h.h1hYh3}rG (h5]h8]h9]h:]h>]uh?MhI]rH hRX&The flavor ID to use for the instance.rI rJ }rK (h%jF h&jD ubaubah1jubeubj)rL }rM (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&jh+h.h1jh3}rN (h5]h8]h9]h:]h>]uh?Mh@hhI]rO (j)rP }rQ (h%X ``image``rR h&jL h+h.h1jh3}rS (h5]h8]h9]h:]h>]uh?MhI]rT hk)rU }rV (h%jR h3}rW (h5]h8]h9]h:]h>]uh&jP hI]rX hRXimagerY rZ }r[ (h%Uh&jU ubah1hvubaubj)r\ }r] (h%Uh3}r^ (h5]h8]h9]h:]h>]uh&jL hI]r_ hV)r` }ra (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.rb h&j\ h+h.h1hYh3}rc (h5]h8]h9]h:]h>]uh?MhI]rd hRXA 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.re rf }rg (h%jb h&j` ubaubah1jubeubeubhV)rh }ri (h%X``os_username``rj h&jh+h.h1hYh3}rk (h5]h8]h9]h:]h>]uh?Mh@hhI]rl hk)rm }rn (h%jj h3}ro (h5]h8]h9]h:]h>]uh&jh hI]rp hRX os_usernamerq rr }rs (h%Uh&jm ubah1hvubaubhV)rt }ru (h%X``os_password``rv h&jh+h.h1hYh3}rw (h5]h8]h9]h:]h>]uh?Mh@hhI]rx hk)ry }rz (h%jv h3}r{ (h5]h8]h9]h:]h>]uh&jt hI]r| hRX os_passwordr} r~ }r (h%Uh&jy ubah1hvubaubhV)r }r (h%X``os_tenant_name``r h&jh+h.h1hYh3}r (h5]h8]h9]h:]h>]uh?Mh@hhI]r hk)r }r (h%j h3}r (h5]h8]h9]h:]h>]uh&j hI]r hRXos_tenant_namer r }r (h%Uh&j ubah1hvubaubj)r }r (h%Uh&jh+h.h1jh3}r (h5]h8]h9]h:]h>]uh?Nh@hhI]r (j)r }r (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&j h+h.h1jh3}r (h5]h8]h9]h:]h>]uh?M hI]r (j)r }r (h%X``os_auth_url``r h&j h+h.h1jh3}r (h5]h8]h9]h:]h>]uh?M hI]r hk)r }r (h%j h3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX os_auth_urlr r }r (h%Uh&j ubah1hvubaubj)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hV)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&j h+h.h1hYh3}r (h5]h8]h9]h:]h>]uh?MhI]r hRXThe 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 ubaubah1jubeubj)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&j h+h.h1jh3}r (h5]h8]h9]h:]h>]uh?M h@hhI]r (j)r }r (h%X``meta``r h&j h+h.h1jh3}r (h5]h8]h9]h:]h>]uh?M hI]r hk)r }r (h%j h3}r (h5]h8]h9]h:]h>]uh&j hI]r hRXmetar r }r (h%Uh&j ubah1hvubaubj)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hV)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+h.h1hYh3}r (h5]h8]h9]h:]h>]uh?M hI]r (hRXbA 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 ubhk)r }r (h%X ``metadata``h3}r (h5]h8]h9]h:]h>]uh&j hI]r hRXmetadatar r }r (h%Uh&j ubah1hvubhRX key from the metadata service.r r }r (h%X key from the metadata service.h&j ubeubah1jubeubeubhV)r }r (h%XNHere is the simplest example of configuring an OpenStack latent buildslave. ::r h&jh+h.h1hYh3}r (h5]h8]h9]h:]h>]uh?Mh@hhI]r hRXKHere 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 ubaubh)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&jh+h.h1hh3}r (hhh:]h9]h5]h8]h>]uh?Mh@hhI]r hRXgfrom 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 ubaubhV)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&jh+h.h1hYh3}r (h5]h8]h9]h:]h>]uh?Mh@hhI]r (hRXThe r r }r (h%XThe h&j ubhk)r }r (h%X ``image``h3}r (h5]h8]h9]h:]h>]uh&j hI]r hRXimager r }r (h%Uh&j ubah1hvubhRX 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 ubeubh)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&jh+h.h1hh3}r (hhh:]h9]h5]h8]h>]uh?Mh@hhI]r hRX.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 ubaubhV)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&jh+h.h1hYh3}r (h5]h8]h9]h:]h>]uh?M-h@hhI]r (h_)r }r (h%X":class:`OpenStackLatentBuildSlave`r h&j h+h.h1hch3}r (UreftypeXclasshehfXOpenStackLatentBuildSlaveU refdomainXpyr h:]h9]U refexplicith5]h8]h>]hhhihNhNuh?M-hI]r hk)r }r (h%j h3}r (h5]h8]r (hpj Xpy-classr eh9]h:]h>]uh&j hI]r hRXOpenStackLatentBuildSlaver r }r (h%Uh&j ubah1hvubaubhRX4 supports all other configuration from the standard r r }r (h%X4 supports all other configuration from the standard h&j ubh_)r }r (h%X:class:`BuildSlave`r h&j h+h.h1hch3}r (UreftypeXclasshehfX BuildSlaveU refdomainXpyr h:]h9]U refexplicith5]h8]h>]hhhihNhNuh?M-hI]r hk)r }r (h%j h3}r (h5]h8]r (hpj Xpy-classr eh9]h:]h>]uh&j hI]r hRX BuildSlaver r }r (h%Uh&j ubah1hvubaubhRX. The r r }r (h%X. The h&j ubhk)r }r! (h%X``missing_timeout``h3}r" (h5]h8]h9]h:]h>]uh&j hI]r# hRXmissing_timeoutr$ r% }r& (h%Uh&j ubah1hvubhRX and r' r( }r) (h%X and h&j ubhk)r* }r+ (h%X``notify_on_missing``h3}r, (h5]h8]h9]h:]h>]uh&j hI]r- hRXnotify_on_missingr. r/ }r0 (h%Uh&j* ubah1hvubhRX specify how long to wait for an OpenStack instance to attach before considering the attempt to have failed and email addresses to alert, respectively. r1 r2 }r3 (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 ubhk)r4 }r5 (h%X``missing_timeout``h3}r6 (h5]h8]h9]h:]h>]uh&j hI]r7 hRXmissing_timeoutr8 r9 }r: (h%Uh&j4 ubah1hvubhRX defaults to 20 minutes.r; r< }r= (h%X defaults to 20 minutes.h&j ubeubeubeubh')r> }r? (h%Uh&jh+h.h1h2h3}r@ (h5]h8]h9]h:]rA Udangers-with-latent-buildslavesrB ah>]rC hauh?M4h@hhI]rD (hK)rE }rF (h%XDangers with Latent BuildslavesrG h&j> h+h.h1hOh3}rH (h5]h8]h9]h:]h>]uh?M4h@hhI]rI hRXDangers with Latent BuildslavesrJ rK }rL (h%jG h&jE ubaubhV)rM }rN (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.rO h&j> h+h.h1hYh3}rP (h5]h8]h9]h:]h>]uh?M6h@hhI]rQ hRXpAny 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.rR rS }rT (h%jO h&jM ubaubhV)rU }rV (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.rW h&j> h+h.h1hYh3}rX (h5]h8]h9]h:]h>]uh?M@h@hhI]rY hRX}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.rZ r[ }r\ (h%jW h&jU ubaubeubeubeubh+h.h1Usystem_messager] h3}r^ (h5]UlevelKh:]h9]r_ h=aUsourceh.h8]h>]UlineKUtypeUINFOr` uh?Kh@hhI]ra hV)rb }rc (h%Uh3}rd (h5]h8]h9]h:]h>]uh&h#hI]re hRX.Duplicate implicit target name: "buildslaves".rf rg }rh (h%Uh&jb ubah1hYubaubh")ri }rj (h%Uh&jh+h.h1j] h3}rk (h5]UlevelKh:]h9]rl j@aUsourceh.h8]h>]UlineKUtypej` uh?Msh@hhI]rm hV)rn }ro (h%Uh3}rp (h5]h8]h9]h:]h>]uh&ji hI]rq hRX*Duplicate implicit target name: "libvirt".rr rs }rt (h%Uh&jn ubah1hYubaubh")ru }rv (h%Uh&jch+h.h1j] h3}rw (h5]UlevelKh:]h9]rx jaUsourceh.h8]h>]UlineKUtypej` uh?Mh@hhI]ry hV)rz }r{ (h%Uh3}r| (h5]h8]h9]h:]h>]uh&ju hI]r} hRX,Duplicate implicit target name: "openstack".r~ r }r (h%Uh&jz ubah1hYubaubeUcurrent_sourcer NU decorationr NUautofootnote_startr KUnameidsr }r (hjhjhjh j@h j0h jh jh jhjYhjhjhjAhjhjhU buildslavesr hjhjphjhhhj9hjB hjhjhjuhI]r (cdocutils.nodes comment r )r }r (h%X -*- rst -*-h&hh+h.h1Ucommentr h3}r (hhh:]h9]h5]h8]h>]uh?Kh@hhI]r hRX -*- rst -*-r r }r (h%Uh&j ubaubhC)r }r (h%X.. _Buildslaves:h&hh+h.h1hFh3}r (h5]h8]h9]h:]r j ah>]r hauh?Kh@hhI]ubj)r }r (h%Uh&hh+h.h1jh3}r (h:]h9]h5]h8]h>]Uentries]r ((UsingleXBuildmaster Config; slavesh]UlineKUtypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX1Hyperlink target "buildslaves" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineKUtypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX0Hyperlink target "cfg-slaves" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineK)Utypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX-Hyperlink target "index-0" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineK4Utypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX-Hyperlink target "index-1" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineKPUtypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRXAHyperlink target "when-buildslaves-go-missing" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineKUtypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX-Hyperlink target "index-2" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineKUtypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX8Hyperlink target "latent-buildslaves" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineKUtypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX-Hyperlink target "index-3" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] ubh")r }r (h%Uh3}r (h5]UlevelKh:]h9]Usourceh.h8]h>]UlineMmUtypej` uhI]r hV)r }r (h%Uh3}r (h5]h8]h9]h:]h>]uh&j hI]r hRX-Hyperlink target "index-4" is not referenced.r r }r (h%Uh&j ubah1hYubah1j] 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* NhONUerror_encoding_error_handlerr+ Ubackslashreplacer, Udebugr- NUembed_stylesheetr. Uoutput_encoding_error_handlerr/ Ustrictr0 U sectnum_xformr1 KUdump_transformsr2 NU docinfo_xformr3 KUwarning_streamr4 NUpep_file_url_templater5 Upep-%04dr6 Uexit_status_levelr7 KUconfigr8 NUstrict_visitorr9 NUcloak_email_addressesr: Utrim_footnote_reference_spacer; Uenvr< NUdump_pseudo_xmlr= NUexpose_internalsr> NUsectsubtitle_xformr? U source_linkr@ NUrfc_referencesrA NUoutput_encodingrB Uutf-8rC U source_urlrD NUinput_encodingrE U utf-8-sigrF U_disable_configrG NU id_prefixrH UU tab_widthrI KUerror_encodingrJ UUTF-8rK U_sourcerL UW/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-buildslaves.rstrM Ugettext_compactrN U generatorrO NUdump_internalsrP NU smart_quotesrQ U pep_base_urlrR Uhttp://www.python.org/dev/peps/rS Usyntax_highlightrT UlongrU Uinput_encoding_error_handlerrV j0 Uauto_id_prefixrW UidrX Udoctitle_xformrY Ustrip_elements_with_classesrZ NU _config_filesr[ ]Ufile_insertion_enabledr\ U raw_enabledr] KU dump_settingsr^ NubUsymbol_footnote_startr_ KUidsr` }ra (jj j j jjj0j,jYjUjijcjjj9j5jjj@j<jjjjjjh=h(jjjjj;j@jjjj jjjAj=h uUsubstitution_namesrb }rc h1h@h3}rd (h5]h:]h9]Usourceh.h8]h>]uU footnotesre ]rf Urefidsrg }rh (j]ri jaj]rj j ah<]rk hDaj]rl jaj]rm j aj;]rn j=aj]ro jaj]rp jauub.PKJtD&(c0<0<5buildbot-v0.8.8/.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.8/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.8/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.PKJtD:[27buildbot-v0.8.8/.doctrees/manual/cfg-schedulers.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XstringparameterqNXtry-schedulersqXnightly-schedulerqXnightlytriggerable schedulerq NXfixedparameterq NXdependent-schedulerq Xforcescheduler schedulerq NXcodebaseparameterq NX schedulersqXtriggerable schedulerqNXchange filtersqNXforcesched parametersqNXbuildslavechoiceparameterqNXconfiguring-schedulersqXconfiguring schedulersqNXscheduler-singlebranchschedulerqXchoicestringparameterqNX authorizationqNXforcescheduler-parametersqXanybranchschedulerqXinheritbuildparameterqNXusernameparameterqNX,buildbot.schedulers.timed.NightlyTriggerableqX textparameterqNXperiodic-schedulerqXperiodic schedulerqNX 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.}q/(U rawsourceq0UUparentq1cdocutils.nodes section q2)q3}q4(h0UU referencedq5Kh1hUsourceq6cdocutils.nodes reprunicode q7XV/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-schedulers.rstq8q9}q:bUexpect_referenced_by_nameq;}q}q?(h0X.. _Schedulers:h1hh6h9Utagnameq@UtargetqAU attributesqB}qC(UidsqD]UbackrefsqE]UdupnamesqF]UclassesqG]UnamesqH]UrefidqIU schedulersqJuUlineqKKUdocumentqLhUchildrenqM]ubsh@UsectionqNhB}qO(hF]qPX schedulersqQahG]hE]hD]qR(hJUid1qSehH]qThauhKKhLhUexpect_referenced_by_idqU}qVhJh>shM]qW(cdocutils.nodes title qX)qY}qZ(h0X Schedulersq[h1h3h6h9h@Utitleq\hB}q](hF]hG]hE]hD]hH]uhKKhLhhM]q^cdocutils.nodes Text q_X Schedulersq`qa}qb(h0h[h1hYubaubcdocutils.nodes paragraph qc)qd}qe(h0X=Schedulers are responsible for initiating builds on builders.qfh1h3h6h9h@U paragraphqghB}qh(hF]hG]hE]hD]hH]uhKKhLhhM]qih_X=Schedulers are responsible for initiating builds on builders.qjqk}ql(h0hfh1hdubaubhc)qm}qn(h0XSome 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.qoh1h3h6h9h@hghB}qp(hF]hG]hE]hD]hH]uhKK hLhhM]qqh_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.qrqs}qt(h0hoh1hmubaubh=)qu}qv(h0X.. _Configuring-Schedulers:h1h3h6h9h@hAhB}qw(hD]hE]hF]hG]hH]hIUconfiguring-schedulersqxuhKK hLhhM]ubh2)qy}qz(h0Uh1h3h6h9h;}q{hhush@hNhB}q|(hF]hG]hE]hD]q}(hxUid2q~ehH]q(hheuhKKhLhhU}qhxhushM]q(hX)q}q(h0XConfiguring Schedulersqh1hyh6h9h@h\hB}q(hF]hG]hE]hD]hH]uhKKhLhhM]qh_XConfiguring Schedulersqq}q(h0hh1hubaubcsphinx.addnodes index q)q}q(h0Uh1hyh6h9h@UindexqhB}q(hD]hE]hF]hG]hH]Uentries]q((UsingleXBuildmaster Config; schedulersXcfg-schedulersqhtq(UsingleXschedulers (Buildmaster Config)hhtqeuhKKhLhhM]ubh=)q}q(h0Uh1hyh6h9h@hAhB}q(hD]hE]hF]hG]hH]hIhuhKKhLhhM]ubhc)q}q(h0XoThe :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.h1hyh6h9h;}h@hghB}q(hF]hG]hE]hD]qhahH]uhKKhLhhU}qhhshM]q(h_XThe qq}q(h0XThe h1hubcsphinx.addnodes pending_xref q)q}q(h0X:bb:cfg:`schedulers`qh1hh6h9h@U pending_xrefqhB}q(UreftypeXcfgUrefwarnqU reftargetqX schedulersU refdomainXbbqhD]hE]U refexplicithF]hG]hH]UrefdocqXmanual/cfg-schedulersquhKKhM]qcdocutils.nodes literal q)q}q(h0hhB}q(hF]hG]q(UxrefqhXbb-cfgqehE]hD]hH]uh1hhM]qh_X schedulersqq}q(h0Uh1hubah@Uliteralqubaubh_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 qq}q(h0X 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 h1hubh)q}q(h0X:class:`SingleBranchScheduler`qh1hh6h9h@hhB}q(UreftypeXclasshhXSingleBranchSchedulerU refdomainXpyqhD]hE]U refexplicithF]hG]hH]hhUpy:classqNU py:moduleqNuhKKhM]qh)q}q(h0hhB}q(hF]hG]q(hhXpy-classqehE]hD]hH]uh1hhM]qh_XSingleBranchSchedulerqȅq}q(h0Uh1hubah@hubaubh_X and q˅q}q(h0X and h1hubh)q}q(h0X:class:`Periodic`qh1hh6h9h@hhB}q(UreftypeXclasshhXPeriodicU refdomainXpyqhD]hE]U refexplicithF]hG]hH]hhhNhNuhKKhM]qh)q}q(h0hhB}q(hF]hG]q(hhXpy-classqehE]hD]hH]uh1hhM]qh_XPeriodicqڅq}q(h0Uh1hubah@hubaubh_XY, but you can write a customized subclass to implement more complicated build scheduling.q݅q}q(h0XY, but you can write a customized subclass to implement more complicated build scheduling.h1hubeubhc)q}q(h0XnScheduler arguments should always be specified by name (as keyword arguments), to allow for future expansion::h1hyh6h9h@hghB}q(hF]hG]hE]hD]hH]uhKKhLhhM]qh_XmScheduler arguments should always be specified by name (as keyword arguments), to allow for future expansion:q䅁q}q(h0XmScheduler arguments should always be specified by name (as keyword arguments), to allow for future expansion:h1hubaubcdocutils.nodes literal_block q)q}q(h0XHsched = SingleBranchScheduler(name="quick", builderNames=['lin', 'win'])h1hyh6h9h@U literal_blockqhB}q(U xml:spaceqUpreserveqhD]hE]hF]hG]hH]uhKKhLhhM]qh_XHsched = SingleBranchScheduler(name="quick", builderNames=['lin', 'win'])qq}q(h0Uh1hubaubhc)q}q(h0XfThere are several common arguments for schedulers, although not all are available with all schedulers.qh1hyh6h9h@hghB}q(hF]hG]hE]hD]hH]uhKKhLhhM]qh_XfThere are several common arguments for schedulers, although not all are available with all schedulers.qq}q(h0hh1hubaubcdocutils.nodes definition_list q)q}q(h0Uh1hyh6h9h@Udefinition_listqhB}q(hF]hG]hE]hD]hH]uhKNhLhhM]q(cdocutils.nodes definition_list_item r)r}r(h0X``name`` Each Scheduler must have a unique name. This is used in status displays, and is also available in the build property ``scheduler``. h1hh6h9h@Udefinition_list_itemrhB}r(hF]hG]hE]hD]hH]uhKK$hM]r(cdocutils.nodes term r)r}r(h0X``name``r h1jh6h9h@Utermr hB}r (hF]hG]hE]hD]hH]uhKK$hM]r h)r }r(h0j hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xnamerr}r(h0Uh1j ubah@hubaubcdocutils.nodes definition r)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0XEach Scheduler must have a unique name. This is used in status displays, and is also available in the build property ``scheduler``.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKK#hM]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(h0XuEach Scheduler must have a unique name. This is used in status displays, and is also available in the build property h1jubh)r }r!(h0X ``scheduler``hB}r"(hF]hG]hE]hD]hH]uh1jhM]r#h_X schedulerr$r%}r&(h0Uh1j ubah@hubh_X.r'}r((h0X.h1jubeubah@U definitionr)ubeubj)r*}r+(h0Xz``builderNames`` This is the set of builders which this scheduler should trigger, specified as a list of names (strings). h1hh6h9h@jhB}r,(hF]hG]hE]hD]hH]uhKK(hLhhM]r-(j)r.}r/(h0X``builderNames``r0h1j*h6h9h@j hB}r1(hF]hG]hE]hD]hH]uhKK(hM]r2h)r3}r4(h0j0hB}r5(hF]hG]hE]hD]hH]uh1j.hM]r6h_X builderNamesr7r8}r9(h0Uh1j3ubah@hubaubj)r:}r;(h0UhB}r<(hF]hG]hE]hD]hH]uh1j*hM]r=hc)r>}r?(h0XhThis is the set of builders which this scheduler should trigger, specified as a list of names (strings).r@h1j:h6h9h@hghB}rA(hF]hG]hE]hD]hH]uhKK'hM]rBh_XhThis is the set of builders which this scheduler should trigger, specified as a list of names (strings).rCrD}rE(h0j@h1j>ubaubah@j)ubeubeubh)rF}rG(h0Uh1hyh6h9h@hhB}rH(hD]hE]hF]hG]hH]UentriesrI]rJ(UsinglerKXProperties; from schedulerUindex-0rLUtrMaUinlinerNuhKK*hLhhM]ubh=)rO}rP(h0Uh1hyh6h9h@hAhB}rQ(hD]hE]hF]hG]hH]hIjLuhKK+hLhhM]ubh)rR}rS(h0Uh1hyh6Nh;}h@hhB}rT(hF]hG]hE]hD]rUjLahH]uhKNhLhhU}rVjLjOshM]rW(j)rX}rY(h0X``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' ] }) h1jRh6h9h@jhB}rZ(hF]hG]hE]hD]hH]uhKK6hM]r[(j)r\}r](h0X``properties``r^h1jXh6h9h@j hB}r_(hF]hG]hE]hD]hH]uhKK6hM]r`h)ra}rb(h0j^hB}rc(hF]hG]hE]hD]hH]uh1j\hM]rdh_X propertiesrerf}rg(h0Uh1jaubah@hubaubj)rh}ri(h0UhB}rj(hF]hG]hE]hD]hH]uh1jXhM]rk(hc)rl}rm(h0X6This 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 exampleh1jhh6h9h@hghB}rn(hF]hG]hE]hD]hH]uhKK-hM]ro(h_XrThis is a dictionary specifying properties that will be transmitted to all builds started by this scheduler. The rprq}rr(h0XrThis is a dictionary specifying properties that will be transmitted to all builds started by this scheduler. The h1jlubh)rs}rt(h0X ``owner``hB}ru(hF]hG]hE]hD]hH]uh1jlhM]rvh_Xownerrwrx}ry(h0Uh1jsubah@hubh_Xv property may be of particular interest, as its contents (as a list) will be added to the list of "interested users" (rzr{}r|(h0Xv property may be of particular interest, as its contents (as a list) will be added to the list of "interested users" (h1jlubh)r}}r~(h0X:ref:`Doing-Things-With-Users`rh1jlh6h9h@hhB}r(UreftypeXrefhhXdoing-things-with-usersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKK-hM]rcdocutils.nodes emphasis r)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1j}hM]rh_XDoing-Things-With-Usersrr}r(h0Uh1jubah@Uemphasisrubaubh_X') for each triggered build. For examplerr}r(h0X') for each triggered build. For exampleh1jlubeubh)r}r(h0Xdsched = Scheduler(..., properties = { 'owner' : [ 'zorro@company.com', 'silver@company.com' ] })h1jhh6h9h@hhB}r(UlinenosrUlanguagerXpythonhhhD]hE]hF]hG]hH]uhKK3hM]rh_Xdsched = Scheduler(..., properties = { 'owner' : [ 'zorro@company.com', 'silver@company.com' ] })rr}r(h0Uh1jubaubeh@j)ubeubj)r}r(h0X9``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. h1jRh6h9h@jhB}r(hF]hG]hE]hD]hH]uhKK=hLhhM]r(j)r}r(h0X``fileIsImportant``rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKK=hM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XfileIsImportantrr}r(h0Uh1jubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X$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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKK9hM]r(h_XDA callable which takes one argument, a Change instance, and returns rr}r(h0XDA callable which takes one argument, a Change instance, and returns h1jubh)r}r(h0X``True``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XTruerr}r(h0Uh1jubah@hubh_X& if the change is worth building, and rr}r(h0X& if the change is worth building, and h1jubh)r}r(h0X ``False``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XFalserr}r(h0Uh1jubah@hubh_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(h0X 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.h1jubeubah@j)ubeubj)r}r(h0X``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. h1jRh6h9h@jhB}r(hF]hG]hE]hD]hH]uhKKFhLhhM]r(j)r}r(h0X``change_filter``rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKKFhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X change_filterrr}r(h0Uh1jubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0XThe 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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKK@hM]r(h_XVThe change filter that will determine which changes are recognized by this scheduler; rr}r(h0XVThe change filter that will determine which changes are recognized by this scheduler; h1jubh)r}r(h0X:ref:`Change-Filters`rh1jh6h9h@hhB}r(UreftypeXrefhhXchange-filtersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKK@hM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_XChange-Filtersrr}r(h0Uh1jubah@jubaubh_X$. Note that this is different from rr}r(h0X$. Note that this is different from h1jubh)r}r(h0X``fileIsImportant``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XfileIsImportantrr}r(h0Uh1jubah@hubh_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(h0X: 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.h1jubeubah@j)ubeubj)r}r(h0X``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. h1jRh6h9h@jhB}r(hF]hG]hE]hD]hH]uhKKchLhhM]r(j)r}r(h0X ``codebases``rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKKchM]rh)r }r (h0jhB}r (hF]hG]hE]hD]hH]uh1jhM]r h_X codebasesr r}r(h0Uh1j ubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]r(hc)r}r(h0XHWhen 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.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKIhM]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(h0jh1jubaubh)r}r(h0Xcodebases = {'codebase1': {'repository':'....', 'branch':'default', 'revision': None}, 'codebase2': {'repository':'....'} }h1jh6h9h@hhB}r(jjXpythonhhhD]hE]hF]hG]hH]uhKKOhM]rh_Xcodebases = {'codebase1': {'repository':'....', 'branch':'default', 'revision': None}, 'codebase2': {'repository':'....'} }r r!}r"(h0Uh1jubaubcdocutils.nodes important r#)r$}r%(h0X4``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.hB}r&(hF]hG]hE]hD]hH]uh1jhM]r'hc)r(}r)(h0X4``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.h1j$h6h9h@hghB}r*(hF]hG]hE]hD]hH]uhKKVhM]r+(h)r,}r-(h0X ``codebases``hB}r.(hF]hG]hE]hD]hH]uh1j(hM]r/h_X codebasesr0r1}r2(h0Uh1j,ubah@hubh_X{ behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in r3r4}r5(h0X{ behaves also like a change_filter on codebase. The scheduler will only process changes when their codebases are found in h1j(ubh)r6}r7(h0X ``codebases``hB}r8(hF]hG]hE]hD]hH]uh1j(hM]r9h_X codebasesr:r;}r<(h0Uh1j6ubah@hubh_X . By default r=r>}r?(h0X . By default h1j(ubh)r@}rA(h0X ``codebases``hB}rB(hF]hG]hE]hD]hH]uh1j(hM]rCh_X codebasesrDrE}rF(h0Uh1j@ubah@hubh_X is set to rGrH}rI(h0X is set to h1j(ubh)rJ}rK(h0X ``{'':{}}``hB}rL(hF]hG]hE]hD]hH]uh1j(hM]rMh_X{'':{}}rNrO}rP(h0Uh1jJubah@hubh_Xo which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler.rQrR}rS(h0Xo which means that only changes with codebase '' (default value for codebase) will be accepted by the scheduler.h1j(ubeubah@U importantrTubhc)rU}rV(h0XBuildsteps 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.rWh1jh6h9h@hghB}rX(hF]hG]hE]hD]hH]uhKK\hM]rYh_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.rZr[}r\(h0jWh1jUubaubeh@j)ubeubj)r]}r^(h0XA``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. h1jRh6h9h@jhB}r_(hF]hG]hE]hD]hH]uhKKlhLhhM]r`(j)ra}rb(h0X``onlyImportant``rch1j]h6h9h@j hB}rd(hF]hG]hE]hD]hH]uhKKlhM]reh)rf}rg(h0jchB}rh(hF]hG]hE]hD]hH]uh1jahM]rih_X onlyImportantrjrk}rl(h0Uh1jfubah@hubaubj)rm}rn(h0UhB}ro(hF]hG]hE]hD]hH]uh1j]hM]rphc)rq}rr(h0X-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.h1jmh6h9h@hghB}rs(hF]hG]hE]hD]hH]uhKKfhM]rt(h_XA boolean that, when rurv}rw(h0XA boolean that, when h1jqubh)rx}ry(h0X``True``hB}rz(hF]hG]hE]hD]hH]uh1jqhM]r{h_XTruer|r}}r~(h0Uh1jxubah@hubh_XB, only adds important changes to the buildset as specified in the rr}r(h0XB, only adds important changes to the buildset as specified in the h1jqubh)r}r(h0X``fileIsImportant``hB}r(hF]hG]hE]hD]hH]uh1jqhM]rh_XfileIsImportantrr}r(h0Uh1jubah@hubh_XJ callable. This means that unimportant changes are ignored the same way a rr}r(h0XJ callable. This means that unimportant changes are ignored the same way a h1jqubh)r}r(h0X``change_filter``hB}r(hF]hG]hE]hD]hH]uh1jqhM]rh_X change_filterrr}r(h0Uh1jubah@hubh_X# filters changes. This defaults to rr}r(h0X# filters changes. This defaults to h1jqubh)r}r(h0X ``False``hB}r(hF]hG]hE]hD]hH]uh1jqhM]rh_XFalserr}r(h0Uh1jubah@hubh_X and only applies when rr}r(h0X and only applies when h1jqubh)r}r(h0X``fileIsImportant``hB}r(hF]hG]hE]hD]hH]uh1jqhM]rh_XfileIsImportantrr}r(h0Uh1jubah@hubh_X is given.rr}r(h0X is given.h1jqubeubah@j)ubeubeubhc)r}r(h0XThe 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.h1hyh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKnhLhhM]r(h_XThe remaining subsections represent a catalog of the available Scheduler types. All these Schedulers are defined in modules under rr}r(h0XThe remaining subsections represent a catalog of the available Scheduler types. All these Schedulers are defined in modules under h1jubh)r}r(h0X:mod:`buildbot.schedulers`rh1jh6h9h@hhB}r(UreftypeXmodhhXbuildbot.schedulersU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKKnhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-modrehE]hD]hH]uh1jhM]rh_Xbuildbot.schedulersrr}r(h0Uh1jubah@hubaubh_Xc, and the docstrings there are the best source of documentation on the arguments taken by each one.rr}r(h0Xc, and the docstrings there are the best source of documentation on the arguments taken by each one.h1jubeubh=)r}r(h0X.. _Change-Filters:h1hyh6h9h@hAhB}r(hD]hE]hF]hG]hH]hIUchange-filtersruhKKshLhhM]ubeubh2)r}r(h0Uh1h3h6h9h;}rh"jsh@hNhB}r(hF]hG]hE]hD]r(jUid3rehH]r(hh"euhKKvhLhhU}rjjshM]r(hX)r}r(h0XChange Filtersrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKKvhLhhM]rh_XChange Filtersrr}r(h0jh1jubaubhc)r}r(h0XSeveral 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::h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKxhLhhM]r(h_XwSeveral schedulers perform filtering on an incoming set of changes. The filter can most generically be specified as a rr}r(h0XwSeveral schedulers perform filtering on an incoming set of changes. The filter can most generically be specified as a h1jubh)r}r(h0X:class:`ChangeFilter`rh1jh6h9h@hhB}r(UreftypeXclasshhX ChangeFilterU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKKxhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_X ChangeFilterrr}r(h0Uh1jubah@hubaubh_X . Set up a rr}r(h0X . Set up a h1jubh)r}r(h0X:class:`ChangeFilter`rh1jh6h9h@hhB}r(UreftypeXclasshhX ChangeFilterU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKKxhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_X ChangeFilterrr}r(h0Uh1jubah@hubaubh_X like this:rr}r(h0X like this:h1jubeubh)r}r(h0Xfrom buildbot.changes.filter import ChangeFilter my_filter = ChangeFilter( project_re="^baseproduct/.*", branch="devel")h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKK|hLhhM]rh_Xfrom buildbot.changes.filter import ChangeFilter my_filter = ChangeFilter( project_re="^baseproduct/.*", branch="devel")rr}r (h0Uh1jubaubhc)r }r (h0XEand then add it to a scheduler with the ``change_filter`` parameter::r h1jh6h9h@hghB}r (hF]hG]hE]hD]hH]uhKKhLhhM]r(h_X(and then add it to a scheduler with the rr}r(h0X(and then add it to a scheduler with the h1j ubh)r}r(h0X``change_filter``hB}r(hF]hG]hE]hD]hH]uh1j hM]rh_X change_filterrr}r(h0Uh1jubah@hubh_X parameter:rr}r(h0X parameter:h1j ubeubh)r}r(h0X:sch = SomeSchedulerClass(..., change_filter=my_filter)h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKKhLhhM]rh_X:sch = SomeSchedulerClass(..., change_filter=my_filter)r r!}r"(h0Uh1jubaubhc)r#}r$(h0X=There are five attributes of changes on which you can filter:r%h1jh6h9h@hghB}r&(hF]hG]hE]hD]hH]uhKKhLhhM]r'h_X=There are five attributes of changes on which you can filter:r(r)}r*(h0j%h1j#ubaubh)r+}r,(h0Uh1jh6h9h@hhB}r-(hF]hG]hE]hD]hH]uhKNhLhhM]r.(j)r/}r0(h0X@``project`` the project string, as defined by the ChangeSource. h1j+h6h9h@jhB}r1(hF]hG]hE]hD]hH]uhKKhM]r2(j)r3}r4(h0X ``project``r5h1j/h6h9h@j hB}r6(hF]hG]hE]hD]hH]uhKKhM]r7h)r8}r9(h0j5hB}r:(hF]hG]hE]hD]hH]uh1j3hM]r;h_Xprojectr<r=}r>(h0Uh1j8ubah@hubaubj)r?}r@(h0UhB}rA(hF]hG]hE]hD]hH]uh1j/hM]rBhc)rC}rD(h0X3the project string, as defined by the ChangeSource.rEh1j?h6h9h@hghB}rF(hF]hG]hE]hD]hH]uhKKhM]rGh_X3the project string, as defined by the ChangeSource.rHrI}rJ(h0jEh1jCubaubah@j)ubeubj)rK}rL(h0X=``repository`` the repository in which this change occurred. h1j+h6h9h@jhB}rM(hF]hG]hE]hD]hH]uhKKhLhhM]rN(j)rO}rP(h0X``repository``rQh1jKh6h9h@j hB}rR(hF]hG]hE]hD]hH]uhKKhM]rSh)rT}rU(h0jQhB}rV(hF]hG]hE]hD]hH]uh1jOhM]rWh_X repositoryrXrY}rZ(h0Uh1jTubah@hubaubj)r[}r\(h0UhB}r](hF]hG]hE]hD]hH]uh1jKhM]r^hc)r_}r`(h0X-the repository in which this change occurred.rah1j[h6h9h@hghB}rb(hF]hG]hE]hD]hH]uhKKhM]rch_X-the repository in which this change occurred.rdre}rf(h0jah1j_ubaubah@j)ubeubj)rg}rh(h0Xr``branch`` the branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by ``None``. h1j+h6h9h@jhB}ri(hF]hG]hE]hD]hH]uhKKhLhhM]rj(j)rk}rl(h0X ``branch``rmh1jgh6h9h@j hB}rn(hF]hG]hE]hD]hH]uhKKhM]roh)rp}rq(h0jmhB}rr(hF]hG]hE]hD]hH]uh1jkhM]rsh_Xbranchrtru}rv(h0Uh1jpubah@hubaubj)rw}rx(h0UhB}ry(hF]hG]hE]hD]hH]uh1jghM]rzhc)r{}r|(h0Xfthe branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by ``None``.h1jwh6h9h@hghB}r}(hF]hG]hE]hD]hH]uhKKhM]r~(h_X]the branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by rr}r(h0X]the branch on which this change occurred. Note that 'trunk' or 'master' is often denoted by h1j{ubh)r}r(h0X``None``hB}r(hF]hG]hE]hD]hH]uh1j{hM]rh_XNonerr}r(h0Uh1jubah@hubh_X.r}r(h0X.h1j{ubeubah@j)ubeubj)r}r(h0XA``category`` the category, again as defined by the ChangeSource. h1j+h6h9h@jhB}r(hF]hG]hE]hD]hH]uhKKhLhhM]r(j)r}r(h0X ``category``rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKKhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xcategoryrr}r(h0Uh1jubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X3the category, again as defined by the ChangeSource.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X3the category, again as defined by the ChangeSource.rr}r(h0jh1jubaubah@j)ubeubj)r}r(h0X$``codebase`` the change's codebase. h1j+h6h9h@jhB}r(hF]hG]hE]hD]hH]uhKKhLhhM]r(j)r}r(h0X ``codebase``rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKKhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xcodebaserr}r(h0Uh1jubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0Xthe change's codebase.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_Xthe change's codebase.rr}r(h0jh1jubaubah@j)ubeubeubhc)r}r(h0XFFor each attribute, the filter can look for a single, specific value::rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh_XEFor each attribute, the filter can look for a single, specific value:rr}r(h0XEFor each attribute, the filter can look for a single, specific value:h1jubaubh)r}r(h0X/my_filter = ChangeFilter(project = 'myproject')h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKKhLhhM]rh_X/my_filter = ChangeFilter(project = 'myproject')rr}r(h0Uh1jubaubhc)r}r(h0X"or accept any of a set of values::rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh_X!or accept any of a set of values:rr}r(h0X!or accept any of a set of values:h1jubaubh)r}r(h0X@my_filter = ChangeFilter(project = ['myproject', 'jimsproject'])h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKKhLhhM]rh_X@my_filter = ChangeFilter(project = ['myproject', 'jimsproject'])rr}r(h0Uh1jubaubhc)r}r(h0XQor apply a regular expression, using the attribute name with a "``_re``" suffix::h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]r(h_X@or apply a regular expression, using the attribute name with a "rr}r(h0X@or apply a regular expression, using the attribute name with a "h1jubh)r}r(h0X``_re``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X_rerr}r(h0Uh1jubah@hubh_X " suffix:rr}r(h0X " suffix:h1jubeubh)r}r(h0Xmy_filter = ChangeFilter(category_re = '.*deve.*') # or, to use regular expression flags: import re my_filter = ChangeFilter(category_re = re.compile('.*deve.*', re.I))h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKKhLhhM]rh_Xmy_filter = ChangeFilter(category_re = '.*deve.*') # or, to use regular expression flags: import re my_filter = ChangeFilter(category_re = re.compile('.*deve.*', re.I))rr}r(h0Uh1jubaubhc)r}r(h0X[For anything more complicated, define a Python function to recognize the strings you want::h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh_XZFor anything more complicated, define a Python function to recognize the strings you want:rr}r(h0XZFor anything more complicated, define a Python function to recognize the strings you want:h1jubaubh)r}r(h0Xdef 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)h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKKhLhhM]rh_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)rr}r(h0Uh1jubaubhc)r}r(h0XThe special argument ``filter_fn`` can be used to specify a function that is given the entire Change object, and returns a boolean.h1jh6h9h@hghB}r (hF]hG]hE]hD]hH]uhKKhLhhM]r (h_XThe special argument r r }r (h0XThe special argument h1jubh)r}r(h0X ``filter_fn``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X filter_fnrr}r(h0Uh1jubah@hubh_Xa can be used to specify a function that is given the entire Change object, and returns a boolean.rr}r(h0Xa can be used to specify a function that is given the entire Change object, and returns a boolean.h1jubeubhc)r}r(h0X-The entire set of allowed arguments, then, isrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh_X-The entire set of allowed arguments, then, isrr}r(h0jh1jubaubcdocutils.nodes table r )r!}r"(h0Uh1jh6h9h@Utabler#hB}r$(hF]hG]hE]hD]hH]uhKNhLhhM]r%cdocutils.nodes tgroup r&)r'}r((h0UhB}r)(hD]hE]hF]hG]hH]UcolsKuh1j!hM]r*(cdocutils.nodes colspec r+)r,}r-(h0UhB}r.(hD]hE]hF]hG]hH]UcolwidthK uh1j'hM]h@Ucolspecr/ubj+)r0}r1(h0UhB}r2(hD]hE]hF]hG]hH]UcolwidthKuh1j'hM]h@j/ubj+)r3}r4(h0UhB}r5(hD]hE]hF]hG]hH]UcolwidthKuh1j'hM]h@j/ubcdocutils.nodes tbody r6)r7}r8(h0UhB}r9(hF]hG]hE]hD]hH]uh1j'hM]r:(cdocutils.nodes row r;)r<}r=(h0UhB}r>(hF]hG]hE]hD]hH]uh1j7hM]r?(cdocutils.nodes entry r@)rA}rB(h0UhB}rC(hF]hG]hE]hD]hH]uh1j<hM]rDhc)rE}rF(h0XprojectrGh1jAh6h9h@hghB}rH(hF]hG]hE]hD]hH]uhKKhM]rIh_XprojectrJrK}rL(h0jGh1jEubaubah@UentryrMubj@)rN}rO(h0UhB}rP(hF]hG]hE]hD]hH]uh1j<hM]rQhc)rR}rS(h0X project_rerTh1jNh6h9h@hghB}rU(hF]hG]hE]hD]hH]uhKKhM]rVh_X project_rerWrX}rY(h0jTh1jRubaubah@jMubj@)rZ}r[(h0UhB}r\(hF]hG]hE]hD]hH]uh1j<hM]r]hc)r^}r_(h0X project_fnr`h1jZh6h9h@hghB}ra(hF]hG]hE]hD]hH]uhKKhM]rbh_X project_fnrcrd}re(h0j`h1j^ubaubah@jMubeh@Urowrfubj;)rg}rh(h0UhB}ri(hF]hG]hE]hD]hH]uh1j7hM]rj(j@)rk}rl(h0UhB}rm(hF]hG]hE]hD]hH]uh1jghM]rnhc)ro}rp(h0X repositoryrqh1jkh6h9h@hghB}rr(hF]hG]hE]hD]hH]uhKKhM]rsh_X repositoryrtru}rv(h0jqh1joubaubah@jMubj@)rw}rx(h0UhB}ry(hF]hG]hE]hD]hH]uh1jghM]rzhc)r{}r|(h0X repository_rer}h1jwh6h9h@hghB}r~(hF]hG]hE]hD]hH]uhKKhM]rh_X repository_rerr}r(h0j}h1j{ubaubah@jMubj@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jghM]rhc)r}r(h0X repository_fnrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X repository_fnrr}r(h0jh1jubaubah@jMubeh@jfubj;)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1j7hM]r(j@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0Xbranchrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_Xbranchrr}r(h0jh1jubaubah@jMubj@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X branch_rerh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X branch_rerr}r(h0jh1jubaubah@jMubj@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X branch_fnrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X branch_fnrr}r(h0jh1jubaubah@jMubeh@jfubj;)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1j7hM]r(j@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0Xcategoryrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_Xcategoryrr}r(h0jh1jubaubah@jMubj@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X category_rerh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X category_rerr}r(h0jh1jubaubah@jMubj@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X category_fnrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X category_fnrr}r(h0jh1jubaubah@jMubeh@jfubj;)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1j7hM]r(j@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0Xcodebaserh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_Xcodebaserr}r(h0jh1jubaubah@jMubj@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X codebase_rerh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X codebase_rerr}r(h0jh1jubaubah@jMubj@)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X codebase_fnrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X codebase_fnrr}r(h0jh1jubaubah@jMubeh@jfubj;)r}r(h0UhB}r (hF]hG]hE]hD]hH]uh1j7hM]r j@)r }r (h0UhB}r (hD]UmorecolsKhE]hF]hG]hH]uh1jhM]rhc)r}r(h0X filter_fnrh1j h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_X filter_fnrr}r(h0jh1jubaubah@jMubah@jfubeh@Utbodyrubeh@Utgrouprubaubhc)r}r(h0XA 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).h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]r(h_X#A Change passes the filter only if rr}r(h0X#A Change passes the filter only if h1jubj)r }r!(h0X*all*hB}r"(hF]hG]hE]hD]hH]uh1jhM]r#h_Xallr$r%}r&(h0Uh1j ubah@jubh_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'r(}r)(h0X 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).h1jubeubh)r*}r+(h0Uh1jh6h9h@hhB}r,(hD]hE]hF]hG]hH]Uentries]r-((UsingleX!Schedulers; SingleBranchSchedulerXsched-SingleBranchSchedulerr.j.tr/(UsingleXSingleBranchScheduler Schedulerj.j.tr0euhKKhLhhM]ubh=)r1}r2(h0Uh1jh6h9h@hAhB}r3(hF]hG]hE]hD]r4j.ahH]uhKKhLhhM]ubh)r5}r6(h0Uh1jh6h9h@hhB}r7(hD]hE]hF]hG]hH]Uentries]r8((UsingleXSchedulers; SchedulerXsched-Schedulerr9j9tr:(UsingleXScheduler Schedulerj9j9tr;euhKKhLhhM]ubh=)r<}r=(h0Uh1jh6h9h@hAhB}r>(hD]hE]hF]hG]hH]hIj9uhKKhLhhM]ubh=)r?}r@(h0X$.. _Scheduler-SingleBranchScheduler:h1jh6h9h;}h@hAhB}rA(hD]hE]hF]hG]hH]hIUscheduler-singlebranchschedulerrBuhKKhLhhU}rCj9j<shM]ubeubh2)rD}rE(h0Uh1h3h6h9h;}rFhj?sh@hNhB}rG(hF]hG]hE]hD]rH(UsinglebranchschedulerrIjBj9ehH]rJ(h$heuhKKhLhhU}rK(j9j<jBj?uhM]rL(hX)rM}rN(h0XSingleBranchSchedulerrOh1jDh6h9h@h\hB}rP(hF]hG]hE]hD]hH]uhKKhLhhM]rQh_XSingleBranchSchedulerrRrS}rT(h0jOh1jMubaubhc)rU}rV(h0X{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.h1jDh6h9h@hghB}rW(hF]hG]hE]hD]hH]uhKKhLhhM]rX(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 rYrZ}r[(h0XThis 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 h1jUubh)r\}r](h0X:meth:`fileIsImportant`r^h1jUh6h9h@hhB}r_(UreftypeXmethhhXfileIsImportantU refdomainXpyr`hD]hE]U refexplicithF]hG]hH]hhhNhNuhKKhM]rah)rb}rc(h0j^hB}rd(hF]hG]re(hj`Xpy-methrfehE]hD]hH]uh1j\hM]rgh_XfileIsImportantrhri}rj(h0Uh1jbubah@hubaubh_XM function which can be used to ignore some Changes if they do not affect any rkrl}rm(h0XM function which can be used to ignore some Changes if they do not affect any h1jUubj)rn}ro(h0X *important*hB}rp(hF]hG]hE]hD]hH]uh1jUhM]rqh_X importantrrrs}rt(h0Uh1jnubah@jubh_X files.rurv}rw(h0X files.h1jUubeubhc)rx}ry(h0X1If ``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.h1jDh6h9h@hghB}rz(hF]hG]hE]hD]hH]uhKKhLhhM]r{(h_XIf r|r}}r~(h0XIf h1jxubh)r}r(h0X``treeStableTimer``hB}r(hF]hG]hE]hD]hH]uh1jxhM]rh_XtreeStableTimerrr}r(h0Uh1jubah@hubh_XR is not set, then this scheduler starts a build for every Change that matches its rr}r(h0XR is not set, then this scheduler starts a build for every Change that matches its h1jxubh)r}r(h0X``change_filter``hB}r(hF]hG]hE]hD]hH]uh1jxhM]rh_X change_filterrr}r(h0Uh1jubah@hubh_X and statsfies rr}r(h0X and statsfies h1jxubh)r}r(h0X:meth:`fileIsImportant`rh1jxh6h9h@hhB}r(UreftypeXmethhhXfileIsImportantU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKKhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-methrehE]hD]hH]uh1jhM]rh_XfileIsImportantrr}r(h0Uh1jubah@hubaubh_X. If rr}r(h0X. If h1jxubh)r}r(h0X``treeStableTimer``hB}r(hF]hG]hE]hD]hH]uh1jxhM]rh_XtreeStableTimerrr}r(h0Uh1jubah@hubh_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(h0Xz is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.h1jxubeubcdocutils.nodes note r)r}r(h0XThe behavior of this scheduler is undefined, if ``treeStableTimer`` is set, and changes from multiple branches, repositories or codebases are accepted by the filter.rh1jDh6h9h@UnoterhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0jh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]r(h_X0The behavior of this scheduler is undefined, if rr}r(h0X0The behavior of this scheduler is undefined, if h1jubh)r}r(h0X``treeStableTimer``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XtreeStableTimerrr}r(h0Uh1jubah@hubh_Xb is set, and changes from multiple branches, repositories or codebases are accepted by the filter.rr}r(h0Xb is set, and changes from multiple branches, repositories or codebases are accepted by the filter.h1jubeubaubj)r}r(h0XThe ``codebases`` argument will filter out codebases not specified there, but *won't* filter based on the branches specified there.rh1jDh6h9h@jhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0jh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]r(h_XThe rr}r(h0XThe h1jubh)r}r(h0X ``codebases``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X codebasesrr}r(h0Uh1jubah@hubh_X= argument will filter out codebases not specified there, but rr}r(h0X= argument will filter out codebases not specified there, but h1jubj)r}r(h0X*won't*hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xwon'trr}r(h0Uh1jubah@jubh_X. filter based on the branches specified there.rr}r(h0X. filter based on the branches specified there.h1jubeubaubhc)r}r(h0X$The arguments to this scheduler are:rh1jDh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh_X$The arguments to this scheduler are:rr}r(h0jh1jubaubhc)r}r(h0X``name``rh1jDh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xnamerr}r(h0Uh1jubah@hubaubhc)r}r(h0X``builderNames``rh1jDh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X builderNamesrr}r(h0Uh1jubah@hubaubhc)r}r(h0X``properties``r h1jDh6h9h@hghB}r (hF]hG]hE]hD]hH]uhKKhLhhM]r h)r }r (h0j hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X propertiesrr}r(h0Uh1j ubah@hubaubhc)r}r(h0X``fileIsImportant``rh1jDh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XfileIsImportantrr}r(h0Uh1jubah@hubaubhc)r}r (h0X``change_filter``r!h1jDh6h9h@hghB}r"(hF]hG]hE]hD]hH]uhKKhLhhM]r#h)r$}r%(h0j!hB}r&(hF]hG]hE]hD]hH]uh1jhM]r'h_X change_filterr(r)}r*(h0Uh1j$ubah@hubaubh)r+}r,(h0Uh1jDh6h9h@hhB}r-(hF]hG]hE]hD]hH]uhKNhLhhM]r.(j)r/}r0(h0X5``onlyImportant`` See :ref:`Configuring-Schedulers`. h1j+h6h9h@jhB}r1(hF]hG]hE]hD]hH]uhKKhM]r2(j)r3}r4(h0X``onlyImportant``r5h1j/h6h9h@j hB}r6(hF]hG]hE]hD]hH]uhKKhM]r7h)r8}r9(h0j5hB}r:(hF]hG]hE]hD]hH]uh1j3hM]r;h_X onlyImportantr<r=}r>(h0Uh1j8ubah@hubaubj)r?}r@(h0UhB}rA(hF]hG]hE]hD]hH]uh1j/hM]rBhc)rC}rD(h0X"See :ref:`Configuring-Schedulers`.h1j?h6h9h@hghB}rE(hF]hG]hE]hD]hH]uhKKhM]rF(h_XSee rGrH}rI(h0XSee h1jCubh)rJ}rK(h0X:ref:`Configuring-Schedulers`rLh1jCh6h9h@hhB}rM(UreftypeXrefhhXconfiguring-schedulersU refdomainXstdrNhD]hE]U refexplicithF]hG]hH]hhuhKKhM]rOj)rP}rQ(h0jLhB}rR(hF]hG]rS(hjNXstd-refrTehE]hD]hH]uh1jJhM]rUh_XConfiguring-SchedulersrVrW}rX(h0Uh1jPubah@jubaubh_X.rY}rZ(h0X.h1jCubeubah@j)ubeubj)r[}r\(h0Xn``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. h1j+h6h9h@jhB}r](hF]hG]hE]hD]hH]uhKKhLhhM]r^(j)r_}r`(h0X``treeStableTimer``rah1j[h6h9h@j hB}rb(hF]hG]hE]hD]hH]uhKKhM]rch)rd}re(h0jahB}rf(hF]hG]hE]hD]hH]uh1j_hM]rgh_XtreeStableTimerrhri}rj(h0Uh1jdubah@hubaubj)rk}rl(h0UhB}rm(hF]hG]hE]hD]hH]uh1j[hM]rn(hc)ro}rp(h0XThe 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.rqh1jkh6h9h@hghB}rr(hF]hG]hE]hD]hH]uhKKhM]rsh_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.rtru}rv(h0jqh1joubaubhc)rw}rx(h0XaIf ``treeStableTimer`` is ``None``, then a separate build is started immediately for each Change.h1jkh6h9h@hghB}ry(hF]hG]hE]hD]hH]uhKKhM]rz(h_XIf r{r|}r}(h0XIf h1jwubh)r~}r(h0X``treeStableTimer``hB}r(hF]hG]hE]hD]hH]uh1jwhM]rh_XtreeStableTimerrr}r(h0Uh1j~ubah@hubh_X is rr}r(h0X is h1jwubh)r}r(h0X``None``hB}r(hF]hG]hE]hD]hH]uh1jwhM]rh_XNonerr}r(h0Uh1jubah@hubh_X?, then a separate build is started immediately for each Change.rr}r(h0X?, then a separate build is started immediately for each Change.h1jwubeubeh@j)ubeubj)r}r(h0X9``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. h1j+h6h9h@jhB}r(hF]hG]hE]hD]hH]uhKKhLhhM]r(j)r}r(h0X``fileIsImportant``rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKKhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XfileIsImportantrr}r(h0Uh1jubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X$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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]r(h_XDA callable which takes one argument, a Change instance, and returns rr}r(h0XDA callable which takes one argument, a Change instance, and returns h1jubh)r}r(h0X``True``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XTruerr}r(h0Uh1jubah@hubh_X& if the change is worth building, and rr}r(h0X& if the change is worth building, and h1jubh)r}r(h0X ``False``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XFalserr}r(h0Uh1jubah@hubh_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(h0X 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.h1jubeubah@j)ubeubj)r}r(h0X``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. h1j+h6h9h@jhB}r(hF]hG]hE]hD]hH]uhKKhLhhM]r(j)r}r(h0X.``categories`` (deprecated; use change_filter)rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKKhM]r(h)r}r(h0X``categories``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X categoriesrr}r(h0Uh1jubah@hubh_X (deprecated; use change_filter)rr}r(h0X (deprecated; use change_filter)h1jubeubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKKhM]rh_XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.rr}r(h0jh1jubaubah@j)ubeubj)r}r(h0XY``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"``. h1j+h6h9h@jhB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(j)r}r(h0X*``branch`` (deprecated; use change_filter)rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKMhM]r(h)r}r(h0X ``branch``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xbranchrr}r(h0Uh1jubah@hubh_X (deprecated; use change_filter)rr}r(h0X (deprecated; use change_filter)h1jubeubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]r(hc)r}r(h0XThe 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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]r(h_XhThe scheduler will pay attention to this branch, ignoring Changes that occur on other branches. Setting rr}r(h0XhThe scheduler will pay attention to this branch, ignoring Changes that occur on other branches. Setting h1jubh)r}r(h0X ``branch``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xbranchrr}r(h0Uh1jubah@hubh_X equal to the special value of rr}r(h0X equal to the special value of h1jubh)r}r (h0X``None``hB}r (hF]hG]hE]hD]hH]uh1jhM]r h_XNoner r }r(h0Uh1jubah@hubh_X: means it should only pay attention to the default branch.rr}r(h0X: means it should only pay attention to the default branch.h1jubeubj)r}r(h0XJ``None`` is a keyword, not a string, so write ``None`` and not ``"None"``.hB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0XJ``None`` is a keyword, not a string, so write ``None`` and not ``"None"``.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]r(h)r}r(h0X``None``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XNonerr}r (h0Uh1jubah@hubh_X& is a keyword, not a string, so write r!r"}r#(h0X& is a keyword, not a string, so write h1jubh)r$}r%(h0X``None``hB}r&(hF]hG]hE]hD]hH]uh1jhM]r'h_XNoner(r)}r*(h0Uh1j$ubah@hubh_X and not r+r,}r-(h0X and not h1jubh)r.}r/(h0X ``"None"``hB}r0(hF]hG]hE]hD]hH]uh1jhM]r1h_X"None"r2r3}r4(h0Uh1j.ubah@hubh_X.r5}r6(h0X.h1jubeubah@jubeh@j)ubeubeubhc)r7}r8(h0X Example::r9h1jDh6h9h@hghB}r:(hF]hG]hE]hD]hH]uhKM hLhhM]r;h_XExample:r<r=}r>(h0XExample:h1j7ubaubh)r?}r@(h0XFfrom 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]h1jDh6h9h@hhB}rA(hhhD]hE]hF]hG]hH]uhKM hLhhM]rBh_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]rCrD}rE(h0Uh1j?ubaubhc)rF}rG(h0XIn 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.h1jDh6h9h@hghB}rH(hF]hG]hE]hD]hH]uhKMhLhhM]rI(h_XIn this example, the two rJrK}rL(h0XIn this example, the two h1jFubj)rM}rN(h0X*quick*hB}rO(hF]hG]hE]hD]hH]uh1jFhM]rPh_XquickrQrR}rS(h0Uh1jMubah@jubh_XH builders are triggered 60 seconds after the tree has been changed. The rTrU}rV(h0XH builders are triggered 60 seconds after the tree has been changed. The h1jFubj)rW}rX(h0X*full*hB}rY(hF]hG]hE]hD]hH]uh1jFhM]rZh_Xfullr[r\}r](h0Uh1jWubah@jubh_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.r^r_}r`(h0X 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.h1jFubeubhc)ra}rb(h0XThe 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``.h1jDh6h9h@hghB}rc(hF]hG]hE]hD]hH]uhKM hLhhM]rd(h_X"The old names for this scheduler, rerf}rg(h0X"The old names for this scheduler, h1jaubh)rh}ri(h0X ``buildbot.scheduler.Scheduler``hB}rj(hF]hG]hE]hD]hH]uh1jahM]rkh_Xbuildbot.scheduler.Schedulerrlrm}rn(h0Uh1jhubah@hubh_X and rorp}rq(h0X and h1jaubh)rr}rs(h0X'``buildbot.schedulers.basic.Scheduler``hB}rt(hF]hG]hE]hD]hH]uh1jahM]ruh_X#buildbot.schedulers.basic.Schedulerrvrw}rx(h0Uh1jrubah@hubh_X4, are deprecated in favor of the more accurate name ryrz}r{(h0X4, are deprecated in favor of the more accurate name h1jaubh)r|}r}(h0X3``buildbot.schedulers.basic.SingleBranchScheduler``hB}r~(hF]hG]hE]hD]hH]uh1jahM]rh_X/buildbot.schedulers.basic.SingleBranchSchedulerrr}r(h0Uh1j|ubah@hubh_X.r}r(h0X.h1jaubeubh)r}r(h0Uh1jDh6h9h@hhB}r(hD]hE]hF]hG]hH]Uentries]r((UsingleXSchedulers; AnyBranchSchedulerXsched-AnyBranchSchedulerrjtr(UsingleXAnyBranchScheduler SchedulerjjtreuhKM%hLhhM]ubh=)r}r(h0Uh1jDh6h9h@hAhB}r(hD]hE]hF]hG]hH]hIjuhKM%hLhhM]ubh=)r}r(h0X.. _AnyBranchScheduler:h1jDh6h9h;}h@hAhB}r(hD]hE]hF]hG]hH]hIUanybranchschedulerruhKM&hLhhU}rjjshM]ubeubh2)r}r(h0Uh5Kh1h3h6h9h;}rhjsh@hNhB}r(hF]rXanybranchschedulerrahG]hE]hD]r(jjUid4rehH]rhauhKM)hLhhU}r(jjjjuhM]r(hX)r}r(h0XAnyBranchSchedulerrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKM)hLhhM]rh_XAnyBranchSchedulerrr}r(h0jh1jubaubhc)r}r(h0XhThis scheduler uses a tree-stable-timer like the default one, but uses a separate timer for each branch.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM+hLhhM]rh_XhThis scheduler uses a tree-stable-timer like the default one, but uses a separate timer for each branch.rr}r(h0jh1jubaubhc)r}r(h0XIf ``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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM.hLhhM]r(h_XIf rr}r(h0XIf h1jubh)r}r(h0X``treeStableTimer``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XtreeStableTimerrr}r(h0Uh1jubah@hubh_XD is not set, then this scheduler is indistinguishable from bb:sched:rr}r(h0XD is not set, then this scheduler is indistinguishable from bb:sched:h1jubh)r}r(h0X``SingleBranchScheduler``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XSingleBranchSchedulerrr}r(h0Uh1jubah@hubh_X. If rr}r(h0X. If h1jubh)r}r(h0X``treeStableTimer``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XtreeStableTimerrr}r(h0Uh1jubah@hubh_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(h0Xz is set, then a build is triggered for each set of Changes which arrive within the configured time, and match the filters.h1jubeubhc)r}r(h0X$The arguments to this scheduler are:rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM1hLhhM]rh_X$The arguments to this scheduler are:rr}r(h0jh1jubaubhc)r}r(h0X``name``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM3hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xnamerr}r(h0Uh1jubah@hubaubhc)r}r(h0X``builderNames``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM5hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X builderNamesrr}r(h0Uh1jubah@hubaubhc)r}r(h0X``properties``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM7hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X propertiesrr}r(h0Uh1jubah@hubaubhc)r}r(h0X``fileIsImportant``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM9hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XfileIsImportantr r }r (h0Uh1jubah@hubaubhc)r }r (h0X``change_filter``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM;hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1j hM]rh_X change_filterrr}r(h0Uh1jubah@hubaubh)r}r(h0Uh1jh6h9h@hhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]r(j)r}r(h0X5``onlyImportant`` See :ref:`Configuring-Schedulers`. h1jh6h9h@jhB}r(hF]hG]hE]hD]hH]uhKM>hM]r(j)r }r!(h0X``onlyImportant``r"h1jh6h9h@j hB}r#(hF]hG]hE]hD]hH]uhKM>hM]r$h)r%}r&(h0j"hB}r'(hF]hG]hE]hD]hH]uh1j hM]r(h_X onlyImportantr)r*}r+(h0Uh1j%ubah@hubaubj)r,}r-(h0UhB}r.(hF]hG]hE]hD]hH]uh1jhM]r/hc)r0}r1(h0X"See :ref:`Configuring-Schedulers`.h1j,h6h9h@hghB}r2(hF]hG]hE]hD]hH]uhKM>hM]r3(h_XSee r4r5}r6(h0XSee h1j0ubh)r7}r8(h0X:ref:`Configuring-Schedulers`r9h1j0h6h9h@hhB}r:(UreftypeXrefhhXconfiguring-schedulersU refdomainXstdr;hD]hE]U refexplicithF]hG]hH]hhuhKM>hM]r<j)r=}r>(h0j9hB}r?(hF]hG]r@(hj;Xstd-refrAehE]hD]hH]uh1j7hM]rBh_XConfiguring-SchedulersrCrD}rE(h0Uh1j=ubah@jubaubh_X.rF}rG(h0X.h1j0ubeubah@j)ubeubj)rH}rI(h0X``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. h1jh6h9h@jhB}rJ(hF]hG]hE]hD]hH]uhKMChLhhM]rK(j)rL}rM(h0X``treeStableTimer``rNh1jHh6h9h@j hB}rO(hF]hG]hE]hD]hH]uhKMChM]rPh)rQ}rR(h0jNhB}rS(hF]hG]hE]hD]hH]uh1jLhM]rTh_XtreeStableTimerrUrV}rW(h0Uh1jQubah@hubaubj)rX}rY(h0UhB}rZ(hF]hG]hE]hD]hH]uh1jHhM]r[hc)r\}r](h0XThe 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.h1jXh6h9h@hghB}r^(hF]hG]hE]hD]hH]uhKMAhM]r_(h_XaThe scheduler will wait for this many seconds before starting the build. If new changes are made r`ra}rb(h0XaThe scheduler will wait for this many seconds before starting the build. If new changes are made h1j\ubj)rc}rd(h0X*on the same branch*hB}re(hF]hG]hE]hD]hH]uh1j\hM]rfh_Xon the same branchrgrh}ri(h0Uh1jcubah@jubh_X3 during this interval, the timer will be restarted.rjrk}rl(h0X3 during this interval, the timer will be restarted.h1j\ubeubah@j)ubeubj)rm}rn(h0Xm``branches`` (deprecated; use change_filter) Changes on branches not specified on this list will be ignored. h1jh6h9h@jhB}ro(hF]hG]hE]hD]hH]uhKMFhLhhM]rp(j)rq}rr(h0X,``branches`` (deprecated; use change_filter)rsh1jmh6h9h@j hB}rt(hF]hG]hE]hD]hH]uhKMFhM]ru(h)rv}rw(h0X ``branches``hB}rx(hF]hG]hE]hD]hH]uh1jqhM]ryh_Xbranchesrzr{}r|(h0Uh1jvubah@hubh_X (deprecated; use change_filter)r}r~}r(h0X (deprecated; use change_filter)h1jqubeubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jmhM]rhc)r}r(h0X?Changes on branches not specified on this list will be ignored.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMFhM]rh_X?Changes on branches not specified on this list will be ignored.rr}r(h0jh1jubaubah@j)ubeubj)r}r(h0X``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. h1jh6h9h@jhB}r(hF]hG]hE]hD]hH]uhKMJhLhhM]r(j)r}r(h0X.``categories`` (deprecated; use change_filter)rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKMJhM]r(h)r}r(h0X``categories``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X categoriesrr}r(h0Uh1jubah@hubh_X (deprecated; use change_filter)rr}r(h0X (deprecated; use change_filter)h1jubeubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMIhM]rh_XA list of categories of changes that this scheduler will respond to. If this is specified, then any non-matching changes are ignored.rr}r(h0jh1jubaubah@j)ubeubeubh)r}r(h0Uh1jh6h9h@hhB}r(hD]hE]hF]hG]hH]Uentries]r((UsingleXSchedulers; DependentXsched-Dependentrjtr(UsingleXDependent SchedulerjjtreuhKMMhLhhM]ubh=)r}r(h0Uh1jh6h9h@hAhB}r(hD]hE]hF]hG]hH]hIjuhKMMhLhhM]ubh=)r}r(h0X.. _Dependent-Scheduler:h1jh6h9h;}h@hAhB}r(hD]hE]hF]hG]hH]hIUdependent-schedulerruhKMNhLhhU}rjjshM]ubeubh2)r}r(h0Uh1h3h6h9h;}rh jsh@hNhB}r(hF]hG]hE]hD]r(jjUid5rehH]r(h%h euhKMQhLhhU}r(jjjjuhM]r(hX)r}r(h0XDependent Schedulerrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKMQhLhhM]rh_XDependent Schedulerrr}r(h0jh1jubaubhc)r}r(h0X\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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMShLhhM]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 rr}r(h0XiIt 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 h1jubj)r}r(h0X*full*hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xfullrr}r(h0Uh1jubah@jubh_X builds after a failing rr}r(h0X builds after a failing h1jubj)r}r(h0X*quick*hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xquickrr}r(h0Uh1jubah@jubh_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 rr}r(h0X 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 h1jubj)r}r(h0X*after*hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xafterrr}r(h0Uh1jubah@jubh_X the producing one.rr}r(h0X the producing one.h1jubeubhc)r}r(h0XYou 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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMahLhhM]r(h_X You can use rr}r(h0X You can use h1jubj)r}r(h0X*Dependencies*hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X Dependenciesrr}r(h0Uh1jubah@jubh_XZ to express this relationship to the Buildbot. There is a special kind of scheduler named rr}r (h0XZ to express this relationship to the Buildbot. There is a special kind of scheduler named h1jubh)r }r (h0X:class:`scheduler.Dependent`r h1jh6h9h@hhB}r (UreftypeXclasshhXscheduler.DependentU refdomainXpyr hD]hE]U refexplicithF]hG]hH]hhhNhNuhKMahM]r h)r }r (h0j hB}r (hF]hG]r (hj Xpy-classr ehE]hD]hH]uh1j hM]r h_Xscheduler.Dependentr r }r (h0Uh1j ubah@hubaubh_X that will watch an r r }r (h0X that will watch an h1jubj)r }r (h0X *upstream*hB}r (hF]hG]hE]hD]hH]uh1jhM]r h_Xupstreamr r }r (h0Uh1j ubah@jubh_X scheduler for builds to complete successfully (on all of its Builders). Each time that happens, the same source code (i.e. the same r r }r (h0X scheduler for builds to complete successfully (on all of its Builders). Each time that happens, the same source code (i.e. the same h1jubh)r }r (h0X``SourceStamp``hB}r (hF]hG]hE]hD]hH]uh1jhM]r h_X SourceStampr! r" }r# (h0Uh1j ubah@hubh_XR) will be used to start a new set of builds, on a different set of Builders. This r$ r% }r& (h0XR) will be used to start a new set of builds, on a different set of Builders. This h1jubj)r' }r( (h0X *downstream*hB}r) (hF]hG]hE]hD]hH]uh1jhM]r* h_X downstreamr+ r, }r- (h0Uh1j' ubah@jubh_Xe scheduler doesn't pay attention to Changes at all. It only pays attention to the upstream scheduler.r. r/ }r0 (h0Xe scheduler doesn't pay attention to Changes at all. It only pays attention to the upstream scheduler.h1jubeubhc)r1 }r2 (h0XIf 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.h1jh6h9h@hghB}r3 (hF]hG]hE]hD]hH]uhKMjhLhhM]r4 (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 r5 r6 }r7 (h0XIf 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 h1j1 ubh)r8 }r9 (h0X ``revision``hB}r: (hF]hG]hE]hD]hH]uh1j1 hM]r; h_Xrevisionr< r= }r> (h0Uh1j8 ubah@hubh_X is r? r@ }rA (h0X is h1j1 ubh)rB }rC (h0X``None``hB}rD (hF]hG]hE]hD]hH]uh1j1 hM]rE h_XNonerF rG }rH (h0Uh1jB ubah@hubh_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 rI rJ }rK (h0X, 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 h1j1 ubh)rL }rM (h0X:ref:`Triggerable-Scheduler`rN h1j1 h6h9h@hhB}rO (UreftypeXrefhhXtriggerable-schedulerU refdomainXstdrP hD]hE]U refexplicithF]hG]hH]hhuhKMjhM]rQ j)rR }rS (h0jN hB}rT (hF]hG]rU (hjP Xstd-refrV ehE]hD]hH]uh1jL hM]rW h_XTriggerable-SchedulerrX rY }rZ (h0Uh1jR ubah@jubaubh_XF for a more flexible dependency mechanism that can avoid this problem.r[ r\ }r] (h0XF for a more flexible dependency mechanism that can avoid this problem.h1j1 ubeubhc)r^ }r_ (h0X,The keyword arguments to this scheduler are:r` h1jh6h9h@hghB}ra (hF]hG]hE]hD]hH]uhKMshLhhM]rb h_X,The keyword arguments to this scheduler are:rc rd }re (h0j` h1j^ ubaubhc)rf }rg (h0X``name``rh h1jh6h9h@hghB}ri (hF]hG]hE]hD]hH]uhKMuhLhhM]rj h)rk }rl (h0jh hB}rm (hF]hG]hE]hD]hH]uh1jf hM]rn h_Xnamero rp }rq (h0Uh1jk ubah@hubaubhc)rr }rs (h0X``builderNames``rt h1jh6h9h@hghB}ru (hF]hG]hE]hD]hH]uhKMwhLhhM]rv h)rw }rx (h0jt hB}ry (hF]hG]hE]hD]hH]uh1jr hM]rz h_X builderNamesr{ r| }r} (h0Uh1jw ubah@hubaubh)r~ }r (h0Uh1jh6h9h@hhB}r (hF]hG]hE]hD]hH]uhKNhLhhM]r (j)r }r (h0X2``properties`` See :ref:`Configuring-Schedulers`. h1j~ h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMzhM]r (j)r }r (h0X``properties``r h1j h6h9h@j hB}r (hF]hG]hE]hD]hH]uhKMzhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_X propertiesr r }r (h0Uh1j ubah@hubaubj)r }r (h0UhB}r (hF]hG]hE]hD]hH]uh1j hM]r hc)r }r (h0X"See :ref:`Configuring-Schedulers`.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMzhM]r (h_XSee r r }r (h0XSee h1j ubh)r }r (h0X:ref:`Configuring-Schedulers`r h1j h6h9h@hhB}r (UreftypeXrefhhXconfiguring-schedulersU refdomainXstdr hD]hE]U refexplicithF]hG]hH]hhuhKMzhM]r j)r }r (h0j hB}r (hF]hG]r (hj Xstd-refr ehE]hD]hH]uh1j hM]r h_XConfiguring-Schedulersr r }r (h0Uh1j ubah@jubaubh_X.r }r (h0X.h1j ubeubah@j)ubeubj)r }r (h0Xo``upstream`` The upstream scheduler to watch. Note that this is an *instance*, not the name of the scheduler. h1j~ h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKM~hLhhM]r (j)r }r (h0X ``upstream``r h1j h6h9h@j hB}r (hF]hG]hE]hD]hH]uhKM~hM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xupstreamr r }r (h0Uh1j ubah@hubaubj)r }r (h0UhB}r (hF]hG]hE]hD]hH]uh1j hM]r hc)r }r (h0XaThe upstream scheduler to watch. Note that this is an *instance*, not the name of the scheduler.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKM}hM]r (h_X7The upstream scheduler to watch. Note that this is an r r }r (h0X7The upstream scheduler to watch. Note that this is an h1j ubj)r }r (h0X *instance*hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xinstancer r }r (h0Uh1j ubah@jubh_X , not the name of the scheduler.r r }r (h0X , not the name of the scheduler.h1j ubeubah@j)ubeubeubhc)r }r (h0X Example::r h1jh6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h_XExample:r r }r (h0XExample:h1j ubaubh)r }r (h0Xfrom 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]h1jh6h9h@hhB}r (hhhD]hE]hF]hG]hH]uhKMhLhhM]r 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]r r }r (h0Uh1j ubaubh)r }r (h0Uh1jh6h9h@hhB}r (hD]hE]hF]hG]hH]Uentries]r ((UsingleXSchedulers; PeriodicXsched-Periodicr j tr (UsingleXPeriodic Schedulerj j tr euhKMhLhhM]ubh=)r }r (h0Uh1jh6h9h@hAhB}r (hD]hE]hF]hG]hH]hIj uhKMhLhhM]ubh=)r }r (h0X.. _Periodic-Scheduler:h1jh6h9h;}h@hAhB}r (hD]hE]hF]hG]hH]hIUperiodic-schedulerr uhKMhLhhU}r j j shM]ubeubh2)r }r (h0Uh1h3h6h9h;}r hj sh@hNhB}r (hF]hG]hE]hD]r (j j Uid6r ehH]r (hheuhKMhLhhU}r (j j j j uhM]r (hX)r }r (h0XPeriodic Schedulerr h1j h6h9h@h\hB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h_XPeriodic Schedulerr r }r (h0j h1j ubaubhc)r }r (h0X>This simple scheduler just triggers a build every *N* seconds.r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r (h_X2This simple scheduler just triggers a build every r r }r (h0X2This simple scheduler just triggers a build every h1j ubj)r }r (h0X*N*hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_XNr }r (h0Uh1j ubah@jubh_X seconds.r r }r (h0X seconds.h1j ubeubhc)r }r (h0X$The arguments to this scheduler are:r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h_X$The arguments to this scheduler are:r r }r (h0j h1j ubaubhc)r }r (h0X``name``r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h)r }r! (h0j hB}r" (hF]hG]hE]hD]hH]uh1j hM]r# h_Xnamer$ r% }r& (h0Uh1j ubah@hubaubhc)r' }r( (h0X``builderNames``r) h1j h6h9h@hghB}r* (hF]hG]hE]hD]hH]uhKMhLhhM]r+ h)r, }r- (h0j) hB}r. (hF]hG]hE]hD]hH]uh1j' hM]r/ h_X builderNamesr0 r1 }r2 (h0Uh1j, ubah@hubaubhc)r3 }r4 (h0X``properties``r5 h1j h6h9h@hghB}r6 (hF]hG]hE]hD]hH]uhKMhLhhM]r7 h)r8 }r9 (h0j5 hB}r: (hF]hG]hE]hD]hH]uh1j3 hM]r; h_X propertiesr< r= }r> (h0Uh1j8 ubah@hubaubhc)r? }r@ (h0X``onlyImportant``rA h1j h6h9h@hghB}rB (hF]hG]hE]hD]hH]uhKMhLhhM]rC h)rD }rE (h0jA hB}rF (hF]hG]hE]hD]hH]uh1j? hM]rG h_X onlyImportantrH rI }rJ (h0Uh1jD ubah@hubaubh)rK }rL (h0Uh1j h6h9h@hhB}rM (hF]hG]hE]hD]hH]uhKNhLhhM]rN j)rO }rP (h0XK``periodicBuildTimer`` The time, in seconds, after which to start a build. h1jK h6h9h@jhB}rQ (hF]hG]hE]hD]hH]uhKMhM]rR (j)rS }rT (h0X``periodicBuildTimer``rU h1jO h6h9h@j hB}rV (hF]hG]hE]hD]hH]uhKMhM]rW h)rX }rY (h0jU hB}rZ (hF]hG]hE]hD]hH]uh1jS hM]r[ h_XperiodicBuildTimerr\ r] }r^ (h0Uh1jX ubah@hubaubj)r_ }r` (h0UhB}ra (hF]hG]hE]hD]hH]uh1jO hM]rb hc)rc }rd (h0X3The time, in seconds, after which to start a build.re h1j_ h6h9h@hghB}rf (hF]hG]hE]hD]hH]uhKMhM]rg h_X3The time, in seconds, after which to start a build.rh ri }rj (h0je h1jc ubaubah@j)ubeubaubhc)rk }rl (h0X Example::rm h1j h6h9h@hghB}rn (hF]hG]hE]hD]hH]uhKMhLhhM]ro h_XExample:rp rq }rr (h0XExample:h1jk ubaubh)rs }rt (h0Xfrom buildbot.schedulers import timed nightly = timed.Periodic(name="daily", builderNames=["full-solaris"], periodicBuildTimer=24*60*60) c['schedulers'] = [nightly]h1j h6h9h@hhB}ru (hhhD]hE]hF]hG]hH]uhKMhLhhM]rv h_Xfrom buildbot.schedulers import timed nightly = timed.Periodic(name="daily", builderNames=["full-solaris"], periodicBuildTimer=24*60*60) c['schedulers'] = [nightly]rw rx }ry (h0Uh1js ubaubhc)rz }r{ (h0X5The 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.h1j h6h9h@hghB}r| (hF]hG]hE]hD]hH]uhKMhLhhM]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 (h0XThe 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 h1jz ubj)r }r (h0X *evening*hB}r (hF]hG]hE]hD]hH]uh1jz hM]r h_Xeveningr r }r (h0Uh1j ubah@jubh_X or r r }r (h0X or h1jz ubj)r }r (h0X*every afternoon*hB}r (hF]hG]hE]hD]hH]uh1jz hM]r h_Xevery afternoonr r }r (h0Uh1j ubah@jubh_X6 scheduler depending upon when it was first activated.r r }r (h0X6 scheduler depending upon when it was first activated.h1jz ubeubh)r }r (h0Uh1j h6h9h@hhB}r (hD]hE]hF]hG]hH]Uentries]r ((UsingleXSchedulers; NightlyX sched-Nightlyr j tr (UsingleXNightly Schedulerj j tr euhKMhLhhM]ubh=)r }r (h0Uh1j h6h9h@hAhB}r (hD]hE]hF]hG]hH]hIj uhKMhLhhM]ubh=)r }r (h0X.. _Nightly-Scheduler:h1j h6h9h;}h@hAhB}r (hD]hE]hF]hG]hH]hIUnightly-schedulerr uhKMhLhhU}r j j shM]ubeubh2)r }r (h0Uh1h3h6h9h;}r hj sh@hNhB}r (hF]hG]hE]hD]r (j j Uid7r ehH]r (h#heuhKMhLhhU}r (j j j j uhM]r (hX)r }r (h0XNightly Schedulerr h1j h6h9h@h\hB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h_XNightly Schedulerr r }r (h0j h1j ubaubhc)r }r (h0XThis 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.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r (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 r r }r (h0XThis 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 h1j ubh)r }r (h0X ``crontab``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xcrontabr r }r (h0Uh1j ubah@hubh_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.r r }r (h0X, 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.h1j ubeubhc)r }r (h0XPass 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:h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r (h_XPass some subset of r r }r (h0XPass some subset of h1j ubh)r }r (h0X ``minute``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xminuter r }r (h0Uh1j ubah@hubh_X, r r }r (h0X, h1j ubh)r }r (h0X``hour``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xhourr r }r (h0Uh1j ubah@hubh_X, r r }r (h0X, h1j ubh)r }r (h0X``dayOfMonth``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_X dayOfMonthr r }r (h0Uh1j ubah@hubh_X, r r }r (h0X, h1j ubh)r }r (h0X ``month``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xmonthr r }r (h0Uh1j ubah@hubh_X, and r r }r (h0X, and h1j ubh)r }r (h0X ``dayOfWeek``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_X dayOfWeekr r }r (h0Uh1j ubah@hubh_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 (h0XG\; 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:h1j ubeubhc)r }r (h0X``name``r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xnamer r }r (h0Uh1j ubah@hubaubhc)r }r (h0X``builderNames``r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_X builderNamesr r }r (h0Uh1j ubah@hubaubhc)r }r (h0X``properties``r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_X propertiesr r! }r" (h0Uh1j ubah@hubaubhc)r# }r$ (h0X``fileIsImportant``r% h1j h6h9h@hghB}r& (hF]hG]hE]hD]hH]uhKMhLhhM]r' h)r( }r) (h0j% hB}r* (hF]hG]hE]hD]hH]uh1j# hM]r+ h_XfileIsImportantr, r- }r. (h0Uh1j( ubah@hubaubhc)r/ }r0 (h0X``change_filter``r1 h1j h6h9h@hghB}r2 (hF]hG]hE]hD]hH]uhKMhLhhM]r3 h)r4 }r5 (h0j1 hB}r6 (hF]hG]hE]hD]hH]uh1j/ hM]r7 h_X change_filterr8 r9 }r: (h0Uh1j4 ubah@hubaubhc)r; }r< (h0X``onlyImportant``r= h1j h6h9h@hghB}r> (hF]hG]hE]hD]hH]uhKMhLhhM]r? h)r@ }rA (h0j= hB}rB (hF]hG]hE]hD]hH]uh1j; hM]rC h_X onlyImportantrD rE }rF (h0Uh1j@ ubah@hubaubh)rG }rH (h0Uh1j h6h9h@hhB}rI (hF]hG]hE]hD]hH]uhKNhLhhM]rJ (j)rK }rL (h0X``codebases`` See :ref:`Configuring-Schedulers`. Note that ``fileIsImportant`` and ``change_filter`` are only relevant if ``onlyIfChanged`` is ``True``. h1jG h6h9h@jhB}rM (hF]hG]hE]hD]hH]uhKMhM]rN (j)rO }rP (h0X ``codebases``rQ h1jK h6h9h@j hB}rR (hF]hG]hE]hD]hH]uhKMhM]rS h)rT }rU (h0jQ hB}rV (hF]hG]hE]hD]hH]uh1jO hM]rW h_X codebasesrX rY }rZ (h0Uh1jT ubah@hubaubj)r[ }r\ (h0UhB}r] (hF]hG]hE]hD]hH]uh1jK hM]r^ hc)r_ }r` (h0XSee :ref:`Configuring-Schedulers`. Note that ``fileIsImportant`` and ``change_filter`` are only relevant if ``onlyIfChanged`` is ``True``.h1j[ h6h9h@hghB}ra (hF]hG]hE]hD]hH]uhKMhM]rb (h_XSee rc rd }re (h0XSee h1j_ ubh)rf }rg (h0X:ref:`Configuring-Schedulers`rh h1j_ h6h9h@hhB}ri (UreftypeXrefhhXconfiguring-schedulersU refdomainXstdrj hD]hE]U refexplicithF]hG]hH]hhuhKMhM]rk j)rl }rm (h0jh hB}rn (hF]hG]ro (hjj Xstd-refrp ehE]hD]hH]uh1jf hM]rq h_XConfiguring-Schedulersrr rs }rt (h0Uh1jl ubah@jubaubh_X . Note that ru rv }rw (h0X . Note that h1j_ ubh)rx }ry (h0X``fileIsImportant``hB}rz (hF]hG]hE]hD]hH]uh1j_ hM]r{ h_XfileIsImportantr| r} }r~ (h0Uh1jx ubah@hubh_X and r r }r (h0X and h1j_ ubh)r }r (h0X``change_filter``hB}r (hF]hG]hE]hD]hH]uh1j_ hM]r h_X change_filterr r }r (h0Uh1j ubah@hubh_X are only relevant if r r }r (h0X are only relevant if h1j_ ubh)r }r (h0X``onlyIfChanged``hB}r (hF]hG]hE]hD]hH]uh1j_ hM]r h_X onlyIfChangedr r }r (h0Uh1j ubah@hubh_X is r r }r (h0X is h1j_ ubh)r }r (h0X``True``hB}r (hF]hG]hE]hD]hH]uh1j_ hM]r h_XTruer r }r (h0Uh1j ubah@hubh_X.r }r (h0X.h1j_ ubeubah@j)ubeubj)r }r (h0X``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. h1jG h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r (j)r }r (h0X``onlyIfChanged``r h1j h6h9h@j hB}r (hF]hG]hE]hD]hH]uhKMhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_X onlyIfChangedr r }r (h0Uh1j ubah@hubaubj)r }r (h0UhB}r (hF]hG]hE]hD]hH]uh1j hM]r hc)r }r (h0XIf 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.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhM]r (h_XJIf this is true, then builds will not be scheduled at the designated time r r }r (h0XJIf this is true, then builds will not be scheduled at the designated time h1j ubj)r }r (h0X*unless*hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xunlessr r }r (h0Uh1j ubah@jubh_XL the specified branch has seen an important change since the previous build.r r }r (h0XL the specified branch has seen an important change since the previous build.h1j ubeubah@j)ubeubj)r }r (h0X``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! h1jG h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r (j)r }r (h0X ``branch``r h1j h6h9h@j hB}r (hF]hG]hE]hD]hH]uhKMhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xbranchr r }r (h0Uh1j ubah@hubaubj)r }r (h0UhB}r (hF]hG]hE]hD]hH]uh1j hM]r hc)r }r (h0X(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!h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhM]r (h_XN(required) The branch to build when the time comes. Remember that a value of r r }r (h0XN(required) The branch to build when the time comes. Remember that a value of h1j ubh)r }r (h0X``None``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_XNoner r }r (h0Uh1j ubah@hubh_XB here means the default branch, and will not match other branches!r r }r (h0XB here means the default branch, and will not match other branches!h1j ubeubah@j)ubeubj)r }r (h0Xm``minute`` The minute of the hour on which to start the build. This defaults to 0, meaning an hourly build. h1jG h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r (j)r }r (h0X ``minute``r h1j h6h9h@j hB}r (hF]hG]hE]hD]hH]uhKMhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xminuter r }r (h0Uh1j ubah@hubaubj)r }r (h0UhB}r (hF]hG]hE]hD]hH]uh1j hM]r hc)r }r (h0XaThe minute of the hour on which to start the build. This defaults to 0, meaning an hourly build.r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhM]r h_XaThe minute of the hour on which to start the build. This defaults to 0, meaning an hourly build.r r }r (h0j h1j ubaubah@j)ubeubj)r }r (h0Xx``hour`` The hour of the day on which to start the build, in 24-hour notation. This defaults to \*, meaning every hour. h1jG h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r (j)r }r (h0X``hour``r h1j h6h9h@j hB}r (hF]hG]hE]hD]hH]uhKMhM]r h)r }r (h0j hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xhourr r }r (h0Uh1j ubah@hubaubj)r }r (h0UhB}r (hF]hG]hE]hD]hH]uh1j hM]r hc)r }r (h0XnThe hour of the day on which to start the build, in 24-hour notation. This defaults to \*, meaning every hour.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhM]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 (h0XnThe hour of the day on which to start the build, in 24-hour notation. This defaults to \*, meaning every hour.h1j ubaubah@j)ubeubj)r }r! (h0Xb``dayOfMonth`` The day of the month to start a build. This defaults to ``*``, meaning every day. h1jG h6h9h@jhB}r" (hF]hG]hE]hD]hH]uhKMhLhhM]r# (j)r$ }r% (h0X``dayOfMonth``r& h1j h6h9h@j hB}r' (hF]hG]hE]hD]hH]uhKMhM]r( h)r) }r* (h0j& hB}r+ (hF]hG]hE]hD]hH]uh1j$ hM]r, h_X dayOfMonthr- r. }r/ (h0Uh1j) ubah@hubaubj)r0 }r1 (h0UhB}r2 (hF]hG]hE]hD]hH]uh1j hM]r3 hc)r4 }r5 (h0XRThe day of the month to start a build. This defaults to ``*``, meaning every day.h1j0 h6h9h@hghB}r6 (hF]hG]hE]hD]hH]uhKMhM]r7 (h_X9The day of the month to start a build. This defaults to r8 r9 }r: (h0X9The day of the month to start a build. This defaults to h1j4 ubh)r; }r< (h0X``*``hB}r= (hF]hG]hE]hD]hH]uh1j4 hM]r> h_X*r? }r@ (h0Uh1j; ubah@hubh_X, meaning every day.rA rB }rC (h0X, meaning every day.h1j4 ubeubah@j)ubeubj)rD }rE (h0Xn``month`` The month in which to start the build, with January = 1. This defaults to \*, meaning every month. h1jG h6h9h@jhB}rF (hF]hG]hE]hD]hH]uhKMhLhhM]rG (j)rH }rI (h0X ``month``rJ h1jD h6h9h@j hB}rK (hF]hG]hE]hD]hH]uhKMhM]rL h)rM }rN (h0jJ hB}rO (hF]hG]hE]hD]hH]uh1jH hM]rP h_XmonthrQ rR }rS (h0Uh1jM ubah@hubaubj)rT }rU (h0UhB}rV (hF]hG]hE]hD]hH]uh1jD hM]rW hc)rX }rY (h0XcThe month in which to start the build, with January = 1. This defaults to \*, meaning every month.h1jT h6h9h@hghB}rZ (hF]hG]hE]hD]hH]uhKMhM]r[ h_XbThe month in which to start the build, with January = 1. This defaults to *, meaning every month.r\ r] }r^ (h0XcThe month in which to start the build, with January = 1. This defaults to \*, meaning every month.h1jX ubaubah@j)ubeubj)r_ }r` (h0Xz``dayOfWeek`` The day of the week to start a build, with Monday = 0. This defaults to \*, meaning every day of the week. h1jG h6h9h@jhB}ra (hF]hG]hE]hD]hH]uhKMhLhhM]rb (j)rc }rd (h0X ``dayOfWeek``re h1j_ h6h9h@j hB}rf (hF]hG]hE]hD]hH]uhKMhM]rg h)rh }ri (h0je hB}rj (hF]hG]hE]hD]hH]uh1jc hM]rk h_X dayOfWeekrl rm }rn (h0Uh1jh ubah@hubaubj)ro }rp (h0UhB}rq (hF]hG]hE]hD]hH]uh1j_ hM]rr hc)rs }rt (h0XkThe day of the week to start a build, with Monday = 0. This defaults to \*, meaning every day of the week.h1jo h6h9h@hghB}ru (hF]hG]hE]hD]hH]uhKMhM]rv h_XjThe day of the week to start a build, with Monday = 0. This defaults to *, meaning every day of the week.rw rx }ry (h0XkThe day of the week to start a build, with Monday = 0. This defaults to \*, meaning every day of the week.h1js ubaubah@j)ubeubeubhc)rz }r{ (h0XeFor example, the following master.cfg clause will cause a build to be started every night at 3:00am::h1j h6h9h@hghB}r| (hF]hG]hE]hD]hH]uhKMhLhhM]r} h_XdFor example, the following master.cfg clause will cause a build to be started every night at 3:00am:r~ r }r (h0XdFor example, the following master.cfg clause will cause a build to be started every night at 3:00am:h1jz ubaubh)r }r (h0Xfrom buildbot.schedulers import timed c['schedulers'].append( timed.Nightly(name='nightly', branch='master', builderNames=['builder1', 'builder2'], hour=3, minute=0))h1j h6h9h@hhB}r (hhhD]hE]hF]hG]hH]uhKMhLhhM]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 (h0Uh1j ubaubhc)r }r (h0XThis 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::h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]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 (h0XThis 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:h1j ubaubh)r }r (h0Xc['schedulers'].append( timed.Nightly(name='BeforeWork', branch=`default`, builderNames=['builder1'], dayOfWeek=0, hour=[6,8], minute=23, onlyIfChanged=True))h1j h6h9h@hhB}r (hhhD]hE]hF]hG]hH]uhKMhLhhM]r h_Xc['schedulers'].append( timed.Nightly(name='BeforeWork', branch=`default`, builderNames=['builder1'], dayOfWeek=0, hour=[6,8], minute=23, onlyIfChanged=True))r r }r (h0Uh1j ubaubhc)r }r (h0XSThe following runs a build every two hours, using Python's :func:`range` function::h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKM hLhhM]r (h_X;The following runs a build every two hours, using Python's r r }r (h0X;The following runs a build every two hours, using Python's h1j ubh)r }r (h0X :func:`range`r h1j h6h9h@hhB}r (UreftypeXfunchhXrangeU refdomainXpyr hD]hE]U refexplicithF]hG]hH]hhhNhNuhKM hM]r h)r }r (h0j hB}r (hF]hG]r (hj Xpy-funcr ehE]hD]hH]uh1j hM]r h_Xranger r }r (h0Uh1j ubah@hubaubh_X function:r r }r (h0X function:h1j ubeubh)r }r (h0Xc.schedulers.append( timed.Nightly(name='every2hours', branch=None, # default branch builderNames=['builder1'], hour=range(0, 24, 2)))h1j h6h9h@hhB}r (hhhD]hE]hF]hG]hH]uhKMhLhhM]r h_Xc.schedulers.append( timed.Nightly(name='every2hours', branch=None, # default branch builderNames=['builder1'], hour=range(0, 24, 2)))r r }r (h0Uh1j ubaubhc)r }r (h0X6Finally, this example will run only on December 24th::r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h_X5Finally, this example will run only on December 24th:r r }r (h0X5Finally, this example will run only on December 24th:h1j ubaubh)r }r (h0Xc['schedulers'].append( timed.Nightly(name='SleighPreflightCheck', branch=None, # default branch builderNames=['flying_circuits', 'radar'], month=12, dayOfMonth=24, hour=12, minute=0))h1j h6h9h@hhB}r (hhhD]hE]hF]hG]hH]uhKMhLhhM]r h_Xc['schedulers'].append( timed.Nightly(name='SleighPreflightCheck', branch=None, # default branch builderNames=['flying_circuits', 'radar'], month=12, dayOfMonth=24, hour=12, minute=0))r r }r (h0Uh1j ubaubh)r }r (h0Uh1j h6h9h@hhB}r (hD]hE]hF]hG]hH]Uentries]r ((UsingleXSchedulers; Try_JobdirXsched-Try_Jobdirr j tr (UsingleXTry_Jobdir Schedulerj j tr euhKM!hLhhM]ubh=)r }r (h0Uh1j h6h9h@hAhB}r (hF]hG]hE]hD]r j ahH]uhKM!hLhhM]ubh)r }r (h0Uh1j h6h9h@hhB}r (hD]hE]hF]hG]hH]Uentries]r ((UsingleXSchedulers; Try_UserpassXsched-Try_Userpassr j tr (UsingleXTry_Userpass Schedulerj j tr euhKM#hLhhM]ubh=)r }r (h0Uh1j h6h9h@hAhB}r (hD]hE]hF]hG]hH]hIj uhKM#hLhhM]ubh=)r }r (h0X.. _Try-Schedulers:h1j h6h9h;}h@hAhB}r (hD]hE]hF]hG]hH]hIUtry-schedulersr uhKM$hLhhU}r j j shM]ubeubh2)r }r (h0Uh1h3h6h9h;}r hj sh@hNhB}r (hF]hG]hE]hD]r (j j Uid8r ehH]r (h&heuhKM'hLhhU}r (j j j j uhM]r (hX)r }r (h0XTry Schedulersr h1j h6h9h@h\hB}r (hF]hG]hE]hD]hH]uhKM'hLhhM]r h_XTry Schedulersr r }r (h0j h1j ubaubhc)r }r (h0XThis 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.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKM)hLhhM]r (h_X,This scheduler allows developers to use the r r }r (h0X,This scheduler allows developers to use the h1j ubcdocutils.nodes strong r )r }r (h0X:command:`buildbot try`hB}r (hF]hG]r Ucommandr ahE]hD]hH]uh1j hM]r h_X buildbot tryr r }r (h0Uh1j ubah@Ustrongr ubh_XD command to trigger builds of code they have not yet committed. See r r }r (h0XD command to trigger builds of code they have not yet committed. See h1j ubh)r }r (h0X:bb:cmdline:`try`r h1j h6h9h@hhB}r (UreftypeXcmdlinehhXtryU refdomainXbbr hD]hE]U refexplicithF]hG]hH]hhuhKM)hM]r h)r }r (h0j hB}r (hF]hG]r (hj X bb-cmdliner ehE]hD]hH]uh1j hM]r h_Xtryr r }r (h0Uh1j ubah@hubaubh_X for complete details.r r }r (h0X for complete details.h1j ubeubhc)r }r (h0XTwo 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``.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKM-hLhhM]r (h_X#Two implementations are available: r r }r (h0X#Two implementations are available: h1j ubh)r }r (h0X:bb:sched:`Try_Jobdir`r h1j h6h9h@hhB}r! (UreftypeXschedhhX Try_JobdirU refdomainXbbr" hD]hE]U refexplicithF]hG]hH]hhuhKM-hM]r# h)r$ }r% (h0j hB}r& (hF]hG]r' (hj" Xbb-schedr( ehE]hD]hH]uh1j hM]r) h_X Try_Jobdirr* r+ }r, (h0Uh1j$ ubah@hubaubh_X and r- r. }r/ (h0X and h1j ubh)r0 }r1 (h0X:bb:sched:`Try_Userpass`r2 h1j h6h9h@hhB}r3 (UreftypeXschedhhX Try_UserpassU refdomainXbbr4 hD]hE]U refexplicithF]hG]hH]hhuhKM-hM]r5 h)r6 }r7 (h0j2 hB}r8 (hF]hG]r9 (hj4 Xbb-schedr: ehE]hD]hH]uh1j0 hM]r; h_X Try_Userpassr< r= }r> (h0Uh1j6 ubah@hubaubh_X9. The former monitors a job directory, specified by the r? r@ }rA (h0X9. The former monitors a job directory, specified by the h1j ubh)rB }rC (h0X ``jobdir``hB}rD (hF]hG]hE]hD]hH]uh1j hM]rE h_XjobdirrF rG }rH (h0Uh1jB ubah@hubh_XF parameter, while the latter listens for PB connections on a specific rI rJ }rK (h0XF parameter, while the latter listens for PB connections on a specific h1j ubh)rL }rM (h0X``port``hB}rN (hF]hG]hE]hD]hH]uh1j hM]rO h_XportrP rQ }rR (h0Uh1jL ubah@hubh_X, and authenticates against rS rT }rU (h0X, and authenticates against h1j ubh)rV }rW (h0X ``userport``hB}rX (hF]hG]hE]hD]hH]uh1j hM]rY h_XuserportrZ r[ }r\ (h0Uh1jV ubah@hubh_X.r] }r^ (h0X.h1j ubeubhc)r_ }r` (h0XThe 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.h1j h6h9h@hghB}ra (hF]hG]hE]hD]hH]uhKM3hLhhM]rb (h_XDThe buildmaster must have a scheduler instance in the config file's rc rd }re (h0XDThe buildmaster must have a scheduler instance in the config file's h1j_ ubh)rf }rg (h0X:bb:cfg:`schedulers`rh h1j_ h6h9h@hhB}ri (UreftypeXcfghhX schedulersU refdomainXbbrj hD]hE]U refexplicithF]hG]hH]hhuhKM3hM]rk h)rl }rm (h0jh hB}rn (hF]hG]ro (hjj Xbb-cfgrp ehE]hD]hH]uh1jf hM]rq h_X schedulersrr rs }rt (h0Uh1jl ubah@hubaubh_XZ list to receive try requests. This lets the administrator control who may initiate these ru rv }rw (h0XZ list to receive try requests. This lets the administrator control who may initiate these h1j_ ubcdocutils.nodes title_reference rx )ry }rz (h0X`trial`hB}r{ (hF]hG]hE]hD]hH]uh1j_ hM]r| h_Xtrialr} r~ }r (h0Uh1jy ubah@Utitle_referencer ubh_Xb builds, which branches are eligible for trial builds, and which Builders should be used for them.r r }r (h0Xb builds, which branches are eligible for trial builds, and which Builders should be used for them.h1j_ ubeubhc)r }r (h0XThe 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 h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKM8hLhhM]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 (h0j h1j ubaubhc)r }r (h0XnAs a result, the try scheduler requires a bit more configuration. There are currently two ways to set this up:r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMHhLhhM]r h_XnAs a result, the try scheduler requires a bit more configuration. There are currently two ways to set this up:r r }r (h0j h1j ubaubh)r }r (h0Uh1j h6h9h@hhB}r (hF]hG]hE]hD]hH]uhKNhLhhM]r (j)r }r (h0X``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. h1j h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMehM]r (j)r }r (h0X``jobdir`` (ssh)r h1j h6h9h@j hB}r (hF]hG]hE]hD]hH]uhKMehM]r (h)r }r (h0X ``jobdir``hB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xjobdirr r }r (h0Uh1j ubah@hubh_X (ssh)r r }r (h0X (ssh)h1j ubeubj)r }r (h0UhB}r (hF]hG]hE]hD]hH]uh1j hM]r (hc)r }r (h0X+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.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMLhM]r (h_X<This approach creates a command queue directory, called the r r }r (h0X<This approach creates a command queue directory, called the h1j ubh)r }r (h0UhB}r (hD]hE]hF]hG]r Xfiler aUrolej hH]uh1j hM]r h_Xjobdirr r }r (h0Xjobdirh1j ubah@hubh_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 (h0X, 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 h1j ubj )r }r (h0X:command:`buildbot try`hB}r (hF]hG]r j ahE]hD]hH]uh1j hM]r h_X buildbot tryr r }r (h0Uh1j ubah@j ubh_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.r r }r (h0X 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.h1j ubeubhc)r }r (h0XThe 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).r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMUhM]r h_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).r r }r (h0j h1j ubaubhc)r }r (h0XThe 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.r h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMYhM]r h_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.r r }r (h0j h1j ubaubhc)r }r (h0XTo 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.h1j h6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMbhM]r (h_X*To implement this, the buildslave invokes r r }r (h0X*To implement this, the buildslave invokes h1j ubh)r }r (h0UhB}r (hD]hE]hF]hG]r Xsampr aUrolej hH]uh1j hM]r (h_Xssh -l r r }r (h0Xssh -l h1j ubj)r }r (h0XusernamehB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xusernamer r }r (h0Uh1j ubah@jubh_X r }r (h0X h1j ubj)r }r (h0XhosthB}r (hF]hG]hE]hD]hH]uh1j hM]r h_Xhostr r }r (h0Uh1j ubah@jubh_X buildbot tryserver r r }r (h0X buildbot tryserver h1j ubj)r}r(h0XARGShB}r(hF]hG]hE]hD]hH]uh1j hM]rh_XARGSrr}r(h0Uh1jubah@jubeh@hubh_Xu, passing the patch contents over stdin. The arguments must include the inlet directory and the revision information.rr}r (h0Xu, passing the patch contents over stdin. The arguments must include the inlet directory and the revision information.h1j ubeubeh@j)ubeubj)r }r (h0XF``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. h1j h6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMuhLhhM]r (j)r}r(h0X``user+password`` (PB)rh1j h6h9h@j hB}r(hF]hG]hE]hD]hH]uhKMuhM]r(h)r}r(h0X``user+password``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X user+passwordrr}r(h0Uh1jubah@hubh_X (PB)rr}r(h0X (PB)h1jubeubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1j hM]r (hc)r!}r"(h0XPIn 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.h1jh6h9h@hghB}r#(hF]hG]hE]hD]hH]uhKMhhM]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 r%r&}r'(h0XIn this approach, each developer gets a username/password pair, which are all listed in the buildmaster's configuration file. When the developer runs h1j!ubj )r(}r)(h0X:command:`buildbot try`hB}r*(hF]hG]r+j ahE]hD]hH]uh1j!hM]r,h_X buildbot tryr-r.}r/(h0Uh1j(ubah@j ubh_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.r0r1}r2(h0X, 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.h1j!ubeubhc)r3}r4(h0XThe 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.h1jh6h9h@hghB}r5(hF]hG]hE]hD]hH]uhKMnhM]r6(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 r7r8}r9(h0XThe 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 h1j3ubjx )r:}r;(h0X`cred`hB}r<(hF]hG]hE]hD]hH]uh1j3hM]r=h_Xcredr>r?}r@(h0Uh1j:ubah@j ubh_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.rArB}rC(h0X, 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.h1j3ubeubeh@j)ubeubeubhc)rD}rE(h0XFor 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:h1j h6h9h@hghB}rF(hF]hG]hE]hD]hH]uhKMwhLhhM]rG(h_XFor example, to set up the rHrI}rJ(h0XFor example, to set up the h1jDubjx )rK}rL(h0X`jobdir`hB}rM(hF]hG]hE]hD]hH]uh1jDhM]rNh_XjobdirrOrP}rQ(h0Uh1jKubah@j ubh_X: style of trial build, using a command queue directory of rRrS}rT(h0X: style of trial build, using a command queue directory of h1jDubh)rU}rV(h0UhB}rW(hD]hE]hF]hG]rXXfilerYaUrolejYhH]uh1jDhM]rZ(j)r[}r\(h0X MASTERDIRhB}r](hF]hG]hE]hD]hH]uh1jUhM]r^h_X MASTERDIRr_r`}ra(h0Uh1j[ubah@jubh_X/jobdirrbrc}rd(h0X/jobdirh1jUubeh@hubh_XD (and assuming that all your project developers were members of the rerf}rg(h0XD (and assuming that all your project developers were members of the h1jDubh)rh}ri(h0X``developers``hB}rj(hF]hG]hE]hD]hH]uh1jDhM]rkh_X developersrlrm}rn(h0Uh1jhubah@hubh_X4 unix group), you would first set up that directory:rorp}rq(h0X4 unix group), you would first set up that directory:h1jDubeubh)rr}rs(h0Xmkdir -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/*h1j h6h9h@hhB}rt(jjXbashhhhD]hE]hF]hG]hH]uhKM|hLhhM]ruh_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/*rvrw}rx(h0Uh1jrubaubhc)ry}rz(h0XGand then use the following scheduler in the buildmaster's config file::r{h1j h6h9h@hghB}r|(hF]hG]hE]hD]hH]uhKMhLhhM]r}h_XFand then use the following scheduler in the buildmaster's config file:r~r}r(h0XFand then use the following scheduler in the buildmaster's config file:h1jyubaubh)r}r(h0Xfrom buildbot.schedulers.trysched import Try_Jobdir s = Try_Jobdir(name="try1", builderNames=["full-linux", "full-netbsd", "full-OSX"], jobdir="jobdir") c['schedulers'] = [s]h1j h6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKMhLhhM]rh_Xfrom buildbot.schedulers.trysched import Try_Jobdir s = Try_Jobdir(name="try1", builderNames=["full-linux", "full-netbsd", "full-OSX"], jobdir="jobdir") c['schedulers'] = [s]rr}r(h0Uh1jubaubhc)r}r(h0XeNote 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.h1j h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]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 rr}r(h0XNote 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 h1jubh)r}r(h0UhB}r(hD]hE]hF]hG]rXfileraUrolejhH]uh1jhM]rh_X twistd.logrr}r(h0X twistd.logh1jubah@hubh_X file (rr}r(h0X file (h1jubh)r}r(h0X:ref:`Logfiles`rh1jh6h9h@hhB}r(UreftypeXrefhhXlogfilesU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKMhM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_XLogfilesrr}r(h0Uh1jubah@jubaubh_XO) as you start using the jobdir, to make sure the buildmaster is happy with it.rr}r(h0XO) as you start using the jobdir, to make sure the buildmaster is happy with it.h1jubeubj)r}r(h0XbPatches 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 = 1000000h1j h6h9h@jhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]r(hc)r}r(h0XPatches 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`::h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]r(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 rr}r(h0XPatches 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 h1jubjx )r}r(h0X `BadJobfile`hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X BadJobfilerr}r(h0Uh1jubah@j ubh_X=, try increasing this limit with a snippet like this in your rr}r(h0X=, try increasing this limit with a snippet like this in your h1jubjx )r}r(h0X `master.cfg`hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X master.cfgrr}r(h0Uh1jubah@j ubh_X:r}r(h0X:h1jubeubh)r}r(h0X\from twisted.protocols.basic import NetstringReceiver NetstringReceiver.MAX_LENGTH = 1000000h1jh@hhB}r(hhhD]hE]hF]hG]hH]uhKMhM]rh_X\from twisted.protocols.basic import NetstringReceiver NetstringReceiver.MAX_LENGTH = 1000000rr}r(h0Uh1jubaubeubhc)r}r(h0XTo 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::h1j h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h_X>To use the username/password form of authentication, create a rr}r(h0X>To use the username/password form of authentication, create a h1jubh)r}r(h0X:class:`Try_Userpass`rh1jh6h9h@hhB}r(UreftypeXclasshhX Try_UserpassU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_X Try_Userpassrr}r(h0Uh1jubah@hubaubh_X% instance instead. It takes the same rr}r(h0X% instance instead. It takes the same h1jubh)r}r(h0X``builderNames``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X builderNamesrr}r(h0Uh1jubah@hubh_X argument as the rr}r(h0X argument as the h1jubh)r}r(h0X:class:`Try_Jobdir`rh1jh6h9h@hhB}r(UreftypeXclasshhX Try_JobdirU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_X Try_Jobdirrr}r(h0Uh1jubah@hubaubh_X! form, but accepts an additional rr}r(h0X! form, but accepts an additional h1jubh)r}r(h0X``port``hB}r (hF]hG]hE]hD]hH]uh1jhM]r h_Xportr r }r (h0Uh1jubah@hubh_X7 argument (to specify the TCP port to listen on) and a rr}r(h0X7 argument (to specify the TCP port to listen on) and a h1jubh)r}r(h0X ``userpass``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xuserpassrr}r(h0Uh1jubah@hubh_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(h0X list of username/password pairs to accept. Remember to use good passwords for this: the security of the buildslave accounts depends upon it:h1jubeubh)r}r(h0X 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]h1j h6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKMhLhhM]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!(h0Uh1jubaubhc)r"}r#(h0XLike most places in the buildbot, the ``port`` argument takes a `strports` specification. See :mod:`twisted.application.strports` for details.h1j h6h9h@hghB}r$(hF]hG]hE]hD]hH]uhKMhLhhM]r%(h_X&Like most places in the buildbot, the r&r'}r((h0X&Like most places in the buildbot, the h1j"ubh)r)}r*(h0X``port``hB}r+(hF]hG]hE]hD]hH]uh1j"hM]r,h_Xportr-r.}r/(h0Uh1j)ubah@hubh_X argument takes a r0r1}r2(h0X argument takes a h1j"ubjx )r3}r4(h0X `strports`hB}r5(hF]hG]hE]hD]hH]uh1j"hM]r6h_Xstrportsr7r8}r9(h0Uh1j3ubah@j ubh_X specification. See r:r;}r<(h0X specification. See h1j"ubh)r=}r>(h0X#:mod:`twisted.application.strports`r?h1j"h6h9h@hhB}r@(UreftypeXmodhhXtwisted.application.strportsU refdomainXpyrAhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rBh)rC}rD(h0j?hB}rE(hF]hG]rF(hjAXpy-modrGehE]hD]hH]uh1j=hM]rHh_Xtwisted.application.strportsrIrJ}rK(h0Uh1jCubah@hubaubh_X for details.rLrM}rN(h0X for details.h1j"ubeubh)rO}rP(h0Uh1j h6h9h@hhB}rQ(hD]hE]hF]hG]hH]Uentries]rR((UsingleXSchedulers; TriggerableXsched-TriggerablerSjStrT(UsingleXTriggerable SchedulerjSjStrUeuhKMhLhhM]ubh=)rV}rW(h0Uh1j h6h9h@hAhB}rX(hF]hG]hE]hD]rYjSahH]uhKMhLhhM]ubh)rZ}r[(h0Uh1j h6h9h@hhB}r\(hD]hE]hF]hG]hH]jI]r](jKXTriggersUindex-1r^Utr_ajNuhKMhLhhM]ubh=)r`}ra(h0Uh1j h6h9h@hAhB}rb(hD]hE]hF]hG]hH]hIj^uhKMhLhhM]ubh=)rc}rd(h0X.. _Triggerable-Scheduler:h1j h6h9h;}h@hAhB}re(hD]hE]hF]hG]hH]hIUtriggerable-schedulerrfuhKMhLhhU}rgj^j`shM]ubeubh2)rh}ri(h0Uh1h3h6h9h;}rjh(jcsh@hNhB}rk(hF]hG]hE]hD]rl(jfj^Uid9rmehH]rn(hh(euhKMhLhhU}ro(jfjcj^j`uhM]rp(hX)rq}rr(h0XTriggerable Schedulerrsh1jhh6h9h@h\hB}rt(hF]hG]hE]hD]hH]uhKMhLhhM]ruh_XTriggerable Schedulerrvrw}rx(h0jsh1jqubaubhc)ry}rz(h0XThe :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.h1jhh6h9h@hghB}r{(hF]hG]hE]hD]hH]uhKMhLhhM]r|(h_XThe r}r~}r(h0XThe h1jyubh)r}r(h0X:class:`Triggerable`rh1jyh6h9h@hhB}r(UreftypeXclasshhX TriggerableU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_X Triggerablerr}r(h0Uh1jubah@hubaubh_X8 scheduler waits to be triggered by a Trigger step (see rr}r(h0X8 scheduler waits to be triggered by a Trigger step (see h1jyubh)r}r(h0X:ref:`Triggering-Schedulers`rh1jyh6h9h@hhB}r(UreftypeXrefhhXtriggering-schedulersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKMhM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_XTriggering-Schedulersrr}r(h0Uh1jubah@jubaubh_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.rr}r(h0XD) 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.h1jyubeubhc)r}r(h0X#The parameters are just the basics:rh1jhh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_X#The parameters are just the basics:rr}r(h0jh1jubaubhc)r}r(h0X``name``rh1jhh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xnamerr}r(h0Uh1jubah@hubaubhc)r}r(h0X``builderNames``rh1jhh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X builderNamesrr}r(h0Uh1jubah@hubaubhc)r}r(h0X``properties``rh1jhh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X propertiesrr}r(h0Uh1jubah@hubaubh)r}r(h0Uh1jhh6h9h@hhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rj)r}r(h0X2``codebases`` See :ref:`Configuring-Schedulers`. h1jh6h9h@jhB}r(hF]hG]hE]hD]hH]uhKMhM]r(j)r}r(h0X ``codebases``rh1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKMhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X codebasesrr}r(h0Uh1jubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X"See :ref:`Configuring-Schedulers`.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]r(h_XSee rr}r(h0XSee h1jubh)r}r(h0X:ref:`Configuring-Schedulers`rh1jh6h9h@hhB}r(UreftypeXrefhhXconfiguring-schedulersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKMhM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_XConfiguring-Schedulersrr}r(h0Uh1jubah@jubaubh_X.r}r(h0X.h1jubeubah@j)ubeubaubhc)r}r(h0XiThis class is only useful in conjunction with the :class:`Trigger` step. Here is a fully-worked example::h1jhh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h_X2This class is only useful in conjunction with the rr}r(h0X2This class is only useful in conjunction with the h1jubh)r}r(h0X:class:`Trigger`r h1jh6h9h@hhB}r (UreftypeXclasshhXTriggerU refdomainXpyr hD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]r h)r }r(h0j hB}r(hF]hG]r(hj Xpy-classrehE]hD]hH]uh1jhM]rh_XTriggerrr}r(h0Uh1j ubah@hubaubh_X& step. Here is a fully-worked example:rr}r(h0X& step. Here is a fully-worked example:h1jubeubh)r}r(h0Xfrom 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))h1jhh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKMhLhhM]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(h0Uh1jubaubh)r }r!(h0Uh1jhh6h9h@hhB}r"(hD]hE]hF]hG]hH]Uentries]r#((UsingleXSchedulers; NightlyTriggerableXsched-NightlyTriggerabler$j$tr%(UsingleXNightlyTriggerable Schedulerj$j$tr&euhKMhLhhM]ubh=)r'}r((h0Uh1jhh6h9h@hAhB}r)(hD]hE]hF]hG]hH]hIj$uhKMhLhhM]ubeubh2)r*}r+(h0Uh1h3h6h9h;}h@hNhB}r,(hF]hG]hE]hD]r-(Unightlytriggerable-schedulerr.j$ehH]r/h auhKMhLhhU}r0j$j'shM]r1(hX)r2}r3(h0XNightlyTriggerable Schedulerr4h1j*h6h9h@h\hB}r5(hF]hG]hE]hD]hH]uhKMhLhhM]r6h_XNightlyTriggerable Schedulerr7r8}r9(h0j4h1j2ubaubh)r:}r;(h0Uh1j*h6Nh@hhB}r<(hD]hE]hF]hG]hH]Uentries]r=(jKX=buildbot.schedulers.timed.NightlyTriggerable (built-in class)hUtr>auhKNhLhhM]ubcsphinx.addnodes desc r?)r@}rA(h0Uh1j*h6Nh@UdescrBhB}rC(UnoindexrDUdomainrEXpyhD]hE]hF]hG]hH]UobjtyperFXclassrGUdesctyperHjGuhKNhLhhM]rI(csphinx.addnodes desc_signature rJ)rK}rL(h0X,buildbot.schedulers.timed.NightlyTriggerableh1j@h6h9h@Udesc_signaturerMhB}rN(hD]rOhaUmodulerPNhE]hF]hG]hH]rQhaUfullnamerRhUclassrSXbuildbot.schedulers.timedUfirstrTuhKMhLhhM]rU(csphinx.addnodes desc_annotation rV)rW}rX(h0Xclass h1jKh6h9h@Udesc_annotationrYhB}rZ(hF]hG]hE]hD]hH]uhKMhLhhM]r[h_Xclass r\r]}r^(h0Uh1jWubaubcsphinx.addnodes desc_addname r_)r`}ra(h0Xbuildbot.schedulers.timed.h1jKh6h9h@U desc_addnamerbhB}rc(hF]hG]hE]hD]hH]uhKMhLhhM]rdh_Xbuildbot.schedulers.timed.rerf}rg(h0Uh1j`ubaubcsphinx.addnodes desc_name rh)ri}rj(h0XNightlyTriggerableh1jKh6h9h@U desc_namerkhB}rl(hF]hG]hE]hD]hH]uhKMhLhhM]rmh_XNightlyTriggerablernro}rp(h0Uh1jiubaubeubcsphinx.addnodes desc_content rq)rr}rs(h0Uh1j@h6h9h@U desc_contentrthB}ru(hF]hG]hE]hD]hH]uhKMhLhhM]ubeubhc)rv}rw(h0X^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.h1j*h6h9h@hghB}rx(hF]hG]hE]hD]hH]uhKMhLhhM]ry(h_XThe rzr{}r|(h0XThe h1jvubh)r}}r~(h0X:class:`NightlyTriggerable`rh1jvh6h9h@hhB}r(UreftypeXclasshhXNightlyTriggerableU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1j}hM]rh_XNightlyTriggerablerr}r(h0Uh1jubah@hubaubh_X scheduler is a mix of the rr}r(h0X scheduler is a mix of the h1jvubh)r}r(h0X:class:`Nightly`rh1jvh6h9h@hhB}r(UreftypeXclasshhXNightlyU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_XNightlyrr}r(h0Uh1jubah@hubaubh_X and rr}r(h0X and h1jvubh)r}r(h0X:class:`Triggerable`rh1jvh6h9h@hhB}r(UreftypeXclasshhX TriggerableU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_X Triggerablerr}r(h0Uh1jubah@hubaubh_Xg schedulers. This scheduler triggers builds at a particular time of day, week, or year, exactly as the rr}r(h0Xg schedulers. This scheduler triggers builds at a particular time of day, week, or year, exactly as the h1jvubh)r}r(h0X:class:`Nightly`rh1jvh6h9h@hhB}r(UreftypeXclasshhXNightlyU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_XNightlyrr}r(h0Uh1jubah@hubaubh_XQ scheduler. However, the source stamp set that is used that provided by the last rr}r(h0XQ scheduler. However, the source stamp set that is used that provided by the last h1jvubh)r}r(h0X:class:`Trigger`rh1jvh6h9h@hhB}r(UreftypeXclasshhXTriggerU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_XTriggerrr}r(h0Uh1jubah@hubaubh_X# step that targeted this scheduler.rr}r(h0X# step that targeted this scheduler.h1jvubeubhc)r}r(h0X#The parameters are just the basics:rh1j*h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_X#The parameters are just the basics:rr}r(h0jh1jubaubhc)r}r(h0X``name``rh1j*h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xnamerr}r(h0Uh1jubah@hubaubhc)r}r(h0X``builderNames``rh1j*h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X builderNamesrr}r(h0Uh1jubah@hubaubhc)r}r(h0X``properties``rh1j*h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X propertiesrr}r(h0Uh1jubah@hubaubh)r}r(h0Uh1j*h6h9h@hhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rj)r}r(h0X1``codebases`` See :ref:`Configuring-Schedulers`. h1jh6h9h@jhB}r (hF]hG]hE]hD]hH]uhKMhM]r (j)r }r (h0X ``codebases``r h1jh6h9h@j hB}r(hF]hG]hE]hD]hH]uhKMhM]rh)r}r(h0j hB}r(hF]hG]hE]hD]hH]uh1j hM]rh_X codebasesrr}r(h0Uh1jubah@hubaubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X"See :ref:`Configuring-Schedulers`.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]r(h_XSee rr }r!(h0XSee h1jubh)r"}r#(h0X:ref:`Configuring-Schedulers`r$h1jh6h9h@hhB}r%(UreftypeXrefhhXconfiguring-schedulersU refdomainXstdr&hD]hE]U refexplicithF]hG]hH]hhuhKMhM]r'j)r(}r)(h0j$hB}r*(hF]hG]r+(hj&Xstd-refr,ehE]hD]hH]uh1j"hM]r-h_XConfiguring-Schedulersr.r/}r0(h0Uh1j(ubah@jubaubh_X.r1}r2(h0X.h1jubeubah@j)ubeubaubhc)r3}r4(h0X ``minute``r5h1j*h6h9h@hghB}r6(hF]hG]hE]hD]hH]uhKMhLhhM]r7h)r8}r9(h0j5hB}r:(hF]hG]hE]hD]hH]uh1j3hM]r;h_Xminuter<r=}r>(h0Uh1j8ubah@hubaubhc)r?}r@(h0X``hour``rAh1j*h6h9h@hghB}rB(hF]hG]hE]hD]hH]uhKMhLhhM]rCh)rD}rE(h0jAhB}rF(hF]hG]hE]hD]hH]uh1j?hM]rGh_XhourrHrI}rJ(h0Uh1jDubah@hubaubhc)rK}rL(h0X``dayOfMonth``rMh1j*h6h9h@hghB}rN(hF]hG]hE]hD]hH]uhKMhLhhM]rOh)rP}rQ(h0jMhB}rR(hF]hG]hE]hD]hH]uh1jKhM]rSh_X dayOfMonthrTrU}rV(h0Uh1jPubah@hubaubhc)rW}rX(h0X ``month``rYh1j*h6h9h@hghB}rZ(hF]hG]hE]hD]hH]uhKMhLhhM]r[h)r\}r](h0jYhB}r^(hF]hG]hE]hD]hH]uh1jWhM]r_h_Xmonthr`ra}rb(h0Uh1j\ubah@hubaubh)rc}rd(h0Uh1j*h6h9h@hhB}re(hF]hG]hE]hD]hH]uhKNhLhhM]rfj)rg}rh(h0X'``dayOfWeek`` See :bb:sched:`Nightly`. h1jch6h9h@jhB}ri(hF]hG]hE]hD]hH]uhKMhM]rj(j)rk}rl(h0X ``dayOfWeek``rmh1jgh6h9h@j hB}rn(hF]hG]hE]hD]hH]uhKMhM]roh)rp}rq(h0jmhB}rr(hF]hG]hE]hD]hH]uh1jkhM]rsh_X dayOfWeekrtru}rv(h0Uh1jpubah@hubaubj)rw}rx(h0UhB}ry(hF]hG]hE]hD]hH]uh1jghM]rzhc)r{}r|(h0XSee :bb:sched:`Nightly`.h1jwh6h9h@hghB}r}(hF]hG]hE]hD]hH]uhKMhM]r~(h_XSee rr}r(h0XSee h1j{ubh)r}r(h0X:bb:sched:`Nightly`rh1j{h6h9h@hhB}r(UreftypeXschedhhXNightlyU refdomainXbbrhD]hE]U refexplicithF]hG]hH]hhuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXbb-schedrehE]hD]hH]uh1jhM]rh_XNightlyrr}r(h0Uh1jubah@hubaubh_X.r}r(h0X.h1j{ubeubah@j)ubeubaubhc)r}r(h0XThis class is only useful in conjunction with the :class:`Trigger` step. Note that ``waitForFinish`` is ignored by :class:`Trigger` steps targeting this scheduler.h1j*h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h_X2This class is only useful in conjunction with the rr}r(h0X2This class is only useful in conjunction with the h1jubh)r}r(h0X:class:`Trigger`rh1jh6h9h@hhB}r(UreftypeXclasshhXTriggerU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_XTriggerrr}r(h0Uh1jubah@hubaubh_X step. Note that rr}r(h0X step. Note that h1jubh)r}r(h0X``waitForFinish``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X waitForFinishrr}r(h0Uh1jubah@hubh_X is ignored by rr}r(h0X is ignored by h1jubh)r}r(h0X:class:`Trigger`rh1jh6h9h@hhB}r(UreftypeXclasshhXTriggerU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_XTriggerrr}r(h0Uh1jubah@hubaubh_X steps targeting this scheduler.rr}r(h0X steps targeting this scheduler.h1jubeubhc)r}r(h0X Here is a fully-worked example::rh1j*h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM!hLhhM]rh_XHere is a fully-worked example:rr}r(h0XHere is a fully-worked example:h1jubaubh)r}r(h0Xfrom 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']))h1j*h6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKM#hLhhM]rh_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']))rr}r(h0Uh1jubaubh)r}r(h0Uh1j*h6h9h@hhB}r(hD]hE]hF]hG]hH]Uentries]r((UsingleXSchedulers; ForceSchedulerXsched-ForceSchedulerrjtr(UsingleXForceScheduler SchedulerjjtreuhKM<hLhhM]ubh=)r}r(h0Uh1j*h6h9h@hAhB}r(hF]hG]hE]hD]rjahH]uhKM<hLhhM]ubh)r}r(h0Uh1j*h6h9h@hhB}r(hD]hE]hF]hG]hH]jI]r(jKX Forced BuildsUindex-2rUtrajNuhKM=hLhhM]ubh=)r}r(h0Uh1j*h6h9h@hAhB}r(hD]hE]hF]hG]hH]hIjuhKM>hLhhM]ubeubh2)r}r(h0Uh1h3h6h9h;}h@hNhB}r(hF]hG]hE]hD]r(Uforcescheduler-schedulerrjehH]rh auhKM@hLhhU}rjjshM]r(hX)r}r(h0XForceScheduler Schedulerrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKM@hLhhM]rh_XForceScheduler Schedulerrr}r(h0jh1jubaubhc)r}r(h0XdThe :class:`ForceScheduler` scheduler is the way you can configure a force build form in the web UI.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMBhLhhM]r(h_XThe rr}r(h0XThe h1jubh)r}r(h0X:class:`ForceScheduler`rh1jh6h9h@hhB}r(UreftypeXclasshhXForceSchedulerU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMBhM]rh)r}r (h0jhB}r (hF]hG]r (hjXpy-classr ehE]hD]hH]uh1jhM]r h_XForceSchedulerrr}r(h0Uh1jubah@hubaubh_XI scheduler is the way you can configure a force build form in the web UI.rr}r(h0XI scheduler is the way you can configure a force build form in the web UI.h1jubeubhc)r}r(h0XIn the ``builder/`` web page, you will see one form for each ForceScheduler scheduler that was configured for this builder.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMEhLhhM]r(h_XIn the rr}r(h0XIn the h1jubh)r}r(h0X``builder/``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xbuilder/rr }r!(h0Uh1jubah@hubh_Xh web page, you will see one form for each ForceScheduler scheduler that was configured for this builder.r"r#}r$(h0Xh web page, you will see one form for each ForceScheduler scheduler that was configured for this builder.h1jubeubhc)r%}r&(h0XThis 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.r'h1jh6h9h@hghB}r((hF]hG]hE]hD]hH]uhKMHhLhhM]r)h_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.r*r+}r,(h0j'h1j%ubaubhc)r-}r.(h0X-The scheduler takes the following parameters:r/h1jh6h9h@hghB}r0(hF]hG]hE]hD]hH]uhKMLhLhhM]r1h_X-The scheduler takes the following parameters:r2r3}r4(h0j/h1j-ubaubhc)r5}r6(h0X``name``r7h1jh6h9h@hghB}r8(hF]hG]hE]hD]hH]uhKMNhLhhM]r9h)r:}r;(h0j7hB}r<(hF]hG]hE]hD]hH]uh1j5hM]r=h_Xnamer>r?}r@(h0Uh1j:ubah@hubaubhc)rA}rB(h0X``builderNames``rCh1jh6h9h@hghB}rD(hF]hG]hE]hD]hH]uhKMPhLhhM]rEh)rF}rG(h0jChB}rH(hF]hG]hE]hD]hH]uh1jAhM]rIh_X builderNamesrJrK}rL(h0Uh1jFubah@hubaubcdocutils.nodes block_quote rM)rN}rO(h0Uh1jh6h9h@U block_quoterPhB}rQ(hF]hG]hE]hD]hH]uhKNhLhhM]rRhc)rS}rT(h0X"See :ref:`Configuring-Schedulers`.h1jNh6h9h@hghB}rU(hF]hG]hE]hD]hH]uhKMRhM]rV(h_XSee rWrX}rY(h0XSee h1jSubh)rZ}r[(h0X:ref:`Configuring-Schedulers`r\h1jSh6h9h@hhB}r](UreftypeXrefhhXconfiguring-schedulersU refdomainXstdr^hD]hE]U refexplicithF]hG]hH]hhuhKMRhM]r_j)r`}ra(h0j\hB}rb(hF]hG]rc(hj^Xstd-refrdehE]hD]hH]uh1jZhM]reh_XConfiguring-Schedulersrfrg}rh(h0Uh1j`ubah@jubaubh_X.ri}rj(h0X.h1jSubeubaubhc)rk}rl(h0X ``reason``rmh1jh6h9h@hghB}rn(hF]hG]hE]hD]hH]uhKMThLhhM]roh)rp}rq(h0jmhB}rr(hF]hG]hE]hD]hH]uh1jkhM]rsh_Xreasonrtru}rv(h0Uh1jpubah@hubaubjM)rw}rx(h0Uh1jh6h9h@jPhB}ry(hF]hG]hE]hD]hH]uhKNhLhhM]rzhc)r{}r|(h0XA :ref:`parameter ` specifying the reason for the build. The default value is a string parameter with value "force build".h1jwh6h9h@hghB}r}(hF]hG]hE]hD]hH]uhKMVhM]r~(h_XA rr}r(h0XA h1j{ubh)r}r(h0X,:ref:`parameter `rh1j{h6h9h@hhB}r(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKMVhM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_X parameterrr}r(h0Uh1jubah@jubaubh_Xh specifying the reason for the build. The default value is a string parameter with value "force build".rr}r(h0Xh specifying the reason for the build. The default value is a string parameter with value "force build".h1j{ubeubaubhc)r}r(h0X ``username``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMYhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xusernamerr}r(h0Uh1jubah@hubaubjM)r}r(h0Uh1jh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XA :ref:`parameter ` specifying the project for the build. The default value is a username parameter,h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM[hM]r(h_XA rr}r(h0XA h1jubh)r}r(h0X,:ref:`parameter `rh1jh6h9h@hhB}r(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKM[hM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_X parameterrr}r(h0Uh1jubah@jubaubh_XR specifying the project for the build. The default value is a username parameter,rr}r(h0XR specifying the project for the build. The default value is a username parameter,h1jubeubaubhc)r}r(h0X ``codebases``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM^hLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X codebasesrr}r(h0Uh1jubah@hubaubjM)r}r(h0Uh1jh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XA list of strings or :ref:`CodebaseParameter ` specifying the codebases that should be presented. The default is a single codebase with no name.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM`hM]r(h_XA list of strings or rr}r(h0XA list of strings or h1jubh)r}r(h0X4:ref:`CodebaseParameter `rh1jh6h9h@hhB}r(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKM`hM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_XCodebaseParameterrr}r(h0Uh1jubah@jubaubh_Xb specifying the codebases that should be presented. The default is a single codebase with no name.rr}r(h0Xb specifying the codebases that should be presented. The default is a single codebase with no name.h1jubeubaubhc)r}r(h0X``properties``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMchLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X propertiesrr}r(h0Uh1jubah@hubaubjM)r}r(h0Uh1jh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XA 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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMehM]r(h_X A list of rr}r(h0X A list of h1jubh)r}r(h0X-:ref:`parameters `rh1jh6h9h@hhB}r(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKMehM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_X parametersr r }r (h0Uh1jubah@jubaubh_Xz, one for each property. These can be arbitrary parameters, where the parameter's name is taken as the property name, or r r }r(h0Xz, one for each property. These can be arbitrary parameters, where the parameter's name is taken as the property name, or h1jubh)r}r(h0X``AnyPropertyParameter``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XAnyPropertyParameterrr}r(h0Uh1jubah@hubh_X9, which allows the web user to specify the property name.rr}r(h0X9, which allows the web user to specify the property name.h1jubeubaubhc)r}r(h0XfAn example may be better than long explanation. What you need in your config file is something like::h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMjhLhhM]rh_XeAn example may be better than long explanation. What you need in your config file is something like:rr}r(h0XeAn example may be better than long explanation. What you need in your config file is something like:h1jubaubh)r }r!(h0X!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)h1jh6h9h@hhB}r"(hhhD]hE]hF]hG]hH]uhKMmhLhhM]r#h_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)r$r%}r&(h0Uh1j ubaubh2)r'}r((h0Uh1jh6h9h@hNhB}r)(hF]hG]hE]hD]r*U authorizationr+ahH]r,hauhKMhLhhM]r-(hX)r.}r/(h0X Authorizationr0h1j'h6h9h@h\hB}r1(hF]hG]hE]hD]hH]uhKMhLhhM]r2h_X Authorizationr3r4}r5(h0j0h1j.ubaubhc)r6}r7(h0XThe 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::h1j'h6h9h@hghB}r8(hF]hG]hE]hD]hH]uhKMhLhhM]r9(h_X*The force scheduler uses the web status's r:r;}r<(h0X*The force scheduler uses the web status's h1j6ubh)r=}r>(h0X$:ref:`authorization `r?h1j6h6h9h@hhB}r@(UreftypeXrefhhX authorizationU refdomainXstdrAhD]hE]U refexplicithF]hG]hH]hhuhKMhM]rBj)rC}rD(h0j?hB}rE(hF]hG]rF(hjAXstd-refrGehE]hD]hH]uh1j=hM]rHh_X authorizationrIrJ}rK(h0Uh1jCubah@jubaubh_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:rLrM}rN(h0X 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:h1j6ubeubh)rO}rP(h0Xuser_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, )h1j'h6h9h@hhB}rQ(hhhD]hE]hF]hG]hH]uhKMhLhhM]rRh_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, )rSrT}rU(h0Uh1jOubaubh=)rV}rW(h0X.. _ForceScheduler-Parameters:h1j'h6h9h@hAhB}rX(hD]hE]hF]hG]hH]hIUforcescheduler-parametersrYuhKMhLhhM]ubeubh2)rZ}r[(h0Uh1jh6h9h;}r\hjVsh@hNhB}r](hF]hG]hE]hD]r^(Uforcesched-parametersr_jYehH]r`(hheuhKMhLhhU}rajYjVshM]rb(hX)rc}rd(h0XForceSched Parametersreh1jZh6h9h@h\hB}rf(hF]hG]hE]hD]hH]uhKMhLhhM]rgh_XForceSched Parametersrhri}rj(h0jeh1jcubaubhc)rk}rl(h0XMost 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.h1jZh6h9h@hghB}rm(hF]hG]hE]hD]hH]uhKMhLhhM]rn(h_XMost of the arguments to rorp}rq(h0XMost of the arguments to h1jkubh)rr}rs(h0X``ForceScheduler``hB}rt(hF]hG]hE]hD]hH]uh1jkhM]ruh_XForceSchedulerrvrw}rx(h0Uh1jrubah@hubh_X are "parameters". Several classes of parameters are available, each describing a different kind of input from a force-build form.ryrz}r{(h0X are "parameters". Several classes of parameters are available, each describing a different kind of input from a force-build form.h1jkubeubhc)r|}r}(h0X0All parameter types have a few common arguments:r~h1jZh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_X0All parameter types have a few common arguments:rr}r(h0j~h1j|ubaubhc)r}r(h0X``name`` (required)rh1jZh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X``name``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xnamerr}r(h0Uh1jubah@hubh_X (required)rr}r(h0X (required)h1jubeubjM)r}r(h0Uh1jZh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XThe 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.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_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.rr}r(h0jh1jubaubaubhc)r}r(h0X-``label`` (optional; default is same as name)rh1jZh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X ``label``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xlabelrr}r(h0Uh1jubah@hubh_X$ (optional; default is same as name)rr}r(h0X$ (optional; default is same as name)h1jubeubjM)r}r(h0Uh1jZh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0X[The label of the parameter. This is what is displayed to the user. HTML is permitted here.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_X[The label of the parameter. This is what is displayed to the user. HTML is permitted here.rr}r(h0jh1jubaubaubhc)r}r(h0X#``default`` (optional; default: "")rh1jZh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X ``default``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xdefaultrr}r(h0Uh1jubah@hubh_X (optional; default: "")rr}r(h0X (optional; default: "")h1jubeubjM)r}r(h0Uh1jZh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XLThe default value for the parameter, that is used if there is no user input.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_XLThe default value for the parameter, that is used if there is no user input.rr}r(h0jh1jubaubaubhc)r}r(h0X'``required`` (optional; default: False)rh1jZh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X ``required``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xrequiredrr}r(h0Uh1jubah@hubh_X (optional; default: False)rr}r(h0X (optional; default: False)h1jubeubjM)r}r(h0Uh1jZh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XWIf this is true, then an error will be shown to user if there is no input in this fieldrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_XWIf this is true, then an error will be shown to user if there is no input in this fieldrr}r(h0jh1jubaubaubhc)r}r(h0XThe parameter types are:rh1jZh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XThe parameter types are:rr}r(h0jh1jubaubh2)r}r(h0Uh1jZh6h9h@hNhB}r(hF]hG]hE]hD]rUfixedparameterrahH]rh auhKMhLhhM]r(hX)r}r(h0XFixedParameterrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XFixedParameterrr}r(h0jh1jubaubh)r}r(h0X/FixedParameter(name="branch", default="trunk"),h1jh6h9h@hhB}r (hhhD]hE]hF]hG]hH]uhKMhLhhM]r h_X/FixedParameter(name="branch", default="trunk"),r r }r (h0Uh1jubaubhc)r}r(h0XmThis parameter type will not be shown on the web form, and always generate a property with its default value.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XmThis parameter type will not be shown on the web form, and always generate a property with its default value.rr}r(h0jh1jubaubeubh2)r}r(h0Uh1jZh6h9h@hNhB}r(hF]hG]hE]hD]rUstringparameterrahH]rhauhKMhLhhM]r(hX)r}r(h0XStringParameterrh1jh6h9h@h\hB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r!h_XStringParameterr"r#}r$(h0jh1jubaubh)r%}r&(h0XqStringParameter(name="pull_url", label="optionally give a public Git pull url:
", default="", size=80)h1jh6h9h@hhB}r'(hhhD]hE]hF]hG]hH]uhKMhLhhM]r(h_XqStringParameter(name="pull_url", label="optionally give a public Git pull url:
", default="", size=80)r)r*}r+(h0Uh1j%ubaubhc)r,}r-(h0XThis parameter type will show a single-line text-entry box, and allow the user to enter an arbitrary string. It adds the following arguments:r.h1jh6h9h@hghB}r/(hF]hG]hE]hD]hH]uhKMhLhhM]r0h_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:r1r2}r3(h0j.h1j,ubaubhc)r4}r5(h0X``regex`` (optional)r6h1jh6h9h@hghB}r7(hF]hG]hE]hD]hH]uhKMhLhhM]r8(h)r9}r:(h0X ``regex``hB}r;(hF]hG]hE]hD]hH]uh1j4hM]r<h_Xregexr=r>}r?(h0Uh1j9ubah@hubh_X (optional)r@rA}rB(h0X (optional)h1j4ubeubjM)rC}rD(h0Uh1jh6h9h@jPhB}rE(hF]hG]hE]hD]hH]uhKNhLhhM]rFhc)rG}rH(h0X[a string that will be compiled as a regex, and used to validate the input of this parameterrIh1jCh6h9h@hghB}rJ(hF]hG]hE]hD]hH]uhKMhM]rKh_X[a string that will be compiled as a regex, and used to validate the input of this parameterrLrM}rN(h0jIh1jGubaubaubhc)rO}rP(h0X ``size`` (optional; default: 10)rQh1jh6h9h@hghB}rR(hF]hG]hE]hD]hH]uhKMhLhhM]rS(h)rT}rU(h0X``size``hB}rV(hF]hG]hE]hD]hH]uh1jOhM]rWh_XsizerXrY}rZ(h0Uh1jTubah@hubh_X (optional; default: 10)r[r\}r](h0X (optional; default: 10)h1jOubeubjM)r^}r_(h0Uh1jh6h9h@jPhB}r`(hF]hG]hE]hD]hH]uhKNhLhhM]rahc)rb}rc(h0X,The width of the input field (in characters)rdh1j^h6h9h@hghB}re(hF]hG]hE]hD]hH]uhKMhM]rfh_X,The width of the input field (in characters)rgrh}ri(h0jdh1jbubaubaubeubh2)rj}rk(h0Uh1jZh6h9h@hNhB}rl(hF]hG]hE]hD]rmU textparameterrnahH]rohauhKMhLhhM]rp(hX)rq}rr(h0X TextParameterrsh1jjh6h9h@h\hB}rt(hF]hG]hE]hD]hH]uhKMhLhhM]ruh_X TextParameterrvrw}rx(h0jsh1jqubaubh)ry}rz(h0XStringParameter(name="comments", label="comments to be displayed to the user of the built binary", default="This is a development build", cols=60, rows=5)h1jjh6h9h@hhB}r{(hhhD]hE]hF]hG]hH]uhKMhLhhM]r|h_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)r}r~}r(h0Uh1jyubaubhc)r}r(h0XThis 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:rh1jjh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_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:rr}r(h0jh1jubaubhc)r}r(h0X ``cols`` (optional; default: 80)rh1jjh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X``cols``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xcolsrr}r(h0Uh1jubah@hubh_X (optional; default: 80)rr}r(h0X (optional; default: 80)h1jubeubjM)r}r(h0Uh1jjh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0X,The number of columns the textarea will haverh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_X,The number of columns the textarea will haverr}r(h0jh1jubaubaubhc)r}r(h0X ``rows`` (optional; default: 20)rh1jjh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X``rows``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xrowsrr}r(h0Uh1jubah@hubh_X (optional; default: 20)rr}r(h0X (optional; default: 20)h1jubeubjM)r}r(h0Uh1jjh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0X)The number of rows the textarea will haverh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_X)The number of rows the textarea will haverr}r(h0jh1jubaubaubhc)r}r(h0XGThis class could be subclassed in order to have more customization e.g.rh1jjh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XGThis class could be subclassed in order to have more customization e.g.rr}r(h0jh1jubaubjM)r}r(h0Uh1jjh6Nh@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rcdocutils.nodes bullet_list r)r}r(h0UhB}r(UbulletrX*hD]hE]hF]hG]hH]uh1jhM]r(cdocutils.nodes list_item r)r}r(h0X9developer could send a list of Git branches to pull from hB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X8developer could send a list of Git branches to pull fromrh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_X8developer could send a list of Git branches to pull fromrr}r(h0jh1jubaubah@U list_itemrubj)r}r(h0X>developer could send a list of gerrit changes to cherry-pick, hB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X=developer could send a list of gerrit changes to cherry-pick,rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]rh_X=developer could send a list of gerrit changes to cherry-pick,rr}r(h0jh1jubaubah@jubj)r}r(h0X8developer could send a shell script to amend the build. hB}r(hF]hG]hE]hD]hH]uh1jhM]rhc)r}r(h0X7developer could send a shell script to amend the build.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM hM]rh_X7developer could send a shell script to amend the build.rr}r(h0jh1jubaubah@jubeh@U bullet_listrubaubhc)r}r(h0X!beware of security issues anyway.rh1jjh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM hLhhM]rh_X!beware of security issues anyway.rr}r(h0jh1jubaubeubh2)r}r(h0Uh1jZh6h9h@hNhB}r(hF]hG]hE]hD]rU intparameterrahH]rh auhKMhLhhM]r(hX)r}r(h0X IntParameterrh1jh6h9h@h\hB}r (hF]hG]hE]hD]hH]uhKMhLhhM]r h_X IntParameterr r }r (h0jh1jubaubh)r}r(h0XKIntParameter(name="debug_level", label="debug level (1-10)", default=2)h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKMhLhhM]rh_XKIntParameter(name="debug_level", label="debug level (1-10)", default=2)rr}r(h0Uh1jubaubhc)r}r(h0XDThis parameter type accepts an integer value using a text-entry box.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XDThis parameter type accepts an integer value using a text-entry box.rr}r(h0jh1jubaubeubh2)r}r(h0Uh1jZh6h9h@hNhB}r(hF]hG]hE]hD]r Ubooleanparameterr!ahH]r"h!auhKMhLhhM]r#(hX)r$}r%(h0XBooleanParameterr&h1jh6h9h@h\hB}r'(hF]hG]hE]hD]hH]uhKMhLhhM]r(h_XBooleanParameterr)r*}r+(h0j&h1j$ubaubh)r,}r-(h0XYBooleanParameter(name="force_build_clean", label="force a make clean", default=False)h1jh6h9h@hhB}r.(hhhD]hE]hF]hG]hH]uhKMhLhhM]r/h_XYBooleanParameter(name="force_build_clean", label="force a make clean", default=False)r0r1}r2(h0Uh1j,ubaubhc)r3}r4(h0XIThis type represents a boolean value. It will be presented as a checkbox.r5h1jh6h9h@hghB}r6(hF]hG]hE]hD]hH]uhKM hLhhM]r7h_XIThis type represents a boolean value. It will be presented as a checkbox.r8r9}r:(h0j5h1j3ubaubeubh2)r;}r<(h0Uh1jZh6h9h@hNhB}r=(hF]hG]hE]hD]r>Uusernameparameterr?ahH]r@hauhKM#hLhhM]rA(hX)rB}rC(h0XUserNameParameterrDh1j;h6h9h@h\hB}rE(hF]hG]hE]hD]hH]uhKM#hLhhM]rFh_XUserNameParameterrGrH}rI(h0jDh1jBubaubh)rJ}rK(h0X2UserNameParameter(label="your name:
", size=80)h1j;h6h9h@hhB}rL(hhhD]hE]hF]hG]hH]uhKM'hLhhM]rMh_X2UserNameParameter(label="your name:
", size=80)rNrO}rP(h0Uh1jJubaubhc)rQ}rR(h0XThis parameter type accepts a username. If authentication is active, it will use the authenticated user instead of displaying a text-entry box.rSh1j;h6h9h@hghB}rT(hF]hG]hE]hD]hH]uhKM)hLhhM]rUh_XThis parameter type accepts a username. If authentication is active, it will use the authenticated user instead of displaying a text-entry box.rVrW}rX(h0jSh1jQubaubh)rY}rZ(h0Uh1j;h6h9h@hhB}r[(hF]hG]hE]hD]hH]uhKNhLhhM]r\(j)r]}r^(h0XN``size`` (optional; default: 10) The width of the input field (in characters) h1jYh6h9h@jhB}r_(hF]hG]hE]hD]hH]uhKM-hM]r`(j)ra}rb(h0X ``size`` (optional; default: 10)rch1j]h6h9h@j hB}rd(hF]hG]hE]hD]hH]uhKM-hM]re(h)rf}rg(h0X``size``hB}rh(hF]hG]hE]hD]hH]uh1jahM]rih_Xsizerjrk}rl(h0Uh1jfubah@hubh_X (optional; default: 10)rmrn}ro(h0X (optional; default: 10)h1jaubeubj)rp}rq(h0UhB}rr(hF]hG]hE]hD]hH]uh1j]hM]rshc)rt}ru(h0X,The width of the input field (in characters)rvh1jph6h9h@hghB}rw(hF]hG]hE]hD]hH]uhKM-hM]rxh_X,The width of the input field (in characters)ryrz}r{(h0jvh1jtubaubah@j)ubeubj)r|}r}(h0Xj``need_email`` (optional; default True) If true, require a full email address rather than arbitrary text. h1jYh6h9h@jhB}r~(hF]hG]hE]hD]hH]uhKM0hLhhM]r(j)r}r(h0X'``need_email`` (optional; default True)rh1j|h6h9h@j hB}r(hF]hG]hE]hD]hH]uhKM0hM]r(h)r}r(h0X``need_email``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X need_emailrr}r(h0Uh1jubah@hubh_X (optional; default True)rr}r(h0X (optional; default True)h1jubeubj)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1j|hM]rhc)r}r(h0XAIf true, require a full email address rather than arbitrary text.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM0hM]rh_XAIf true, require a full email address rather than arbitrary text.rr}r(h0jh1jubaubah@j)ubeubeubh)r}r(h0Uh1j;h6h9h@hhB}r(hD]hE]hF]hG]hH]Uentries]r((UsingleX!Schedulers; ChoiceStringParameterXsched-ChoiceStringParameterrjtr(UsingleXChoiceStringParameter SchedulerjjtreuhKM3hLhhM]ubh=)r}r(h0Uh1j;h6h9h@hAhB}r(hD]hE]hF]hG]hH]hIjuhKM3hLhhM]ubeubh2)r}r(h0Uh1jZh6h9h;}h@hNhB}r(hF]hG]hE]hD]r(UchoicestringparameterrjehH]rhauhKM5hLhhU}rjjshM]r(hX)r}r(h0XChoiceStringParameterrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKM5hLhhM]rh_XChoiceStringParameterrr}r(h0jh1jubaubh)r}r(h0XRChoiceStringParameter(name="branch", choices=["main","devel"], default="main")h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKM9hLhhM]rh_XRChoiceStringParameter(name="branch", choices=["main","devel"], default="main")rr}r(h0Uh1jubaubhc)r}r(h0X*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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM<hLhhM]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(h0XThis 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 h1jubh)r}r(h0X ``multiple``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xmultiplerr}r(h0Uh1jubah@hubh_XA is false, then its result is a string - one of the choices. If rr}r(h0XA is false, then its result is a string - one of the choices. If h1jubh)r}r(h0X ``multiple``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xmultiplerr}r(h0Uh1jubah@hubh_X@ is true, then the result is a list of strings from the choices.rr}r(h0X@ is true, then the result is a list of strings from the choices.h1jubeubhc)r}r(h0XNote 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.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMAhLhhM]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(h0XNote 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 h1jubh)r}r(h0X!:py:class:`InheritBuildParameter`rh1jh6h9h@hhB}r(UreftypeXclasshhXInheritBuildParameterU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMAhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_XInheritBuildParameterrr}r(h0Uh1jubah@hubaubh_X class.rr}r(h0X class.h1jubeubhc)r}r(h0X6Its arguments, in addition to the common options, are:rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMEhLhhM]rh_X6Its arguments, in addition to the common options, are:rr}r(h0jh1jubaubhc)r}r(h0X ``choices``rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMGhLhhM]rh)r}r(h0jhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xchoicesrr}r(h0Uh1jubah@hubaubjM)r}r(h0Uh1jh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r (h0XThe list of available choices.r h1jh6h9h@hghB}r (hF]hG]hE]hD]hH]uhKMIhM]r h_XThe list of available choices.r r}r(h0j h1jubaubaubhc)r}r(h0X$``strict`` (optional; default: True)rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMKhLhhM]r(h)r}r(h0X ``strict``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xstrictrr}r(h0Uh1jubah@hubh_X (optional; default: True)rr}r(h0X (optional; default: True)h1jubeubjM)r}r (h0Uh1jh6h9h@jPhB}r!(hF]hG]hE]hD]hH]uhKNhLhhM]r"hc)r#}r$(h0XIf 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.r%h1jh6h9h@hghB}r&(hF]hG]hE]hD]hH]uhKMMhM]r'h_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.r(r)}r*(h0j%h1j#ubaubaubhc)r+}r,(h0X ``multiple``r-h1jh6h9h@hghB}r.(hF]hG]hE]hD]hH]uhKMRhLhhM]r/h)r0}r1(h0j-hB}r2(hF]hG]hE]hD]hH]uh1j+hM]r3h_Xmultipler4r5}r6(h0Uh1j0ubah@hubaubjM)r7}r8(h0Uh1jh6h9h@jPhB}r9(hF]hG]hE]hD]hH]uhKNhLhhM]r:hc)r;}r<(h0X3If true, then the user may select multiple choices.r=h1j7h6h9h@hghB}r>(hF]hG]hE]hD]hH]uhKMThM]r?h_X3If true, then the user may select multiple choices.r@rA}rB(h0j=h1j;ubaubaubhc)rC}rD(h0X Example::rEh1jh6h9h@hghB}rF(hF]hG]hE]hD]hH]uhKMVhLhhM]rGh_XExample:rHrI}rJ(h0XExample:h1jCubaubh)rK}rL(h0XChoiceStringParameter(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")))h1jh6h9h@hhB}rM(hhhD]hE]hF]hG]hH]uhKMXhLhhM]rNh_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")))rOrP}rQ(h0Uh1jKubaubeubh2)rR}rS(h0Uh1jZh6h9h@hNhB}rT(hF]hG]hE]hD]rUUcodebaseparameterrVahH]rWh auhKMihLhhM]rX(hX)rY}rZ(h0XCodebaseParameterr[h1jRh6h9h@h\hB}r\(hF]hG]hE]hD]hH]uhKMihLhhM]r]h_XCodebaseParameterr^r_}r`(h0j[h1jYubaubh)ra}rb(h0X$CodebaseParameter(codebase="myrepo")h1jRh6h9h@hhB}rc(hhhD]hE]hF]hG]hH]uhKMmhLhhM]rdh_X$CodebaseParameter(codebase="myrepo")rerf}rg(h0Uh1jaubaubhc)rh}ri(h0XHThis is a parameter group to specify a sourcestamp for a given codebase.rjh1jRh6h9h@hghB}rk(hF]hG]hE]hD]hH]uhKMohLhhM]rlh_XHThis is a parameter group to specify a sourcestamp for a given codebase.rmrn}ro(h0jjh1jhubaubhc)rp}rq(h0X ``codebase``rrh1jRh6h9h@hghB}rs(hF]hG]hE]hD]hH]uhKMqhLhhM]rth)ru}rv(h0jrhB}rw(hF]hG]hE]hD]hH]uh1jphM]rxh_Xcodebaseryrz}r{(h0Uh1juubah@hubaubjM)r|}r}(h0Uh1jRh6h9h@jPhB}r~(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XThe name of the codebase.rh1j|h6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMshM]rh_XThe name of the codebase.rr}r(h0jh1jubaubaubhc)r}r(h0X/``branch`` (optional; default: StringParameter)rh1jRh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMuhLhhM]r(h)r}r(h0X ``branch``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xbranchrr}r(h0Uh1jubah@hubh_X% (optional; default: StringParameter)rr}r(h0X% (optional; default: StringParameter)h1jubeubjM)r}r(h0Uh1jRh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XxA :ref:`parameter ` specifying the branch to build. The default value is a string parameter.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMwhM]r(h_XA rr}r(h0XA h1jubh)r}r(h0X,:ref:`parameter `rh1jh6h9h@hhB}r(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKMwhM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_X parameterrr}r(h0Uh1jubah@jubaubh_XJ specifying the branch to build. The default value is a string parameter.rr}r(h0XJ specifying the branch to build. The default value is a string parameter.h1jubeubaubhc)r}r(h0X1``revision`` (optional; default: StringParameter)rh1jRh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMzhLhhM]r(h)r}r(h0X ``revision``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_Xrevisionrr}r(h0Uh1jubah@hubh_X% (optional; default: StringParameter)rr}r(h0X% (optional; default: StringParameter)h1jubeubjM)r}r(h0Uh1jRh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XzA :ref:`parameter ` specifying the revision to build. The default value is a string parameter.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKM|hM]r(h_XA rr}r(h0XA h1jubh)r}r(h0X,:ref:`parameter `rh1jh6h9h@hhB}r(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKM|hM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_X parameterrr}r(h0Uh1jubah@jubaubh_XL specifying the revision to build. The default value is a string parameter.rr}r(h0XL specifying the revision to build. The default value is a string parameter.h1jubeubaubhc)r}r(h0X3``repository`` (optional; default: StringParameter)rh1jRh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X``repository``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X repositoryrr}r(h0Uh1jubah@hubh_X% (optional; default: StringParameter)rr}r(h0X% (optional; default: StringParameter)h1jubeubjM)r}r(h0Uh1jRh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r(h0XA :ref:`parameter ` specifying the repository for the build. The default value is a string parameter.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhM]r(h_XA rr}r(h0XA h1jubh)r}r(h0X,:ref:`parameter `rh1jh6h9h@hhB}r(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdrhD]hE]U refexplicithF]hG]hH]hhuhKMhM]rj)r}r(h0jhB}r(hF]hG]r(hjXstd-refrehE]hD]hH]uh1jhM]rh_X parameterrr}r(h0Uh1jubah@jubaubh_XS specifying the repository for the build. The default value is a string parameter.r r }r (h0XS specifying the repository for the build. The default value is a string parameter.h1jubeubaubhc)r }r (h0X0``project`` (optional; default: StringParameter)rh1jRh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h)r}r(h0X ``project``hB}r(hF]hG]hE]hD]hH]uh1j hM]rh_Xprojectrr}r(h0Uh1jubah@hubh_X% (optional; default: StringParameter)rr}r(h0X% (optional; default: StringParameter)h1j ubeubjM)r}r(h0Uh1jRh6h9h@jPhB}r(hF]hG]hE]hD]hH]uhKNhLhhM]rhc)r}r (h0X~A :ref:`parameter ` specifying the project for the build. The default value is a string parameter.h1jh6h9h@hghB}r!(hF]hG]hE]hD]hH]uhKMhM]r"(h_XA r#r$}r%(h0XA h1jubh)r&}r'(h0X,:ref:`parameter `r(h1jh6h9h@hhB}r)(UreftypeXrefhhXforcescheduler-parametersU refdomainXstdr*hD]hE]U refexplicithF]hG]hH]hhuhKMhM]r+j)r,}r-(h0j(hB}r.(hF]hG]r/(hj*Xstd-refr0ehE]hD]hH]uh1j&hM]r1h_X parameterr2r3}r4(h0Uh1j,ubah@jubaubh_XP specifying the project for the build. The default value is a string parameter.r5r6}r7(h0XP specifying the project for the build. The default value is a string parameter.h1jubeubaubh)r8}r9(h0Uh1jRh6h9h@hhB}r:(hD]hE]hF]hG]hH]Uentries]r;((UsingleX!Schedulers; InheritBuildParameterXsched-InheritBuildParameterr<j<tr=(UsingleXInheritBuildParameter Schedulerj<j<tr>euhKMhLhhM]ubh=)r?}r@(h0Uh1jRh6h9h@hAhB}rA(hD]hE]hF]hG]hH]hIj<uhKMhLhhM]ubeubh2)rB}rC(h0Uh1jZh6h9h;}h@hNhB}rD(hF]hG]hE]hD]rE(UinheritbuildparameterrFj<ehH]rGhauhKMhLhhU}rHj<j?shM]rI(hX)rJ}rK(h0XInheritBuildParameterrLh1jBh6h9h@h\hB}rM(hF]hG]hE]hD]hH]uhKMhLhhM]rNh_XInheritBuildParameterrOrP}rQ(h0jLh1jJubaubhc)rR}rS(h0XThis 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:rTh1jBh6h9h@hghB}rU(hF]hG]hE]hD]hH]uhKMhLhhM]rVh_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:rWrX}rY(h0jTh1jRubaubhc)rZ}r[(h0X``compatible_builds``r\h1jBh6h9h@hghB}r](hF]hG]hE]hD]hH]uhKMhLhhM]r^h)r_}r`(h0j\hB}ra(hF]hG]hE]hD]hH]uh1jZhM]rbh_Xcompatible_buildsrcrd}re(h0Uh1j_ubah@hubaubjM)rf}rg(h0Uh1jBh6h9h@jPhB}rh(hF]hG]hE]hD]hH]uhKNhLhhM]rihc)rj}rk(h0XA 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.h1jfh6h9h@hghB}rl(hF]hG]hE]hD]hH]uhKMhM]rm(h_X^A function to find compatible builds in the build history. This function is given the master rnro}rp(h0X^A function to find compatible builds in the build history. This function is given the master h1jjubh)rq}rr(h0X*:py:class:`~buildbot.status.master.Status`rsh1jjh6h9h@hhB}rt(UreftypeXclasshhXbuildbot.status.master.StatusU refdomainXpyruhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rvh)rw}rx(h0jshB}ry(hF]hG]rz(hjuXpy-classr{ehE]hD]hH]uh1jqhM]r|h_XStatusr}r~}r(h0Uh1jwubah@hubaubh_Xn instance as first argument, and the current builder name as second argument, or None when forcing all builds.rr}r(h0Xn instance as first argument, and the current builder name as second argument, or None when forcing all builds.h1jjubeubaubhc)r}r(h0X Example::rh1jBh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XExample:rr}r(h0XExample:h1jubaubh)r}r(h0Xjdef 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 # ... properties=[ InheritBuildParameter( name="inherit", label="promote a build for merge", compatible_builds=get_compatible_builds, required = True), ])h1jBh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKMhLhhM]rh_Xjdef 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 # ... properties=[ InheritBuildParameter( name="inherit", label="promote a build for merge", compatible_builds=get_compatible_builds, required = True), ])rr}r(h0Uh1jubaubh)r}r(h0Uh1jBh6h9h@hhB}r(hD]hE]hF]hG]hH]Uentries]r((UsingleX%Schedulers; BuildslaveChoiceParameterXsched-BuildslaveChoiceParameterrjtr(UsingleX#BuildslaveChoiceParameter SchedulerjjtreuhKMhLhhM]ubh=)r}r(h0Uh1jBh6h9h@hAhB}r(hD]hE]hF]hG]hH]hIjuhKMhLhhM]ubeubh2)r}r(h0Uh1jZh6h9h;}h@hNhB}r(hF]hG]hE]hD]r(UbuildslavechoiceparameterrjehH]rhauhKMhLhhU}rjjshM]r(hX)r}r(h0XBuildslaveChoiceParameterrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XBuildslaveChoiceParameterrr}r(h0jh1jubaubhc)r}r(h0X'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``.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h_X~This parameter allows a scheduler to require that a build is assigned to the chosen buildslave. The choice is assigned to the rr}r(h0X~This parameter allows a scheduler to require that a build is assigned to the chosen buildslave. The choice is assigned to the h1jubjx )r}r(h0X `slavename`hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X slavenamerr}r(h0Uh1jubah@j ubh_X property for the build. The rr}r(h0X property for the build. The h1jubh)r}r(h0X0:py:class:`~buildbot.builder.enforceChosenSlave`rh1jh6h9h@hhB}r(UreftypeXclasshhX#buildbot.builder.enforceChosenSlaveU refdomainXpyrhD]hE]U refexplicithF]hG]hH]hhhNhNuhKMhM]rh)r}r(h0jhB}r(hF]hG]r(hjXpy-classrehE]hD]hH]uh1jhM]rh_XenforceChosenSlaverr}r(h0Uh1jubah@hubaubh_X! functor must be assigned to the rr}r(h0X! functor must be assigned to the h1jubh)r}r(h0X``canStartBuild``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X canStartBuildrr}r(h0Uh1jubah@hubh_X parameter for the rr}r(h0X parameter for the h1jubh)r}r(h0X ``Builder``hB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XBuilderrr}r(h0Uh1jubah@hubh_X.r}r(h0X.h1jubeubhc)r}r(h0X Example::rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XExample:rr}r(h0XExample:h1jubaubh)r}r(h0Xfrom buildbot.process.builder import enforceChosenSlave # schedulers: ForceScheduler( # ... properties=[ BuildslaveChoiceParameter(), ] ) # builders: BuilderConfig( # ... canStartBuild=enforceChosenSlave, )h1jh6h9h@hhB}r(hhhD]hE]hF]hG]hH]uhKMhLhhM]rh_Xfrom buildbot.process.builder import enforceChosenSlave # schedulers: ForceScheduler( # ... properties=[ BuildslaveChoiceParameter(), ] ) # builders: BuilderConfig( # ... canStartBuild=enforceChosenSlave, )rr}r(h0Uh1jubaubeubh2)r}r(h0Uh1jZh6h9h@hNhB}r(hF]hG]hE]hD]rUanypropertyparameterrahH]rh'auhKMhLhhM]r(hX)r}r(h0XAnyPropertyParameterrh1jh6h9h@h\hB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XAnyPropertyParameterrr}r(h0jh1jubaubhc)r}r(h0XThis parameter type can only be used in ``properties``, and allows the user to specify both the property name and value in the HTML form.h1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]r(h_X(This parameter type can only be used in rr}r(h0X(This parameter type can only be used in h1jubh)r}r(h0X``properties``hB}r (hF]hG]hE]hD]hH]uh1jhM]r h_X propertiesr r }r (h0Uh1jubah@hubh_XS, and allows the user to specify both the property name and value in the HTML form.rr}r(h0XS, and allows the user to specify both the property name and value in the HTML form.h1jubeubhc)r}r(h0XThis Parameter is here to reimplement old Buildbot behavior, and should be avoided. Stricter parameter name and type should be preferred.rh1jh6h9h@hghB}r(hF]hG]hE]hD]hH]uhKMhLhhM]rh_XThis Parameter is here to reimplement old Buildbot behavior, and should be avoided. Stricter parameter name and type should be preferred.rr}r(h0jh1jubaubeubeubeubeubh6h9h@Usystem_messagerhB}r(hF]UlevelKhD]hE]rhSaUsourceh9hG]hH]UlineKUtypeUINFOruhKKhLhhM]rhc)r}r(h0UhB}r (hF]hG]hE]hD]hH]uh1h.hM]r!h_X-Duplicate implicit target name: "schedulers".r"r#}r$(h0Uh1jubah@hgubaubh-)r%}r&(h0Uh1jh6h9h@jhB}r'(hF]UlevelKhD]hE]r(jaUsourceh9hG]hH]UlineM)UtypejuhKM)hLhhM]r)hc)r*}r+(h0UhB}r,(hF]hG]hE]hD]hH]uh1j%hM]r-h_X5Duplicate implicit target name: "anybranchscheduler".r.r/}r0(h0Uh1j*ubah@hgubaubeUcurrent_sourcer1NU decorationr2NUautofootnote_startr3KUnameidsr4}r5(hjhj hj h j.h jh jh jh jVhhJhjmhjhj_hjhhxhh~hjBhjhj+hjYhjhjFhj?hhhjnhj hj h jh!j!h"jh#j h$jIh%jh&j h'jh(jfuhM]r6(cdocutils.nodes comment r7)r8}r9(h0X -*- rst -*-h1hh6h9h@Ucommentr:hB}r;(hhhD]hE]hF]hG]hH]uhKKhLhhM]r<h_X -*- rst -*-r=r>}r?(h0Uh1j8ubaubh>h3eh0UU transformerr@NU footnote_refsrA}rBUrefnamesrC}rDUsymbol_footnotesrE]rFUautofootnote_refsrG]rHUsymbol_footnote_refsrI]rJU citationsrK]rLhLhU current_linerMNUtransform_messagesrN]rO(h-)rP}rQ(h0UhB}rR(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineKUtypejuhM]rShc)rT}rU(h0UhB}rV(hF]hG]hE]hD]hH]uh1jPhM]rWh_X0Hyperlink target "schedulers" is not referenced.rXrY}rZ(h0Uh1jTubah@hgubah@jubh-)r[}r\(h0UhB}r](hF]UlevelKhD]hE]Usourceh9hG]hH]UlineK UtypejuhM]r^hc)r_}r`(h0UhB}ra(hF]hG]hE]hD]hH]uh1j[hM]rbh_X<Hyperlink target "configuring-schedulers" is not referenced.rcrd}re(h0Uh1j_ubah@hgubah@jubh-)rf}rg(h0UhB}rh(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineKUtypejuhM]rihc)rj}rk(h0UhB}rl(hF]hG]hE]hD]hH]uh1jfhM]rmh_X4Hyperlink target "cfg-schedulers" is not referenced.rnro}rp(h0Uh1jjubah@hgubah@jubh-)rq}rr(h0UhB}rs(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineK+UtypejuhM]rthc)ru}rv(h0UhB}rw(hF]hG]hE]hD]hH]uh1jqhM]rxh_X-Hyperlink target "index-0" is not referenced.ryrz}r{(h0Uh1juubah@hgubah@jubh-)r|}r}(h0UhB}r~(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineKsUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1j|hM]rh_X4Hyperlink target "change-filters" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineKUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XAHyperlink target "sched-SingleBranchScheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineKUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X5Hyperlink target "sched-Scheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineKUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XEHyperlink target "scheduler-singlebranchscheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM%UtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X>Hyperlink target "sched-AnyBranchScheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM&UtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X8Hyperlink target "anybranchscheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMMUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X5Hyperlink target "sched-Dependent" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMNUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X9Hyperlink target "dependent-scheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X4Hyperlink target "sched-Periodic" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X8Hyperlink target "periodic-scheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X3Hyperlink target "sched-Nightly" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X7Hyperlink target "nightly-scheduler" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM!UtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X6Hyperlink target "sched-Try_Jobdir" is not referenced.rr }r (h0Uh1jubah@hgubah@jubh-)r }r (h0UhB}r (hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM#UtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1j hM]rh_X8Hyperlink target "sched-Try_Userpass" is not referenced.rr}r(h0Uh1jubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM$UtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_X4Hyperlink target "try-schedulers" is not referenced.rr}r (h0Uh1jubah@hgubah@jubh-)r!}r"(h0UhB}r#(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]r$hc)r%}r&(h0UhB}r'(hF]hG]hE]hD]hH]uh1j!hM]r(h_X7Hyperlink target "sched-Triggerable" is not referenced.r)r*}r+(h0Uh1j%ubah@hgubah@jubh-)r,}r-(h0UhB}r.(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]r/hc)r0}r1(h0UhB}r2(hF]hG]hE]hD]hH]uh1j,hM]r3h_X-Hyperlink target "index-1" is not referenced.r4r5}r6(h0Uh1j0ubah@hgubah@jubh-)r7}r8(h0UhB}r9(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]r:hc)r;}r<(h0UhB}r=(hF]hG]hE]hD]hH]uh1j7hM]r>h_X;Hyperlink target "triggerable-scheduler" is not referenced.r?r@}rA(h0Uh1j;ubah@hgubah@jubh-)rB}rC(h0UhB}rD(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]rEhc)rF}rG(h0UhB}rH(hF]hG]hE]hD]hH]uh1jBhM]rIh_X>Hyperlink target "sched-NightlyTriggerable" is not referenced.rJrK}rL(h0Uh1jFubah@hgubah@jubh-)rM}rN(h0UhB}rO(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM<UtypejuhM]rPhc)rQ}rR(h0UhB}rS(hF]hG]hE]hD]hH]uh1jMhM]rTh_X:Hyperlink target "sched-ForceScheduler" is not referenced.rUrV}rW(h0Uh1jQubah@hgubah@jubh-)rX}rY(h0UhB}rZ(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM>UtypejuhM]r[hc)r\}r](h0UhB}r^(hF]hG]hE]hD]hH]uh1jXhM]r_h_X-Hyperlink target "index-2" is not referenced.r`ra}rb(h0Uh1j\ubah@hgubah@jubh-)rc}rd(h0UhB}re(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]rfhc)rg}rh(h0UhB}ri(hF]hG]hE]hD]hH]uh1jchM]rjh_X?Hyperlink target "forcescheduler-parameters" is not referenced.rkrl}rm(h0Uh1jgubah@hgubah@jubh-)rn}ro(h0UhB}rp(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineM3UtypejuhM]rqhc)rr}rs(h0UhB}rt(hF]hG]hE]hD]hH]uh1jnhM]ruh_XAHyperlink target "sched-ChoiceStringParameter" is not referenced.rvrw}rx(h0Uh1jrubah@hgubah@jubh-)ry}rz(h0UhB}r{(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]r|hc)r}}r~(h0UhB}r(hF]hG]hE]hD]hH]uh1jyhM]rh_XAHyperlink target "sched-InheritBuildParameter" is not referenced.rr}r(h0Uh1j}ubah@hgubah@jubh-)r}r(h0UhB}r(hF]UlevelKhD]hE]Usourceh9hG]hH]UlineMUtypejuhM]rhc)r}r(h0UhB}r(hF]hG]hE]hD]hH]uh1jhM]rh_XEHyperlink target "sched-BuildslaveChoiceParameter" is not referenced.rr}r(h0Uh1jubah@hgubah@jubeUreporterrNUid_startrK U 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_backlinksrjMU 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.8/master/docs/manual/cfg-schedulers.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 j j.j1jjj$j*jjj9jDj_jZjjjjjVjRj<jBjjhJh3j j j j jmjhj j j j jjjjh~hyjjhxhyhSh3j j j^jhjjjLjRjSjVjjj+j'jjjYjZjjjjjjjFjBj j j?j;j.j*hjKhhj j jnjjj j jjj!jjjj j jIjDjjjBjDjjjfjhuUsubstitution_namesr}rh@hLhB}r(hF]hD]hE]Usourceh9hG]hH]uU footnotesr]rUrefidsr}r(j ]rj aj ]rj aj$]rj'aj9]rj<aj]rjaj<]rj?aj]rjahJ]rh>ahx]rhuajL]rjOaj^]rj`aj]rjaj ]rj aj]rjajY]rjVaj]rjaj ]rj ah]rhaj ]rj aj ]rj aj]rjaj]rjaj]rjajB]rj?ajf]rjcauub.PKJtD<"1buildbot-v0.8.8/.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.8/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 this 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 this future this might be changed, to have the rr}r(hNX; object. In this 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_hubhvX1. This process is explained more clearly in :ref:rgrh}ri(hNX1. This process is explained more clearly in :ref:hOjYubh)rj}rk(hNX``Email-Addresses``ha}rl(hc]hd]he]hf]hi]uhOjYhm]rmhvXEmail-Addressesrnro}rp(hNUhOjjubah_hubhvX.rq}rr(hNX.hOjYubeubhz)rs}rt(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}ru(hc]hd]he]hf]hi]uhkMuhlhhm]rv(hvXAnother way to utilize rwrx}ry(hNXAnother way to utilize hOjsubj)rz}r{(hNX`User Objects`ha}r|(hc]hd]he]hf]hi]uhOjshm]r}hvX User Objectsr~r}r(hNUhOjzubah_jubhvX is through rr}r(hNX is through hOjsubj)r}r(hNX `UsersAuth`ha}r(hc]hd]he]hf]hi]uhOjshm]rhvX UsersAuthrr}r(hNUhOjubah_jubhvX for web authentication (see rr}r(hNX for web authentication (see hOjsubj)r}r(hNX:bb:status:`WebStatus`rhOjshZh]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 hOjsubj)r}r(hNX `UsersAuth`ha}r(hc]hd]he]hf]hi]uhOjshm]rhvX UsersAuthrr}r(hNUhOjubah_jubhvX, you need to set a rr}r(hNX, you need to set a hOjsubj)r}r(hNX `bb_username`ha}r(hc]hd]he]hf]hi]uhOjshm]rhvX bb_usernamerr}r(hNUhOjubah_jubhvX and rr}r(hNX and hOjsubj)r}r(hNX `bb_password`ha}r(hc]hd]he]hf]hi]uhOjshm]rhvX bb_passwordrr}r(hNUhOjubah_jubhvX via the rr}r(hNX via the hOjsubh)r}r(hNX``buildbot user``ha}r(hc]hd]he]hf]hi]uhOjshm]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.hOjsubeubj@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]rhvXinterested usersrr}r(hNUhOjubah_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.r r }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(hNjhOj ubaubj;eubhZh]h_hha}r(hf]he]hc]hd]hi]hUemail-addressesruhkMhlhhm]ubsh_h`ha}r(hc]hd]he]hf]r(jUid8rehi]r(h h4euhkMhlhh}rjj;shm]r(ho)r}r(hNXEmail AddressesrhOj8hZh]h_hsha}r(hc]hd]he]hf]hi]uhkMhlhhm]r hvXEmail Addressesr!r"}r#(hNjhOjubaubhz)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 r(r)}r*(hNXThe hOj$ubj)r+}r,(hNX:bb:status:`MailNotifier`r-hOj$hZh]h_jha}r.(UreftypeXstatusjjX MailNotifierU refdomainXbbr/hf]he]U refexplicithc]hd]hi]jjuhkMhm]r0h)r1}r2(hNj-ha}r3(hc]hd]r4(jj/X bb-statusr5ehe]hf]hi]uhOj+hm]r6hvX MailNotifierr7r8}r9(hNUhOj1ubah_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 r:r;}r<(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)r=}r>(hNX:class:`Build`r?hOj$hZh]h_jha}r@(UreftypeXclassjjXBuildU refdomainXpyrAhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rBh)rC}rD(hNj?ha}rE(hc]hd]rF(jjAXpy-classrGehe]hf]hi]uhOj=hm]rHhvXBuildrIrJ}rK(hNUhOjCubah_hubaubhvX['s Interested Users. To do this, it needs a way to convert User names into email addresses.rLrM}rN(hNX\\'s Interested Users. To do this, it needs a way to convert User names into email addresses.hOj$ubeubhz)rO}rP(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}rQ(hc]hd]he]hf]hi]uhkMhlhhm]rR(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 rSrT}rU(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 hOjOubh)rV}rW(hNX``@repositoryhost.com``ha}rX(hc]hd]he]hf]hi]uhOjOhm]rYhvX@repositoryhost.comrZr[}r\(hNUhOjVubah_hubhvX_. Some projects use other kinds of mappings (for example the preferred email address may be at r]r^}r_(hNX_. Some projects use other kinds of mappings (for example the preferred email address may be at hOjOubh)r`}ra(hNX``project.org``ha}rb(hc]hd]he]hf]hi]uhOjOhm]rchvX project.orgrdre}rf(hNUhOj`ubah_hubhvX) despite the repository host being named rgrh}ri(hNX) despite the repository host being named hOjOubh)rj}rk(hNX``cvs.project.org``ha}rl(hc]hd]he]hf]hi]uhOjOhm]rmhvXcvs.project.orgrnro}rp(hNUhOjjubah_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.rqrr}rs(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.hOjOubeubhz)rt}ru(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}rv(hc]hd]he]hf]hi]uhkMhlhhm]rw(hvX)To convert these names to addresses, the rxry}rz(hNX)To convert these names to addresses, the hOjtubj)r{}r|(hNX:class:`MailNotifier`r}hOjthZh]h_jha}r~(UreftypeXclassjjX MailNotifierU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNj}ha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOj{hm]rhvX MailNotifierrr}r(hNUhOjubah_hubaubhvX uses an rr}r(hNX uses an hOjtubj)r}r(hNX:class:`EmailLookup`rhOjthZh]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 hOjtubj)r}r(hNX:meth:`getAddress`rhOjthZh]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 hOjtubj)r}r(hNX:class:`MailNotifier`rhOjthZh]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 hOjtubj)r}r(hNX:class:`EmailLookup`rhOjthZh]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 hOjtubh)r}r(hNX ``finger``ha}r(hc]hd]he]hf]hi]uhOjthm]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 hOjtubh)r}r(hNX ``lookup``ha}r(hc]hd]he]hf]hi]uhOjthm]rhvXlookuprr}r(hNUhOjubah_hubhvX argument.rr}r(hNX argument.hOjtubeubhz)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]rhvXextraRecipientsrr}r(hNUhOjubah_hubhvXX is given, those users are still sent mail when the EmailLookup object is not specified.r r }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 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-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 hOj ubj)r%}r&(hNX:class:`MailNotifier`r'hOj hZh]h_jha}r((UreftypeXclassjjX MailNotifierU 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]r0hvX MailNotifierr1r2}r3(hNUhOj+ubah_hubaubhvXG, and every email message the buildbot emits will take advantage of it.r4r5}r6(hNXG, and every email message the buildbot emits will take advantage of it.hOj ubeubj6eubhZh]h_hha}r7(hf]he]hc]hd]hi]hU irc-nicknamesr8uhkMhlhhm]ubsh_h`ha}r9(hc]hd]he]hf]r:(j8Uid9r;ehi]r<(h h(ho)r?}r@(hNX IRC NicknamesrAhOj3hZh]h_hsha}rB(hc]hd]he]hf]hi]uhkMhlhhm]rChvX IRC NicknamesrDrE}rF(hNjAhOj?ubaubhz)rG}rH(hNX Like :class:`MailNotifier`, the :class:`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.hOj3hZh]h_h~ha}rI(hc]hd]he]hf]hi]uhkMhlhhm]rJ(hvXLike rKrL}rM(hNXLike hOjGubj)rN}rO(hNX:class:`MailNotifier`rPhOjGhZh]h_jha}rQ(UreftypeXclassjjX MailNotifierU refdomainXpyrRhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rSh)rT}rU(hNjPha}rV(hc]hd]rW(jjRXpy-classrXehe]hf]hi]uhOjNhm]rYhvX MailNotifierrZr[}r\(hNUhOjTubah_hubaubhvX, the r]r^}r_(hNX, the hOjGubj)r`}ra(hNX":class:`buildbot.status.words.IRC`rbhOjGhZh]h_jha}rc(UreftypeXclassjjXbuildbot.status.words.IRCU refdomainXpyrdhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]reh)rf}rg(hNjbha}rh(hc]hd]ri(jjdXpy-classrjehe]hf]hi]uhOj`hm]rkhvXbuildbot.status.words.IRCrlrm}rn(hNUhOjfubah_hubaubhvX 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.rorp}rq(hNX 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.hOjGubeubhz)rr}rs(hNXIn 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 :class:`MailNotifier` does for email addresses, the :class:`IRC` object will have an :class:`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).hOj3hZh]h_h~ha}rt(hc]hd]he]hf]hi]uhkMhlhhm]ru(hvXIn 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 rvrw}rx(hNXIn 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 hOjrubj)ry}rz(hNX:class:`MailNotifier`r{hOjrhZh]h_jha}r|(UreftypeXclassjjX MailNotifierU refdomainXpyr}hf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]r~h)r}r(hNj{ha}r(hc]hd]r(jj}Xpy-classrehe]hf]hi]uhOjyhm]rhvX MailNotifierrr}r(hNUhOjubah_hubaubhvX does for email addresses, the rr}r(hNX does for email addresses, the hOjrubj)r}r(hNX :class:`IRC`rhOjrhZh]h_jha}r(UreftypeXclassjjXIRCU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXIRCrr}r(hNUhOjubah_hubaubhvX object will have an rr}r(hNX object will have an hOjrubj)r}r(hNX:class:`IRCLookup`rhOjrhZh]h_jha}r(UreftypeXclassjjX IRCLookupU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvX IRCLookuprr}r(hNUhOjubah_hubaubhvX 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 rr}r(hNX 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 hOjrubh)r}r(hNX``buildbot: i am user warner``ha}r(hc]hd]he]hf]hi]uhOjrhm]rhvXbuildbot: i am user warnerrr}r(hNUhOjubah_hubhvX commands).rr}r(hNX commands).hOjrubeubhz)r}r(hNXUOnce the mapping is established, the rest of the buildbot can ask the :class:`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.hOj3hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXFOnce the mapping is established, the rest of the buildbot can ask the rr}r(hNXFOnce the mapping is established, the rest of the buildbot can ask the hOjubj)r}r(hNX :class:`IRC`rhOjhZh]h_jha}r(UreftypeXclassjjXIRCU refdomainXpyrhf]he]U refexplicithc]hd]hi]jjjNjNuhkMhm]rh)r}r(hNjha}r(hc]hd]r(jjXpy-classrehe]hf]hi]uhOjhm]rhvXIRCrr}r(hNUhOjubah_hubaubhvX 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.rr}r(hNX 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.hOjubeubhz)r}r(hNXzThese operations and authentication of commands issued by particular nicknames will be implemented in :ref:`User-Objects`.hOj3hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]r(hvXfThese operations and authentication of commands issued by particular nicknames will be implemented in rr}r(hNXfThese operations and authentication of commands issued by particular nicknames will be implemented in 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.r}r(hNX.hOjubeubj1eubhZh]h_hha}r(hf]he]hc]hd]hi]hUlive-status-clientsruhkMhlhhm]ubsh_h`ha}r(hc]hd]he]hf]r(jUid10rehi]r(hh?euhkMhlhh}rjj1shm]r(ho)r}r(hNXLive Status ClientsrhOj.hZh]h_hsha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXLive Status Clientsrr}r(hNjhOjubaubhz)r}r(hNXThe Buildbot also offers a desktop status client interface which can display real-time build status in a GUI panel on the developer's desktop.rhOj.hZh]h_h~ha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXThe Buildbot also offers a desktop status client interface which can display real-time build status in a GUI panel on the developer's desktop.rr}r(hNjhOjubaubcsphinx.addnodes index r)r}r(hNUhOj.hZh]h_Uindexrha}r(hf]he]hc]hd]hi]Uentriesr]r(Usingler X PropertiesUindex-0r Utr aUinliner uhkMhlhhm]ubh)r }r(hNUhOj.hZh]h_hha}r(hf]he]hc]hd]hi]hj uhkMhlhhm]ubj,eubhZh]h}h_hha}r(hf]he]hc]hd]hi]hUbuild-propertiesruhkMhlhh}rj j shm]ubsh_h`ha}r(hc]hd]he]hf]r(jj Uid11rehi]r(h h&euhkMhlhh}r(jj,j j uhm]r(ho)r}r(hNXBuild PropertiesrhOj)hZh]h_hsha}r(hc]hd]he]hf]hi]uhkMhlhhm]rhvXBuild Propertiesrr}r (hNjhOjubaubhz)r!}r"(hNXEach 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.hOj)hZh]h_h~ha}r#(hc]hd]he]hf]hi]uhkMhlhhm]r$(hvXEach build has a set of r%r&}r'(hNXEach build has a set of hOj!ubh)r(}r)(hNX*Build Properties*ha}r*(hc]hd]he]hf]hi]uhOj!hm]r+hvXBuild Propertiesr,r-}r.(hNUhOj(ubah_hubhvX, 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.r/r0}r1(hNX, 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.hOj!ubeubhz)r2}r3(hNX^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.r4hOj)hZh]h_h~ha}r5(hc]hd]he]hf]hi]uhkMhlhhm]r6hvX^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.r7r8}r9(hNj4hOj2ubaubhz)r:}r;(hNXpProperties are very flexible, and can be used to implement all manner of functionality. Here are some examples:r<hOj)hZh]h_h~ha}r=(hc]hd]he]hf]hi]uhkMhlhhm]r>hvXpProperties are very flexible, and can be used to implement all manner of functionality. Here are some examples:r?r@}rA(hNj<hOj:ubaubhz)rB}rC(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}rD(hc]hd]he]hf]hi]uhkMhlhhm]rE(hvXCMost Source steps record the revision that they checked out in the rFrG}rH(hNXCMost Source steps record the revision that they checked out in the hOjBubh)rI}rJ(hNX``got_revision``ha}rK(hc]hd]he]hf]hi]uhOjBhm]rLhvX got_revisionrMrN}rO(hNUhOjIubah_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.rPrQ}rR(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.hOjBubeubcdocutils.nodes note rS)rT}rU(hNXhIn builds with more than one codebase, the ``got_revision`` property is a dictionary, keyed by codebase.rVhOj)hZh]h_UnoterWha}rX(hc]hd]he]hf]hi]uhkNhlhhm]rYhz)rZ}r[(hNjVhOjThZh]h_h~ha}r\(hc]hd]he]hf]hi]uhkMhm]r](hvX+In builds with more than one codebase, the r^r_}r`(hNX+In builds with more than one codebase, the hOjZubh)ra}rb(hNX``got_revision``ha}rc(hc]hd]he]hf]hi]uhOjZhm]rdhvX got_revisionrerf}rg(hNUhOjaubah_hubhvX- property is a dictionary, keyed by codebase.rhri}rj(hNX- property is a dictionary, keyed by codebase.hOjZubeubaubhz)rk}rl(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}rm(hc]hd]he]hf]hi]uhkMhlhhm]rn(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 rorp}rq(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 hOjkubh)rr}rs(hNX``is_nightly``ha}rt(hc]hd]he]hf]hi]uhOjkhm]ruhvX is_nightlyrvrw}rx(hNUhOjrubah_hubhvXi property so that steps can distinguish the nightly builds, perhaps to run more resource-intensive tests.ryrz}r{(hNXi property so that steps can distinguish the nightly builds, perhaps to run more resource-intensive tests.hOjkubeubhz)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.r~hOj)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(hNj~hOj|ubaubh)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 rr}r(hNXa hOjubh)r}r(hNX*codebase generator*ha}r(hc]hd]he]hf]hi]uhOjhm]r hvXcodebase generatorr r }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.hOj hZh]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`rhOjhZh]h_jha}r(UreftypeXcfgjjXcodebaseGeneratorU refdomainXbbrhf]he]U refexplicithc]hd]hi]jjuhkMhm]rh)r}r(hNjha}r (hc]hd]r!(jjXbb-cfgr"ehe]hf]hi]uhOjhm]r#hvXcodebaseGeneratorr$r%}r&(hNUhOjubah_hubaubhvX that is defined in the configuration. Most generators examine the repository of a change to determine its codebase, using project-specific rules.r'r(}r)(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_itemr*ubj)r+}r,(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}r-(hc]hd]he]hf]hi]uhOjhm]r.(hz)r/}r0(hNXsome *schedulers*hOj+hZh]h_h~ha}r1(hc]hd]he]hf]hi]uhkMhm]r2(hvXsome r3r4}r5(hNXsome hOj/ubh)r6}r7(hNX *schedulers*ha}r8(hc]hd]he]hf]hi]uhOj/hm]r9hvX schedulersr:r;}r<(hNUhOj6ubah_hubeubj)r=}r>(hNUha}r?(hc]hd]he]hf]hi]uhOj+hm]r@hz)rA}rB(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.hOj=hZh]h_h~ha}rC(hc]hd]he]hf]hi]uhkMhm]rD(hvXEach rErF}rG(hNXEach hOjAubj)rH}rI(hNX:bb:cfg:`scheduler`rJhOjAhZh]h_jha}rK(UreftypeXcfgjjX schedulersU refdomainXbbrLhf]he]U refexplicithc]hd]hi]jjuhkMhm]rMh)rN}rO(hNjJha}rP(hc]hd]rQ(jjLXbb-cfgrRehe]hf]hi]uhOjHhm]rShvX schedulerrTrU}rV(hNUhOjNubah_hubaubhvX1 has to be configured with a set of all required rWrX}rY(hNX1 has to be configured with a set of all required hOjAubh)rZ}r[(hNX ``codebases``ha}r\(hc]hd]he]hf]hi]uhOjAhm]r]hvX codebasesr^r_}r`(hNUhOjZubah_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.rarb}rc(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.hOjAubeubah_jubeh_j*ubj)rd}re(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}rf(hc]hd]he]hf]hi]uhOjhm]rg(hz)rh}ri(hNX/multiple *source steps* - one for each codebaserjhOjdhZh]h_h~ha}rk(hc]hd]he]hf]hi]uhkM$hm]rl(hvX multiple rmrn}ro(hNX multiple hOjhubh)rp}rq(hNX*source steps*ha}rr(hc]hd]he]hf]hi]uhOjhhm]rshvX source stepsrtru}rv(hNUhOjpubah_hubhvX - one for each codebaserwrx}ry(hNX - one for each codebasehOjhubeubj)rz}r{(hNUha}r|(hc]hd]he]hf]hi]uhOjdhm]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.hOjzhZh]h_h~ha}r(hc]hd]he]hf]hi]uhkM&hm]r(hvXA rr}r(hNXA hOj~ubj)r}r(hNX:ref:`Builder`rhOj~hZh]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 hOj~ubj)r}r(hNX#:ref:`source step`rhOj~hZh]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 hOj~ubh)r}r(hNX ``codebase``ha}r(hc]hd]he]hf]hi]uhOj~hm]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.hOj~ubeubjS)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]uhOjzhm]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_jWubjS)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]uhOjzhm]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_jWubeh_jubeh_j*ubeh_U bullet_listrubaubcdocutils.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]r hz)r }r (hNjhOjhZh]h_h~ha}r (hc]hd]he]hf]hi]uhkM5hm]r (hvX Defining a rr}r(hNX Defining a hOj ubj)r}r(hNX:bb:cfg:`codebaseGenerator`rhOj hZh]h_jha}r(UreftypeXcfgjjXcodebaseGeneratorU refdomainXbbrhf]he]U refexplicithc]hd]hi]jjuhkM5hm]rh)r}r(hNjha}r(hc]hd]r(jjXbb-cfgrehe]hf]hi]uhOjhm]rhvXcodebaseGeneratorrr}r(hNUhOjubah_hubaubhvX that returns non-empty (not r r!}r"(hNX that returns non-empty (not hOj ubh)r#}r$(hNX``''``ha}r%(hc]hd]he]hf]hi]uhOj hm]r&hvX''r'r(}r)(hNUhOj#ubah_hubhvX;) codebases will change the behavior of all the schedulers.r*r+}r,(hNX;) codebases will change the behavior of all the schedulers.hOj ubeubaubeubeubhZh]h}r-hj%sh_h`ha}r.(hc]hd]he]hf]r/(Uusersr0j(ehi]r1(h#heuhkMhlhh}r2j(j%shm]r3(ho)r4}r5(hNXUsersr6hOhVhZh]h_hsha}r7(hc]hd]he]hf]hi]uhkMhlhhm]r8hvXUsersr9r:}r;(hNj6hOj4ubaubhz)r<}r=(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}r>(hc]hd]he]hf]hi]uhkM hlhhm]r?(hvX-Buildbot has a somewhat limited awareness of r@rA}rB(hNX-Buildbot has a somewhat limited awareness of hOj<ubh)rC}rD(hNX*users*ha}rE(hc]hd]he]hf]hi]uhOj<hm]rFhvXusersrGrH}rI(hNUhOjCubah_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.rJrK}rL(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.hOj<ubeubhz)rM}rN(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}rO(hc]hd]he]hf]hi]uhkM%hlhhm]rP(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 rQrR}rS(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 hOjMubj)rT}rU(hNX:bb:status:`WebStatus`rVhOjMhZh]h_jha}rW(UreftypeXstatusjjX WebStatusU refdomainXbbrXhf]he]U refexplicithc]hd]hi]jjuhkM%hm]rYh)rZ}r[(hNjVha}r\(hc]hd]r](jjXX bb-statusr^ehe]hf]hi]uhOjThm]r_hvX WebStatusr`ra}rb(hNUhOjZubah_hubaubhvX and rcrd}re(hNX and hOjMubj)rf}rg(hNX:bb:status:`IRC`rhhOjMhZh]h_jha}ri(UreftypeXstatusjjXIRCU refdomainXbbrjhf]he]U refexplicithc]hd]hi]jjuhkM%hm]rkh)rl}rm(hNjhha}rn(hc]hd]ro(jjjX bb-statusrpehe]hf]hi]uhOjfhm]rqhvXIRCrrrs}rt(hNUhOjlubah_hubaubhvX).rurv}rw(hNX).hOjMubeubhz)rx}ry(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}rz(hc]hd]he]hf]hi]uhkM)hlhhm]r{(hvXJEach developer is primarily known through the source control system. Each r|r}}r~(hNXJEach developer is primarily known through the source control system. Each hOjxubj)r}r(hNX:class:`Change`rhOjxhZh]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 hOjxubj)r}r(hNX :attr:`who`rhOjxhZh]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 hOjxubj)r}r(hNX:class:`Build`rhOjxhZh]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 hOjxubh)r}r(hNX *blamelist*ha}r(hc]hd]he]hf]hi]uhOjxhm]rhvX blamelistrr}r(hNUhOjubah_hubhvX.r}r(hNX.hOjxubeubhz)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]rhvX User Objectsrr}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 r r }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]uhOj hm]rhvXChange-Sourcesrr}r(hNUhOjubah_hubaubhvX and rr}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]r((jj#Xstd-refr)ehe]hf]hi]uhOjhm]r*hvXStatus-Targetsr+r,}r-(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.r.r/}r0(hNX). The User Objects are stored in the Buildbot database and correlate the various attributes that a user might have: irc, Git, etc.hOjubeubhQhP)r1}r2(hNUhOhThZh]h_h`ha}r3(hc]hd]he]hf]r4Utoolsr5ahi]r6hauhkMahlhhm]r7(ho)r8}r9(hNXToolsr:hOj1hZh]h_hsha}r;(hc]hd]he]hf]hi]uhkMahlhhm]r<hvXToolsr=r>}r?(hNj:hOj8ubaubhz)r@}rA(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`).hOj1hZh]h_h~ha}rB(hc]hd]he]hf]hi]uhkMchlhhm]rC(hvX%For managing users manually, use the rDrE}rF(hNX%For managing users manually, use the hOj@ubh)rG}rH(hNX``buildbot user``ha}rI(hc]hd]he]hf]hi]uhOj@hm]rJhvX buildbot userrKrL}rM(hNUhOjGubah_hubhvXv command, which allows you to add, remove, update, and show various attributes of users in the Buildbot database (see rNrO}rP(hNXv command, which allows you to add, remove, update, and show various attributes of users in the Buildbot database (see hOj@ubj)rQ}rR(hNX:ref:`Command-line-Tool`rShOj@hZh]h_jha}rT(UreftypeXrefjjXcommand-line-toolU refdomainXstdrUhf]he]U refexplicithc]hd]hi]jjuhkMchm]rVh)rW}rX(hNjSha}rY(hc]hd]rZ(jjUXstd-refr[ehe]hf]hi]uhOjQhm]r\hvXCommand-line-Toolr]r^}r_(hNUhOjWubah_hubaubhvX).r`ra}rb(hNX).hOj@ubeubhz)rc}rd(hNXsTo show all of the users in the database in a more pretty manner, use the users page in the :bb:Status:`WebStatus`.hOj1hZh]h_h~ha}re(hc]hd]he]hf]hi]uhkMghlhhm]rf(hvX\To show all of the users in the database in a more pretty manner, use the users page in the rgrh}ri(hNX\To show all of the users in the database in a more pretty manner, use the users page in the hOjcubj)rj}rk(hNX:bb:Status:`WebStatus`rlhOjchZh]h_jha}rm(UreftypeXstatusjjX WebStatusU refdomainXbbrnhf]he]U refexplicithc]hd]hi]jjuhkMghm]roh)rp}rq(hNjlha}rr(hc]hd]rs(jjnX bb-statusrtehe]hf]hi]uhOjjhm]ruhvX WebStatusrvrw}rx(hNUhOjpubah_hubaubhvX.ry}rz(hNX.hOjcubeubeubjBeubhZh]h_h`ha}r{(hc]r|jOahd]he]hf]r}Uid6r~ahi]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]rhvXUsernamerr}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``r hOjhZh]h_jha}r(hc]hd]he]hf]hi]uhkMShm]rh)r}r(hNj ha}r(hc]hd]he]hf]hi]uhOj hm]rhvXhgrr}r(hNUhOjubah_hubaubj)r}r(hNUha}r(hc]hd]he]hf]hi]uhOjhm]rhz)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]uhOjhm]r"hvXwhor#r$}r%(hNUhOjubah_hubhvXP attributes are free-form strings, but usually adhere to similar conventions as r&r'}r((hNXP attributes are free-form strings, but usually adhere to similar conventions as hOjubh)r)}r*(hNX``git``ha}r+(hc]hd]he]hf]hi]uhOjhm]r,hvXgitr-r.}r/(hNUhOj)ubah_hubhvX attributes (r0r1}r2(hNX attributes (hOjubh)r3}r4(hNX``Full Name ``ha}r5(hc]hd]he]hf]hi]uhOjhm]r6hvXFull Name r7r8}r9(hNUhOj3ubah_hubhvX).r:r;}r<(hNX).hOjubeubah_jubeubj)r=}r>(hNX9``cvs`` ``who`` attributes are of the form ``Username``. hOjhZh]h_jha}r?(hc]hd]he]hf]hi]uhkMVhlhhm]r@(j)rA}rB(hNX``cvs``rChOj=hZh]h_jha}rD(hc]hd]he]hf]hi]uhkMVhm]rEh)rF}rG(hNjCha}rH(hc]hd]he]hf]hi]uhOjAhm]rIhvXcvsrJrK}rL(hNUhOjFubah_hubaubj)rM}rN(hNUha}rO(hc]hd]he]hf]hi]uhOj=hm]rPhz)rQ}rR(hNX0``who`` attributes are of the form ``Username``.hOjMhZh]h_h~ha}rS(hc]hd]he]hf]hi]uhkMVhm]rT(h)rU}rV(hNX``who``ha}rW(hc]hd]he]hf]hi]uhOjQhm]rXhvXwhorYrZ}r[(hNUhOjUubah_hubhvX attributes are of the form r\r]}r^(hNX attributes are of the form hOjQubh)r_}r`(hNX ``Username``ha}ra(hc]hd]he]hf]hi]uhOjQhm]rbhvXUsernamercrd}re(hNUhOj_ubah_hubhvX.rf}rg(hNX.hOjQubeubah_jubeubj)rh}ri(hNXp``darcs`` ``who`` attributes contain an ``Email`` and may also include a ``Full Name`` like ``git`` attributes. hOjhZh]h_jha}rj(hc]hd]he]hf]hi]uhkMZhlhhm]rk(j)rl}rm(hNX ``darcs``rnhOjhhZh]h_jha}ro(hc]hd]he]hf]hi]uhkMZhm]rph)rq}rr(hNjnha}rs(hc]hd]he]hf]hi]uhOjlhm]rthvXdarcsrurv}rw(hNUhOjqubah_hubaubj)rx}ry(hNUha}rz(hc]hd]he]hf]hi]uhOjhhm]r{hz)r|}r}(hNXe``who`` attributes contain an ``Email`` and may also include a ``Full Name`` like ``git`` attributes.hOjxhZh]h_h~ha}r~(hc]hd]he]hf]hi]uhkMYhm]r(h)r}r(hNX``who``ha}r(hc]hd]he]hf]hi]uhOj|hm]rhvXwhorr}r(hNUhOjubah_hubhvX attributes contain an rr}r(hNX attributes contain an hOj|ubh)r}r(hNX ``Email``ha}r(hc]hd]he]hf]hi]uhOj|hm]rhvXEmailrr}r(hNUhOjubah_hubhvX and may also include a rr}r(hNX and may also include a hOj|ubh)r}r(hNX ``Full Name``ha}r(hc]hd]he]hf]hi]uhOj|hm]rhvX Full Namerr}r(hNUhOjubah_hubhvX like rr}r(hNX like hOj|ubh)r}r(hNX``git``ha}r(hc]hd]he]hf]hi]uhOj|hm]rhvXgitrr}r(hNUhOjubah_hubhvX attributes.rr}r(hNX attributes.hOj|ubeubah_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]rj~aUsourceh]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 jh jh jh jh j;hj5hjIhjhhhjhjhjhj hjhjhj hj6hjhjhjhjhj(hjUh j h!jh"jh#j0h$jh%jh&jh'jfh(jh)j h*jh+jh,jh-jh.jh/jFh0jh1j`h2j h3j[ h4jh5j`h6jh7jOh8jh9j#h:jh;jhjEh?jh@hhAjhBjfhChhhDjhEjhFNuhm]rhXahNUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]r Uautofootnote_refsr ]r Usymbol_footnote_refsr ]r U 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]rhvX3Hyperlink target "source-stamps" is not referenced.rr}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]uhOjhm]r%hvX=Hyperlink target "version-control-systems" is not referenced.r&r'}r((hNUhOj"ubah_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]r0hvXNHyperlink target "how-different-vc-systems-specify-sources" is not referenced.r1r2}r3(hNUhOj-ubah_h~ubah_jubhK)r4}r5(hNUha}r6(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]r7hz)r8}r9(hNUha}r:(hc]hd]he]hf]hi]uhOj4hm]r;hvX;Hyperlink target "attributes-of-changes" is not referenced.r<r=}r>(hNUhOj8ubah_h~ubah_jubhK)r?}r@(hNUha}rA(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rBhz)rC}rD(hNUha}rE(hc]hd]he]hf]hi]uhOj?hm]rFhvX.Hyperlink target "attr-who" is not referenced.rGrH}rI(hNUhOjCubah_h~ubah_jubhK)rJ}rK(hNUha}rL(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rMhz)rN}rO(hNUha}rP(hc]hd]he]hf]hi]uhOjJhm]rQhvX0Hyperlink target "attr-files" is not referenced.rRrS}rT(hNUhOjNubah_h~ubah_jubhK)rU}rV(hNUha}rW(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rXhz)rY}rZ(hNUha}r[(hc]hd]he]hf]hi]uhOjUhm]r\hvX3Hyperlink target "attr-comments" is not referenced.r]r^}r_(hNUhOjYubah_h~ubah_jubhK)r`}ra(hNUha}rb(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rchz)rd}re(hNUha}rf(hc]hd]he]hf]hi]uhOj`hm]rghvX2Hyperlink target "attr-project" is not referenced.rhri}rj(hNUhOjdubah_h~ubah_jubhK)rk}rl(hNUha}rm(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]rnhz)ro}rp(hNUha}rq(hc]hd]he]hf]hi]uhOjkhm]rrhvX5Hyperlink target "attr-repository" is not referenced.rsrt}ru(hNUhOjoubah_h~ubah_jubhK)rv}rw(hNUha}rx(hc]UlevelKhf]he]Usourceh]hd]hi]UlineKUtypejuhm]ryhz)rz}r{(hNUha}r|(hc]hd]he]hf]hi]uhOjvhm]r}hvX3Hyperlink target "attr-codebase" is not referenced.r~r}r(hNUhOjzubah_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]rhvX5Hyperlink target "email-addresses" 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 hvX3Hyperlink target "irc-nicknames" is not referenced.r r}r(hNUhOj ubah_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.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"hvX-Hyperlink target "index-0" 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-hvX6Hyperlink target "build-properties" is not referenced.r.r/}r0(hNUhOj*ubah_h~ubah_jubhK)r1}r2(hNUha}r3(hc]UlevelKhf]he]Usourceh]hd]hi]UlineMUtypejuhm]r4hz)r5}r6(hNUha}r7(hc]hd]he]hf]hi]uhOj1hm]r8hvX>Hyperlink target "multiple-codebase-builds" is not referenced.r9r:}r;(hNUhOj5ubah_h~ubah_jubeUreporterr<NUid_startr=K U autofootnotesr>]r?U citation_refsr@}rAUindirect_targetsrB]rCUsettingsrD(cdocutils.frontend Values rEorF}rG(Ufootnote_backlinksrHKUrecord_dependenciesrINU rfc_base_urlrJUhttp://tools.ietf.org/html/rKU tracebackrLUpep_referencesrMNUstrip_commentsrNNU toc_backlinksrOUentryrPU language_coderQUenrRU datestamprSNU report_levelrTKU _destinationrUNU halt_levelrVKU strip_classesrWNhsNUerror_encoding_error_handlerrXUbackslashreplacerYUdebugrZNUembed_stylesheetr[Uoutput_encoding_error_handlerr\Ustrictr]U sectnum_xformr^KUdump_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_sourceryUP/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/concepts.rstrzUgettext_compactr{U generatorr|NUdump_internalsr}NU smart_quotesr~U 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(jj.jKjFja j\ jjjjj j j5j1jIjJhhjjjjjjjj8j;j3j~hQjj=j j jhTjfjajjjjhhj6j2jj)jjj j)jjjjjjjjj(hVjUjPj jjjj0hVjjjjjj)jfjaj j jjjjjjjjjFjBjjj`jaj j j[ j\ jj8j`jajOjPjjj#jjjjjj8j3jjjEjFjj.jjjhTjj=hhhXjjjjjQjJuUsubstitution_namesr}rh_hlha}r(hc]hf]he]Usourceh]hd]hi]uU footnotesr]rUrefidsr}r(j]rjajI]rjFah]rhaj]rjaj]rjaj ]rj aj]rjaj]rjaj]rjaj]rj aj]rj,aj ]rj aj]rjaj]rjaj`]rj]aj ]rj aj[ ]rjX aj]rj;aj`]rj]ajO]rjLaj8]rj6ajE]rjBaj]rj1aj(]rj%aj]rj@aj]rjaj]rjauub.PKJtD 6buildbot-v0.8.8/.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.8/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.8/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.PKJtDz]B .buildbot-v0.8.8/.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.8/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.8q.q/}q0(hU0.8.8q1hNh'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/cmdlineqdqeNXmanual/resourcesqfqgNXmanual/optimizationqhqieUhiddenqjU includefilesqk]ql(hZh\h^h`hbhdhfhheUmaxdepthqmKuh'Kh]ubaubeubehUU transformerqnNU footnote_refsqo}qpUrefnamesqq}qrUsymbol_footnotesqs]qtUautofootnote_refsqu]qvUsymbol_footnote_refsqw]qxU citationsqy]qzh(hU current_lineq{NUtransform_messagesq|]q}Ureporterq~NUid_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.8/master/docs/manual/index.rstqUgettext_compactqU generatorqNUdump_internalsqNU smart_quotesqU 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.PKJtDc:5buildbot-v0.8.8/.doctrees/manual/optimization.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xproperties load speedupqNX optimizationquUsubstitution_defsq}q Uparse_messagesq ]q cdocutils.nodes system_message q )q }q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhhUsourceqcdocutils.nodes reprunicode qXT/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/optimization.rstqq}qbUexpect_referenced_by_nameq}qhcdocutils.nodes target q)q}q(hX.. _Optimization:hhhhUtagnameqUtargetq U attributesq!}q"(Uidsq#]Ubackrefsq$]Udupnamesq%]Uclassesq&]Unamesq']Urefidq(U optimizationq)uUlineq*KUdocumentq+hUchildrenq,]ubshUsectionq-h!}q.(h%]q/X optimizationq0ah&]h$]h#]q1(h)Uid1q2eh']q3hauh*Kh+hUexpect_referenced_by_idq4}q5h)hsh,]q6(cdocutils.nodes title q7)q8}q9(hX Optimizationq:hhhhhUtitleq;h!}q<(h%]h&]h$]h#]h']uh*Kh+hh,]q=cdocutils.nodes Text q>X 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.8/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.PKJtD,_vv;buildbot-v0.8.8/.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 Xbuild-factoriesq X gnuautoconfq X 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.8/master/docs/manual/cfg-buildfactories.rstq/q0}q1bUexpect_referenced_by_nameq2}q3h cdocutils.nodes target q4)q5}q6(h#X.. _Build-Factories:h$hh-h0Utagnameq7Utargetq8U attributesq9}q:(Uidsq;]Ubackrefsq<]Udupnamesq=]Uclassesq>]Unamesq?]Urefidq@Ubuild-factoriesqAuUlineqBKUdocumentqChUchildrenqD]ubsh7UsectionqEh9}qF(h=]h>]h<]h;]qG(hAUid1qHeh?]qI(hh euhBKhChUexpect_referenced_by_idqJ}qKhAh5shD]qL(cdocutils.nodes title qM)qN}qO(h#XBuild FactoriesqPh$h+h-h0h7UtitleqQh9}qR(h=]h>]h<]h;]h?]uhBKhChhD]qScdocutils.nodes Text qTXBuild FactoriesqUqV}qW(h#hPh$hNubaubcdocutils.nodes paragraph qX)qY}qZ(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-h0h7U paragraphq[h9}q\(h=]h>]h<]h;]h?]uhBKhChhD]q](hTX Each Builder is equipped with a q^q_}q`(h#X Each Builder is equipped with a h$hYubcdocutils.nodes literal qa)qb}qc(h#X``build factory``h9}qd(h=]h>]h<]h;]h?]uh$hYhD]qehTX build factoryqfqg}qh(h#Uh$hbubah7UliteralqiubhTX, 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 qjqk}ql(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$hYubha)qm}qn(h#X ``factory``h9}qo(h=]h>]h<]h;]h?]uh$hYhD]qphTXfactoryqqqr}qs(h#Uh$hmubah7hiubhTX element of its dictionary.qtqu}qv(h#X element of its dictionary.h$hYubeubhX)qw}qx(h#XSThe steps used by these builds are defined in the next section, :ref:`Build-Steps`.qyh$h+h-h0h7h[h9}qz(h=]h>]h<]h;]h?]uhBK hChhD]q{(hTX@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$hwubcsphinx.addnodes pending_xref q)q}q(h#X:ref:`Build-Steps`qh$hwh-h0h7U pending_xrefqh9}q(UreftypeXrefUrefwarnqU reftargetqX build-stepsU refdomainXstdqh;]h<]U refexplicith=]h>]h?]UrefdocqXmanual/cfg-buildfactoriesquhBK hD]qcdocutils.nodes emphasis q)q}q(h#hh9}q(h=]h>]q(UxrefqhXstd-refqeh<]h;]h?]uh$hhD]qhTX Build-Stepsqq}q(h#Uh$hubah7UemphasisqubaubhTX.q}q(h#X.h$hwubeubcdocutils.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-h0h7Unoteqh9}q(h=]h>]h<]h;]h?]uhBNhChhD]qhX)q}q(h#XoBuild factories are used with builders, and are not added directly to the buildmaster configuration dictionary.qh$hh-h0h7h[h9}q(h=]h>]h<]h;]h?]uhBKhD]qhTXoBuild factories are used with builders, and are not added directly to the buildmaster configuration dictionary.qq}q(h#hh$hubaubaubh4)q}q(h#X.. _BuildFactory:h$h+h-h0h7h8h9}q(h=]h>]h<]h;]qU buildfactoryqah?]qh auhBKhChhD]ubcsphinx.addnodes index q)q}q(h#Uh$h+h-h0h7Uindexqh9}q(h;]h<]h=]h>]h?]Uentriesq]q(UsingleqX Build FactoryUindex-0qUtqaUinlinequhBKhChhD]ubh4)q}q(h#Uh$h+h-h0h7h8h9}q(h;]h<]h=]h>]h?]h@huhBKhChhD]ubh%)q}q(h#Uh$h+h-h0h2}h7hEh9}q(h=]h>]h<]h;]q(Udefining-a-build-factoryqheh?]qhauhBKhChhJ}qhhshD]q(hM)q}q(h#XDefining a Build Factoryqh$hh-h0h7hQh9}q(h=]h>]h<]h;]h?]uhBKhChhD]qhTXDefining a Build Factoryqȅq}q(h#hh$hubaubhX)q}q(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-h0h7h[h9}q(h=]h>]h<]h;]h?]uhBKhChhD]q(hTXA qυq}q(h#XA h$hubh)q}q(h#X:class:`BuildFactory`qh$hh-h0h7hh9}q(UreftypeXclasshhX BuildFactoryU refdomainXpyqh;]h<]U refexplicith=]h>]h?]hhUpy:classqNU py:moduleqNuhBKhD]qha)q}q(h#hh9}q(h=]h>]q(hhXpy-classqeh<]h;]h?]uh$hhD]qhTX BuildFactoryqq}q(h#Uh$hubah7hiubaubhTX 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 qㅁq}q(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$hubha)q}q(h#X``make build``h9}q(h=]h>]h<]h;]h?]uh$hhD]qhTX make buildqꅁq}q(h#Uh$hubah7hiubhTX would be configured as follows:q텁q}q(h#X would be configured as follows:h$hubeubcdocutils.nodes literal_block q)q}q(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-h0h7U literal_blockqh9}q(U xml:spaceqUpreserveqh;]h<]h=]h>]h?]uhBKhChhD]qhTXfrom 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"]))qq}q(h#Uh$hubaubhX)q}q(h#XMThis factory would then be attached to one builder (or several, if desired)::qh$hh-h0h7h[h9}q(h=]h>]h<]h;]h?]uhBK#hChhD]qhTXLThis factory would then be attached to one builder (or several, if desired):rr}r(h#XLThis factory would then be attached to one builder (or several, if desired):h$hubaubh)r}r(h#X^c['builders'].append( BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f))h$hh-h0h7hh9}r(hhh;]h<]h=]h>]h?]uhBK%hChhD]rhTX^c['builders'].append( BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f))rr}r (h#Uh$jubaubhX)r }r (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-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBK(hChhD]r (hTX5It is also possible to pass a list of steps into the rr}r(h#X5It is also possible to pass a list of steps into the h$j ubh)r}r(h#X:class:`BuildFactory`rh$j h-h0h7hh9}r(UreftypeXclasshhX BuildFactoryU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBK(hD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-classreh<]h;]h?]uh$jhD]rhTX BuildFactoryrr}r(h#Uh$jubah7hiubaubhTX when it is created. Using r r!}r"(h#X when it is created. Using h$j ubh)r#}r$(h#X:meth:`addStep`r%h$j h-h0h7hh9}r&(UreftypeXmethhhXaddStepU refdomainXpyr'h;]h<]U refexplicith=]h>]h?]hhhNhNuhBK(hD]r(ha)r)}r*(h#j%h9}r+(h=]h>]r,(hj'Xpy-methr-eh<]h;]h?]uh$j#hD]r.hTXaddStepr/r0}r1(h#Uh$j)ubah7hiubaubhTX 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.r2r3}r4(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$j ubeubh)r5}r6(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-h0h7hh9}r7(hhh;]h<]h=]h>]h?]uhBK.hChhD]r8hTXfrom 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)r9r:}r;(h#Uh$j5ubaubhX)r<}r=(h#X;Finally, you can also add a sequence of steps all at once::r>h$hh-h0h7h[h9}r?(h=]h>]h<]h;]h?]uhBK7hChhD]r@hTX:Finally, you can also add a sequence of steps all at once:rArB}rC(h#X:Finally, you can also add a sequence of steps all at once:h$j<ubaubh)rD}rE(h#Xf.addSteps(all_steps)h$hh-h0h7hh9}rF(hhh;]h<]h=]h>]h?]uhBK9hChhD]rGhTXf.addSteps(all_steps)rHrI}rJ(h#Uh$jDubaubh%)rK}rL(h#Uh$hh-h0h7hEh9}rM(h=]h>]h<]h;]rNU attributesrOah?]rPhauhBK]h<]h;]h?]uhBK]h<]h;]h?]uhBK>hChhD]r^hTXQThe following attributes can be set on a build factory after it is created, e.g.,r_r`}ra(h#XQThe following attributes can be set on a build factory after it is created, e.g.,h$jZubaubh)rb}rc(h#X0f = factory.BuildFactory() f.useProgress = Falseh$jKh-h0h7hh9}rd(hhh;]h<]h=]h>]h?]uhBK@hChhD]rehTX0f = factory.BuildFactory() f.useProgress = Falserfrg}rh(h#Uh$jbubaubcdocutils.nodes definition_list ri)rj}rk(h#Uh$jKh-h0h7Udefinition_listrlh9}rm(h=]h>]h<]h;]h?]uhBNhChhD]rn(cdocutils.nodes definition_list_item ro)rp}rq(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$jjh-h0h7Udefinition_list_itemrrh9}rs(h=]h>]h<]h;]h?]uhBKIhD]rt(cdocutils.nodes term ru)rv}rw(h#X:attr:`useProgress`rxh$jph-h0h7Utermryh9}rz(h=]h>]h<]h;]h?]uhBKIhD]r{h)r|}r}(h#jxh$jvh-h0h7hh9}r~(UreftypeXattrhhX useProgressU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKIhD]rha)r}r(h#jxh9}r(h=]h>]r(hjXpy-attrreh<]h;]h?]uh$j|hD]rhTX useProgressrr}r(h#Uh$jubah7hiubaubaubcdocutils.nodes definition r)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jphD]rhX)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-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKDhD]r(hTX (defaults to rr}r(h#X (defaults to h$jubha)r}r(h#X``True``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXTruerr}r(h#Uh$jubah7hiubhTX): if rr}r(h#X): if h$jubha)r}r(h#X``True``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXTruerr}r(h#Uh$jubah7hiubhTX1, 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$jubha)r}r(h#X ``False``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXFalserr}r(h#Uh$jubah7hiubhTX to inhibit progress-tracking.rr}r(h#X to inhibit progress-tracking.h$jubeubah7U definitionrubeubjo)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$jjh-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBKShChhD]r(ju)r}r(h#X:attr:`workdir`rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBKShD]rh)r}r(h#jh$jh-h0h7hh9}r(UreftypeXattrhhXworkdirU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKShD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-attrreh<]h;]h?]uh$jhD]rhTXworkdirrr}r(h#Uh$jubah7hiubaubaubj)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jhD]r(hX)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.rh$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKLhD]rhTX(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#jh$jubaubhX)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-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKPhD]r(hTXIf 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-h0h7hh9}r(UreftypeXrefhhXfactory-workdir-functionsU refdomainXstdrh;]h<]U refexplicith=]h>]h?]hhuhBKPhD]rh)r}r(h#jh9}r(h=]h>]r(hjXstd-refreh<]h;]h?]uh$jhD]rhTXFactory-Workdir-Functionsrr}r(h#Uh$jubah7hubaubhTX.r}r(h#X.h$jubeubeh7jubeubeubeubeubh)eubh-h0h7hEh9}r(h=]h>]h<]h;]rUpredefined-build-factoriesrah?]rh auhBKVhChhD]r(hM)r}r(h#XPredefined Build Factoriesrh$h)h-h0h7hQh9}r(h=]h>]h<]h;]h?]uhBKVhChhD]rhTXPredefined Build Factoriesrr}r(h#jh$jubaubhX)r}r(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.rh$h)h-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKXhChhD]rhTXBuildbot 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.rr}r(h#jh$jubaubh4)r}r(h#X.. _GNUAutoconf:h$h)h-h0h7h8h9}r(h=]h>]h<]h;]rU gnuautoconfr ah?]r h auhBK]hChhD]ubh)r }r (h#Uh$h)h-h0h7hh9}r (h;]h<]h=]h>]h?]h]r((hX GNUAutoconfUindex-1rUtr(hXBuild Factory; GNUAutoconfjUtrehuhBK_hChhD]ubh4)r}r(h#Uh$h)h-h0h7h8h9}r(h;]h<]h=]h>]h?]h@juhBKbhChhD]ubh&h%)r}r(h#Uh(Kh$h)h-h0h2}h7hEh9}r(h=]rXbasicbuildfactoryrah>]h<]h;]r(Uindex-2rUid3reh?]uhBKhChhJ}rjh4)r}r(h#Uh$h&h-h0h7h8h9}r (h;]h<]h=]h>]h?]h@juhBKhChhD]ubshD]r!(hM)r"}r#(h#XBasicBuildFactoryr$h$jh-h0h7hQh9}r%(h=]h>]h<]h;]h?]uhBKhChhD]r&hTXBasicBuildFactoryr'r(}r)(h#j$h$j"ubaubh)r*}r+(h#Uh$jh-Nh7hh9}r,(h;]h<]h=]h>]h?]Uentries]r-(hX;buildbot.process.factory.BasicBuildFactory (built-in class)h Utr.auhBNhChhD]ubcsphinx.addnodes desc r/)r0}r1(h#Uh$jh-Nh7Udescr2h9}r3(Unoindexr4Udomainr5Xpyh;]h<]h=]h>]h?]Uobjtyper6Xclassr7Udesctyper8j7uhBNhChhD]r9(csphinx.addnodes desc_signature r:)r;}r<(h#X*buildbot.process.factory.BasicBuildFactoryh$j0h-h0h7Udesc_signaturer=h9}r>(h;]r?h aUmoduler@Nh<]h=]h>]h?]rAh aUfullnamerBh UclassrCXbuildbot.process.factoryUfirstrDuhBKhChhD]rE(csphinx.addnodes desc_annotation rF)rG}rH(h#Xclass h$j;h-h0h7Udesc_annotationrIh9}rJ(h=]h>]h<]h;]h?]uhBKhChhD]rKhTXclass rLrM}rN(h#Uh$jGubaubcsphinx.addnodes desc_addname rO)rP}rQ(h#Xbuildbot.process.factory.h$j;h-h0h7U desc_addnamerRh9}rS(h=]h>]h<]h;]h?]uhBKhChhD]rThTXbuildbot.process.factory.rUrV}rW(h#Uh$jPubaubcsphinx.addnodes desc_name rX)rY}rZ(h#XBasicBuildFactoryh$j;h-h0h7U desc_namer[h9}r\(h=]h>]h<]h;]h?]uhBKhChhD]r]hTXBasicBuildFactoryr^r_}r`(h#Uh$jYubaubeubcsphinx.addnodes desc_content ra)rb}rc(h#Uh$j0h-h0h7U desc_contentrdh9}re(h=]h>]h<]h;]h?]uhBKhChhD]ubeubhX)rf}rg(h#XThis is a subclass of :class:`GNUAutoconf` which assumes the source is in CVS, and uses ``mode='clobber'`` to always build from a clean working copy.h$jh-h0h7h[h9}rh(h=]h>]h<]h;]h?]uhBKhChhD]ri(hTXThis is a subclass of rjrk}rl(h#XThis is a subclass of h$jfubh)rm}rn(h#X:class:`GNUAutoconf`roh$jfh-h0h7hh9}rp(UreftypeXclasshhX GNUAutoconfU refdomainXpyrqh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKhD]rrha)rs}rt(h#joh9}ru(h=]h>]rv(hjqXpy-classrweh<]h;]h?]uh$jmhD]rxhTX GNUAutoconfryrz}r{(h#Uh$jsubah7hiubaubhTX. which assumes the source is in CVS, and uses r|r}}r~(h#X. which assumes the source is in CVS, and uses h$jfubha)r}r(h#X``mode='clobber'``h9}r(h=]h>]h<]h;]h?]uh$jfhD]rhTXmode='clobber'rr}r(h#Uh$jubah7hiubhTX, to always build from a clean working copy.rr}r(h#X, to always build from a clean working copy.h$jfubeubh4)r}r(h#X .. _BasicSVN:h$jh-h0h7h8h9}r(h=]h>]h<]h;]rUbasicsvnrah?]rhauhBKhChhD]ubh)r}r(h#Uh$jh-h0h7hh9}r(h;]h<]h=]h>]h?]h]r((hXBasicSVNUindex-3rUtr(hXBuild Factory; BasicSVNjUtrehuhBKhChhD]ubh4)r}r(h#Uh$jh-h0h7h8h9}r(h;]h<]h=]h>]h?]h@juhBKhChhD]ubeubh%)r}r(h#Uh(Kh$h)h-h0h2}h7hEh9}r(h=]rXbasicsvnrah>]h<]h;]r(jUid4reh?]uhBKhChhJ}rjjshD]r(hM)r}r(h#XBasicSVNrh$jh-h0h7hQh9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXBasicSVNrr}r(h#jh$jubaubh)r}r(h#Uh$jh-Nh7hh9}r(h;]h<]h=]h>]h?]Uentries]r(hX2buildbot.process.factory.BasicSVN (built-in class)hUtrauhBNhChhD]ubj/)r}r(h#Uh$jh-Nh7j2h9}r(j4j5Xpyh;]h<]h=]h>]h?]j6Xclassrj8juhBNhChhD]r(j:)r}r(h#X!buildbot.process.factory.BasicSVNh$jh-h0h7j=h9}r(h;]rhaj@Nh<]h=]h>]h?]rhajBhjCXbuildbot.process.factoryjDuhBKhChhD]r(jF)r}r(h#Xclass h$jh-h0h7jIh9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXclass rr}r(h#Uh$jubaubjO)r}r(h#Xbuildbot.process.factory.h$jh-h0h7jRh9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXbuildbot.process.factory.rr}r(h#Uh$jubaubjX)r}r(h#XBasicSVNh$jh-h0h7j[h9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXBasicSVNrr}r(h#Uh$jubaubeubja)r}r(h#Uh$jh-h0h7jdh9}r(h=]h>]h<]h;]h?]uhBKhChhD]ubeubhX)r}r(h#XQThis class is similar to :class:`BasicBuildFactory`, but uses SVN instead of CVS.rh$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKhChhD]r(hTXThis class is similar to rr}r(h#XThis class is similar to h$jubh)r}r(h#X:class:`BasicBuildFactory`rh$jh-h0h7hh9}r(UreftypeXclasshhXBasicBuildFactoryU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKhD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-classreh<]h;]h?]uh$jhD]rhTXBasicBuildFactoryrr}r(h#Uh$jubah7hiubaubhTX, but uses SVN instead of CVS.rr}r(h#X, but uses SVN instead of CVS.h$jubeubh4)r}r(h#X.. _QuickBuildFactory:h$jh-h0h7h8h9}r(h=]h>]h<]h;]rUquickbuildfactoryrah?]rhauhBKhChhD]ubh)r}r(h#Uh$jh-h0h7hh9}r(h;]h<]h=]h>]h?]h]r((hXQuickBuildFactoryUindex-4rUtr(hX Build Factory; QuickBuildFactoryjUtrehuhBKhChhD]ubh4)r}r(h#Uh$jh-h0h7h8h9}r(h;]h<]h=]h>]h?]h@juhBKhChhD]ubeubh%)r}r(h#Uh(Kh$h)h-h0h2}h7hEh9}r(h=]rXquickbuildfactoryrah>]h<]h;]r(jUid5reh?]uhBKhChhJ}rjjshD]r(hM)r}r(h#XQuickBuildFactoryrh$jh-h0h7hQh9}r(h=]h>]h<]h;]h?]uhBKhChhD]r hTXQuickBuildFactoryr r }r (h#jh$jubaubh)r }r(h#Uh$jh-Nh7hh9}r(h;]h<]h=]h>]h?]Uentries]r(hX;buildbot.process.factory.QuickBuildFactory (built-in class)hUtrauhBNhChhD]ubj/)r}r(h#Uh$jh-Nh7j2h9}r(j4j5Xpyh;]h<]h=]h>]h?]j6Xclassrj8juhBNhChhD]r(j:)r}r(h#X*buildbot.process.factory.QuickBuildFactoryh$jh-h0h7j=h9}r(h;]rhaj@Nh<]h=]h>]h?]rhajBhjCXbuildbot.process.factoryjDuhBKhChhD]r(jF)r}r(h#Xclass h$jh-h0h7jIh9}r(h=]h>]h<]h;]h?]uhBKhChhD]r hTXclass r!r"}r#(h#Uh$jubaubjO)r$}r%(h#Xbuildbot.process.factory.h$jh-h0h7jRh9}r&(h=]h>]h<]h;]h?]uhBKhChhD]r'hTXbuildbot.process.factory.r(r)}r*(h#Uh$j$ubaubjX)r+}r,(h#XQuickBuildFactoryh$jh-h0h7j[h9}r-(h=]h>]h<]h;]h?]uhBKhChhD]r.hTXQuickBuildFactoryr/r0}r1(h#Uh$j+ubaubeubja)r2}r3(h#Uh$jh-h0h7jdh9}r4(h=]h>]h<]h;]h?]uhBKhChhD]ubeubhX)r5}r6(h#XThe :class:`QuickBuildFactory` class is a subclass of :class:`GNUAutoconf` which assumes the source is in CVS, and uses ``mode='update'`` to get incremental updates.h$jh-h0h7h[h9}r7(h=]h>]h<]h;]h?]uhBKhChhD]r8(hTXThe r9r:}r;(h#XThe h$j5ubh)r<}r=(h#X:class:`QuickBuildFactory`r>h$j5h-h0h7hh9}r?(UreftypeXclasshhXQuickBuildFactoryU refdomainXpyr@h;]h<]U refexplicith=]h>]h?]hhhNhNuhBKhD]rAha)rB}rC(h#j>h9}rD(h=]h>]rE(hj@Xpy-classrFeh<]h;]h?]uh$j<hD]rGhTXQuickBuildFactoryrHrI}rJ(h#Uh$jBubah7hiubaubhTX class is a subclass of rKrL}rM(h#X class is a subclass of h$j5ubh)rN}rO(h#X:class:`GNUAutoconf`rPh$j5h-h0h7hh9}rQ(UreftypeXclasshhX GNUAutoconfU refdomainXpyrRh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKhD]rSha)rT}rU(h#jPh9}rV(h=]h>]rW(hjRXpy-classrXeh<]h;]h?]uh$jNhD]rYhTX GNUAutoconfrZr[}r\(h#Uh$jTubah7hiubaubhTX. which assumes the source is in CVS, and uses r]r^}r_(h#X. which assumes the source is in CVS, and uses h$j5ubha)r`}ra(h#X``mode='update'``h9}rb(h=]h>]h<]h;]h?]uh$j5hD]rchTX mode='update'rdre}rf(h#Uh$j`ubah7hiubhTX to get incremental updates.rgrh}ri(h#X to get incremental updates.h$j5ubeubhX)rj}rk(h#X+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='update'`` flag, to do the source update in-place.h$jh-h0h7h[h9}rl(h=]h>]h<]h;]h?]uhBKhChhD]rm(hTXThe difference between a rnro}rp(h#XThe difference between a h$jjubcdocutils.nodes title_reference rq)rr}rs(h#X `full build`h9}rt(h=]h>]h<]h;]h?]uh$jjhD]ruhTX full buildrvrw}rx(h#Uh$jrubah7Utitle_referenceryubhTX and a rzr{}r|(h#X and a h$jjubjq)r}}r~(h#X `quick build`h9}r(h=]h>]h<]h;]h?]uh$jjhD]rhTX quick buildrr}r(h#Uh$j}ubah7jyubhTX 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$jjubha)r}r(h#X``mode='update'``h9}r(h=]h>]h<]h;]h?]uh$jjhD]rhTX mode='update'rr}r(h#Uh$jubah7hiubhTX( flag, to do the source update in-place.rr}r(h#X( flag, to do the source update in-place.h$jjubeubhX)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$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKhChhD]r(hTX)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-h0h7hh9}r(UreftypeXattrhhX useProgressU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKhD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-attrreh<]h;]h?]uh$jhD]rhTX useProgressrr}r(h#Uh$jubah7hiubaubhTX flag to rr}r(h#X flag to h$jubha)r}r(h#X ``False``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXFalserr}r(h#Uh$jubah7hiubhTX. 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$jubeubhX)r}r(h#X2This class is probably not of use to new projects.rh$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTX2This class is probably not of use to new projects.rr}r(h#jh$jubaubh4)r}r(h#X.. _Factory-CPAN:h$jh-h0h7h8h9}r(h=]h>]h<]h;]rU factory-cpanrah?]rhauhBKhChhD]ubh)r}r(h#Uh$jh-h0h7hh9}r(h;]h<]h=]h>]h?]h]r((hXCPANUindex-5rUtr(hXBuild Factory; CPANjUtrehuhBKhChhD]ubh4)r}r(h#Uh$jh-h0h7h8h9}r(h;]h<]h=]h>]h?]h@juhBKhChhD]ubeubh%)r}r(h#Uh(Kh$h)h-h0h2}h7hEh9}r(h=]rXcpanrah>]h<]h;]r(Ucpanrjeh?]uhBKhChhJ}rjjshD]r(hM)r}r(h#XCPANrh$jh-h0h7hQh9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXCPANrr}r(h#jh$jubaubh)r}r(h#Uh$jh-Nh7hh9}r(h;]h<]h=]h>]h?]Uentries]r(hX.buildbot.process.factory.CPAN (built-in class)hUtrauhBNhChhD]ubj/)r}r(h#Uh$jh-Nh7j2h9}r(j4j5Xpyh;]h<]h=]h>]h?]j6Xclassrj8juhBNhChhD]r(j:)r}r(h#Xbuildbot.process.factory.CPANh$jh-h0h7j=h9}r(h;]rhaj@Nh<]h=]h>]h?]rhajBhjCXbuildbot.process.factoryjDuhBKhChhD]r(jF)r}r(h#Xclass h$jh-h0h7jIh9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXclass rr}r(h#Uh$jubaubjO)r}r(h#Xbuildbot.process.factory.h$jh-h0h7jRh9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXbuildbot.process.factory.rr}r(h#Uh$jubaubjX)r}r(h#XCPANh$jh-h0h7j[h9}r(h=]h>]h<]h;]h?]uhBKhChhD]rhTXCPANrr}r(h#Uh$jubaubeubja)r}r(h#Uh$jh-h0h7jdh9}r(h=]h>]h<]h;]h?]uhBKhChhD]ubeubhX)r}r(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-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBKhChhD]r(hTX%Most Perl modules available from the r r }r (h#X%Most Perl modules available from the h$jubcdocutils.nodes reference r )r }r(h#X`CPAN `_h9}r(UnameXCPANUrefurirXhttp://www.cpan.org/rh;]h<]h=]h>]h?]uh$jhD]rhTXCPANrr}r(h#Uh$j ubah7U referencerubh4)r}r(h#X h(Kh$jh7h8h9}r(Urefurijh;]rUid6rah<]h=]h>]h?]rjauhD]ubhTX archive use the rr}r(h#X archive use the h$jubha)r }r!(h#X ``MakeMaker``h9}r"(h=]h>]h<]h;]h?]uh$jhD]r#hTX MakeMakerr$r%}r&(h#Uh$j ubah7hiubhTXt module to provide configuration, build, and test services. The standard build routine for these modules looks like:r'r(}r)(h#Xt module to provide configuration, build, and test services. The standard build routine for these modules looks like:h$jubeubh)r*}r+(h#X4% perl Makefile.PL % make % make test # make installh$jh-h0h7hh9}r,(Ulinenosr-Ulanguager.Xbashhhh;]h<]h=]h>]h?]uhBKhChhD]r/hTX4% perl Makefile.PL % make % make test # make installr0r1}r2(h#Uh$j*ubaubhX)r3}r4(h#X.(except again Buildbot skips the install step)r5h$jh-h0h7h[h9}r6(h=]h>]h<]h;]h?]uhBKhChhD]r7hTX.(except again Buildbot skips the install step)r8r9}r:(h#j5h$j3ubaubhX)r;}r<(h#XMBuildbot provides a :class:`CPAN` factory to compile and test these projects.h$jh-h0h7h[h9}r=(h=]h>]h<]h;]h?]uhBKhChhD]r>(hTXBuildbot provides a r?r@}rA(h#XBuildbot provides a h$j;ubh)rB}rC(h#X :class:`CPAN`rDh$j;h-h0h7hh9}rE(UreftypeXclasshhXCPANU refdomainXpyrFh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKhD]rGha)rH}rI(h#jDh9}rJ(h=]h>]rK(hjFXpy-classrLeh<]h;]h?]uh$jBhD]rMhTXCPANrNrO}rP(h#Uh$jHubah7hiubaubhTX, factory to compile and test these projects.rQrR}rS(h#X, factory to compile and test these projects.h$j;ubeubhX)rT}rU(h#X Arguments:rVh$jh-h0h7h[h9}rW(h=]h>]h<]h;]h?]uhBKhChhD]rXhTX Arguments:rYrZ}r[(h#jVh$jTubaubji)r\}r](h#Uh$jh-h0h7jlh9}r^(h=]h>]h<]h;]h?]uhBNhChhD]r_(jo)r`}ra(h#X[``source`` (required): A step specification tuple, like that used by :class:`GNUAutoconf`. h$j\h-h0h7jrh9}rb(h=]h>]h<]h;]h?]uhBKhD]rc(ju)rd}re(h#X ``source``rfh$j`h-h0h7jyh9}rg(h=]h>]h<]h;]h?]uhBKhD]rhha)ri}rj(h#jfh9}rk(h=]h>]h<]h;]h?]uh$jdhD]rlhTXsourcermrn}ro(h#Uh$jiubah7hiubaubj)rp}rq(h#Uh9}rr(h=]h>]h<]h;]h?]uh$j`hD]rshX)rt}ru(h#XO(required): A step specification tuple, like that used by :class:`GNUAutoconf`.h$jph-h0h7h[h9}rv(h=]h>]h<]h;]h?]uhBKhD]rw(hTX:(required): A step specification tuple, like that used by rxry}rz(h#X:(required): A step specification tuple, like that used by h$jtubh)r{}r|(h#X:class:`GNUAutoconf`r}h$jth-h0h7hh9}r~(UreftypeXclasshhX GNUAutoconfU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBKhD]rha)r}r(h#j}h9}r(h=]h>]r(hjXpy-classreh<]h;]h?]uh$j{hD]rhTX GNUAutoconfrr}r(h#Uh$jubah7hiubaubhTX.r}r(h#X.h$jtubeubah7jubeubjo)r}r(h#Xk``perl`` A string which specifies the :command:`perl` executable to use. Defaults to just :command:`perl`. h$j\h-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBMhChhD]r(ju)r}r(h#X``perl``rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBMhD]rha)r}r(h#jh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXperlrr}r(h#Uh$jubah7hiubaubj)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jhD]rhX)r}r(h#XaA string which specifies the :command:`perl` executable to use. Defaults to just :command:`perl`.h$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBMhD]r(hTXA string which specifies the rr}r(h#XA string which specifies the h$jubcdocutils.nodes strong r)r}r(h#X:command:`perl`h9}r(h=]h>]rUcommandrah<]h;]h?]uh$jhD]rhTXperlrr}r(h#Uh$jubah7UstrongrubhTX% executable to use. Defaults to just rr}r(h#X% executable to use. Defaults to just h$jubj)r}r(h#X:command:`perl`h9}r(h=]h>]rjah<]h;]h?]uh$jhD]rhTXperlrr}r(h#Uh$jubah7jubhTX.r}r(h#X.h$jubeubah7jubeubeubh4)r}r(h#X.. _Distutils:h$jh-h0h7h8h9}r(h=]h>]h<]h;]rU distutilsrah?]rhauhBMhChhD]ubh)r}r(h#Uh$jh-h0h7hh9}r(h;]h<]h=]h>]h?]h]r((hX DistutilsUindex-6rUtr(hXBuild Factory; DistutilsjUtrehuhBMhChhD]ubh4)r}r(h#Uh$jh-h0h7h8h9}r(h;]h<]h=]h>]h?]h@juhBM hChhD]ubeubh%)r}r(h#Uh(Kh$h)h-h0h2}h7hEh9}r(h=]rX distutilsrah>]h<]h;]r(jUid7reh?]uhBM hChhJ}rjjshD]r(hM)r}r(h#X Distutilsrh$jh-h0h7hQh9}r(h=]h>]h<]h;]h?]uhBM hChhD]rhTX Distutilsrr}r(h#jh$jubaubh)r}r(h#Uh$jh-Nh7hh9}r(h;]h<]h=]h>]h?]Uentries]r(hX3buildbot.process.factory.Distutils (built-in class)hUtrauhBNhChhD]ubj/)r}r(h#Uh$jh-Nh7j2h9}r(j4j5Xpyh;]h<]h=]h>]h?]j6Xclassrj8juhBNhChhD]r(j:)r}r(h#X"buildbot.process.factory.Distutilsh$jh-h0h7j=h9}r(h;]rhaj@Nh<]h=]h>]h?]rhajBhjCXbuildbot.process.factoryjDuhBMhChhD]r(jF)r}r(h#Xclass h$jh-h0h7jIh9}r(h=]h>]h<]h;]h?]uhBMhChhD]rhTXclass rr}r(h#Uh$jubaubjO)r}r(h#Xbuildbot.process.factory.h$jh-h0h7jRh9}r(h=]h>]h<]h;]h?]uhBMhChhD]rhTXbuildbot.process.factory.rr}r(h#Uh$jubaubjX)r}r(h#X Distutilsh$jh-h0h7j[h9}r(h=]h>]h<]h;]h?]uhBMhChhD]rhTX Distutilsrr}r(h#Uh$jubaubeubja)r}r(h#Uh$jh-h0h7jdh9}r(h=]h>]h<]h;]h?]uhBMhChhD]ubeubhX)r}r (h#XMost Python modules use the ``distutils`` package to provide configuration and build services. The standard build process looks like:h$jh-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBMhChhD]r (hTXMost Python modules use the r r }r(h#XMost Python modules use the h$jubha)r}r(h#X ``distutils``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTX distutilsrr}r(h#Uh$jubah7hiubhTX\ package to provide configuration and build services. The standard build process looks like:rr}r(h#X\ package to provide configuration and build services. The standard build process looks like:h$jubeubh)r}r(h#X5% python ./setup.py build % python ./setup.py installh$jh-h0h7hh9}r(j-j.Xbashhhh;]h<]h=]h>]h?]uhBMhChhD]rhTX5% python ./setup.py build % python ./setup.py installrr}r(h#Uh$jubaubhX)r }r!(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-h0h7h[h9}r"(h=]h>]h<]h;]h?]uhBMhChhD]r#(hTXMUnfortunately, although Python provides a standard unit-test framework named r$r%}r&(h#XMUnfortunately, although Python provides a standard unit-test framework named h$j ubha)r'}r((h#X ``unittest``h9}r)(h=]h>]h<]h;]h?]uh$j hD]r*hTXunittestr+r,}r-(h#Uh$j'ubah7hiubhTX, to the best of my knowledge r.r/}r0(h#X, to the best of my knowledge h$j ubha)r1}r2(h#X ``distutils``h9}r3(h=]h>]h<]h;]h?]uh$j hD]r4hTX distutilsr5r6}r7(h#Uh$j1ubah7hiubhTX 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.)r8r9}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$j ubeubhX)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-h0h7h[h9}r=(h=]h>]h<]h;]h?]uhBMhChhD]r>(hTXThe r?r@}rA(h#XThe h$j;ubh)rB}rC(h#X:class:`Distutils`rDh$j;h-h0h7hh9}rE(UreftypeXclasshhX DistutilsU refdomainXpyrFh;]h<]U refexplicith=]h>]h?]hhhNhNuhBMhD]rGha)rH}rI(h#jDh9}rJ(h=]h>]rK(hjFXpy-classrLeh<]h;]h?]uh$jBhD]rMhTX DistutilsrNrO}rP(h#Uh$jHubah7hiubaubhTXZ factory provides support for running the build part of this process. It accepts the same rQrR}rS(h#XZ factory provides support for running the build part of this process. It accepts the same h$j;ubha)rT}rU(h#X ``source=``h9}rV(h=]h>]h<]h;]h?]uh$j;hD]rWhTXsource=rXrY}rZ(h#Uh$jTubah7hiubhTX( parameter as the other build factories.r[r\}r](h#X( parameter as the other build factories.h$j;ubeubhX)r^}r_(h#X Arguments:r`h$jh-h0h7h[h9}ra(h=]h>]h<]h;]h?]uhBM!hChhD]rbhTX Arguments:rcrd}re(h#j`h$j^ubaubji)rf}rg(h#Uh$jh-h0h7jlh9}rh(h=]h>]h<]h;]h?]uhBNhChhD]ri(jo)rj}rk(h#X[``source`` (required): A step specification tuple, like that used by :class:`GNUAutoconf`. h$jfh-h0h7jrh9}rl(h=]h>]h<]h;]h?]uhBM$hD]rm(ju)rn}ro(h#X ``source``rph$jjh-h0h7jyh9}rq(h=]h>]h<]h;]h?]uhBM$hD]rrha)rs}rt(h#jph9}ru(h=]h>]h<]h;]h?]uh$jnhD]rvhTXsourcerwrx}ry(h#Uh$jsubah7hiubaubj)rz}r{(h#Uh9}r|(h=]h>]h<]h;]h?]uh$jjhD]r}hX)r~}r(h#XO(required): A step specification tuple, like that used by :class:`GNUAutoconf`.h$jzh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBM$hD]r(hTX:(required): A step specification tuple, like that used by rr}r(h#X:(required): A step specification tuple, like that used by h$j~ubh)r}r(h#X:class:`GNUAutoconf`rh$j~h-h0h7hh9}r(UreftypeXclasshhX GNUAutoconfU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBM$hD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-classreh<]h;]h?]uh$jhD]rhTX GNUAutoconfrr}r(h#Uh$jubah7hiubaubhTX.r}r(h#X.h$j~ubeubah7jubeubjo)r}r(h#Xq``python`` A string which specifies the :command:`python` executable to use. Defaults to just :command:`python`. h$jfh-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBM(hChhD]r(ju)r}r(h#X ``python``rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBM(hD]rha)r}r(h#jh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXpythonrr}r(h#Uh$jubah7hiubaubj)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jhD]rhX)r}r(h#XeA string which specifies the :command:`python` executable to use. Defaults to just :command:`python`.h$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBM'hD]r(hTXA string which specifies the rr}r(h#XA string which specifies the h$jubj)r}r(h#X:command:`python`h9}r(h=]h>]rjah<]h;]h?]uh$jhD]rhTXpythonrr}r(h#Uh$jubah7jubhTX% executable to use. Defaults to just rr}r(h#X% executable to use. Defaults to just h$jubj)r}r(h#X:command:`python`h9}r(h=]h>]rjah<]h;]h?]uh$jhD]rhTXpythonrr}r(h#Uh$jubah7jubhTX.r}r(h#X.h$jubeubah7jubeubjo)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$jfh-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBM.hChhD]r(ju)r}r(h#X``test``rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBM.hD]rha)r}r(h#jh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXtestrr}r(h#Uh$jubah7hiubaubj)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jhD]rhX)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-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBM+hD]r(hTXmProvides 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$jubha)r}r(h#X``None``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXNonerr}r(h#Uh$jubah7hiubhTXq, which disables the test step (since there is no common default command to run unit tests in distutils modules).rr}r(h#Xq, which disables the test step (since there is no common default command to run unit tests in distutils modules).h$jubeubah7jubeubeubh4)r}r(h#X .. _Trial:h$jh-h0h7h8h9}r(h=]h>]h<]h;]rUtrialrah?]rhauhBM0hChhD]ubh)r}r(h#Uh$jh-h0h7hh9}r(h;]h<]h=]h>]h?]h]r((hXTrialUindex-7rUtr(hXBuild Factory; TrialjUtrehuhBM2hChhD]ubh4)r}r(h#Uh$jh-h0h7h8h9}r(h;]h<]h=]h>]h?]h@juhBM5hChhD]ubeubh%)r}r(h#Uh(Kh$h)h-h0h2}h7hEh9}r(h=]rXtrialrah>]h<]h;]r(jUid8reh?]uhBM7hChhJ}rjjshD]r(hM)r}r(h#XTrialrh$jh-h0h7hQh9}r(h=]h>]h<]h;]h?]uhBM7hChhD]rhTXTrialr r }r (h#jh$jubaubh)r }r (h#Uh$jh-Nh7hh9}r(h;]h<]h=]h>]h?]Uentries]r(hX/buildbot.process.factory.Trial (built-in class)hUtrauhBNhChhD]ubj/)r}r(h#Uh$jh-Nh7j2h9}r(j4j5Xpyh;]h<]h=]h>]h?]j6Xclassrj8juhBNhChhD]r(j:)r}r(h#Xbuildbot.process.factory.Trialh$jh-h0h7j=h9}r(h;]rhaj@Nh<]h=]h>]h?]rhajBhjCXbuildbot.process.factoryjDuhBM:hChhD]r(jF)r}r(h#Xclass h$jh-h0h7jIh9}r(h=]h>]h<]h;]h?]uhBM:hChhD]rhTXclass r r!}r"(h#Uh$jubaubjO)r#}r$(h#Xbuildbot.process.factory.h$jh-h0h7jRh9}r%(h=]h>]h<]h;]h?]uhBM:hChhD]r&hTXbuildbot.process.factory.r'r(}r)(h#Uh$j#ubaubjX)r*}r+(h#XTrialh$jh-h0h7j[h9}r,(h=]h>]h<]h;]h?]uhBM:hChhD]r-hTXTrialr.r/}r0(h#Uh$j*ubaubeubja)r1}r2(h#Uh$jh-h0h7jdh9}r3(h=]h>]h<]h;]h?]uhBM:hChhD]ubeubhX)r4}r5(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$jh-h0h7h[h9}r6(h=]h>]h<]h;]h?]uhBM;hChhD]r7(hTX(Twisted provides a unit test tool named r8r9}r:(h#X(Twisted provides a unit test tool named h$j4ubj)r;}r<(h#X:command:`trial`h9}r=(h=]h>]r>jah<]h;]h?]uh$j4hD]r?hTXtrialr@rA}rB(h#Uh$j;ubah7jubhTX: which provides a few improvements over Python's built-in rCrD}rE(h#X: which provides a few improvements over Python's built-in h$j4ubh)rF}rG(h#X:mod:`unittest`rHh$j4h-h0h7hh9}rI(UreftypeXmodhhXunittestU refdomainXpyrJh;]h<]U refexplicith=]h>]h?]hhhNhNuhBM;hD]rKha)rL}rM(h#jHh9}rN(h=]h>]rO(hjJXpy-modrPeh<]h;]h?]uh$jFhD]rQhTXunittestrRrS}rT(h#Uh$jLubah7hiubaubhTX 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:rUrV}rW(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$j4ubeubh)rX}rY(h#Xu% python ./setup.py build % PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test % python ./setup.py installh$jh-h0h7hh9}rZ(j-j.Xbashhhh;]h<]h=]h>]h?]uhBMAhChhD]r[hTXu% python ./setup.py build % PYTHONPATH=build/lib.linux-i686-2.3 trial -v PROJECTNAME.test % python ./setup.py installr\r]}r^(h#Uh$jXubaubhX)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$jh-h0h7h[h9}ra(h=]h>]h<]h;]h?]uhBMGhChhD]rb(hTXUnfortunately, the rcrd}re(h#XUnfortunately, the h$j_ubha)rf}rg(h#Uh9}rh(h;]h<]h=]h>]riXfilerjaUrolejjh?]uh$j_hD]rkhTX build/librlrm}rn(h#X build/libh$jfubah7hiubhTX' directory into which the built/copied rorp}rq(h#X' directory into which the built/copied h$j_ubha)rr}rs(h#X``.py``h9}rt(h=]h>]h<]h;]h?]uh$j_hD]ruhTX.pyrvrw}rx(h#Uh$jrubah7hiubhTX 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 ryrz}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$j_ubjq)r|}r}(h#X `in place`h9}r~(h=]h>]h<]h;]h?]uh$j_hD]rhTXin placerr}r(h#Uh$j|ubah7jyubhTX! from the tree's base directory (rr}r(h#X! from the tree's base directory (h$j_ubha)r}r(h#X``PYTHONPATH=.``h9}r(h=]h>]h<]h;]h?]uh$j_hD]rhTX PYTHONPATH=.rr}r(h#Uh$jubah7hiubhTX).rr}r(h#X).h$j_ubeubhX)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$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBMMhChhD]r(hTXIn addition, the rr}r(h#XIn addition, the h$jubha)r}r(h#Uh9}r(h;]h<]h=]h>]rXsampraUrolejh?]uh$jhD]rh)r}r(h#X PROJECTNAMEh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTX PROJECTNAMErr}r(h#Uh$jubah7hubah7hiubhTX 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-h0h7hh9}r(UreftypeXmodhhXtestU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBMMhD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-modreh<]h;]h?]uh$jhD]rhTXtestrr}r(h#Uh$jubah7hiubaubhTX/ 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-h0h7hh9}r(UreftypeXclasshhXTrialU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBMMhD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-classreh<]h;]h?]uh$jhD]rhTXTrialrr}r(h#Uh$jubah7hiubaubhTX1 class must be told where to find the test files.rr}r(h#X1 class must be told where to find the test files.h$jubeubhX)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$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBMThChhD]r(hTXThe rr}r(h#XThe h$jubh)r}r(h#X:class:`Trial`rh$jh-h0h7hh9}r(UreftypeXclasshhXTrialU refdomainXpyrh;]h<]U refexplicith=]h>]h?]hhhNhNuhBMThD]rha)r}r(h#jh9}r(h=]h>]r(hjXpy-classreh<]h;]h?]uh$jhD]rhTXTrialrr}r(h#Uh$jubah7hiubaubhTX 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.rr}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$jubeubhX)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.rh$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBMYhChhD]rhTX0One 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.rr}r(h#jh$jubaubhX)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$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBM_hChhD]r(hTXDAnother feature of trial is that you can give it a series of source rr}r(h#XDAnother feature of trial is that you can give it a series of source h$jubha)r}r(h#X``.py``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTX.pyrr}r(h#Uh$jubah7hiubhTX, files, and it will search them for special rr}r(h#X, files, and it will search them for special h$jubha)r}r(h#X``test-case-name``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXtest-case-namerr}r(h#Uh$jubah7hiubhTX 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.rr}r(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$jubeubhX)r}r(h#X Arguments:r h$jh-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBMfhChhD]r hTX Arguments:r r }r(h#j h$jubaubji)r}r(h#Uh$jh-h0h7jlh9}r(h=]h>]h<]h;]h?]uhBNhChhD]r(jo)r}r(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$jh-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBMmhD]r(ju)r}r(h#X ``testpath``rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBMmhD]rha)r}r(h#jh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXtestpathr r!}r"(h#Uh$jubah7hiubaubj)r#}r$(h#Uh9}r%(h=]h>]h<]h;]h?]uh$jhD]r&hX)r'}r((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$j#h-h0h7h[h9}r)(h=]h>]h<]h;]h?]uhBMihD]r*(hTXProvides a directory to add to r+r,}r-(h#XProvides a directory to add to h$j'ubh)r.}r/(h#Uh9}r0(h;]h<]h=]h>]h?]h]r1((hX PYTHONPATHr2Uindex-8r3Utr4(hX environment variable; PYTHONPATHj3Utr5euh$j'hD]h7hubh4)r6}r7(h#Uh9}r8(h=]h>]h<]h;]r9j3ah?]uh$j'hD]h7h8ubh)r:}r;(h#X:envvar:`PYTHONPATH`r<h$j'h-h0h7hh9}r=(UreftypeXenvvarhhj2U refdomainXstdr>h;]h<]U refexplicith=]h>]h?]hhuhBMihD]r?ha)r@}rA(h#j<h9}rB(h=]h>]rC(hj>X std-envvarrDeh<]h;]h?]uh$j:hD]rEhTX PYTHONPATHrFrG}rH(h#Uh$j@ubah7hiubaubhTXB when running the unit tests, if tests are being run. Defaults to rIrJ}rK(h#XB when running the unit tests, if tests are being run. Defaults to h$j'ubha)rL}rM(h#X``.``h9}rN(h=]h>]h<]h;]h?]uh$j'hD]rOhTX.rP}rQ(h#Uh$jLubah7hiubhTX| to include the project files in-place. The generated build library is frequently architecture-dependent, but may simply be rRrS}rT(h#X| to include the project files in-place. The generated build library is frequently architecture-dependent, but may simply be h$j'ubha)rU}rV(h#Uh9}rW(h;]h<]h=]h>]rXXfilerYaUrolejYh?]uh$j'hD]rZhTX build/libr[r\}r](h#X build/libh$jUubah7hiubhTX for pure-python modules.r^r_}r`(h#X for pure-python modules.h$j'ubeubah7jubeubjo)ra}rb(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$jh-h0h7jrh9}rc(h=]h>]h<]h;]h?]uhBMwhChhD]rd(ju)re}rf(h#X ``python``rgh$jah-h0h7jyh9}rh(h=]h>]h<]h;]h?]uhBMwhD]riha)rj}rk(h#jgh9}rl(h=]h>]h<]h;]h?]uh$jehD]rmhTXpythonrnro}rp(h#Uh$jjubah7hiubaubj)rq}rr(h#Uh9}rs(h=]h>]h<]h;]h?]uh$jahD]rthX)ru}rv(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$jqh-h0h7h[h9}rw(h=]h>]h<]h;]h?]uhBMphD]rx(hTXEwhich Python executable to use. This list will form the start of the ryrz}r{(h#XEwhich Python executable to use. This list will form the start of the h$juubjq)r|}r}(h#X`argv`h9}r~(h=]h>]h<]h;]h?]uh$juhD]rhTXargvrr}r(h#Uh$j|ubah7jyubhTX? 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$juubha)r}r(h#X ``trial``h9}r(h=]h>]h<]h;]h?]uh$juhD]rhTXtrialrr}r(h#Uh$jubah7hiubhTX to an explicit path (like rr}r(h#X to an explicit path (like h$juubha)r}r(h#Uh9}r(h;]h<]h=]h>]rXfileraUrolejh?]uh$juhD]rhTX/usr/bin/trialrr}r(h#X/usr/bin/trialh$jubah7hiubhTX or rr}r(h#X or h$juubha)r}r(h#Uh9}r(h;]h<]h=]h>]rXfileraUrolejh?]uh$juhD]rhTX ./bin/trialrr}r(h#X ./bin/trialh$jubah7hiubhTX). The parameter defaults to rr}r(h#X). The parameter defaults to h$juubha)r}r(h#X``None``h9}r(h=]h>]h<]h;]h?]uh$juhD]rhTXNonerr}r(h#Uh$jubah7hiubhTX(, which leaves it out entirely (running rr}r(h#X(, which leaves it out entirely (running h$juubha)r}r(h#X``trial args``h9}r(h=]h>]h<]h;]h?]uh$juhD]rhTX trial argsrr}r(h#Uh$jubah7hiubhTX instead of rr}r(h#X instead of h$juubha)r}r(h#X``python ./bin/trial args``h9}r(h=]h>]h<]h;]h?]uh$juhD]rhTXpython ./bin/trial argsrr}r(h#Uh$jubah7hiubhTX). Likely values are rr}r(h#X). Likely values are h$juubha)r}r(h#X``['python']``h9}r(h=]h>]h<]h;]h?]uh$juhD]rhTX ['python']rr}r(h#Uh$jubah7hiubhTX, rr}r(h#X, h$juubha)r}r(h#X``['python2.2']``h9}r(h=]h>]h<]h;]h?]uh$juhD]rhTX ['python2.2']rr}r(h#Uh$jubah7hiubhTX, or rr}r(h#X, or h$juubha)r}r(h#X``['python', '-Wall']``h9}r(h=]h>]h<]h;]h?]uh$juhD]rhTX['python', '-Wall']rr}r(h#Uh$jubah7hiubhTX.r}r(h#X.h$juubeubah7jubeubjo)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$jh-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBM}hChhD]r(ju)r}r(h#X ``trial``rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBM}hD]rha)r}r(h#jh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXtrialrr}r(h#Uh$jubah7hiubaubj)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jhD]rhX)r}r(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$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBMzhD]r(hTXprovides the name of the rr}r(h#Xprovides the name of the h$jubj)r}r(h#X:command:`trial`h9}r(h=]h>]rjah<]h;]h?]uh$jhD]rhTXtrialrr}r(h#Uh$jubah7jubhTXL command. It is occasionally useful to use an alternate executable, such as rr}r(h#XL command. It is occasionally useful to use an alternate executable, such as h$jubj)r }r (h#X:command:`trial2.2`h9}r (h=]h>]r jah<]h;]h?]uh$jhD]r hTXtrial2.2rr}r(h#Uh$j ubah7jubhTXI which might run the tests under an older version of Python. Defaults to rr}r(h#XI which might run the tests under an older version of Python. Defaults to h$jubj)r}r(h#X:command:`trial`h9}r(h=]h>]rjah<]h;]h?]uh$jhD]rhTXtrialrr}r(h#Uh$jubah7jubhTX.r}r(h#X.h$jubeubah7jubeubjo)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$jh-h0h7jrh9}r (h=]h>]h<]h;]h?]uhBMhChhD]r!(ju)r"}r#(h#X ``trialMode``r$h$jh-h0h7jyh9}r%(h=]h>]h<]h;]h?]uhBMhD]r&ha)r'}r((h#j$h9}r)(h=]h>]h<]h;]h?]uh$j"hD]r*hTX trialModer+r,}r-(h#Uh$j'ubah7hiubaubj)r.}r/(h#Uh9}r0(h=]h>]h<]h;]h?]uh$jhD]r1hX)r2}r3(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$j.h-h0h7h[h9}r4(h=]h>]h<]h;]h?]uhBMhD]r5(hTX_a list of arguments to pass to trial, specifically to set the reporting mode. This defaults to r6r7}r8(h#X_a list of arguments to pass to trial, specifically to set the reporting mode. This defaults to h$j2ubha)r9}r:(h#X``['--reporter=bwverbose']``h9}r;(h=]h>]h<]h;]h?]uh$j2hD]r<hTX['--reporter=bwverbose']r=r>}r?(h#Uh$j9ubah7hiubhTX/, which only works for Twisted-2.1.0 and later.r@rA}rB(h#X/, which only works for Twisted-2.1.0 and later.h$j2ubeubah7jubeubjo)rC}rD(h#Xw``trialArgs`` a list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to ``[]``. h$jh-h0h7jrh9}rE(h=]h>]h<]h;]h?]uhBMhChhD]rF(ju)rG}rH(h#X ``trialArgs``rIh$jCh-h0h7jyh9}rJ(h=]h>]h<]h;]h?]uhBMhD]rKha)rL}rM(h#jIh9}rN(h=]h>]h<]h;]h?]uh$jGhD]rOhTX trialArgsrPrQ}rR(h#Uh$jLubah7hiubaubj)rS}rT(h#Uh9}rU(h=]h>]h<]h;]h?]uh$jChD]rVhX)rW}rX(h#Xha list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to ``[]``.h$jSh-h0h7h[h9}rY(h=]h>]h<]h;]h?]uhBMhD]rZ(hTXaa list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to r[r\}r](h#Xaa list of arguments to pass to trial, available to turn on any extra flags you like. Defaults to h$jWubha)r^}r_(h#X``[]``h9}r`(h=]h>]h<]h;]h?]uh$jWhD]rahTX[]rbrc}rd(h#Uh$j^ubah7hiubhTX.re}rf(h#X.h$jWubeubah7jubeubjo)rg}rh(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$jh-h0h7jrh9}ri(h=]h>]h<]h;]h?]uhBMhChhD]rj(ju)rk}rl(h#X ``tests``rmh$jgh-h0h7jyh9}rn(h=]h>]h<]h;]h?]uhBMhD]roha)rp}rq(h#jmh9}rr(h=]h>]h<]h;]h?]uh$jkhD]rshTXtestsrtru}rv(h#Uh$jpubah7hiubaubj)rw}rx(h#Uh9}ry(h=]h>]h<]h;]h?]uh$jghD]rzhX)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$jwh-h0h7h[h9}r}(h=]h>]h<]h;]h?]uhBMhD]r~(hTXkProvides 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$j{ubha)r}r(h#Uh9}r(h;]h<]h=]h>]rXsampraUrolejh?]uh$j{hD]r(h)r}r(h#X PROJECTNAMEh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTX PROJECTNAMErr}r(h#Uh$jubah7hubhTX.testrr}r(h#X.testh$jubeh7hiubhTX$, or a list of strings. Defaults to rr}r(h#X$, or a list of strings. Defaults to h$j{ubha)r}r(h#X``None``h9}r(h=]h>]h<]h;]h?]uh$j{hD]rhTXNonerr}r(h#Uh$jubah7hiubhTXF, 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$j{ubha)r}r(h#X``testChanges``h9}r(h=]h>]h<]h;]h?]uh$j{hD]rhTX testChangesrr}r(h#Uh$jubah7hiubhTX.r}r(h#X.h$j{ubeubah7jubeubjo)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$jh-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBMhChhD]r(ju)r}r(h#X``testChanges``rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBMhD]rha)r}r(h#jh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTX testChangesrr}r(h#Uh$jubah7hiubaubj)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jhD]rhX)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-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBMhD]r(hTXif rr}r(h#Xif h$jubha)r}r(h#X``True``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXTruerr}r(h#Uh$jubah7hiubhTX , ignore the rr}r(h#X , ignore the h$jubha)r}r(h#X ``tests``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXtestsrr}r(h#Uh$jubah7hiubhTX 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.rr}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$jubeubah7jubeubjo)r}r(h#X``recurse`` If ``True``, tells Trial (with the ``--recurse`` argument) to look in all subdirectories for additional test cases. h$jh-h0h7jrh9}r(h=]h>]h<]h;]h?]uhBMhChhD]r(ju)r}r(h#X ``recurse``rh$jh-h0h7jyh9}r(h=]h>]h<]h;]h?]uhBMhD]rha)r}r(h#jh9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXrecurserr}r(h#Uh$jubah7hiubaubj)r}r(h#Uh9}r(h=]h>]h<]h;]h?]uh$jhD]rhX)r}r(h#XsIf ``True``, tells Trial (with the ``--recurse`` argument) to look in all subdirectories for additional test cases.h$jh-h0h7h[h9}r(h=]h>]h<]h;]h?]uhBMhD]r(hTXIf rr}r(h#XIf h$jubha)r}r(h#X``True``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTXTruerr}r(h#Uh$jubah7hiubhTX, tells Trial (with the rr}r(h#X, tells Trial (with the h$jubha)r}r(h#X ``--recurse``h9}r(h=]h>]h<]h;]h?]uh$jhD]rhTX --recurser r }r (h#Uh$jubah7hiubhTXC argument) to look in all subdirectories for additional test cases.r r }r (h#XC argument) to look in all subdirectories for additional test cases.h$jubeubah7jubeubjo)r }r (h#X``reactor`` which reactor to use, like 'gtk' or 'java'. If not provided, the Twisted's usual platform-dependent default is used. h$jh-h0h7jrh9}r (h=]h>]h<]h;]h?]uhBMhChhD]r (ju)r }r (h#X ``reactor``r h$j h-h0h7jyh9}r (h=]h>]h<]h;]h?]uhBMhD]r ha)r }r (h#j h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXreactorr r }r (h#Uh$j ubah7hiubaubj)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hX)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$j h-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBMhD]r hTXtwhich reactor to use, like 'gtk' or 'java'. If not provided, the Twisted's usual platform-dependent default is used.r r }r! (h#j h$j ubaubah7jubeubjo)r" }r# (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$jh-h0h7jrh9}r$ (h=]h>]h<]h;]h?]uhBMhChhD]r% (ju)r& }r' (h#X ``randomly``r( h$j" h-h0h7jyh9}r) (h=]h>]h<]h;]h?]uhBMhD]r* ha)r+ }r, (h#j( h9}r- (h=]h>]h<]h;]h?]uh$j& hD]r. hTXrandomlyr/ r0 }r1 (h#Uh$j+ ubah7hiubaubj)r2 }r3 (h#Uh9}r4 (h=]h>]h<]h;]h?]uh$j" hD]r5 hX)r6 }r7 (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$j2 h-h0h7h[h9}r8 (h=]h>]h<]h;]h?]uhBMhD]r9 (hTXIf r: r; }r< (h#XIf h$j6 ubha)r= }r> (h#X``True``h9}r? (h=]h>]h<]h;]h?]uh$j6 hD]r@ hTXTruerA rB }rC (h#Uh$j= ubah7hiubhTX, tells Trial (with the rD rE }rF (h#X, tells Trial (with the h$j6 ubha)rG }rH (h#X``--random=0``h9}rI (h=]h>]h<]h;]h?]uh$j6 hD]rJ hTX --random=0rK rL }rM (h#Uh$jG ubah7hiubhTXy argument) to run the test cases in random order, which sometimes catches subtle inter-test dependency bugs. Defaults to rN rO }rP (h#Xy argument) to run the test cases in random order, which sometimes catches subtle inter-test dependency bugs. Defaults to h$j6 ubha)rQ }rR (h#X ``False``h9}rS (h=]h>]h<]h;]h?]uh$j6 hD]rT hTXFalserU rV }rW (h#Uh$jQ ubah7hiubhTX.rX }rY (h#X.h$j6 ubeubah7jubeubeubhX)rZ }r[ (h#X_The step can also take any of the :class:`ShellCommand` arguments, e.g., :attr:`haltOnFailure`.h$jh-h0h7h[h9}r\ (h=]h>]h<]h;]h?]uhBMhChhD]r] (hTX"The step can also take any of the r^ r_ }r` (h#X"The step can also take any of the h$jZ ubh)ra }rb (h#X:class:`ShellCommand`rc h$jZ h-h0h7hh9}rd (UreftypeXclasshhX ShellCommandU refdomainXpyre h;]h<]U refexplicith=]h>]h?]hhhNhNuhBMhD]rf ha)rg }rh (h#jc h9}ri (h=]h>]rj (hje Xpy-classrk eh<]h;]h?]uh$ja hD]rl hTX ShellCommandrm rn }ro (h#Uh$jg ubah7hiubaubhTX arguments, e.g., rp rq }rr (h#X arguments, e.g., h$jZ ubh)rs }rt (h#X:attr:`haltOnFailure`ru h$jZ h-h0h7hh9}rv (UreftypeXattrhhX haltOnFailureU refdomainXpyrw h;]h<]U refexplicith=]h>]h?]hhhNhNuhBMhD]rx ha)ry }rz (h#ju h9}r{ (h=]h>]r| (hjw Xpy-attrr} eh<]h;]h?]uh$js hD]r~ hTX haltOnFailurer r }r (h#Uh$jy ubah7hiubaubhTX.r }r (h#X.h$jZ ubeubhX)r }r (h#XXUnless one of ``tests`` or ``testChanges`` are set, the step will generate an exception.h$jh-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBMhChhD]r (hTXUnless one of r r }r (h#XUnless one of h$j ubha)r }r (h#X ``tests``h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXtestsr r }r (h#Uh$j ubah7hiubhTX or r r }r (h#X or h$j ubha)r }r (h#X``testChanges``h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX testChangesr r }r (h#Uh$j ubah7hiubhTX. are set, the step will generate an exception.r r }r (h#X. are set, the step will generate an exception.h$j ubeubeubeubh-h0h2}h7hEh9}r (h=]r X gnuautoconfr ah>]h<]h;]r (jUid2r eh?]uhBKdhChhJ}r jjshD]r (hM)r }r (h#X GNUAutoconfr h$h&h-h0h7hQh9}r (h=]h>]h<]h;]h?]uhBKdhChhD]r hTX GNUAutoconfr r }r (h#j h$j ubaubh)r }r (h#Uh$h&h-Nh7hh9}r (h;]h<]h=]h>]h?]Uentries]r (hX5buildbot.process.factory.GNUAutoconf (built-in class)hUtr auhBNhChhD]ubj/)r }r (h#Uh$h&h-Nh7j2h9}r (j4j5Xpyh;]h<]h=]h>]h?]j6Xclassr j8j uhBNhChhD]r (j:)r }r (h#X$buildbot.process.factory.GNUAutoconfh$j h-h0h7j=h9}r (h;]r haj@Nh<]h=]h>]h?]r hajBhjCXbuildbot.process.factoryjDuhBKghChhD]r (jF)r }r (h#Xclass h$j h-h0h7jIh9}r (h=]h>]h<]h;]h?]uhBKghChhD]r hTXclass r r }r (h#Uh$j ubaubjO)r }r (h#Xbuildbot.process.factory.h$j h-h0h7jRh9}r (h=]h>]h<]h;]h?]uhBKghChhD]r hTXbuildbot.process.factory.r r }r (h#Uh$j ubaubjX)r }r (h#X GNUAutoconfh$j h-h0h7j[h9}r (h=]h>]h<]h;]h?]uhBKghChhD]r hTX GNUAutoconfr r }r (h#Uh$j ubaubeubja)r }r (h#Uh$j h-h0h7jdh9}r (h=]h>]h<]h;]h?]uhBKghChhD]ubeubhX)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-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKhhChhD]r (j )r }r (h#X7`GNU Autoconf `_h9}r (UnameX GNU AutoconfjX%http://www.gnu.org/software/autoconf/r h;]h<]h=]h>]h?]uh$j hD]r hTX GNU Autoconfr r }r (h#Uh$j ubah7jubh4)r }r (h#X( h(Kh$j h7h8h9}r (Urefurij h;]r U gnu-autoconfr ah<]h=]h>]h?]r hauhD]ubhTXI 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 ubeubh)r }r (h#XP% CONFIG_ENV=foo ./configure --with-flags % make all % make check # make installh$h&h-h0h7hh9}r (j-j.Xbashhhh;]h<]h=]h>]h?]uhBKohChhD]r hTXP% CONFIG_ENV=foo ./configure --with-flags % make all % make check # make installr r }r (h#Uh$j ubaubhX)r }r (h#XG(except of course the Buildbot always skips the ``make install`` part).h$h&h-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKvhChhD]r (hTX0(except of course the Buildbot always skips the r r }r (h#X0(except of course the Buildbot always skips the h$j ubha)r }r (h#X``make install``h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX make installr r }r (h#Uh$j ubah7hiubhTX part).r r }r (h#X part).h$j ubeubhX)r }r (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-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKyhChhD]r (hTXThe Buildbot's r r }r (h#XThe Buildbot's h$j ubh)r }r (h#X-:class:`buildbot.process.factory.GNUAutoconf`r h$j h-h0h7hh9}r (UreftypeXclasshhX$buildbot.process.factory.GNUAutoconfU refdomainXpyr h;]h<]U refexplicith=]h>]h?]hhhNhNuhBKyhD]r ha)r }r (h#j h9}r (h=]h>]r (hj Xpy-classr eh<]h;]h?]uh$j hD]r hTX$buildbot.process.factory.GNUAutoconfr r }r (h#Uh$j ubah7hiubaubhTX 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.r 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$j ubeubhX)r }r (h#X Example::r h$h&h-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKhChhD]r hTXExample:r! r" }r# (h#XExample:h$j ubaubh)r$ }r% (h#Xtf = factory.GNUAutoconf(source=source.SVN(svnurl=URL, mode="copy"), flags=["--disable-nls"])h$h&h-h0h7hh9}r& (hhh;]h<]h=]h>]h?]uhBKhChhD]r' hTXtf = factory.GNUAutoconf(source=source.SVN(svnurl=URL, mode="copy"), flags=["--disable-nls"])r( r) }r* (h#Uh$j$ ubaubhX)r+ }r, (h#XRequired Arguments:r- h$h&h-h0h7h[h9}r. (h=]h>]h<]h;]h?]uhBKhChhD]r/ hTXRequired Arguments:r0 r1 }r2 (h#j- h$j+ ubaubji)r3 }r4 (h#Uh$h&h-h0h7jlh9}r5 (h=]h>]h<]h;]h?]uhBNhChhD]r6 jo)r7 }r8 (h#Xs``source`` This argument must be a step specification tuple that provides a BuildStep to generate the source tree. h$j3 h-h0h7jrh9}r9 (h=]h>]h<]h;]h?]uhBKhD]r: (ju)r; }r< (h#X ``source``r= h$j7 h-h0h7jyh9}r> (h=]h>]h<]h;]h?]uhBKhD]r? ha)r@ }rA (h#j= h9}rB (h=]h>]h<]h;]h?]uh$j; hD]rC hTXsourcerD rE }rF (h#Uh$j@ ubah7hiubaubj)rG }rH (h#Uh9}rI (h=]h>]h<]h;]h?]uh$j7 hD]rJ hX)rK }rL (h#XgThis argument must be a step specification tuple that provides a BuildStep to generate the source tree.rM h$jG h-h0h7h[h9}rN (h=]h>]h<]h;]h?]uhBKhD]rO hTXgThis argument must be a step specification tuple that provides a BuildStep to generate the source tree.rP rQ }rR (h#jM h$jK ubaubah7jubeubaubhX)rS }rT (h#XOptional Arguments:rU h$h&h-h0h7h[h9}rV (h=]h>]h<]h;]h?]uhBKhChhD]rW hTXOptional Arguments:rX rY }rZ (h#jU h$jS ubaubji)r[ }r\ (h#Uh$h&h-h0h7jlh9}r] (h=]h>]h<]h;]h?]uhBNhChhD]r^ (jo)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-h0h7jrh9}ra (h=]h>]h<]h;]h?]uhBKhD]rb (ju)rc }rd (h#X ``configure``re h$j_ h-h0h7jyh9}rf (h=]h>]h<]h;]h?]uhBKhD]rg ha)rh }ri (h#je h9}rj (h=]h>]h<]h;]h?]uh$jc hD]rk hTX configurerl rm }rn (h#Uh$jh ubah7hiubaubj)ro }rp (h#Uh9}rq (h=]h>]h<]h;]h?]uh$j_ hD]rr hX)rs }rt (h#XThe command used to configure the tree. Defaults to :command:`./configure`. Accepts either a string or a list of shell argv elements.h$jo h-h0h7h[h9}ru (h=]h>]h<]h;]h?]uhBKhD]rv (hTX4The command used to configure the tree. Defaults to rw rx }ry (h#X4The command used to configure the tree. Defaults to h$js ubj)rz }r{ (h#X:command:`./configure`h9}r| (h=]h>]r} jah<]h;]h?]uh$js hD]r~ hTX ./configurer r }r (h#Uh$jz ubah7jubhTX;. 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$js ubeubah7jubeubjo)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-h0h7jrh9}r (h=]h>]h<]h;]h?]uhBKhChhD]r (ju)r }r (h#X``configureEnv``r h$j h-h0h7jyh9}r (h=]h>]h<]h;]h?]uhBKhD]r ha)r }r (h#j h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX configureEnvr r }r (h#Uh$j ubah7hiubaubj)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hX)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-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKhD]r (hTXThe 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 ubha)r }r (h#X``CFLAGS="-O2 -g"``h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXCFLAGS="-O2 -g"r r }r (h#Uh$j ubah7hiubhTXQ (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 ubeubah7jubeubjo)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-h0h7jrh9}r (h=]h>]h<]h;]h?]uhBKhChhD]r (ju)r }r (h#X``configureFlags``r h$j h-h0h7jyh9}r (h=]h>]h<]h;]h?]uhBKhD]r ha)r }r (h#j h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXconfigureFlagsr r }r (h#Uh$j ubah7hiubaubj)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hX)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-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKhD]r (hTXA 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 ubha)r }r (h#X``["--without-x"]``h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX["--without-x"]r r }r (h#Uh$j ubah7hiubhTX9 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 ubeubah7jubeubjo)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-h0h7jrh9}r (h=]h>]h<]h;]h?]uhBKhChhD]r (ju)r }r (h#X ``compile``r h$j h-h0h7jyh9}r (h=]h>]h<]h;]h?]uhBKhD]r ha)r }r (h#j h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXcompiler r }r (h#Uh$j ubah7hiubaubj)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hX)r }r (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-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKhD]r (hTXjthis is a shell command or list of argv values which is used to actually compile the tree. It defaults to r r }r (h#Xjthis is a shell command or list of argv values which is used to actually compile the tree. It defaults to h$j ubha)r }r (h#X ``make all``h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXmake allr r }r (h#Uh$j ubah7hiubhTX . If set to r r }r (h#X . If set to h$j ubha)r }r (h#X``None``h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXNoner r }r (h#Uh$j ubah7hiubhTX, the compile step is skipped.r r }r (h#X, the compile step is skipped.h$j ubeubah7jubeubjo)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 @code{make check}. If set to None, the test step is skipped. h$j[ h-h0h7jrh9}r (h=]h>]h<]h;]h?]uhBKhChhD]r (ju)r }r (h#X``test``r h$j h-h0h7jyh9}r (h=]h>]h<]h;]h?]uhBKhD]r ha)r }r (h#j h9}r (h=]h>]h<]h;]h?]uh$j hD]r hTXtestr r }r (h#Uh$j ubah7hiubaubj)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hX)r }r (h#Xthis is a shell command or list of argv values which is used to run the tree's self-tests. It defaults to @code{make check}. If set to None, the test step is skipped.r h$j h-h0h7h[h9}r (h=]h>]h<]h;]h?]uhBKhD]r hTXthis is a shell command or list of argv values which is used to run the tree's self-tests. It defaults to @code{make check}. If set to None, the test step is skipped.r r }r (h#j h$j ubaubah7jubeubeubh4)r }r (h#X.. _BasicBuildFactory:h$h&h-h0h7h8h9}r (h=]h>]h<]h;]r Ubasicbuildfactoryr ah?]r hauhBKhChhD]ubh)r }r! (h#Uh$h&h-h0h7hh9}r" (h;]h<]h=]h>]h?]h]r# ((hXBasicBuildFactoryjUtr$ (hX Build Factory; BasicBuildFactoryjUtr% ehuhBKhChhD]ubjeubh-h0h7Usystem_messager& h9}r' (h=]UlevelKh;]h<]r( j aUsourceh0h>]h?]UlineKdUtypeUINFOr) uhBKdhChhD]r* hX)r+ }r, (h#Uh9}r- (h=]h>]h<]h;]h?]uh$h!hD]r. hTX.Duplicate implicit target name: "gnuautoconf".r/ r0 }r1 (h#Uh$j+ ubah7h[ubaubh )r2 }r3 (h#Uh$jh-h0h7j& h9}r4 (h=]UlevelKh;]h<]r5 jaUsourceh0h>]h?]UlineKUtypej) uhBKhChhD]r6 hX)r7 }r8 (h#Uh9}r9 (h=]h>]h<]h;]h?]uh$j2 hD]r: hTX4Duplicate implicit target name: "basicbuildfactory".r; r< }r= (h#Uh$j7 ubah7h[ubaubh )r> }r? (h#Uh$jh-h0h7j& h9}r@ (h=]UlevelKh;]h<]rA jaUsourceh0h>]h?]UlineKUtypej) uhBKhChhD]rB hX)rC }rD (h#Uh9}rE (h=]h>]h<]h;]h?]uh$j> hD]rF hTX+Duplicate implicit target name: "basicsvn".rG rH }rI (h#Uh$jC ubah7h[ubaubh )rJ }rK (h#Uh$jh-h0h7j& h9}rL (h=]UlevelKh;]h<]rM jaUsourceh0h>]h?]UlineKUtypej) uhBKhChhD]rN hX)rO }rP (h#Uh9}rQ (h=]h>]h<]h;]h?]uh$jJ hD]rR hTX4Duplicate implicit target name: "quickbuildfactory".rS rT }rU (h#Uh$jO ubah7h[ubaubh )rV }rW (h#Uh$jh-h0h7j& h9}rX (h=]UlevelKh;]h<]rY jaUsourceh0h>]h?]UlineKUtypej) uhBKhChhD]rZ hX)r[ }r\ (h#Uh9}r] (h=]h>]h<]h;]h?]uh$jV hD]r^ hTX'Duplicate implicit target name: "cpan".r_ r` }ra (h#Uh$j[ ubah7h[ubaubh )rb }rc (h#Uh$jh-h0h7j& h9}rd (h=]UlevelKh;]h<]re jaUsourceh0h>]h?]UlineM Utypej) uhBM hChhD]rf hX)rg }rh (h#Uh9}ri (h=]h>]h<]h;]h?]uh$jb hD]rj hTX,Duplicate implicit target name: "distutils".rk rl }rm (h#Uh$jg ubah7h[ubaubh )rn }ro (h#Uh$jh-h0h7j& h9}rp (h=]UlevelKh;]h<]rq jaUsourceh0h>]h?]UlineM7Utypej) uhBM7hChhD]rr hX)rs }rt (h#Uh9}ru (h=]h>]h<]h;]h?]uh$jn hD]rv hTX(Duplicate implicit target name: "trial".rw rx }ry (h#Uh$js ubah7h[ubaubeUcurrent_sourcerz NU decorationr{ NUautofootnote_startr| KUnameidsr} }r~ (hj hjhhh jh h h hh hAh j hj hhHhjhhhhhhhhhhhjhjhjhjhjOhhuhD]r (h5h+eh#UU transformerr NU footnote_refsr }r Urefnamesr }r Usymbol_footnotesr ]r Uautofootnote_refsr ]r Usymbol_footnote_refsr ]r U citationsr ]r hChU current_liner NUtransform_messagesr ]r (h )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX5Hyperlink target "build-factories" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX2Hyperlink target "buildfactory" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX-Hyperlink target "index-0" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineK]Utypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX1Hyperlink target "gnuautoconf" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKbUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX-Hyperlink target "index-1" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX7Hyperlink target "basicbuildfactory" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX-Hyperlink target "index-2" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX.Hyperlink target "basicsvn" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX-Hyperlink target "index-3" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX7Hyperlink target "quickbuildfactory" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX-Hyperlink target "index-4" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX2Hyperlink target "factory-cpan" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineKUtypej) uhD]r hX)r }r (h#Uh9}r (h=]h>]h<]h;]h?]uh$j hD]r hTX-Hyperlink target "index-5" is not referenced.r r }r (h#Uh$j ubah7h[ubah7j& ubh )r }r (h#Uh9}r! (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineMUtypej) uhD]r" hX)r# }r$ (h#Uh9}r% (h=]h>]h<]h;]h?]uh$j hD]r& hTX/Hyperlink target "distutils" is not referenced.r' r( }r) (h#Uh$j# ubah7h[ubah7j& ubh )r* }r+ (h#Uh9}r, (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineM Utypej) uhD]r- hX)r. }r/ (h#Uh9}r0 (h=]h>]h<]h;]h?]uh$j* hD]r1 hTX-Hyperlink target "index-6" is not referenced.r2 r3 }r4 (h#Uh$j. ubah7h[ubah7j& ubh )r5 }r6 (h#Uh9}r7 (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineM0Utypej) uhD]r8 hX)r9 }r: (h#Uh9}r; (h=]h>]h<]h;]h?]uh$j5 hD]r< hTX+Hyperlink target "trial" is not referenced.r= r> }r? (h#Uh$j9 ubah7h[ubah7j& ubh )r@ }rA (h#Uh9}rB (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineM5Utypej) uhD]rC hX)rD }rE (h#Uh9}rF (h=]h>]h<]h;]h?]uh$j@ hD]rG hTX-Hyperlink target "index-7" is not referenced.rH rI }rJ (h#Uh$jD ubah7h[ubah7j& ubh )rK }rL (h#Uh9}rM (h=]UlevelKh;]h<]Usourceh0h>]h?]UlineMiUtypej) uhD]rN hX)rO }rP (h#Uh9}rQ (h=]h>]h<]h;]h?]uh$jK hD]rR hTX-Hyperlink target "index-8" is not referenced.rS rT }rU (h#Uh$jO ubah7h[ubah7j& ubeUreporterrV NUid_startrW K U autofootnotesrX ]rY U citation_refsrZ }r[ Uindirect_targetsr\ ]r] Usettingsr^ (cdocutils.frontend Values r_ or` }ra (Ufootnote_backlinksrb KUrecord_dependenciesrc NU rfc_base_urlrd Uhttp://tools.ietf.org/html/re U tracebackrf Upep_referencesrg NUstrip_commentsrh NU toc_backlinksri Uentryrj U language_coderk Uenrl U datestamprm NU report_levelrn KU _destinationro NU halt_levelrp KU strip_classesrq NhQNUerror_encoding_error_handlerrr Ubackslashreplacers Udebugrt NUembed_stylesheetru Uoutput_encoding_error_handlerrv Ustrictrw U sectnum_xformrx KUdump_transformsry NU docinfo_xformrz 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.8/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 jw 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 (j j jjh j;hhhhjjjjjjjjjjj h&jjhAh+hHh+jjjjjjjjhhjh&j j jjj jjjjjhjhjjh)j3j6hj hjjjjjjjjjjOjKhjhjuUsubstitution_namesr }r h7hCh9}r (h=]h;]h<]Usourceh0h>]h?]uU footnotesr ]r Urefidsr }r (hA]r h5aj]r jaj]r jaj]r jaj]r jah]r haj]r jaj]r jaj]r jauub.PKJtDL~m ~m 7buildbot-v0.8.8/.doctrees/manual/cfg-buildsteps.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XepydocqX visual c++qNX buildbot tracqXstep-cvsq Xrpmbuildq NX9buildbot.steps.source.buildbot.steps.master.LogRenderableq Xremovedirectoryq NX?buildbot.steps.source.buildbot.steps.source.mercurial.Mercurialq Xtriggering-schedulersqXstep-bzrqXtriggering schedulersqNXrestructuredtextqX copydirectoryqNX subversionqXcvs (slave-side)qNX deblintianqNX0buildbot.steps.source.buildbot.steps.source.RepoqXslave-filesystem-stepsqX3buildbot.steps.source.buildbot.steps.source.bzr.BzrqXpython buildstepsqNXsetpropertiesfromenvqNXsubunitshellcommandqNXrepoqXother parametersqNX5buildbot.steps.source.buildbot.steps.source.repo.RepoqX2buildbot.steps.source.buildbot.steps.python.SphinxqX step-sphinxq X?buildbot.steps.source.buildbot.steps.slave.SetPropertiesFromEnvq!Xdarcsq"X mercurialq#Xslave filesystem stepsq$NXusing shellcommandsq%NXperlmoduletestq&NXmiscellaneous buildstepsq'NX1buildbot.steps.source.buildbot.steps.source.p4.P4q(X>buildbot.steps.source.buildbot.steps.python_twisted.RemovePYCsq)Xdebian build stepsq*NX<buildbot.steps.source.buildbot.steps.transfer.StringDownloadq+XDbuildbot.steps.source.buildbot.steps.transfer.JSONPropertiesDownloadq,X shellcommandq-NXsource-checkoutq.Xbzr (slave-side)q/NXstep-subunitshellcommandq0Xbitkeeper (slave-side)q1NXsetting-propertiesq2Xstep-mercurialq3Xgit (slave-side)q4NX:buildbot.steps.source.buildbot.steps.transfer.FileDownloadq5Xrpmlintq6NXstep-setpropertyq7X>buildbot.steps.source.buildbot.steps.master.MasterShellCommandq8X fileexistsq9NXsource checkout (slave-side)q:NXmonotoneq;Xmtr (mysql-test-run)qX@buildbot.steps.source.buildbot.steps.transfer.JSONStringDownloadq?X7buildbot.steps.source.buildbot.steps.shell.ShellCommandq@X3buildbot.steps.source.buildbot.steps.source.cvs.CVSqAXp4 (slave-side)qBNXtrialqCNXpython-buildstepsqDXmockbuildsrpm stepqENX buildepydocqFNXrepo (slave-side)qGNXsource checkoutqHNXhlintqINX logrenderableqJNXtransferring filesqKNXgitqLX@buildbot.steps.source.buildbot.steps.subunit.SubunitShellCommandqMX configureqNNXstep-buildepydocqOXsvn (slave-side)qPNXpylintqQNXperforceqRXcommon parametersqSNXNbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromChangeSourceqTXLbuildbot.steps.source.buildbot.steps.source.repo.RepoDownloadsFromPropertiesqUX3buildbot.steps.source.buildbot.steps.source.git.GitqVX step-pylintqWXp4qXNXdarcs (slave-side)qYNX9buildbot.steps.source.buildbot.steps.python_twisted.TrialqZXsetpropertyfromcommandq[NXcvsq\Xcompileq]NX step-trialq^X debpbuilderq_NXsource-checkout-slave-sideq`Xtransfering stringsqaNXtransfering directoriesqbNX makedirectoryqcNXrunning commands on the masterqdNXstep-svnqeX pycheckerqfXrpm-related stepsqgNX build stepsqhNXtreesizeqiNXbuildstep-common-parametersqjXsetting propertiesqkNX4buildbot.steps.source.buildbot.steps.python.PyFlakesqlXAbuildbot.steps.source.buildbot.steps.shell.SetPropertyFromCommandqmX step-pyflakeqnXmaxqqoNXtestqpNX removepycsqqNXmonotone (slave-side)qrNXstep-svn-slave-sideqsX3buildbot.steps.source.buildbot.steps.source.svn.SVNqtX7buildbot.steps.source.buildbot.steps.python.BuildEPYDocquX8buildbot.steps.source.buildbot.steps.transfer.FileUploadqvX mock stepsqwNX debcowbuilderqxNX bitkeeperqyXsvnqzNX7buildbot.steps.source.buildbot.steps.master.SetPropertyq{X4buildbot.steps.source.buildbot.steps.shell.Configureq|Xsphinxq}Xbzrq~NXpyflakesqXmercurial (slave-side)qNXmockrebuild 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.8/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(hhheuhKhhUexpect_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 Stepsqq}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(UreftypeXclassUrefwarnq͉U 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 BuildStepq݅q}q(hUhhubahUliteralqubaubhX^s are usually specified in the buildmaster's configuration file, in a list that goes into the qᅁq}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(UreftypeXclassh͉hX BuildFactoryU refdomainXpyqh]h]U refexplicith]h]h]hhhNhNuhKh]qh)q}q(hhh}q(h]h]q(hhXpy-classqeh]h]h]uhhh]qhX BuildFactoryqq}q(hUhhubahhubaubhX. The qq}q(hX. The hhubh)q}q(hX:class:`BuildStep`qhhhhhhh}q(UreftypeXclassh͉hX BuildStepU refdomainXpyqh]h]U refexplicith]h]h]hhhNhNuhKh]qh)q}q(hhh}q(h]h]q(hhXpy-classreh]h]h]uhhh]rhX BuildSteprr}r(hUhhubahhubaubhX 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`r hhhhhhh}r (UreftypeXclassh͉hX BuildStepU refdomainXpyr h]h]U refexplicith]h]h]hhhNhNuhKh]r h)r}r(hj h}r(h]h]r(hj Xpy-classreh]h]h]uhjh]rhX BuildSteprr}r(hUhjubahhubaubhX5 in one build without affecting a later build). Each rr}r(hX5 in one build without affecting a later build). Each hhubh)r}r(hX:class:`BuildFactory`rhhhhhhh}r(UreftypeXclassh͉hX BuildFactoryU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhKh]rh)r }r!(hjh}r"(h]h]r#(hjXpy-classr$eh]h]h]uhjh]r%hX BuildFactoryr&r'}r((hUhj ubahhubaubhXo 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)r,}r-(hX:meth:`addStep`r.hhhhhhh}r/(UreftypeXmethh͉hXaddStepU refdomainXpyr0h]h]U refexplicith]h]h]hhhNhNuhKh]r1h)r2}r3(hj.h}r4(h]h]r5(hj0Xpy-methr6eh]h]h]uhj,h]r7hXaddStepr8r9}r:(hUhj2ubahhubaubhX method:r;r<}r=(hX method:hhubeubcdocutils.nodes literal_block r>)r?}r@(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_blockrAh}rB(U xml:spacerCUpreserverDh]h]h]h]h]uhKhhh]rEhXfrom 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"]))rFrG}rH(hUhj?ubaubh)rI}rJ(hX2The basic behavior for a :class:`BuildStep` is to:rKhhhhhhh}rL(h]h]h]h]h]uhKhhh]rM(hXThe basic behavior for a rNrO}rP(hXThe basic behavior for a hjIubh)rQ}rR(hX:class:`BuildStep`rShjIhhhhh}rT(UreftypeXclassh͉hX BuildStepU refdomainXpyrUh]h]U refexplicith]h]h]hhhNhNuhKh]rVh)rW}rX(hjSh}rY(h]h]rZ(hjUXpy-classr[eh]h]h]uhjQh]r\hX BuildStepr]r^}r_(hUhjWubahhubaubhX is to:r`ra}rb(hX is to:hjIubeubcdocutils.nodes block_quote rc)rd}re(hUhhhNhU block_quoterfh}rg(h]h]h]h]h]uhNhhh]rhcdocutils.nodes bullet_list ri)rj}rk(hUh}rl(UbulletrmX*h]h]h]h]h]uhjdh]rn(cdocutils.nodes list_item ro)rp}rq(hXrun for a while, then stoprrh}rs(h]h]h]h]h]uhjjh]rth)ru}rv(hjrhjphhhhh}rw(h]h]h]h]h]uhKh]rxhXrun for a while, then stopryrz}r{(hjrhjuubaubahU list_itemr|ubjo)r}}r~(hX?possibly invoke some RemoteCommands on the attached build slaverh}r(h]h]h]h]h]uhjjh]rh)r}r(hjhj}hhhhh}r(h]h]h]h]h]uhKh]rhX?possibly invoke some RemoteCommands on the attached build slaverr}r(hjhjubaubahj|ubjo)r}r(hX#possibly produce a set of log filesrh}r(h]h]h]h]h]uhjjh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhKh]rhX#possibly produce a set of log filesrr}r(hjhjubaubahj|ubjo)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]uhjjh]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(UreftypeXmodh͉hXbuildbot.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(hUhjubahhubeubahj|ubjo)r}r(hX5provide a list of short strings to describe the step h}r(h]h]h]h]h]uhjjh]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(hjhjubaubahj|ubehU 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(UreftypeXclassh͉hX BuildStepU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhK h]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhX BuildSteprr}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(UreftypeXclassh͉hXBuildU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhK h]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXBuildr r }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`rhjhhhhh}r(UreftypeXindexh͉hXstepU refdomainXbbrh]h]U refexplicith]h]h]hhuhK h]rh)r}r(hjh}r(h]h]r(hjXbb-indexreh]h]h]uhjh]rhXsteprr}r(hUhjubahhubaubhX.r}r(hX.hjubeubcsphinx.addnodes index r )r!}r"(hUhhhhhUindexr#h}r$(h]h]h]h]h]Uentriesr%]r&(Usingler'XBuildstep ParameterUindex-0r(Utr)aUinliner*uhK$hhh]ubh)r+}r,(hUhhhhhhh}r-(h]h]h]h]h]hj(uhK%hhh]ubh)r.}r/(hX .. _Buildstep-Common-Parameters:hhhhh}hhh}r0(h]h]h]h]h]hUbuildstep-common-parametersr1uhK&hhh}r2j(j+sh]ubh)r3}r4(hUhKhhhhh}r5hjj.shhh}r6(h]r7Xcommon parametersr8ah]h]h]r9(Ucommon-parametersr:j1j(eh]r;hjauhK)hhh}r<(j1j.j(j+uh]r=(h)r>}r?(hXCommon Parametersr@hj3hhhhh}rA(h]h]h]h]h]uhK)hhh]rBhXCommon ParametersrCrD}rE(hj@hj>ubaubh)rF}rG(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.hj3hhhhh}rH(h]h]h]h]h]uhK+hhh]rI(hXAll rJrK}rL(hXAll hjFubh)rM}rN(hX:class:`BuildStep`rOhjFhhhhh}rP(UreftypeXclassh͉hX BuildStepU refdomainXpyrQh]h]U refexplicith]h]h]hhhNhNuhK+h]rRh)rS}rT(hjOh}rU(h]h]rV(hjQXpy-classrWeh]h]h]uhjMh]rXhX BuildSteprYrZ}r[(hUhjSubahhubaubhXs accept some common parameters. Some of these control how their individual status affects the overall build. Others are used to specify which r\r]}r^(hX\s accept some common parameters. Some of these control how their individual status affects the overall build. Others are used to specify which hjFubcdocutils.nodes title_reference r_)r`}ra(hX`Locks`h}rb(h]h]h]h]h]uhjFh]rchXLocksrdre}rf(hUhj`ubahUtitle_referencergubhX (see rhri}rj(hX (see hjFubh)rk}rl(hX:ref:`Interlocks`rmhjFhhhhh}rn(UreftypeXrefh͈hX interlocksU refdomainXstdroh]h]U refexplicith]h]h]hhuhK+h]rpcdocutils.nodes emphasis rq)rr}rs(hjmh}rt(h]h]ru(hjoXstd-refrveh]h]h]uhjkh]rwhX Interlocksrxry}rz(hUhjrubahUemphasisr{ubaubhX5) should be acquired before allowing the step to run.r|r}}r~(hX5) should be acquired before allowing the step to run.hjFubeubh)r}r(hX6Arguments common to all :class:`BuildStep` subclasses:rhj3hhhhh}r(h]h]h]h]h]uhK0hhh]r(hXArguments common to all rr}r(hXArguments common to all hjubh)r}r(hX:class:`BuildStep`rhjhhhhh}r(UreftypeXclassh͉hX BuildStepU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhK0h]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhX BuildSteprr}r(hUhjubahhubaubhX subclasses:rr}r(hX subclasses:hjubeubcdocutils.nodes definition_list r)r}r(hUhj3hhhUdefinition_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]uhK4h]r(cdocutils.nodes term r)r}r(hX``name``rhjhhhUtermrh}r(h]h]h]h]h]uhK4h]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]uhK3h]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(UreftypeXclassh͉hXLogFileU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhK3h]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(hUhj3hhhj#h}r(h]h]h]h]h]j%]r(j'X"Buildstep Parameter; haltOnFailureUindex-1rUtraj*uhK6hhh]ubh)r}r(hUhj3hhhhh}r(h]h]h]h]h]hjuhK7hhh]ubj)r}r(hUhj3hhh}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]uhK>h]r(j)r}r(hX``haltOnFailure``rhjhhhjh}r(h]h]h]h]h]uhK>h]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]uhK9h]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]r hXFAILUREr r }r (hUhjubahhubhXI of this build step will cause the build to halt immediately. Steps with r r}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]rhX haltOnFailurerr}r (hUhjubahhubhX 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`r0hjhhhhh}r1(UreftypeXclassh͉hX BuildStepU refdomainXpyr2h]h]U refexplicith]h]h]hhhNhNuhK9h]r3h)r4}r5(hj0h}r6(h]h]r7(hj2Xpy-classr8eh]h]h]uhj.h]r9hX BuildStepr:r;}r<(hUhj4ubahhubaubhXCs). 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@}rA(hX``haltOnFailure``h}rB(h]h]h]h]h]uhjh]rChX haltOnFailurerDrE}rF(hUhj@ubahhubhX% if something fails early on but not rGrH}rI(hX% if something fails early on but not hjubh)rJ}rK(hX``flunkOnFailure``h}rL(h]h]h]h]h]uhjh]rMhXflunkOnFailurerNrO}rP(hUhjJubahhubhX. This can be achieved with rQrR}rS(hX. This can be achieved with hjubh)rT}rU(hX``haltOnFailure=True``h}rV(h]h]h]h]h]uhjh]rWhXhaltOnFailure=TruerXrY}rZ(hUhjTubahhubhX, r[r\}r](hX, hjubh)r^}r_(hX``flunkOnFailure=False``h}r`(h]h]h]h]h]uhjh]rahXflunkOnFailure=Falserbrc}rd(hUhj^ubahhubhX.re}rf(hX.hjubeubahjubeubaubj )rg}rh(hUhj3hhhj#h}ri(h]h]h]h]h]j%]rj(j'X$Buildstep Parameter; flunkOnWarningsUindex-2rkUtrlaj*uhK@hhh]ubh)rm}rn(hUhj3hhhhh}ro(h]h]h]h]h]hjkuhKAhhh]ubj)rp}rq(hUhj3hhh}hjh}rr(h]h]h]h]rsjkah]uhNhhh}rtjkjmsh]ruj)rv}rw(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. hjphhhjh}rx(h]h]h]h]h]uhKDh]ry(j)rz}r{(hX``flunkOnWarnings``r|hjvhhhjh}r}(h]h]h]h]h]uhKDh]r~h)r}r(hj|h}r(h]h]h]h]h]uhjzh]rhXflunkOnWarningsrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjvh]rh)r}r(hXwhen ``True``, a ``WARNINGS`` or ``FAILURE`` of this build step will mark the overall build as ``FAILURE``. The remaining steps will still be executed.hjhhhhh}r(h]h]h]h]h]uhKCh]r(hXwhen rr}r(hXwhen 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 ``WARNINGS``h}r(h]h]h]h]h]uhjh]rhXWARNINGSrr}r(hUhjubahhubhX or rr}r(hX or hjubh)r}r(hX ``FAILURE``h}r(h]h]h]h]h]uhjh]rhXFAILURErr}r(hUhjubahhubhX3 of this build step will mark the overall build as rr}r(hX3 of this build step will mark the overall build as hjubh)r}r(hX ``FAILURE``h}r(h]h]h]h]h]uhjh]rhXFAILURErr}r(hUhjubahhubhX-. The remaining steps will still be executed.rr}r(hX-. The remaining steps will still be executed.hjubeubahjubeubaubj )r}r(hUhj3hhhj#h}r(h]h]h]h]h]j%]r(j'X#Buildstep Parameter; flunkOnFailureUindex-3rUtraj*uhKFhhh]ubh)r}r(hUhj3hhhhh}r(h]h]h]h]h]hjuhKGhhh]ubj)r}r(hUhj3hhh}hjh}r(h]h]h]h]rjah]uhNhhh}rjjsh]rj)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. hjhhhjh}r(h]h]h]h]h]uhKJh]r(j)r}r(hX``flunkOnFailure``rhjhhhjh}r(h]h]h]h]h]uhKJh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXflunkOnFailurerr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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.hjhhhhh}r(h]h]h]h]h]uhKIh]r(hXwhen rr}r(hXwhen 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(hUhjubahhubhX5 of this build step will mark the overall build as a rr}r(hX5 of this build step will mark the overall build as a hjubh)r}r(hX ``FAILURE``h}r(h]h]h]h]h]uhjh]rhXFAILURErr}r(hUhjubahhubhX-. The remaining steps will still be executed.rr}r(hX-. The remaining steps will still be executed.hjubeubahjubeubaubj )r}r(hUhj3hhhj#h}r(h]h]h]h]h]j%]r(j'X#Buildstep Parameter; warnOnWarningsUindex-4rUtraj*uhKLhhh]ubh)r}r(hUhj3hhhhh}r (h]h]h]h]h]hjuhKMhhh]ubj)r }r (hUhj3hhh}hjh}r (h]h]h]h]r jah]uhNhhh}rjjsh]rj)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]uhKQh]r(j)r}r(hX``warnOnWarnings``rhjhhhjh}r(h]h]h]h]h]uhKQh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXwarnOnWarningsrr}r(hUhjubahhubaubj)r }r!(hUh}r"(h]h]h]h]h]uhjh]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]uhKOh]r'(hXwhen r(r)}r*(hXwhen hj$ubh)r+}r,(hX``True``h}r-(h]h]h]h]h]uhj$h]r.hXTruer/r0}r1(hUhj+ubahhubhX, a r2r3}r4(hX, a hj$ubh)r5}r6(hX ``WARNINGS``h}r7(h]h]h]h]h]uhj$h]r8hXWARNINGSr9r:}r;(hUhj5ubahhubhX or r<r=}r>(hX or hj$ubh)r?}r@(hX ``FAILURE``h}rA(h]h]h]h]h]uhj$h]rBhXFAILURErCrD}rE(hUhj?ubahhubhX: of this build step will mark the overall build as having rFrG}rH(hX: of this build step will mark the overall build as having hj$ubh)rI}rJ(hX ``WARNINGS``h}rK(h]h]h]h]h]uhj$h]rLhXWARNINGSrMrN}rO(hUhjIubahhubhX-. The remaining steps will still be executed.rPrQ}rR(hX-. The remaining steps will still be executed.hj$ubeubahjubeubaubj )rS}rT(hUhj3hhhj#h}rU(h]h]h]h]h]j%]rV(j'X"Buildstep Parameter; warnOnFailureUindex-5rWUtrXaj*uhKShhh]ubh)rY}rZ(hUhj3hhhhh}r[(h]h]h]h]h]hjWuhKThhh]ubj)r\}r](hUhj3hhh}hjh}r^(h]h]h]h]r_jWah]uhNhhh}r`jWjYsh]raj)rb}rc(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. hj\hhhjh}rd(h]h]h]h]h]uhKWh]re(j)rf}rg(hX``warnOnFailure``rhhjbhhhjh}ri(h]h]h]h]h]uhKWh]rjh)rk}rl(hjhh}rm(h]h]h]h]h]uhjfh]rnhX warnOnFailurerorp}rq(hUhjkubahhubaubj)rr}rs(hUh}rt(h]h]h]h]h]uhjbh]ruh)rv}rw(hXwhen ``True``, a ``FAILURE`` of this build step will mark the overall build as having ``WARNINGS``. The remaining steps will still be executed.hjrhhhhh}rx(h]h]h]h]h]uhKVh]ry(hXwhen rzr{}r|(hXwhen hjvubh)r}}r~(hX``True``h}r(h]h]h]h]h]uhjvh]rhXTruerr}r(hUhj}ubahhubhX, a rr}r(hX, a hjvubh)r}r(hX ``FAILURE``h}r(h]h]h]h]h]uhjvh]rhXFAILURErr}r(hUhjubahhubhX: of this build step will mark the overall build as having rr}r(hX: of this build step will mark the overall build as having hjvubh)r}r(hX ``WARNINGS``h}r(h]h]h]h]h]uhjvh]rhXWARNINGSrr}r(hUhjubahhubhX-. The remaining steps will still be executed.rr}r(hX-. The remaining steps will still be executed.hjvubeubahjubeubaubj )r}r(hUhj3hhhj#h}r(h]h]h]h]h]j%]r(j'XBuildstep Parameter; alwaysRunUindex-6rUtraj*uhKYhhh]ubh)r}r(hUhj3hhhhh}r(h]h]h]h]h]hjuhKZhhh]ubj)r}r(hUhj3hhh}hjh}r(h]h]h]h]rjah]uhNhhh}rjjsh]rj)r}r(hX``alwaysRun`` if ``True``, this build step will always be run, even if a previous buildstep with ``haltOnFailure=True`` has failed. hjhhhjh}r(h]h]h]h]h]uhK]h]r(j)r}r(hX ``alwaysRun``rhjhhhjh}r(h]h]h]h]h]uhK]h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX alwaysRunrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXuif ``True``, this build step will always be run, even if a previous buildstep with ``haltOnFailure=True`` has failed.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(hUhjubahhubhXH, this build step will always be run, even if a previous buildstep with rr}r(hXH, this build step will always be run, even if a previous buildstep with hjubh)r}r(hX``haltOnFailure=True``h}r(h]h]h]h]h]uhjh]rhXhaltOnFailure=Truerr}r(hUhjubahhubhX has failed.rr}r(hX has failed.hjubeubahjubeubaubj )r}r(hUhj3hhhj#h}r(h]h]h]h]h]j%]r(j'XBuildstep Parameter; doStepIfUindex-7rUtraj*uhK_hhh]ubh)r}r(hUhj3hhhhh}r(h]h]h]h]h]hjuhK`hhh]ubj)r}r(hUhj3hhh}hjh}r(h]h]h]h]rjah]uhNhhh}rjjsh]rj)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. hjhhhjh}r(h]h]h]h]h]uhKgh]r(j)r}r(hX ``doStepIf``rhjhhhjh}r(h]h]h]h]h]uhKgh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXdoStepIfrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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.hjhhhhh}r(h]h]h]h]h]uhKbh]r(hX[A step can be configured to only run under certain conditions. To do this, set the step's rr}r(hX[A step can be configured to only run under certain conditions. To do this, set the step's hjubh)r}r(hX ``doStepIf``h}r(h]h]h]h]h]uhjh]rhXdoStepIfrr}r (hUhjubahhubhX 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 r r }r (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 hjubh)r }r(hX ``SKIPPED``h}r(h]h]h]h]h]uhjh]rhXSKIPPEDrr}r(hUhj ubahhubhXU without doing anything. Otherwise, the step will be executed normally. If you set rr}r(hXU without doing anything. Otherwise, the step will be executed normally. If you set hjubh)r}r(hX ``doStepIf``h}r(h]h]h]h]h]uhjh]rhXdoStepIfrr}r(hUhjubahhubhXM to a function, that function should accept one parameter, which will be the rr}r (hXM to a function, that function should accept one parameter, which will be the hjubh)r!}r"(hX :class:`Step`r#hjhhhhh}r$(UreftypeXclassh͉hXStepU refdomainXpyr%h]h]U refexplicith]h]h]hhhNhNuhKbh]r&h)r'}r((hj#h}r)(h]h]r*(hj%Xpy-classr+eh]h]h]uhj!h]r,hXStepr-r.}r/(hUhj'ubahhubaubhX object itself.r0r1}r2(hX object itself.hjubeubahjubeubaubj )r3}r4(hUhj3hhhj#h}r5(h]h]h]h]h]j%]r6(j'XBuildstep Parameter; hideStepIfUindex-8r7Utr8aj*uhKihhh]ubh)r9}r:(hUhj3hhhhh}r;(h]h]h]h]h]hj7uhKjhhh]ubj)r<}r=(hUhj3hhh}hjh}r>(h]h]h]h]r?j7ah]uhNhhh}r@j7j9sh]rAj)rB}rC(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}rD(h]h]h]h]h]uhKqh]rE(j)rF}rG(hX``hideStepIf``rHhjBhhhjh}rI(h]h]h]h]h]uhKqh]rJh)rK}rL(hjHh}rM(h]h]h]h]h]uhjFh]rNhX hideStepIfrOrP}rQ(hUhjKubahhubaubj)rR}rS(hUh}rT(h]h]h]h]h]uhjBh]rU(h)rV}rW(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, ::hjRhhhhh}rX(h]h]h]h]h]uhKlh]rY(hXkA step can be optionally hidden from the waterfall and build details web pages. To do this, set the step's rZr[}r\(hXkA step can be optionally hidden from the waterfall and build details web pages. To do this, set the step's hjVubh)r]}r^(hX``hideStepIf``h}r_(h]h]h]h]h]uhjVh]r`hX hideStepIfrarb}rc(hUhj]ubahhubhXW to a boolean value, or to a function that takes two parameters -- the results and the rdre}rf(hXW to a boolean value, or to a function that takes two parameters -- the results and the hjVubh)rg}rh(hX:class:`BuildStep`rihjVhhhhh}rj(UreftypeXclassh͉hX BuildStepU refdomainXpyrkh]h]U refexplicith]h]h]hhhNhNuhKlh]rlh)rm}rn(hjih}ro(h]h]rp(hjkXpy-classrqeh]h]h]uhjgh]rrhX BuildSteprsrt}ru(hUhjmubahhubaubhX -- 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,rvrw}rx(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,hjVubeubj>)ry}rz(hXIfactory.addStep(Foo(..., hideStepIf=lambda results, s: results==SKIPPED))hjRhjAh}r{(jCjDh]h]h]h]h]uhKqh]r|hXIfactory.addStep(Foo(..., hideStepIf=lambda results, s: results==SKIPPED))r}r~}r(hUhjyubaubehjubeubaubj )r}r(hUhj3hhhj#h}r(h]h]h]h]h]j%]r(j'XBuildstep Parameter; locksUindex-9rUtraj*uhKshhh]ubh)r}r(hUhj3hhhhh}r(h]h]h]h]h]hjuhKthhh]ubj)r}r(hUhj3hhh}hjh}r(h]h]h]h]rjah]uhNhhh}rjjsh]rj)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`. hjhhhjh}r(h]h]h]h]h]uhKzh]r(j)r}r(hX ``locks``rhjhhhjh}r(h]h]h]h]h]uhKzh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXlocksrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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`.hjhhhhh}r(h]h]h]h]h]uhKvh]r(hX a list of rr}r(hX a list of hjubh)r}r(hX ``Locks``h}r(h]h]h]h]h]uhjh]rhXLocksrr}r(hUhjubahhubhX (instances of rr}r(hX (instances of hjubh)r}r(hX!:class:`buildbot.locks.SlaveLock`rhjhhhhh}r(UreftypeXclassh͉hXbuildbot.locks.SlaveLockU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhKvh]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXbuildbot.locks.SlaveLockrr}r(hUhjubahhubaubhX or rr}r(hX or hjubh)r}r(hX":class:`buildbot.locks.MasterLock`rhjhhhhh}r(UreftypeXclassh͉hXbuildbot.locks.MasterLockU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhKvh]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXbuildbot.locks.MasterLockrr}r(hUhjubahhubaubhX/) that should be acquired before starting this rr}r(hX/) that should be acquired before starting this hjubh)r}r(hX :class:`Step`rhjhhhhh}r(UreftypeXclassh͉hXStepU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhKvh]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXSteprr}r(hUhjubahhubaubhX. The rr}r(hX. The hjubh)r}r(hX ``Locks``h}r(h]h]h]h]h]uhjh]rhXLocksrr}r(hUhjubahhubhXP will be released when the step is complete. Note that this is a list of actual rr}r(hXP will be released when the step is complete. Note that this is a list of actual hjubh)r}r(hX :class:`Lock`rhjhhhhh}r(UreftypeXclassh͉hXLockU refdomainXpyrh]h]U refexplicith]h]h]hhhNhNuhKvh]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXLockrr}r(hUhjubahhubaubhXM instances, not names. Also note that all Locks must have unique names. See rr}r(hXM instances, not names. Also note that all Locks must have unique names. See hjubh)r}r(hX:ref:`Interlocks`rhjhhhhh}r (UreftypeXrefh͈hX interlocksU refdomainXstdr h]h]U refexplicith]h]h]hhuhKvh]r jq)r }r (hjh}r(h]h]r(hj Xstd-refreh]h]h]uhjh]rhX Interlocksrr}r(hUhj ubahj{ubaubhX.r}r(hX.hjubeubahjubeubaubh)r}r(hX.. _Source-Checkout:hj3hhhhh}r(h]h]h]h]h]hUsource-checkoutruhK|hhh]ubeubhh)r}r(hUhhhhh}rh`h)r}r(hX.. _Source-Checkout-Slave-Side:hh)r }r!(hUhKhhhhh}hhh}r"(h]r#Xrepor$ah]h]h]r%(Urepor&X step-Repor'eh]uhM hhh}r(j'h)r)}r*(hUhh)r+}r,(hUhhhhh}hhh}r-(h]h]h]h]r.(Up4r/Xstep-P4r0eh]r1hXauhMhhh}r2j0h)r3}r4(hUhh)r5}r6(hUhhhhh}r7hh)r8}r9(hX .. _Step-Bzr:hh)r:}r;(hUhKhhhhh}r<h h)r=}r>(hX .. _Step-CVS:hh)r?}r@(hUhhhhh}rAheh)rB}rC(hX .. _Step-SVN:hh)rD}rE(hUhKhhhhh}rFhh)rG}rH(hX .. _Step-Git:hh)rI}rJ(hUhKhhhhh}rKh3h)rL}rM(hX.. _Step-Mercurial:hhhhh}hhh}rN(h]h]h]h]h]hUstep-mercurialrOuhKhhh}rPXstep-MercurialrQh)rR}rS(hUhhhhhhh}rT(h]h]h]h]h]hjQuhKhhh]ubsh]ubshhh}rU(h]rVX mercurialrWah]h]h]rX(U mercurialrYjOjQeh]rZh3auhMhhh}r[(jQjRjOjLuh]r\(h)r]}r^(hX Mercurialr_hjIhhhhh}r`(h]h]h]h]h]uhMhhh]rahX Mercurialrbrc}rd(hj_hj]ubaubj )re}rf(hUhjIhNhj#h}rg(h]h]h]h]h]Uentries]rh(j'XJbuildbot.steps.source.mercurial.Mercurial (class in buildbot.steps.source)h UtriauhNhhh]ubcsphinx.addnodes desc rj)rk}rl(hUhjIhNhUdescrmh}rn(UnoindexroUdomainrpXpyh]h]h]h]h]UobjtyperqXclassrrUdesctypersjruhNhhh]rt(csphinx.addnodes desc_signature ru)rv}rw(hX)buildbot.steps.source.mercurial.MercurialhjkhhhUdesc_signaturerxh}ry(h]rzh aUmoduler{Xbuildbot.steps.sourcer|h]h]h]h]r}h aUfullnamer~X)buildbot.steps.source.mercurial.MercurialUclassrXbuildbot.steps.source.mercurialUfirstruhMhhh]r(csphinx.addnodes desc_annotation r)r}r(hXclass hjvhhhUdesc_annotationrh}r(h]h]h]h]h]uhMhhh]rhXclass rr}r(hUhjubaubcsphinx.addnodes desc_addname r)r}r(hX buildbot.steps.source.mercurial.hjvhhhU desc_addnamerh}r(h]h]h]h]h]uhMhhh]rhX buildbot.steps.source.mercurial.rr}r(hUhjubaubcsphinx.addnodes desc_name r)r}r(hX MercurialhjvhhhU desc_namerh}r(h]h]h]h]h]uhMhhh]rhX Mercurialrr}r(hUhjubaubeubcsphinx.addnodes desc_content r)r}r(hUhjkhhhU desc_contentrh}r(h]h]h]h]h]uhMhhh]ubeubh)r}r(hX{The :bb:step:`Mercurial` build step performs a `Mercurial `_ (aka ``hg``) checkout or update.hjIhhhhh}r(h]h]h]h]h]uhMhhh]r(hXThe rr}r(hXThe hjubh)r}r(hX:bb:step:`Mercurial`rhjhhhhh}r(UreftypeXsteph͉hX MercurialU refdomainXbbrh]h]U refexplicith]h]h]hhuhMh]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhX Mercurialrr}r(hUhjubahhubaubhX build step performs a rr}r(hX build step performs a hjubcdocutils.nodes reference r)r}r(hX+`Mercurial `_h}r(UnameX MercurialUrefurirXhttp://selenic.com/mercurialrh]h]h]h]h]uhjh]rhX Mercurialrr}r(hUhjubahU referencerubh)r}r(hX hKhjhhh}r(Urefurijh]rUid4rah]h]h]h]rjWauh]ubhX (aka rr}r(hX (aka hjubh)r}r(hX``hg``h}r(h]h]h]h]h]uhjh]rhXhgrr}r(hUhjubahhubhX) checkout or update.rr}r(hX) checkout or update.hjubeubh)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. ::hjIhhhhh}r(h]h]h]h]h]uhMhhh]r(hX%Branches are available in two modes: rr}r(hX%Branches are available in two modes: hjubh)r}r(hX ``dirname``h}r(h]h]h]h]h]uhjh]rhXdirnamerr}r(hUhjubahhubhXM, where the name of the branch is a suffix of the name of the repository, or rr}r(hXM, where the name of the branch is a suffix of the name of the repository, or hjubh)r}r(hX ``inrepo``h}r(h]h]h]h]h]uhjh]rhXinreporr}r(hUhjubahhubhXu, which uses Hg's named-branches support. Make sure this setting matches your changehook, if you have that installed.rr}r(hXu, which uses Hg's named-branches support. Make sure this setting matches your changehook, if you have that installed.hjubeubj>)r}r(hXfrom buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh', branchType='inrepo'))hjIhhhjAh}r(jCjDh]h]h]h]h]uhM hhh]rhXfrom buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh', branchType='inrepo'))rr}r(hUhjubaubh)r}r(hX1The Mercurial step takes the following arguments:rhjIhhhhh}r(h]h]h]h]h]uhMhhh]rhX1The Mercurial step takes the following arguments:rr}r(hjhjubaubj)r}r(hUhjIhhhjh}r(h]h]h]h]h]uhNhhh]r(j)r}r(hX@``repourl`` where the Mercurial source repository is available. hjhhhjh}r (h]h]h]h]h]uhMh]r (j)r }r (hX ``repourl``r hjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hj h}r(h]h]h]h]h]uhj h]rhXrepourlrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX3where the Mercurial source repository is available.rhjhhhhh}r(h]h]h]h]h]uhMh]rhX3where the Mercurial source repository is available.r r!}r"(hjhjubaubahjubeubj)r#}r$(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. hjhhhjh}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 defaultBranchr0r1}r2(hUhj,ubahhubaubj)r3}r4(hUh}r5(h]h]h]h]h]uhj#h]r6h)r7}r8(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.hj3hhhhh}r9(h]h]h]h]h]uhMh]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 r;r<}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 hj7ubh)r>}r?(hX ``repourl``h}r@(h]h]h]h]h]uhj7h]rAhXrepourlrBrC}rD(hUhj>ubahhubhX1 to create the string that will be passed to the rErF}rG(hX1 to create the string that will be passed to the hj7ubh)rH}rI(hX ``hg clone``h}rJ(h]h]h]h]h]uhj7h]rKhXhg clonerLrM}rN(hUhjHubahhubhX command.rOrP}rQ(hX command.hj7ubeubahjubeubj)rR}rS(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``. hjhhhjh}rT(h]h]h]h]h]uhMhhh]rU(j)rV}rW(hX``branchType``rXhjRhhhjh}rY(h]h]h]h]h]uhMh]rZh)r[}r\(hjXh}r](h]h]h]h]h]uhjVh]r^hX branchTyper_r`}ra(hUhj[ubahhubaubj)rb}rc(hUh}rd(h]h]h]h]h]uhjRh]reh)rf}rg(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``.hjbhhhhh}rh(h]h]h]h]h]uhMh]ri(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the rjrk}rl(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the hjfubh)rm}rn(hX ``repourl``h}ro(h]h]h]h]h]uhjfh]rphXrepourlrqrr}rs(hUhjmubahhubhXG or the branch is a Mercurial named branch and can be found within the rtru}rv(hXG or the branch is a Mercurial named branch and can be found within the hjfubh)rw}rx(hX ``repourl``h}ry(h]h]h]h]h]uhjfh]rzhXrepourlr{r|}r}(hUhjwubahhubhX.r~}r(hX.hjfubeubahjubeubj)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. hjhhhjh}r(h]h]h]h]h]uhM#hhh]r(j)r}r(hX``clobberOnBranchChange``rhjhhhjh}r(h]h]h]h]h]uhM#h]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]uhM!h]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``hjIhhhhh}r(h]h]h]h]h]uhM%hhh]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(hUhjubahhubeubjc)r}r(hUhjIhNhjfh}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:rhjhhhhh}r(h]h]h]h]h]uhM(h]rhXaMercurial's incremental mode does not require a method. The full mode has three methods defined:rr}r(hjhjubaubj)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]uhM.h]r(j)r}r(hX ``clobber``rhjhhhjh}r(h]h]h]h]h]uhM.h]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(hX~It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repositoryrhjhhhhh}r(h]h]h]h]h]uhM-h]rhX~It removes the build directory entirely then makes full clone from repo. This can be slow as it need to clone whole repositoryrr}r(hjhjubaubahjubeubj)r}r(hX|``fresh`` This remove all other files except those tracked by VCS. First it does :command:`hg purge --all` then pull/update hjhhhjh}r(h]h]h]h]h]uhM2h]r(j)r}r(hX ``fresh``rhjhhhjh}r(h]h]h]h]h]uhM2h]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(hXqThis remove all other files except those tracked by VCS. First it does :command:`hg purge --all` then pull/updatehjhhhhh}r(h]h]h]h]h]uhM1h]r(hXGThis remove all other files except those tracked by VCS. First it does rr}r(hXGThis remove all other files except those tracked by VCS. First it does hjubcdocutils.nodes strong r)r}r(hX:command:`hg purge --all`h}r(h]h]rUcommandrah]h]h]uhjh]rhXhg purge --allrr}r (hUhjubahUstrongr ubhX then pull/updater r }r (hX then pull/updatehjubeubahjubeubj)r}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]uhM8h]r(j)r}r(hX ``clean``rhjhhhjh}r(h]h]h]h]h]uhM8h]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#(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.hjhhhhh}r$(h]h]h]h]h]uhM5h]r%(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 r&r'}r((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 hj"ubj)r)}r*(hX:command:`hg purge`h}r+(h]h]r,jah]h]h]uhj"h]r-hXhg purger.r/}r0(hUhj)ubahj ubhX then pull/update.r1r2}r3(hX then pull/update.hj"ubeubahjubeubehjubeubj )r4}r5(hUhjIhhhj#h}r6(h]h]h]h]h]Uentries]r7((UsingleXBuild Steps; GitXstep-Gitr8j8tr9(UsingleXGit Build Stepj8j8tr:euhM;hhh]ubh)r;}r<(hUhjIhhhhh}r=(h]h]h]h]h]hj8uhM;hhh]ubjGeubhhh}hhh}r>(h]h]h]h]h]hUstep-gitr?uhM<hhh}r@j8j;sh]ubshhh}rA(h]rBXgitrCah]h]h]rD(UgitrEj?j8eh]rFhauhM?hhh}rG(j?jGj8j;uh]rH(h)rI}rJ(hXGitrKhjDhhhhh}rL(h]h]h]h]h]uhM?hhh]rMhXGitrNrO}rP(hjKhjIubaubj )rQ}rR(hUhjDhNhj#h}rS(h]h]h]h]h]Uentries]rT(j'X>buildbot.steps.source.git.Git (class in buildbot.steps.source)hVUtrUauhNhhh]ubjj)rV}rW(hUhjDhNhjmh}rX(jojpXpyh]h]h]h]h]jqXclassrYjsjYuhNhhh]rZ(ju)r[}r\(hXbuildbot.steps.source.git.GithjVhhhjxh}r](h]r^hVaj{j|h]h]h]h]r_hVaj~Xbuildbot.steps.source.git.GitjXbuildbot.steps.source.gitjuhMBhhh]r`(j)ra}rb(hXclass hj[hhhjh}rc(h]h]h]h]h]uhMBhhh]rdhXclass rerf}rg(hUhjaubaubj)rh}ri(hXbuildbot.steps.source.git.hj[hhhjh}rj(h]h]h]h]h]uhMBhhh]rkhXbuildbot.steps.source.git.rlrm}rn(hUhjhubaubj)ro}rp(hXGithj[hhhjh}rq(h]h]h]h]h]uhMBhhh]rrhXGitrsrt}ru(hUhjoubaubeubj)rv}rw(hUhjVhhhjh}rx(h]h]h]h]h]uhMBhhh]ubeubh)ry}rz(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. ::hjDhhhhh}r{(h]h]h]h]h]uhMChhh]r|(hXThe r}r~}r(hXThe hjyubh)r}r(hX``Git``h}r(h]h]h]h]h]uhjyh]rhXGitrr}r(hUhjubahhubhX build step clones or updates a rr}r(hX build step clones or updates a hjyubj)r}r(hX`Git `_h}r(UnameXGitjXhttp://git.or.cz/rh]h]h]h]h]uhjyh]rhXGitrr}r(hUhjubahjubh)r}r(hX hKhjyhhh}r(Urefurijh]rUid5rah]h]h]h]rjCauh]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 hjyubj)r}r(hX:command:`git init`h}r(h]h]rjah]h]h]uhjyh]rhXgit initrr}r(hUhjubahj ubhX command that the buildbot uses.rr}r(hX command that the buildbot uses.hjyubeubj>)r}r(hXfrom buildbot.steps.source.git import Git factory.addStep(Git(repourl='git://path/to/repo', mode='full', method='clobber', submodules=True))hjDhhhjAh}r(jCjDh]h]h]h]h]uhMIhhh]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:rhjDhhhhh}r(h]h]h]h]h]uhMMhhh]rhX+The Git step takes the following arguments:rr}r(hjhjubaubj)r}r(hUhjDhhhjh}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]uhMPh]r(j)r}r(hX ``repourl``rhjhhhjh}r(h]h]h]h]h]uhMPh]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(hX3(required): the URL of the upstream Git repository.rhjhhhhh}r(h]h]h]h]h]uhMPh]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]uhMThhh]r(j)r}r(hX ``branch``rhjhhhjh}r(h]h]h]h]h]uhMTh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXbranchrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(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.rhjhhhhh}r(h]h]h]h]h]uhMSh]rhX(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.rr}r(hjhjubaubahjubeubj)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]uhMYhhh]r(j)r}r(hX``submodules``rhjhhhjh}r(h]h]h]h]h]uhMYh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX submodulesrr}r (hUhjubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhjh]r h)r }r (hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: ``False``.hj hhhhh}r (h]h]h]h]h]uhMWh]r (hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: r r }r (hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: 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``shallow`` (optional): instructs git to attempt shallow clones (``--depth 1``). This option can be used only in full builds with clobber method. hjhhhjh}r (h]h]h]h]h]uhM]hhh]r (j)r }r (hX ``shallow``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! hXshallowr" r# }r$ (hUhj ubahhubaubj)r% }r& (hUh}r' (h]h]h]h]h]uhj h]r( h)r) }r* (hX(optional): instructs git to attempt shallow clones (``--depth 1``). This option can be used only in full builds with clobber method.hj% hhhhh}r+ (h]h]h]h]h]uhM\h]r, (hX5(optional): instructs git to attempt shallow clones (r- r. }r/ (hX5(optional): instructs git to attempt shallow clones (hj) ubh)r0 }r1 (hX ``--depth 1``h}r2 (h]h]h]h]h]uhj) h]r3 hX --depth 1r4 r5 }r6 (hUhj0 ubahhubhXC). This option can be used only in full builds with clobber method.r7 r8 }r9 (hXC). This option can be used only in full builds with clobber method.hj) ubeubahjubeubj)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]uhMbhhh]r= (j)r> }r? (hX ``progress``r@ hj: hhhjh}rA (h]h]h]h]h]uhMbh]rB h)rC }rD (hj@ h}rE (h]h]h]h]h]uhj> h]rF hXprogressrG rH }rI (hUhjC ubahhubaubj)rJ }rK (hUh}rL (h]h]h]h]h]uhj: h]rM h)rN }rO (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.hjJ hhhhh}rP (h]h]h]h]h]uhM`h]rQ (hX(optional): passes the (rR rS }rT (hX(optional): passes the (hjN ubh)rU }rV (hX``--progress``h}rW (h]h]h]h]h]uhjN h]rX hX --progressrY rZ }r[ (hUhjU ubahhubhX ) flag to (r\ r] }r^ (hX ) flag to (hjN ubj)r_ }r` (hX:command:`git fetch`h}ra (h]h]rb jah]h]h]uhjN h]rc hX git fetchrd re }rf (hUhj_ ubahj ubhXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.rg rh }ri (hXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.hjN ubeubahjubeubj)rj }rk (hX``retryFetch`` (optional): this value defaults to ``False``. In any case if fetch fails buildbot retries to fetch again instead of failing the entire source checkout. hjhhhjh}rl (h]h]h]h]h]uhMghhh]rm (j)rn }ro (hX``retryFetch``rp hjj hhhjh}rq (h]h]h]h]h]uhMgh]rr h)rs }rt (hjp h}ru (h]h]h]h]h]uhjn h]rv hX retryFetchrw rx }ry (hUhjs ubahhubaubj)rz }r{ (hUh}r| (h]h]h]h]h]uhjj h]r} h)r~ }r (hX(optional): this value defaults to ``False``. In any case if fetch fails buildbot retries to fetch again instead of failing the entire source checkout.hjz hhhhh}r (h]h]h]h]h]uhMeh]r (hX#(optional): this value defaults to r r }r (hX#(optional): this value defaults to hj~ ubh)r }r (hX ``False``h}r (h]h]h]h]h]uhj~ h]r hXFalser r }r (hUhj ubahhubhXk. In any case if fetch fails buildbot retries to fetch again instead of failing the entire source checkout.r r }r (hXk. In any case if fetch fails buildbot retries to fetch again instead of failing the entire source checkout.hj~ ubeubahjubeubj)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]uhMmhhh]r (j)r }r (hX``clobberOnFailure``r hj hhhjh}r (h]h]h]h]h]uhMmh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXclobberOnFailurer r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)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.hj hhhhh}r (h]h]h]h]h]uhMjh]r (hX(optional): defaults to r r }r (hX(optional): defaults to hj ubh)r }r (hX ``False``h}r (h]h]h]h]h]uhj h]r hXFalser r }r (hUhj ubahhubhX. 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.hj ubeubahjubeubeubh)r }r (hX``mode``r hjDhhhhh}r (h]h]h]h]h]uhMohhh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXmoder r }r (hUhj ubahhubaubjc)r }r (hUhjDhhhjfh}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]uhMqh]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 ubeubjc)r }r (hUh}r (h]h]h]h]h]uhj h]r j)r }r (hUh}r (h]h]h]h]h]uhj h]r (j)r }r (hXN``incremental`` The source is update, but any built files are left untouched. hj hhhjh}r (h]h]h]h]h]uhMuh]r (j)r }r (hX``incremental``r hj hhhjh}r (h]h]h]h]h]uhMuh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hX incrementalr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hX=The source is update, but any built files are left untouched.r hj hhhhh}r (h]h]h]h]h]uhMuh]r hX=The source is update, but any built files are left untouched.r r }r (hj hj ubaubahjubeubj)r }r (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}r (h]h]h]h]h]uhMzh]r (j)r }r (hX``full``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 hXfullr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj 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]uhMxh]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 ubeubahjubeubehjubahjfubeubh)r }r (hX ``method``r hjDhhhhh}r! (h]h]h]h]h]uhM|hhh]r" h)r# }r$ (hj h}r% (h]h]h]h]h]uhj h]r& hXmethodr' r( }r) (hUhj# ubahhubaubjc)r* }r+ (hUhjDhNhjfh}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:hj* hhhhh}r0 (h]h]h]h]h]uhM~h]r1 (hX(optional): defaults to r2 r3 }r4 (hX(optional): defaults to hj. ubh)r5 }r6 (hX ``fresh``h}r7 (h]h]h]h]h]uhj. h]r8 hXfreshr9 r: }r; (hUhj5 ubahhubhX when mode is r< r= }r> (hX when mode is hj. ubh)r? }r@ (hX``full``h}rA (h]h]h]h]h]uhj. h]rB hXfullrC rD }rE (hUhj? ubahhubhX[. Git's incremental mode does not require a method. The full mode has four methods defined:rF rG }rH (hX[. Git's incremental mode does not require a method. The full mode has four methods defined:hj. ubeubj)rI }rJ (hUh}rK (h]h]h]h]h]uhj* h]rL (j)rM }rN (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. hjI hhhjh}rO (h]h]h]h]h]uhMh]rP (j)rQ }rR (hX ``clobber``rS hjM hhhjh}rT (h]h]h]h]h]uhMh]rU h)rV }rW (hjS h}rX (h]h]h]h]h]uhjQ h]rY hXclobberrZ r[ }r\ (hUhjV ubahhubaubj)r] }r^ (hUh}r_ (h]h]h]h]h]uhjM h]r` h)ra }rb (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.hj] hhhhh}rc (h]h]h]h]h]uhMh]rd (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 re rf }rg (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 hja ubh)rh }ri (hX ``shallow``h}rj (h]h]h]h]h]uhja h]rk hXshallowrl rm }rn (hUhjh ubahhubhXk option. If shallow options is enabled and build request have unknown revision value, then this step fails.ro rp }rq (hXk option. If shallow options is enabled and build request have unknown revision value, then this step fails.hja ubeubahjubeubj)rr }rs (hX``fresh`` This remove all other files except those tracked by Git. First it does :command:`git clean -d -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. hjI hhhjh}rt (h]h]h]h]h]uhMh]ru (j)rv }rw (hX ``fresh``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~ hXfreshr r }r (hUhj{ ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhjr h]r h)r }r (hXThis remove all other files except those tracked by Git. First it does :command:`git clean -d -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.hj hhhhh}r (h]h]h]h]h]uhMh]r (hXGThis remove all other files except those tracked by Git. First it does r r }r (hXGThis remove all other files except those tracked by Git. First it does hj ubj)r }r (hX:command:`git clean -d -f -x`h}r (h]h]r jah]h]h]uhj h]r hXgit clean -d -f -xr r }r (hUhj ubahj ubhX_ then fetch/checkout to a specified revision(if any). This option is equal to update mode with r r }r (hX_ then fetch/checkout to a specified revision(if any). This option is equal to update mode with hj ubh)r }r (hX``ignore_ignores=True``h}r (h]h]h]h]h]uhj h]r hXignore_ignores=Truer r }r (hUhj ubahhubhX in old steps.r r }r (hX in old steps.hj ubeubahjubeubj)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` then fetch. This is equivalent to ``ignore_ignores=False`` in old steps. hjI hhhjh}r (h]h]h]h]h]uhMh]r (j)r }r (hX ``clean``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 hXcleanr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]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` 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 ubj)r }r (hX:command:`git clean -d -f`h}r (h]h]r jah]h]h]uhj h]r hXgit clean -d -fr r }r (hUhj ubahj ubhX# then fetch. This is equivalent to r r }r (hX# then fetch. This is equivalent to hj ubh)r }r (hX``ignore_ignores=False``h}r (h]h]h]h]h]uhj h]r hXignore_ignores=Falser r }r (hUhj ubahhubhX in old steps.r r }r (hX in old steps.hj ubeubahjubeubj)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. hjI 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 ubeubahjubeubehjubeubh)r }r (hX``getDescription``r hjDhhhhh}r (h]h]h]h]h]uhMhhh]r h)r }r (hj h}r (h]h]h]h]h]uhj h]r hXgetDescriptionr r }r (hUhj ubahhubaubjc)r }r (hUhjDhNhjfh}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:hj hhhhh}r (h]h]h]h]h]uhMh]r (hX$(optional) After checkout, invoke a r r }r! (hX$(optional) After checkout, invoke a hj ubj_)r" }r# (hX`git describe`h}r$ (h]h]h]h]h]uhj h]r% hX git describer& r' }r( (hUhj" ubahjgubhXR on the revision and save the result in a property; the property's name is either r) r* }r+ (hXR on the revision and save the result in a property; the property's name is either hj ubh)r, }r- (hX``commit-description``h}r. (h]h]h]h]h]uhj h]r/ hXcommit-descriptionr0 r1 }r2 (hUhj, ubahhubhX or r3 r4 }r5 (hX or hj ubh)r6 }r7 (hX``commit-description-foo``h}r8 (h]h]h]h]h]uhj h]r9 hXcommit-description-foor: r; }r< (hUhj6 ubahhubhX, depending on whether the r= r> }r? (hX, depending on whether the hj ubh)r@ }rA (hX ``codebase``h}rB (h]h]h]h]h]uhj h]rC hXcodebaserD rE }rF (hUhj@ ubahhubhX= argument was also provided. The argument should either be a rG rH }rI (hX= argument was also provided. The argument should either be a hj ubh)rJ }rK (hX``bool``h}rL (h]h]h]h]h]uhj h]rM hXboolrN rO }rP (hUhjJ ubahhubhX or rQ rR }rS (hX or hj ubh)rT }rU (hX``dict``h}rV (h]h]h]h]h]uhj h]rW hXdictrX rY }rZ (hUhjT ubahhubhX, and will change how r[ r\ }r] (hX, and will change how hj ubj_)r^ }r_ (hX`git describe`h}r` (h]h]h]h]h]uhj h]ra hX git describerb rc }rd (hUhj^ ubahjgubhX is called:re rf }rg (hX is called:hj ubeubji)rh }ri (hUh}rj (jmX*h]h]h]h]h]uhj h]rk (jo)rl }rm (hX:``getDescription=False``: disables this feature explicitlyrn h}ro (h]h]h]h]h]uhjh h]rp h)rq }rr (hjn hjl hhhhh}rs (h]h]h]h]h]uhMh]rt (h)ru }rv (hX``getDescription=False``h}rw (h]h]h]h]h]uhjq h]rx hXgetDescription=Falsery rz }r{ (hUhju ubahhubhX": disables this feature explicitlyr| r} }r~ (hX": disables this feature explicitlyhjq ubeubahj|ubjo)r }r (hXL``getDescription=True`` or empty ``dict()``: Run `git describe` with no argsr h}r (h]h]h]h]h]uhjh h]r h)r }r (hj hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX``getDescription=True``h}r (h]h]h]h]h]uhj h]r hXgetDescription=Truer r }r (hUhj ubahhubhX or empty r r }r (hX or empty hj ubh)r }r (hX ``dict()``h}r (h]h]h]h]h]uhj h]r hXdict()r r }r (hUhj ubahhubhX: Run r r }r (hX: Run hj ubj_)r }r (hX`git describe`h}r (h]h]h]h]h]uhj h]r hX git describer r }r (hUhj ubahjgubhX with no argsr r }r (hX with no argshj ubeubahj|ubjo)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 h]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.hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX``getDescription={...}``h}r (h]h]h]h]h]uhj h]r hXgetDescription={...}r r }r (hUhj ubahhubhXM: 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 hj ubh)r }r (hX ``False``h}r (h]h]h]h]h]uhj h]r hXFalser r }r (hUhj ubahhubhX or r r }r (hX or hj ubh)r }r (hX``None``h}r (h]h]h]h]h]uhj h]r hXNoner r }r (hUhj ubahhubhX" to explicitly skip that argument.r r }r (hX" to explicitly skip that argument.hj ubeubh)r }r (hXPFor the following keys, a value of ``True`` appends the same-named Git argument:r hj hhhhh}r (h]h]h]h]h]uhMh]r (hX#For the following keys, a value of r r }r (hX#For the following keys, a value of hj ubh)r }r (hX``True``h}r (h]h]h]h]h]uhj h]r hXTruer r }r (hUhj ubahhubhX% appends the same-named Git argument:r r }r (hX% appends the same-named Git argument:hj ubeubjc)r }r (hUh}r (h]h]h]h]h]uhj h]r ji)r }r (hUh}r (jmX*h]h]h]h]h]uhj h]r (jo)r }r (hX``all`` : `--all`r h}r (h]h]h]h]h]uhj h]r h)r }r (hj hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX``all``h}r (h]h]h]h]h]uhj h]r hXallr r }r (hUhj ubahhubhX : r r }r (hX : hj ubj_)r }r (hX`--all`h}r (h]h]h]h]h]uhj h]r hX--allr r }r (hUhj ubahjgubeubahj|ubjo)r }r (hX``always``: `--always`r h}r (h]h]h]h]h]uhj h]r h)r }r (hj hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX ``always``h}r (h]h]h]h]h]uhj h]r hXalwaysr r }r (hUhj ubahhubhX: r r }r (hX: hj ubj_)r }r (hX `--always`h}r (h]h]h]h]h]uhj h]r hX--alwaysr r }r (hUhj ubahjgubeubahj|ubjo)r }r (hX``contains``: `--contains`r h}r (h]h]h]h]h]uhj h]r h)r }r (hj hj hhhhh}r! (h]h]h]h]h]uhMh]r" (h)r# }r$ (hX ``contains``h}r% (h]h]h]h]h]uhj h]r& hXcontainsr' r( }r) (hUhj# ubahhubhX: r* r+ }r, (hX: hj ubj_)r- }r. (hX `--contains`h}r/ (h]h]h]h]h]uhj h]r0 hX --containsr1 r2 }r3 (hUhj- ubahjgubeubahj|ubjo)r4 }r5 (hX``debug``: `--debug`r6 h}r7 (h]h]h]h]h]uhj h]r8 h)r9 }r: (hj6 hj4 hhhhh}r; (h]h]h]h]h]uhMh]r< (h)r= }r> (hX ``debug``h}r? (h]h]h]h]h]uhj9 h]r@ hXdebugrA rB }rC (hUhj= ubahhubhX: rD rE }rF (hX: hj9 ubj_)rG }rH (hX `--debug`h}rI (h]h]h]h]h]uhj9 h]rJ hX--debugrK rL }rM (hUhjG ubahjgubeubahj|ubjo)rN }rO (hX``long``: `--long``rP h}rQ (h]h]h]h]h]uhj h]rR h)rS }rT (hjP hjN hhhhh}rU (h]h]h]h]h]uhMh]rV (h)rW }rX (hX``long``h}rY (h]h]h]h]h]uhjS h]rZ hXlongr[ r\ }r] (hUhjW ubahhubhX: r^ r_ }r` (hX: hjS ubj_)ra }rb (hX `--long``h}rc (h]h]h]h]h]uhjS h]rd hX--long`re rf }rg (hUhja ubahjgubeubahj|ubjo)rh }ri (hX ``exact-match``: `--exact-match`rj h}rk (h]h]h]h]h]uhj h]rl h)rm }rn (hjj hjh hhhhh}ro (h]h]h]h]h]uhMh]rp (h)rq }rr (hX``exact-match``h}rs (h]h]h]h]h]uhjm h]rt hX exact-matchru rv }rw (hUhjq ubahhubhX: rx ry }rz (hX: hjm ubj_)r{ }r| (hX`--exact-match`h}r} (h]h]h]h]h]uhjm h]r~ hX --exact-matchr r }r (hUhj{ ubahjgubeubahj|ubjo)r }r (hX``tags``: `--tags`r h}r (h]h]h]h]h]uhj h]r h)r }r (hj hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX``tags``h}r (h]h]h]h]h]uhj h]r hXtagsr r }r (hUhj ubahhubhX: r r }r (hX: hj ubj_)r }r (hX`--tags`h}r (h]h]h]h]h]uhj h]r hX--tagsr r }r (hUhj ubahjgubeubahj|ubjo)r }r (hX``dirty``: `--dirty` h}r (h]h]h]h]h]uhj h]r h)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]uhj h]r hXdirtyr r }r (hUhj ubahhubhX: r r }r (hX: hj ubj_)r }r (hX `--dirty`h}r (h]h]h]h]h]uhj h]r hX--dirtyr r }r (hUhj ubahjgubeubahj|ubehjubahjfubh)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 hj hhhhh}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 ubaubjc)r }r (hUh}r (h]h]h]h]h]uhj h]r ji)r }r (hUh}r (jmX*h]h]h]h]h]uhj h]r (jo)r }r (hX``match=foo``: `--match foo`r h}r (h]h]h]h]h]uhj h]r h)r }r (hj hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX ``match=foo``h}r (h]h]h]h]h]uhj h]r hX match=foor r }r (hUhj ubahhubhX: r r }r (hX: hj ubj_)r }r (hX `--match foo`h}r (h]h]h]h]h]uhj h]r hX --match foor r }r (hUhj ubahjgubeubahj|ubjo)r }r (hX``abbrev=7``: `--abbrev=7`r h}r (h]h]h]h]h]uhj h]r h)r }r (hj hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX ``abbrev=7``h}r (h]h]h]h]h]uhj h]r hXabbrev=7r r }r (hUhj ubahhubhX: r r }r (hX: hj ubj_)r }r (hX `--abbrev=7`h}r (h]h]h]h]h]uhj h]r hX --abbrev=7r r }r (hUhj ubahjgubeubahj|ubjo)r }r (hX"``candidates=7``: `--candidates=7`r h}r (h]h]h]h]h]uhj h]r h)r }r (hj hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX``candidates=7``h}r (h]h]h]h]h]uhj h]r hX candidates=7r r }r (hUhj ubahhubhX: r r }r (hX: hj ubj_)r }r (hX`--candidates=7`h}r (h]h]h]h]h]uhj h]r hX--candidates=7r r }r (hUhj ubahjgubeubahj|ubjo)r }r (hX``dirty=foo``: `--dirty=foo` h}r (h]h]h]h]h]uhj h]r h)r }r (hX``dirty=foo``: `--dirty=foo`r hj hhhhh}r (h]h]h]h]h]uhMh]r (h)r }r (hX ``dirty=foo``h}r (h]h]h]h]h]uhj h]r hX dirty=foor r! }r" (hUhj ubahhubhX: r# r$ }r% (hX: hj ubj_)r& }r' (hX `--dirty=foo`h}r( (h]h]h]h]h]uhj h]r) hX --dirty=foor* r+ }r, (hUhj& ubahjgubeubahj|ubehjubahjfubehj|ubehjubeubh)r- }r. (hX ``config``r/ hjDhhhhh}r0 (h]h]h]h]h]uhMhhh]r1 h)r2 }r3 (hj/ h}r4 (h]h]h]h]h]uhj- h]r5 hXconfigr6 r7 }r8 (hUhj2 ubahhubaubjc)r9 }r: (hUhjDhhhjfh}r; (h]h]h]h]h]uhNhhh]r< h)r= }r> (hXS(optional) A dict of git configuration settings to pass to the remote git commands.r? hj9 hhhhh}r@ (h]h]h]h]h]uhMh]rA hXS(optional) A dict of git configuration settings to pass to the remote git commands.rB rC }rD (hj? hj= ubaubaubj )rE }rF (hUhjDhhhj#h}rG (h]h]h]h]h]Uentries]rH ((UsingleXBuild Steps; SVNXstep-SVNrI jI trJ (UsingleXSVN Build StepjI jI trK euhMhhh]ubh)rL }rM (hUhjDhhhhh}rN (h]h]h]h]h]hjI uhMhhh]ubjBeubhhh}hhh}rO (h]h]h]h]h]hUstep-svnrP uhMhhh}rQ jI jL sh]ubshhh}rR (h]h]h]h]rS (UsvnrT jP jI eh]rU (hzheeuhMhhh}rV (jP jBjI jL uh]rW (h)rX }rY (hXSVNrZ hj?hhhhh}r[ (h]h]h]h]h]uhMhhh]r\ hXSVNr] r^ }r_ (hjZ hjX ubaubj )r` }ra (hUhj?hNhj#h}rb (h]h]h]h]h]Uentries]rc (j'X>buildbot.steps.source.svn.SVN (class in buildbot.steps.source)htUtrd auhNhhh]ubjj)re }rf (hUhj?hNhjmh}rg (jojpXpyh]h]h]h]h]jqXclassrh jsjh uhNhhh]ri (ju)rj }rk (hXbuildbot.steps.source.svn.SVNhje hhhjxh}rl (h]rm htaj{j|h]h]h]h]rn htaj~Xbuildbot.steps.source.svn.SVNjXbuildbot.steps.source.svnjuhMhhh]ro (j)rp }rq (hXclass hjj hhhjh}rr (h]h]h]h]h]uhMhhh]rs hXclass rt ru }rv (hUhjp ubaubj)rw }rx (hXbuildbot.steps.source.svn.hjj hhhjh}ry (h]h]h]h]h]uhMhhh]rz hXbuildbot.steps.source.svn.r{ r| }r} (hUhjw ubaubj)r~ }r (hXSVNhjj hhhjh}r (h]h]h]h]h]uhMhhh]r hXSVNr r }r (hUhj~ ubaubeubj)r }r (hUhje hhhjh}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 r r }r (hXThe hj ubh)r }r (hX:bb:step:`SVN`r hj hhhhh}r (UreftypeXsteph͉hXSVNU 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 hXSVNr r }r (hUhj ubahhubaubhX build step performs a r r }r (hX build step performs a hj ubj)r }r (hX,`Subversion `_h}r (UnameX SubversionjXhttp://subversion.tigris.orgr h]h]h]h]h]uhj h]r hX Subversionr r }r (hUhj ubahjubh)r }r (hX hKhj hhh}r (Urefurij h]r U subversionr ah]h]h]h]r hauh]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 (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 (UreftypeXsteph͉hXSVNU 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 hXSVNr r }r (hUhj ubahhubaubhX! step should be created with the r r }r (hX! step should be created with the hj ubh)r }r (hX ``repourl``h}r (h]h]h]h]h]uhj h]r hXrepourlr r }r (hUhj ubahhubhX argument:r r }r (hX argument:hj ubeubj)r }r (hUhj?hhhjh}r (h]h]h]h]h]uhNhhh]r j)r }r (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. 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 (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.hj hhhhh}r (h]h]h]h]h]uhMh]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 ubj)r }r (hX:command:`svn checkout`h}r(h]h]rjah]h]h]uhj h]rhX svn checkoutrr}r(hUhj ubahj ubhX 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 rr}r(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)r }r (hX``Interpolate``h}r (h]h]h]h]h]uhj h]r hX Interpolater r}r(hUhj ubahhubhXN. For example, if you wanted to check out the trunk repository, you could use rr}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]r hXhttp://svn.example.com/reposr!r"}r#(hUhjubahhubhX", 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 directly use r.r/}r0(hX" sub-tree, you would directly use hj ubh)r1}r2(hX5``repourl="http://svn.example.com/repos/trunk/calc"``h}r3(h]h]h]h]h]uhj h]r4hX1repourl="http://svn.example.com/repos/trunk/calc"r5r6}r7(hUhj1ubahhubhX as an argument to your r8r9}r:(hX as an argument to your hj ubh)r;}r<(hX:bb:step:`SVN`r=hj hhhhh}r>(UreftypeXsteph͉hXSVNU refdomainXbbr?h]h]U refexplicith]h]h]hhuhMh]r@h)rA}rB(hj=h}rC(h]h]rD(hj?Xbb-steprEeh]h]h]uhj;h]rFhXSVNrGrH}rI(hUhjAubahhubaubhX step.rJrK}rL(hX step.hj ubeubahjubeubaubh)rM}rN(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}rO(h]h]h]h]h]uhMhhh]rP(hXGIf you are building from multiple branches, then you should create the rQrR}rS(hXGIf you are building from multiple branches, then you should create the hjMubh)rT}rU(hX:bb:step:`SVN`rVhjMhhhhh}rW(UreftypeXsteph͉hXSVNU refdomainXbbrXh]h]U refexplicith]h]h]hhuhMh]rYh)rZ}r[(hjVh}r\(h]h]r](hjXXbb-stepr^eh]h]h]uhjTh]r_hXSVNr`ra}rb(hUhjZubahhubaubhX step with the rcrd}re(hX step with the hjMubh)rf}rg(hX ``repourl``h}rh(h]h]h]h]h]uhjMh]rihXrepourlrjrk}rl(hUhjfubahhubhX% and provide branch information with rmrn}ro(hX% and provide branch information with hjMubh)rp}rq(hX``Interpolate``h}rr(h]h]h]h]h]uhjMh]rshX Interpolatertru}rv(hUhjpubahhubhX:rw}rx(hX:hjMubeubj>)ry}rz(hXfrom buildbot.steps.source.svn import SVN factory.addStep(SVN(mode='incremental', repourl=Interpolate('svn://svn.example.org/svn/%(src::branch)s/myproject')))hj?hhhjAh}r{(jCjDh]h]h]h]h]uhMhhh]r|hXfrom buildbot.steps.source.svn import SVN factory.addStep(SVN(mode='incremental', repourl=Interpolate('svn://svn.example.org/svn/%(src::branch)s/myproject')))r}r~}r(hUhjyubaubh)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]uhMhhh]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(UreftypeXsteph͉hXSVNU refdomainXbbrh]h]U refexplicith]h]h]hhuhMh]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXSVNrr}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:hjubeubj>)r}r(hXfrom buildbot.steps.source.svn import SVN factory.addStep(SVN(mode='full', repourl='svn://svn.example.org/svn/myproject/trunk'))hj?hhhjAh}r(jCjDh]h]h]h]h]uhMhhh]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. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``username``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXusernamerr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXa(optional): if specified, this will be passed to the ``svn`` binary with a ``--username`` option.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX5(optional): if specified, this will be passed to the rr}r(hX5(optional): if specified, this will be passed to the hjubh)r}r(hX``svn``h}r(h]h]h]h]h]uhjh]rhXsvnrr}r(hUhjubahhubhX binary with a rr}r(hX binary with a hjubh)r}r(hX``--username``h}r(h]h]h]h]h]uhjh]rhX --usernamerr}r(hUhjubahhubhX option.rr}r(hX option.hjubeubahjubeubj)r}r(hXo``password`` (optional): if specified, this will be passed to the ``svn`` binary with a ``--password`` option. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``password``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXpasswordrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXa(optional): if specified, this will be passed to the ``svn`` binary with a ``--password`` option.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX5(optional): if specified, this will be passed to the rr}r(hX5(optional): if specified, this will be passed to the hjubh)r}r(hX``svn``h}r(h]h]h]h]h]uhjh]rhXsvnrr}r(hUhjubahhubhX binary with a rr }r (hX binary with a hjubh)r }r (hX``--password``h}r (h]h]h]h]h]uhjh]rhX --passwordrr}r(hUhj ubahhubhX option.rr}r(hX option.hjubeubahjubeubj)r}r(hX{``extra_args`` (optional): if specified, an array of strings that will be passed as extra arguments to the ``svn`` binary. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``extra_args``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r (h]h]h]h]h]uhjh]r!hX extra_argsr"r#}r$(hUhjubahhubaubj)r%}r&(hUh}r'(h]h]h]h]h]uhjh]r(h)r)}r*(hXk(optional): if specified, an array of strings that will be passed as extra arguments to the ``svn`` binary.hj%hhhhh}r+(h]h]h]h]h]uhMh]r,(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the r-r.}r/(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the hj)ubh)r0}r1(hX``svn``h}r2(h]h]h]h]h]uhj)h]r3hXsvnr4r5}r6(hUhj0ubahhubhX binary.r7r8}r9(hX binary.hj)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. hjhhhjh}r<(h]h]h]h]h]uhMhhh]r=(j)r>}r?(hX``keep_on_purge``r@hj:hhhjh}rA(h]h]h]h]h]uhMh]rBh)rC}rD(hj@h}rE(h]h]h]h]h]uhj>h]rFhX keep_on_purgerGrH}rI(hUhjCubahhubaubj)rJ}rK(hUh}rL(h]h]h]h]h]uhj:h]rMh)rN}rO(hX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.rPhjJhhhhh}rQ(h]h]h]h]h]uhMh]rRhX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.rSrT}rU(hjPhjNubaubahjubeubj)rV}rW(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. hjhhhjh}rX(h]h]h]h]h]uhM hhh]rY(j)rZ}r[(hX ``depth``r\hjVhhhjh}r](h]h]h]h]h]uhM h]r^h)r_}r`(hj\h}ra(h]h]h]h]h]uhjZh]rbhXdepthrcrd}re(hUhj_ubahhubaubj)rf}rg(hUh}rh(h]h]h]h]h]uhjVh]ri(h)rj}rk(hXt(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.rlhjfhhhhh}rm(h]h]h]h]h]uhMh]rnhXt(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.rorp}rq(hjlhjjubaubh)rr}rs(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.hjfhhhhh}rt(h]h]h]h]h]uhMh]ru(hX If set to rvrw}rx(hX If set to hjrubh)ry}rz(hX ``empty``h}r{(h]h]h]h]h]uhjrh]r|hXemptyr}r~}r(hUhjyubahhubhXU 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 hjrubh)r}r(hX ``files``h}r(h]h]h]h]h]uhjrh]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 hjrubh)r}r(hX``immediates``h}r(h]h]h]h]h]uhjrh]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 hjrubh)r}r(hX ``infinity``h}r(h]h]h]h]h]uhjrh]rhXinfinityrr}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.rr}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.hjrubeubehjubeubj)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. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``preferLastChangedRev``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXpreferLastChangedRevrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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]uhMh]r(hX(optional): By default, the rr}r(hX(optional): By default, the hjubh)r}r(hX``got_revision``h}r(h]h]h]h]h]uhjh]rhX got_revisionrr}r(hUhjubahhubhXH property is set to the repository's global revision ("Revision" in the rr}r(hXH property is set to the repository's global revision ("Revision" in the hjubj_)r}r(hX `svn info`h}r(h]h]h]h]h]uhjh]rhXsvn inforr}r(hUhjubahjgubhX output). Set this parameter to rr}r(hX output). Set this parameter to hjubh)r}r(hX``True``h}r(h]h]h]h]h]uhjh]rhXTruerr}r(hUhjubahhubhX2 to have it set to the "Last Changed Rev" instead.rr}r(hX2 to have it set to the "Last Changed Rev" instead.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(hUhjubahhubeubjc)r}r(hUhj?hNhjfh}r(h]h]h]h]h]uhNhhh]r(h)r}r(hXZSVN's incremental mode does not require a method. The full mode has five methods defined:rhjhhhhh}r(h]h]h]h]h]uhMh]rhXZSVN's incremental mode does not require a method. The full mode has five methods defined:rr}r(hjhjubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(hXV``clobber`` It removes the working directory for each build then makes 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]r hXclobberr r }r (hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXIIt removes the working directory for each build then makes full checkout.rhjhhhhh}r(h]h]h]h]h]uhMh]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``. hjhhhjh}r(h]h]h]h]h]uhM h]r(j)r}r(hX ``fresh``r hjhhhjh}r!(h]h]h]h]h]uhM h]r"h)r#}r$(hj h}r%(h]h]h]h]h]uhjh]r&hXfreshr'r(}r)(hUhj#ubahhubaubj)r*}r+(hUh}r,(h]h]h]h]h]uhjh]r-h)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``.hj*hhhhh}r0(h]h]h]h]h]uhMh]r1(hXThis always always purges local changes before updating. This deletes unversioned files and reverts everything that would appear in a r2r3}r4(hXThis always always purges local changes before updating. This deletes unversioned files and reverts everything that would appear in a hj.ubj)r5}r6(hX!:command:`svn status --no-ignore`h}r7(h]h]r8jah]h]h]uhj.h]r9hXsvn status --no-ignorer:r;}r<(hUhj5ubahj ubhX1. This is equivalent to the old update mode with r=r>}r?(hX1. This is equivalent to the old update mode with hj.ubh)r@}rA(hX``always_purge``h}rB(h]h]h]h]h]uhj.h]rChX always_purgerDrE}rF(hUhj@ubahhubhX.rG}rH(hX.hj.ubeubahjubeubj)rI}rJ(hXq``clean`` This is same as fresh except that it deletes all unversioned files generated by :command:`svn status`. hjhhhjh}rK(h]h]h]h]h]uhM$h]rL(j)rM}rN(hX ``clean``rOhjIhhhjh}rP(h]h]h]h]h]uhM$h]rQh)rR}rS(hjOh}rT(h]h]h]h]h]uhjMh]rUhXcleanrVrW}rX(hUhjRubahhubaubj)rY}rZ(hUh}r[(h]h]h]h]h]uhjIh]r\h)r]}r^(hXfThis is same as fresh except that it deletes all unversioned files generated by :command:`svn status`.hjYhhhhh}r_(h]h]h]h]h]uhM#h]r`(hXPThis is same as fresh except that it deletes all unversioned files generated by rarb}rc(hXPThis is same as fresh except that it deletes all unversioned files generated by hj]ubj)rd}re(hX:command:`svn status`h}rf(h]h]rgjah]h]h]uhj]h]rhhX svn statusrirj}rk(hUhjdubahj ubhX.rl}rm(hX.hj]ubeubahjubeubj)rn}ro(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}rp(h]h]h]h]h]uhM-h]rq(j)rr}rs(hX``copy``rthjnhhhjh}ru(h]h]h]h]h]uhM-h]rvh)rw}rx(hjth}ry(h]h]h]h]h]uhjrh]rzhXcopyr{r|}r}(hUhjwubahhubaubj)r~}r(hUh}r(h]h]h]h]h]uhjnh]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.hj~hhhhh}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(hUhjubahhubhX 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. hjhhhjh}r(h]h]h]h]h]uhM2h]r(j)r}r(hX ``export``rhjhhhjh}r(h]h]h]h]h]uhM2h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXexportrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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.hjhhhhh}r(h]h]h]h]h]uhM0h]r(hX Similar to rr}r(hX Similar to hjubh)r}r(hX``method='copy'``h}r(h]h]h]h]h]uhjh]rhX method='copy'rr}r(hUhjubahhubhX, except using rr}r(hX, except using hjubh)r}r(hX``svn export``h}r(h]h]h]h]h]uhjh]rhX svn exportrr}r(hUhjubahhubhX0 to create build directory so that there are no rr}r(hX0 to create build directory so that there are no hjubh)r}r(hX``.svn``h}r(h]h]h]h]h]uhjh]rhX.svnrr}r(hUhjubahhubhX$ directories in the build directory.rr}r(hX$ directories in the build directory.hjubeubahjubeubehjubeubh)r}r(hXnIf you are using branches, you must also make sure your ``ChangeSource`` will report the correct branch names.hj?hhhhh}r(h]h]h]h]h]uhM4hhh]r(hX8If you are using branches, you must also make sure your rr}r(hX8If you are using branches, you must also make sure your hjubh)r}r(hX``ChangeSource``h}r(h]h]h]h]h]uhjh]rhX ChangeSourcerr}r(hUhjubahhubhX& will report the correct branch names.rr}r(hX& will report the correct branch names.hjubeubj )r}r(hUhj?hhhj#h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; CVSXstep-CVSrjtr(UsingleXCVS Build StepjjtreuhM8hhh]ubh)r}r(hUhj?hhhhh}r(h]h]h]h]h]hjuhM8hhh]ubj=eubhhh}hhh}r(h]h]h]h]h]hUstep-cvsruhM9hhh}rjjsh]ubshhh}r(h]rXcvsrah]h]h]r(Ucvsrjjeh]rh auhM<hhh}r(jjjj=uh]r(h)r}r(hXCVSrhj:hhhhh}r (h]h]h]h]h]uhM<hhh]r hXCVSr r }r (hjhjubaubj )r}r(hUhj:hNhj#h}r(h]h]h]h]h]Uentries]r(j'X>buildbot.steps.source.cvs.CVS (class in buildbot.steps.source)hAUtrauhNhhh]ubjj)r}r(hUhj:hNhjmh}r(jojpXpyh]h]h]h]h]jqXclassrjsjuhNhhh]r(ju)r}r(hXbuildbot.steps.source.cvs.CVShjhhhjxh}r(h]rhAaj{j|h]h]h]h]rhAaj~Xbuildbot.steps.source.cvs.CVSjXbuildbot.steps.source.cvsjuhM?hhh]r(j)r}r(hXclass hjhhhjh}r (h]h]h]h]h]uhM?hhh]r!hXclass r"r#}r$(hUhjubaubj)r%}r&(hXbuildbot.steps.source.cvs.hjhhhjh}r'(h]h]h]h]h]uhM?hhh]r(hXbuildbot.steps.source.cvs.r)r*}r+(hUhj%ubaubj)r,}r-(hXCVShjhhhjh}r.(h]h]h]h]h]uhM?hhh]r/hXCVSr0r1}r2(hUhj,ubaubeubj)r3}r4(hUhjhhhjh}r5(h]h]h]h]h]uhM?hhh]ubeubh)r6}r7(hXcThe :bb:step:`CVS` build step performs a `CVS `_ checkout or update. ::hj:hhhhh}r8(h]h]h]h]h]uhM@hhh]r9(hXThe r:r;}r<(hXThe hj6ubh)r=}r>(hX:bb:step:`CVS`r?hj6hhhhh}r@(UreftypeXsteph͉hXCVSU refdomainXbbrAh]h]U refexplicith]h]h]hhuhM@h]rBh)rC}rD(hj?h}rE(h]h]rF(hjAXbb-steprGeh]h]h]uhj=h]rHhXCVSrIrJ}rK(hUhjCubahhubaubhX build step performs a rLrM}rN(hX build step performs a hj6ubj)rO}rP(hX#`CVS `_h}rQ(UnameXCVSjXhttp://www.nongnu.org/cvs/rRh]h]h]h]h]uhj6h]rShXCVSrTrU}rV(hUhjOubahjubh)rW}rX(hX hKhj6hhh}rY(UrefurijRh]rZUid6r[ah]h]h]h]r\jauh]ubhX checkout or update.r]r^}r_(hX checkout or update.hj6ubeubj>)r`}ra(hXfrom buildbot.steps.source.cvs import CVS factory.addStep(CVS(mode='incremental', cvsroot=':pserver:me@cvs.sourceforge.net:/cvsroot/myproj', cvsmodule='buildbot'))hj:hhhjAh}rb(jCjDh]h]h]h]h]uhMChhh]rchXfrom buildbot.steps.source.cvs import CVS factory.addStep(CVS(mode='incremental', cvsroot=':pserver:me@cvs.sourceforge.net:/cvsroot/myproj', cvsmodule='buildbot'))rdre}rf(hUhj`ubaubh)rg}rh(hX(This step takes the following arguments:rihj:hhhhh}rj(h]h]h]h]h]uhMHhhh]rkhX(This step takes the following arguments:rlrm}rn(hjihjgubaubj)ro}rp(hUhj:hhhjh}rq(h]h]h]h]h]uhNhhh]rr(j)rs}rt(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``. hjohhhjh}ru(h]h]h]h]h]uhMOh]rv(j)rw}rx(hX ``cvsroot``ryhjshhhjh}rz(h]h]h]h]h]uhMOh]r{h)r|}r}(hjyh}r~(h]h]h]h]h]uhjwh]rhXcvsrootrr}r(hUhj|ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjsh]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]uhMKh]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``. hjohhhjh}r(h]h]h]h]h]uhMThhh]r(j)r}r(hX ``cvsmodule``rhjhhhjh}r(h]h]h]h]h]uhMTh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX cvsmodulerr}r(hUhjubahhubaubj)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]uhMRh]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]rhXmodulerr}r(hUhjubahhubhXb, which is generally a subdirectory of the CVSROOT. The cvsmodule for the Buildbot source code is rr}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]rhXbuildbotrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(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``. hjohhhjh}r(h]h]h]h]h]uhMXhhh]r(j)r}r(hX ``branch``rhjhhhjh}r(h]h]h]h]h]uhMXh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXbranchrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXa string which will be used in a ``-r`` argument. This is most useful for specifying a branch to work on. Defaults to ``HEAD``.hjhhhhh}r(h]h]h]h]h]uhMWh]r(hX!a string which will be used in a rr}r(hX!a string which will be used in a hjubh)r}r(hX``-r``h}r(h]h]h]h]h]uhjh]rhX-rrr}r(hUhjubahhubhXO argument. This is most useful for specifying a branch to work on. Defaults to rr}r(hXO argument. This is most useful for specifying a branch to work on. Defaults to hjubh)r}r(hX``HEAD``h}r(h]h]h]h]h]uhjh]rhXHEADrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(hXb``global_options`` a list of flags to be put before the argument ``checkout`` in the CVS command. hjohhhjh}r(h]h]h]h]h]uhM\hhh]r(j)r}r(hX``global_options``rhjhhhjh}r(h]h]h]h]h]uhM\h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXglobal_optionsrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXNa list of flags to be put before the argument ``checkout`` in the CVS command.hjhhhhh}r (h]h]h]h]h]uhM[h]r (hX.a list of flags to be put before the argument r r }r (hX.a list of flags to be put before the argument 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.hjubeubahjubeubj)r}r(hXW``extra_options`` a list of flags to be put after the ``checkout`` in the CVS command. hjohhhjh}r(h]h]h]h]h]uhM_hhh]r(j)r}r(hX``extra_options``rhjhhhjh}r(h]h]h]h]h]uhM_h]r h)r!}r"(hjh}r#(h]h]h]h]h]uhjh]r$hX extra_optionsr%r&}r'(hUhj!ubahhubaubj)r(}r)(hUh}r*(h]h]h]h]h]uhjh]r+h)r,}r-(hXDa list of flags to be put after the ``checkout`` in the CVS command.hj(hhhhh}r.(h]h]h]h]h]uhM_h]r/(hX$a list of flags to be put after the r0r1}r2(hX$a list of flags to be put after the hj,ubh)r3}r4(hX ``checkout``h}r5(h]h]h]h]h]uhj,h]r6hXcheckoutr7r8}r9(hUhj3ubahhubhX in the CVS command.r:r;}r<(hX in the CVS command.hj,ubeubahjubeubeubh)r=}r>(hX``mode`` ``method``hj:hhhhh}r?(h]h]h]h]h]uhMahhh]r@(h)rA}rB(hX``mode``h}rC(h]h]h]h]h]uhj=h]rDhXmoderErF}rG(hUhjAubahhubhX rH}rI(hX hj=ubh)rJ}rK(hX ``method``h}rL(h]h]h]h]h]uhj=h]rMhXmethodrNrO}rP(hUhjJubahhubeubjc)rQ}rR(hUhj:hNhjfh}rS(h]h]h]h]h]uhNhhh]rT(h)rU}rV(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``.hjQhhhhh}rW(h]h]h]h]h]uhMdh]rX(hX:No method is needed for incremental mode. For full mode, rYrZ}r[(hX:No method is needed for incremental mode. For full mode, hjUubh)r\}r](hX ``method``h}r^(h]h]h]h]h]uhjUh]r_hXmethodr`ra}rb(hUhj\ubahhubhXG can take the values shown below. If no value is given, it defaults to rcrd}re(hXG can take the values shown below. If no value is given, it defaults to hjUubh)rf}rg(hX ``fresh``h}rh(h]h]h]h]h]uhjUh]rihXfreshrjrk}rl(hUhjfubahhubhX.rm}rn(hX.hjUubeubj)ro}rp(hUh}rq(h]h]h]h]h]uhjQh]rr(j)rs}rt(hXO``clobber`` This specifies to remove the ``workdir`` and make a full checkout. hjohhhjh}ru(h]h]h]h]h]uhMih]rv(j)rw}rx(hX ``clobber``ryhjshhhjh}rz(h]h]h]h]h]uhMih]r{h)r|}r}(hjyh}r~(h]h]h]h]h]uhjwh]rhXclobberrr}r(hUhj|ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjsh]rh)r}r(hXBThis specifies to remove the ``workdir`` and make a full checkout.hjhhhhh}r(h]h]h]h]h]uhMih]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. hjohhhjh}r(h]h]h]h]h]uhMmh]r(j)r}r(hX ``fresh``rhjhhhjh}r(h]h]h]h]h]uhMmh]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 ``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]uhMlh]r(hXThis method first runs rr}r(hXThis method first runs hjubh)r}r(hX ``cvsdisard``h}r(h]h]h]h]h]uhjh]rhX cvsdisardrr}r(hUhjubahhubhX9 in the build directory, then updates it. This requires rr}r(hX9 in the build directory, then updates it. This requires hjubh)r}r(hX``cvsdiscard``h}r(h]h]h]h]h]uhjh]rhX cvsdiscardrr}r(hUhjubahhubhX( which is a part of the cvsutil package.rr}r(hX( which is a part of the cvsutil package.hjubeubahjubeubj)r}r(hXx``clean`` This method is the same as ``method='fresh'``, but it runs ``cvsdiscard --ignore`` instead of ``cvsdiscard``. hjohhhjh}r(h]h]h]h]h]uhMqh]r(j)r}r(hX ``clean``rhjhhhjh}r(h]h]h]h]h]uhMqh]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(hXmThis method is the same as ``method='fresh'``, but it runs ``cvsdiscard --ignore`` instead of ``cvsdiscard``.hjhhhhh}r(h]h]h]h]h]uhMph]r(hXThis method is the same as rr}r(hXThis method is the same as hjubh)r}r(hX``method='fresh'``h}r(h]h]h]h]h]uhjh]rhXmethod='fresh'rr}r(hUhjubahhubhX, but it runs rr}r(hX, but it runs hjubh)r}r(hX``cvsdiscard --ignore``h}r(h]h]h]h]h]uhjh]rhXcvsdiscard --ignorerr}r(hUhjubahhubhX instead of rr}r(hX instead of hjubh)r}r(hX``cvsdiscard``h}r(h]h]h]h]h]uhjh]rhX cvsdiscardrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(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. hjohhhjh}r(h]h]h]h]h]uhMvh]r(j)r}r(hX``copy``rhjhhhjh}r(h]h]h]h]h]uhMvh]rh)r}r (hjh}r (h]h]h]h]h]uhjh]r hXcopyr r }r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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.hjhhhhh}r(h]h]h]h]h]uhMth]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.r!r"}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-Bzrr(j(tr)(UsingleXBzr Build Stepj(j(tr*euhMyhhh]ubh)r+}r,(hUhj:hhhhh}r-(h]h]h]h]h]hj(uhMyhhh]ubj8eubhhh}hhh}r.(h]h]h]h]h]hUstep-bzrr/uhMzhhh}r0j(j+sh]ubshhh}r1(h]h]h]h]r2(Ubzrr3j/j(eh]r4(h~heuhM}hhh}r5(j(j+j/j8uh]r6(h)r7}r8(hXBzrr9hj5hhhhh}r:(h]h]h]h]h]uhM}hhh]r;hXBzrr<r=}r>(hj9hj7ubaubj )r?}r@(hUhj5hNhj#h}rA(h]h]h]h]h]Uentries]rB(j'X>buildbot.steps.source.bzr.Bzr (class in buildbot.steps.source)hUtrCauhNhhh]ubjj)rD}rE(hUhj5hNhjmh}rF(jojpXpyh]h]h]h]h]jqXclassrGjsjGuhNhhh]rH(ju)rI}rJ(hXbuildbot.steps.source.bzr.BzrhjDhhhjxh}rK(h]rLhaj{j|h]h]h]h]rMhaj~Xbuildbot.steps.source.bzr.BzrjXbuildbot.steps.source.bzrjuhMhhh]rN(j)rO}rP(hXclass hjIhhhjh}rQ(h]h]h]h]h]uhMhhh]rRhXclass rSrT}rU(hUhjOubaubj)rV}rW(hXbuildbot.steps.source.bzr.hjIhhhjh}rX(h]h]h]h]h]uhMhhh]rYhXbuildbot.steps.source.bzr.rZr[}r\(hUhjVubaubj)r]}r^(hXBzrhjIhhhjh}r_(h]h]h]h]h]uhMhhh]r`hXBzrrarb}rc(hUhj]ubaubeubj)rd}re(hUhjDhhhjh}rf(h]h]h]h]h]uhMhhh]ubeubh)rg}rh(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. ::hj5hhhhh}ri(h]h]h]h]h]uhMhhh]rj(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply rkrl}rm(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply hjgubj_)rn}ro(hX`Bazaar`h}rp(h]h]h]h]h]uhjgh]rqhXBazaarrrrs}rt(hUhjnubahjgubhX. 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.rurv}rw(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.hjgubeubj>)rx}ry(hXfrom buildbot.steps.source.bzr import Bzr factory.addStep(Bzr(mode='incremental', repourl='lp:~knielsen/maria/tmp-buildbot-test'))hj5hhhjAh}rz(jCjDh]h]h]h]h]uhMhhh]r{hXfrom buildbot.steps.source.bzr import Bzr factory.addStep(Bzr(mode='incremental', repourl='lp:~knielsen/maria/tmp-buildbot-test'))r|r}}r~(hUhjxubaubh)r}r(hX'The step takes the following arguments:rhj5hhhhh}r(h]h]h]h]h]uhMhhh]rhX'The step takes the following arguments:rr}r(hjhjubaubj)r}r(hUhj5hhhjh}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 rr}r(hX(required unless hjubh)r}r(hX ``baseURL``h}r(h]h]h]h]h]uhjh]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.hjubeubahjubeubj)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``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXbaseURLrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(required unless rr}r(hX(required unless hjubh)r}r(hX ``repourl``h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubhXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.rr}r(hXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hjubeubahjubeubj)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}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``defaultBranch``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX defaultBranchrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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 ``bzr checkout`` command.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX(allowed if and only if rr}r(hX(allowed if and only if hjubh)r}r(hX ``baseURL``h}r(h]h]h]h]h]uhjh]rhXbaseURLrr}r(hUhjubahhubhX 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 rr}r(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 hjubh)r}r(hX ``baseURL``h}r(h]h]h]h]h]uhjh]rhXbaseURLrr}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``bzr checkout``h}r(h]h]h]h]h]uhjh]rhX bzr checkoutrr }r (hUhjubahhubhX command.r r }r (hX command.hjubeubahjubeubeubh)r}r(hX``mode`` ``method``hj5hhhhh}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!(hUhjubahhubeubjc)r"}r#(hUhj5hNhjfh}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``.hj"hhhhh}r((h]h]h]h]h]uhMh]r)(hX:No method is needed for incremental mode. For full mode, r*r+}r,(hX:No method is needed for incremental mode. For full mode, hj&ubh)r-}r.(hX ``method``h}r/(h]h]h]h]h]uhj&h]r0hXmethodr1r2}r3(hUhj-ubahhubhXG can take the values shown below. If no value is given, it defaults to r4r5}r6(hXG can take the values shown below. If no value is given, it defaults to hj&ubh)r7}r8(hX ``fresh``h}r9(h]h]h]h]h]uhj&h]r:hXfreshr;r<}r=(hUhj7ubahhubhX.r>}r?(hX.hj&ubeubj)r@}rA(hUh}rB(h]h]h]h]h]uhj"h]rC(j)rD}rE(hXO``clobber`` This specifies to remove the ``workdir`` and make a full checkout. hj@hhhjh}rF(h]h]h]h]h]uhMh]rG(j)rH}rI(hX ``clobber``rJhjDhhhjh}rK(h]h]h]h]h]uhMh]rLh)rM}rN(hjJh}rO(h]h]h]h]h]uhjHh]rPhXclobberrQrR}rS(hUhjMubahhubaubj)rT}rU(hUh}rV(h]h]h]h]h]uhjDh]rWh)rX}rY(hXBThis specifies to remove the ``workdir`` and make a full checkout.hjThhhhh}rZ(h]h]h]h]h]uhMh]r[(hXThis specifies to remove the r\r]}r^(hXThis specifies to remove the hjXubh)r_}r`(hX ``workdir``h}ra(h]h]h]h]h]uhjXh]rbhXworkdirrcrd}re(hUhj_ubahhubhX and make a full checkout.rfrg}rh(hX and make a full checkout.hjXubeubahjubeubj)ri}rj(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. hj@hhhjh}rk(h]h]h]h]h]uhMh]rl(j)rm}rn(hX ``fresh``rohjihhhjh}rp(h]h]h]h]h]uhMh]rqh)rr}rs(hjoh}rt(h]h]h]h]h]uhjmh]ruhXfreshrvrw}rx(hUhjrubahhubaubj)ry}rz(hUh}r{(h]h]h]h]h]uhjih]r|h)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.hjyhhhhh}r(h]h]h]h]h]uhMh]r(hXThis method first runs rr}r(hXThis method first runs hj}ubh)r}r(hX``bzr clean-tree``h}r(h]h]h]h]h]uhj}h]rhXbzr clean-treerr}r(hUhjubahhubhX* to remove all the unversioned files then rr}r(hX* to remove all the unversioned files then hj}ubh)r}r(hX ``update``h}r(h]h]h]h]h]uhj}h]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.hj}ubeubahjubeubj)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``. hj@hhhjh}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]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]rhXbzr clean-tree --ignorerr}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. hj@hhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX``copy``rhjhhhjh}r(h]h]h]h]h]uhMh]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(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.hjhhhhh}r(h]h]h]h]h]uhMh]r(hX?A local bzr repository is maintained and the repo is copied to rr}r(hX?A local bzr repository is maintained and the repo is copied to hjubh)r}r(hX ``build``h}r(h]h]h]h]h]uhjh]rhXbuildrr}r(hUhjubahhubhXZ directory for each build. Before each build the local bzr repo is updated then copied to rr}r(hXZ directory for each build. Before each build the local bzr repo is updated then copied to hjubh)r}r(hX ``build``h}r(h]h]h]h]h]uhjh]rhXbuildrr}r(hUhjubahhubhX for next steps.rr}r(hX for next steps.hjubeubahjubeubehjubeubj )r}r(hUhj5hhhj#h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; P4j0j0tr(UsingleX P4 Build Stepj0j0treuhMhhh]ubj3eubhhhhh}r(h]h]h]h]h]hj0uhMhhh]ubsh]r(h)r}r(hXP4rhj+hhhhh}r(h]h]h]h]h]uhMhhh]rhXP4rr}r(hjhjubaubj )r}r(hUhj+hNhj#h}r(h]h]h]h]h]Uentries]r(j'X<buildbot.steps.source.p4.P4 (class in buildbot.steps.source)h(UtrauhNhhh]ubjj)r}r(hUhj+hNhjmh}r(jojpXpyh]h]h]h]h]jqXclassrjsjuhNhhh]r(ju)r}r(hXbuildbot.steps.source.p4.P4hjhhhjxh}r(h]rh(aj{j|h]h]h]h]r h(aj~Xbuildbot.steps.source.p4.P4jXbuildbot.steps.source.p4juhMhhh]r (j)r }r (hXclass hjhhhjh}r (h]h]h]h]h]uhMhhh]rhXclass rr}r(hUhj ubaubj)r}r(hXbuildbot.steps.source.p4.hjhhhjh}r(h]h]h]h]h]uhMhhh]rhXbuildbot.steps.source.p4.rr}r(hUhjubaubj)r}r(hXP4hjhhhjh}r(h]h]h]h]h]uhMhhh]rhXP4rr}r(hUhjubaubeubj)r }r!(hUhjhhhjh}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 r'r(}r)(hXThe hj#ubh)r*}r+(hX :bb:step:`P4`r,hj#hhhhh}r-(UreftypeXsteph͉hXP4U refdomainXbbr.h]h]U refexplicith]h]h]hhuhMh]r/h)r0}r1(hj,h}r2(h]h]r3(hj.Xbb-stepr4eh]h]h]uhj*h]r5hXP4r6r7}r8(hUhj0ubahhubaubhX build step creates a r9r:}r;(hX build step creates a hj#ubj)r<}r=(hX&`Perforce `_h}r>(UnameXPerforcejXhttp://www.perforce.com/r?h]h]h]h]h]uhj#h]r@hXPerforcerArB}rC(hUhj<ubahjubh)rD}rE(hX hKhj#hhh}rF(Urefurij?h]rGUperforcerHah]h]h]h]rIhRauh]ubhX- client specification and performs an update.rJrK}rL(hX- client specification and performs an update.hj#ubeubj>)rM}rN(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+hhhjAh}rO(jCjDh]h]h]h]h]uhMhhh]rPhXOfrom 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', ))rQrR}rS(hUhjMubaubh)rT}rU(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}rV(h]h]h]h]h]uhMhhh]rW(hXGYou can specify the client spec in two different ways. You can use the rXrY}rZ(hXGYou can specify the client spec in two different ways. You can use the hjTubh)r[}r\(hX ``p4base``h}r](h]h]h]h]h]uhjTh]r^hXp4baser_r`}ra(hUhj[ubahhubhX, rbrc}rd(hX, hjTubh)re}rf(hX ``p4branch``h}rg(h]h]h]h]h]uhjTh]rhhXp4branchrirj}rk(hUhjeubahhubhX, and (optionally) rlrm}rn(hX, and (optionally) hjTubh)ro}rp(hX``p4extra_views``h}rq(h]h]h]h]h]uhjTh]rrhX p4extra_viewsrsrt}ru(hUhjoubahhubhX2 to build up the viewspec, or you can utilize the rvrw}rx(hX2 to build up the viewspec, or you can utilize the hjTubh)ry}rz(hX``p4viewspec``h}r{(h]h]h]h]h]uhjTh]r|hX p4viewspecr}r~}r(hUhjyubahhubhX2 to specify the whole viewspec as a set of tuples.rr}r(hX2 to specify the whole viewspec as a set of tuples.hjTubeubh)r}r(hX6Using 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(hX5Using p4viewspec will allow you to add lines such as:hjubaubj>)r}r(hX|//depot/branch/mybranch/... ///... -//depot/branch/mybranch/notthisdir/... ///notthisdir/...hj+hhhjAh}r(jCjDh]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]uhMhhh]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 rr}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]rhX p4extra_viewsrr}r(hUhjubahhubhX2 you will receive a configuration error exception.rr}r(hX2 you will receive a configuration error exception.hjubeubj)r}r(hUhj+hhhjh}r(h]h]h]h]h]uhNhhh]r(j)r}r(hXn``p4base`` A view into the Perforce depot without branch name or trailing "/...". Typically ``//depot/proj``. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``p4base``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXp4baserr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXbA view into the Perforce depot without branch name or trailing "/...". Typically ``//depot/proj``.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXQA view into the Perforce depot without branch name or trailing "/...". Typically rr}r(hXQA view into the Perforce depot without branch name or trailing "/...". Typically hjubh)r}r(hX``//depot/proj``h}r(h]h]h]h]h]uhjh]rhX //depot/projrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(hX``p4branch`` (optional): A single string, which is appended to the p4base as follows ``//...`` to form the first line in the viewspec hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``p4branch``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXp4branchrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rj)r}r(hUh}r(h]h]h]h]h]uhjh]rj)r}r(hX(optional): A single string, which is appended to the p4base as follows ``//...`` to form the first line in the viewspec hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hXG(optional): A single string, which is appended to the p4base as followsrhjhhhjh}r(h]h]h]h]h]uhMh]r hXG(optional): A single string, which is appended to the p4base as followsr r }r (hjhjubaubj)r }r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hXB``//...`` to form the first line in the viewspechj hhhhh}r(h]h]h]h]h]uhMh]r(h)r}r(hX``//...``h}r(h]h]h]h]h]uhjh]rhX//...rr}r(hUhjubahhubhX' to form the first line in the viewspecrr}r(hX' to form the first line in the viewspechjubeubahjubeubahjubahjubeubj)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. hjhhhjh}r!(h]h]h]h]h]uhMhhh]r"(j)r#}r$(hX``p4extra_views``r%hjhhhjh}r&(h]h]h]h]h]uhMh]r'h)r(}r)(hj%h}r*(h]h]h]h]h]uhj#h]r+hX p4extra_viewsr,r-}r.(hUhj(ubahhubaubj)r/}r0(hUh}r1(h]h]h]h]h]uhjh]r2h)r3}r4(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.hj/hhhhh}r5(h]h]h]h]h]uhMh]r6(hX(optional): a list of r7r8}r9(hX(optional): a list of hj3ubh)r:}r;(hX``(depotpath, clientpath)``h}r<(h]h]h]h]h]uhj3h]r=hX(depotpath, clientpath)r>r?}r@(hUhj:ubahhubhXZ tuples containing extra views to be mapped into the client specification. Both will have rArB}rC(hXZ tuples containing extra views to be mapped into the client specification. Both will have hj3ubh)rD}rE(hX``/...``h}rF(h]h]h]h]h]uhj3h]rGhX/...rHrI}rJ(hUhjDubahhubhXc appended automatically. The client name and source directory will be prepended to the client path.rKrL}rM(hXc appended automatically. The client name and source directory will be prepended to the client path.hj3ubeubahjubeubj)rN}rO(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/','')]`` yields a viewspec with just ``//depot/main/... ///...`` hjhhhjh}rP(h]h]h]h]h]uhMhhh]rQ(j)rR}rS(hX``p4viewspec``rThjNhhhjh}rU(h]h]h]h]h]uhMh]rVh)rW}rX(hjTh}rY(h]h]h]h]h]uhjRh]rZhX p4viewspecr[r\}r](hUhjWubahhubaubj)r^}r_(hUh}r`(h]h]h]h]h]uhjNh]ra(h)rb}rc(hXThis will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows ``[('//depot/main/','')]``hj^hhhhh}rd(h]h]h]h]h]uhMh]re(hX|This will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows rfrg}rh(hX|This will override any p4branch, p4base, and/or p4extra_views specified. The viewspec will be an array of tuples as follows hjbubh)ri}rj(hX``[('//depot/main/','')]``h}rk(h]h]h]h]h]uhjbh]rlhX[('//depot/main/','')]rmrn}ro(hUhjiubahhubeubh)rp}rq(hXyields a viewspec with justrrhj^hhhhh}rs(h]h]h]h]h]uhMh]rthXyields a viewspec with justrurv}rw(hjrhjpubaubh)rx}ry(hX%``//depot/main/... ///...``rzhj^hhhhh}r{(h]h]h]h]h]uhMh]r|h)r}}r~(hjzh}r(h]h]h]h]h]uhjxh]rhX!//depot/main/... ///...rr}r(hUhj}ubahhubaubehjubeubj)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. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``p4port``rhjhhhjh}r(h]h]h]h]h]uhMh]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]uhMh]r(hX(optional): the rr}r(hX(optional): the hjubh)r}r(hUh}r(h]h]h]h]rXsampraUrolejh]uhjh]r(jq)r}r(hXhosth}r(h]h]h]h]h]uhjh]rhXhostrr}r(hUhjubahj{ubhX:r}r(hX:hjubjq)r}r(hXporth}r(h]h]h]h]h]uhjh]rhXportrr}r(hUhjubahj{ubehhubhXH 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(UreftypeXoptionh͉hX-pU refdomainXstdrU refprogramrNh]h]U refexplicith]h]h]hhuhMh]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. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``p4user``rhjhhhjh}r(h]h]h]h]h]uhMh]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]uhMh]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(UreftypeXoptionh͉hX-uU refdomainXstdrjNh]h]U refexplicith]h]h]hhuhMh]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(hXg``p4passwd`` (optional): the Perforce password, used as the :option:`-p` argument to all p4 commands. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``p4passwd``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXp4passwdrr}r (hUhjubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhjh]r h)r}r(hXX(optional): the Perforce password, used as the :option:`-p` argument to all p4 commands.hj hhhhh}r(h]h]h]h]h]uhMh]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`rhjhhhhh}r(UreftypeXoptionh͉hX-pU refdomainXstdrjNh]h]U refexplicith]h]h]hhuhMh]rj)r}r(hjh}r(h]h]r(hjX std-optionreh]h]h]uhjh]r hX-pr!r"}r#(hUhjubahjubaubhX argument to all p4 commands.r$r%}r&(hX argument to all p4 commands.hjubeubahjubeubj)r'}r((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`. hjhhhjh}r)(h]h]h]h]h]uhMhhh]r*(j)r+}r,(hX ``p4client``r-hj'hhhjh}r.(h]h]h]h]h]uhMh]r/h)r0}r1(hj-h}r2(h]h]h]h]h]uhj+h]r3hXp4clientr4r5}r6(hUhj0ubahhubaubj)r7}r8(hUh}r9(h]h]h]h]h]uhj'h]r:h)r;}r<(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`.hj7hhhhh}r=(h]h]h]h]h]uhMh]r>(hX.(optional): The name of the client to use. In r?r@}rA(hX.(optional): The name of the client to use. In hj;ubh)rB}rC(hX``mode='full'``h}rD(h]h]h]h]h]uhj;h]rEhX mode='full'rFrG}rH(hUhjBubahhubhX and rIrJ}rK(hX and hj;ubh)rL}rM(hX``mode='incremental'``h}rN(h]h]h]h]h]uhj;h]rOhXmode='incremental'rPrQ}rR(hUhjLubahhubhX%, 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 rSrT}rU(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 hj;ubj_)rV}rW(hX`buildbot_%(slave)s_%(build)s`h}rX(h]h]h]h]h]uhj;h]rYhXbuildbot_%(slave)s_%(build)srZr[}r\(hUhjVubahjgubhX.r]}r^(hX.hj;ubeubahjubeubj)r_}r`(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``. hjhhhjh}ra(h]h]h]h]h]uhMhhh]rb(j)rc}rd(hX``p4line_end``rehj_hhhjh}rf(h]h]h]h]h]uhMh]rgh)rh}ri(hjeh}rj(h]h]h]h]h]uhjch]rkhX p4line_endrlrm}rn(hUhjhubahhubaubj)ro}rp(hUh}rq(h]h]h]h]h]uhj_h]rrh)rs}rt(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``.hjohhhhh}ru(h]h]h]h]h]uhMh]rv(hXi(optional): The type of line ending handling P4 should use. This is added directly to the client spec's rwrx}ry(hXi(optional): The type of line ending handling P4 should use. This is added directly to the client spec's hjsubh)rz}r{(hX ``LineEnd``h}r|(h]h]h]h]h]uhjsh]r}hXLineEndr~r}r(hUhjzubahhubhX property. The default is rr}r(hX property. The default is hjsubh)r}r(hX ``local``h}r(h]h]h]h]h]uhjsh]rhXlocalrr}r(hUhjubahhubhX.r}r(hX.hjsubeubahjubeubeubj )r}r(hUhj+hhhj#h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; Repoj'j'tr(UsingleXRepo Build Stepj'j'treuhM hhh]ubj)eubhhhhh}r(h]h]h]h]h]hj'uhM hhh]ubsh]r(h)r}r(hXReporhj hhhhh}r(h]h]h]h]h]uhM hhh]rhXReporr}r(hjhjubaubj )r}r(hUhj hNhj#h}r(h]h]h]h]h]Uentries]r(j'X@buildbot.steps.source.repo.Repo (class in buildbot.steps.source)hUtrauhNhhh]ubjj)r}r(hUhj hNhjmh}r(jojpXpyh]h]h]h]h]jqXclassrjsjuhNhhh]r(ju)r}r(hXbuildbot.steps.source.repo.Repohjhhhjxh}r(h]rhaj{j|h]h]h]h]rhaj~Xbuildbot.steps.source.repo.RepojXbuildbot.steps.source.repojuhMhhh]r(j)r}r(hXclass hjhhhjh}r(h]h]h]h]h]uhMhhh]rhXclass rr}r(hUhjubaubj)r}r(hXbuildbot.steps.source.repo.hjhhhjh}r(h]h]h]h]h]uhMhhh]rhXbuildbot.steps.source.repo.rr}r(hUhjubaubj)r}r(hXRepohjhhhjh}r(h]h]h]h]h]uhMhhh]rhXReporr}r(hUhjubaubeubj)r}r(hUhjhhhjh}r(h]h]h]h]h]uhMhhh]ubeubh)r}r(hXbThe :bb:step:`Repo` build step performs a `Repo `_ init and sync.hj hhhhh}r(h]h]h]h]h]uhMhhh]r(hXThe rr}r(hXThe hjubh)r}r(hX:bb:step:`Repo`rhjhhhhh}r(UreftypeXsteph͉hXRepoU refdomainXbbrh]h]U refexplicith]h]h]hhuhMh]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXReporr}r(hUhjubahhubaubhX build step performs a rr}r(hX build step performs a hjubj)r}r(hX)`Repo `_h}r(UnameXRepojXhttp://lwn.net/Articles/304488/rh]h]h]h]h]uhjh]rhXReporr}r(hUhjubahjubh)r}r(hX" hKhjhhh}r(Urefurijh]rUid7rah]h]h]h]rj$auh]ubhX init and sync.rr}r(hX init and sync.hjubeubh)r}r(hXoIt is a drop-in replacement for `Repo (Slave-Side)`, which should not be used anymore for new and old projects.hj hhhhh}r(h]h]h]h]h]uhMhhh]r(hX It is a drop-in replacement for rr}r(hX It is a drop-in replacement for hjubj_)r}r(hX`Repo (Slave-Side)`h}r(h]h]h]h]h]uhjh]rhXRepo (Slave-Side)rr}r(hUhjubahjgubhX<, which should not be used anymore for new and old projects.rr}r(hX<, which should not be used anymore for new and old projects.hjubeubh)r}r(hX,The Repo step takes the following arguments:rhj hhhhh}r(h]h]h]h]h]uhMhhh]rhX,The Repo step takes the following arguments:rr}r(hjhjubaubj)r}r (hUhj hhhjh}r (h]h]h]h]h]uhNhhh]r (j)r }r (hXb``manifestURL`` (required): the URL at which the Repo's manifests source repository is available. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX``manifestURL``rhj hhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX manifestURLrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhj h]rh)r }r!(hXQ(required): the URL at which the Repo's manifests source repository is available.r"hjhhhhh}r#(h]h]h]h]h]uhMh]r$hXQ(required): the URL at which the Repo's manifests source repository is available.r%r&}r'(hj"hj ubaubahjubeubj)r(}r)(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. hjhhhjh}r*(h]h]h]h]h]uhMhhh]r+(j)r,}r-(hX``manifestBranch``r.hj(hhhjh}r/(h]h]h]h]h]uhMh]r0h)r1}r2(hj.h}r3(h]h]h]h]h]uhj,h]r4hXmanifestBranchr5r6}r7(hUhj1ubahhubaubj)r8}r9(hUh}r:(h]h]h]h]h]uhj(h]r;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.hj8hhhhh}r>(h]h]h]h]h]uhMh]r?(hX(optional, defaults to r@rA}rB(hX(optional, defaults to hj<ubh)rC}rD(hX ``master``h}rE(h]h]h]h]h]uhj<h]rFhXmasterrGrH}rI(hUhjCubahhubhX[): the manifest repository branch on which repo will take its manifest. Corresponds to the rJrK}rL(hX[): the manifest repository branch on which repo will take its manifest. Corresponds to the hj<ubh)rM}rN(hX``-b``h}rO(h]h]h]h]h]uhj<h]rPhX-brQrR}rS(hUhjMubahhubhX argument to the rTrU}rV(hX argument to the hj<ubj)rW}rX(hX:command:`repo init`h}rY(h]h]rZjah]h]h]uhj<h]r[hX repo initr\r]}r^(hUhjWubahj ubhX command.r_r`}ra(hX command.hj<ubeubahjubeubj)rb}rc(hX``manifestFile`` (optional, defaults to ``default.xml``): the manifest filename. Corresponds to the ``-m`` argument to the :command:`repo init` command. hjhhhjh}rd(h]h]h]h]h]uhM"hhh]re(j)rf}rg(hX``manifestFile``rhhjbhhhjh}ri(h]h]h]h]h]uhM"h]rjh)rk}rl(hjhh}rm(h]h]h]h]h]uhjfh]rnhX manifestFilerorp}rq(hUhjkubahhubaubj)rr}rs(hUh}rt(h]h]h]h]h]uhjbh]ruh)rv}rw(hX(optional, defaults to ``default.xml``): the manifest filename. Corresponds to the ``-m`` argument to the :command:`repo init` command.hjrhhhhh}rx(h]h]h]h]h]uhM h]ry(hX(optional, defaults to rzr{}r|(hX(optional, defaults to hjvubh)r}}r~(hX``default.xml``h}r(h]h]h]h]h]uhjvh]rhX default.xmlrr}r(hUhj}ubahhubhX-): the manifest filename. Corresponds to the rr}r(hX-): the manifest filename. Corresponds to the hjvubh)r}r(hX``-m``h}r(h]h]h]h]h]uhjvh]rhX-mrr}r(hUhjubahhubhX argument to the rr}r(hX argument to the hjvubj)r}r(hX:command:`repo init`h}r(h]h]rjah]h]h]uhjvh]rhX repo initrr}r(hUhjubahj ubhX command.rr}r(hX command.hjvubeubahjubeubj)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. hjhhhjh}r(h]h]h]h]h]uhM)hhh]r(j)r}r(hX ``tarball``rhjhhhjh}r(h]h]h]h]h]uhM)h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXtarballrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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.hjhhhhh}r(h]h]h]h]h]uhM%h]r(hX(optional, defaults to rr}r(hX(optional, defaults to hjubh)r}r(hX``None``h}r(h]h]h]h]h]uhjh]rhXNonerr}r(hUhjubahhubhX): 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 rr}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 hjubh)r}r(hX ``.repo``h}r(h]h]h]h]h]uhjh]rhX.reporr}r(hUhjubahhubhX directory which contains all the Git objects. This feature helps to minimize network usage on very big projects with lots of slaves.rr}r(hX directory which contains all the Git objects. This feature helps to minimize network usage on very big projects with lots of slaves.hjubeubahjubeubj)r}r(hX``jobs`` (optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j". hjhhhjh}r(h]h]h]h]h]uhM-hhh]r(j)r}r(hX``jobs``rhjhhhjh}r(h]h]h]h]h]uhM-h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXjobsrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX(optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hjhhhhh}r(h]h]h]h]h]uhM,h]r(hX(optional, defaults to rr}r(hX(optional, defaults to hjubh)r}r(hX``None``h}r(h]h]h]h]h]uhjh]rhXNonerr}r(hUhjubahhubhXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".rr}r(hXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hjubeubahjubeubj)r}r(hX``syncAllBranches`` (optional, defaults to ``False``): renderable boolean to control whether ``repo`` syncs all branches. i.e. ``repo sync -c`` hjhhhjh}r(h]h]h]h]h]uhM1hhh]r(j)r}r(hX``syncAllBranches``rhjhhhjh}r(h]h]h]h]h]uhM1h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXsyncAllBranchesrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX{(optional, defaults to ``False``): renderable boolean to control whether ``repo`` syncs all branches. i.e. ``repo sync -c``hjhhhhh}r(h]h]h]h]h]uhM0h]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(hUhj ubahhubhX)): renderable boolean to control whether rr}r(hX)): renderable boolean to control whether hjubh)r}r(hX``repo``h}r(h]h]h]h]h]uhjh]rhXreporr}r(hUhjubahhubhX syncs all branches. i.e. rr}r(hX syncs all branches. i.e. hjubh)r}r (hX``repo sync -c``h}r!(h]h]h]h]h]uhjh]r"hX repo sync -cr#r$}r%(hUhjubahhubeubahjubeubj)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 hjhhhjh}r((h]h]h]h]h]uhM:hhh]r)(j)r*}r+(hX``updateTarballAge``r,hj&hhhjh}r-(h]h]h]h]h]uhM:h]r.h)r/}r0(hj,h}r1(h]h]h]h]h]uhj*h]r2hXupdateTarballAger3r4}r5(hUhj/ubahhubaubj)r6}r7(hUh}r8(h]h]h]h]h]uhj&h]r9h)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<hj6hhhhh}r=(h]h]h]h]h]uhM4h]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@}rA(hj<hj:ubaubahjubeubj)rB}rC(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`` hjhhhjh}rD(h]h]h]h]h]uhMDhhh]rE(j)rF}rG(hX``repoDownloads``rHhjBhhhjh}rI(h]h]h]h]h]uhMDh]rJh)rK}rL(hjHh}rM(h]h]h]h]h]uhjFh]rNhX repoDownloadsrOrP}rQ(hUhjKubahhubaubj)rR}rS(hUh}rT(h]h]h]h]h]uhjBh]rU(h)rV}rW(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:hjRhhhhh}rX(h]h]h]h]h]uhM=h]rY(hX&(optional, defaults to None): list of rZr[}r\(hX&(optional, defaults to None): list of hjVubh)r]}r^(hX``repo download``h}r_(h]h]h]h]h]uhjVh]r`hX repo downloadrarb}rc(hUhj]ubahhubhXZ commands to perform at the end of the Repo step each string in the list will be prefixed rdre}rf(hXZ commands to perform at the end of the Repo step each string in the list will be prefixed hjVubh)rg}rh(hX``repo download``h}ri(h]h]h]h]h]uhjVh]rjhX repo downloadrkrl}rm(hUhjgubahhubhXI, and run as is. This means you can include parameter in the string. e.g:rnro}rp(hXI, and run as is. This means you can include parameter in the string. e.g:hjVubeubjc)rq}rr(hUh}rs(h]h]h]h]h]uhjRh]rtji)ru}rv(hUh}rw(jmX-h]h]h]h]h]uhjqh]rx(jo)ry}rz(hX[``["-c project 1234/4"]`` will cherry-pick patchset 4 of patch 1234 in project ``project`` h}r{(h]h]h]h]h]uhjuh]r|h)r}}r~(hXZ``["-c project 1234/4"]`` will cherry-pick patchset 4 of patch 1234 in project ``project``hjyhhhhh}r(h]h]h]h]h]uhMBh]r(h)r}r(hX``["-c project 1234/4"]``h}r(h]h]h]h]h]uhj}h]rhX["-c project 1234/4"]rr}r(hUhjubahhubhX6 will cherry-pick patchset 4 of patch 1234 in project rr}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]rhXprojectrr}r(hUhjubahhubeubahj|ubjo)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]uhjuh]rh)r}r(hXf``["-f project 1234/4"]`` will enforce fast-forward on patchset 4 of patch 1234 in project ``project``rhjhhhhh}r(h]h]h]h]h]uhMDh]r(h)r}r(hX``["-f project 1234/4"]``h}r(h]h]h]h]h]uhjh]rhX["-f project 1234/4"]rr}r(hUhjubahhubhXB will enforce fast-forward on patchset 4 of patch 1234 in project rr}r(hXB will enforce fast-forward on patchset 4 of patch 1234 in project hjubh)r}r(hX ``project``h}r(h]h]h]h]h]uhjh]rhXprojectrr}r(hUhjubahhubeubahj|ubehjubahjfubehjubeubeubj )r}r(hUhj hNhj#h}r(h]h]h]h]h]Uentries]r(j'XWbuildbot.steps.source.repo.RepoDownloadsFromProperties (class in buildbot.steps.source)hUUtrauhNhhh]ubjj)r}r(hUhj hNhjmh}r(jojpXpyh]h]h]h]h]jqXclassrjsjuhNhhh]r(ju)r}r(hX6buildbot.steps.source.repo.RepoDownloadsFromPropertieshjhhhjxh}r(h]rhUaj{j|h]h]h]h]rhUaj~X6buildbot.steps.source.repo.RepoDownloadsFromPropertiesjXbuildbot.steps.source.repojuhMGhhh]r(j)r}r(hXclass hjhhhjh}r(h]h]h]h]h]uhMGhhh]rhXclass rr}r(hUhjubaubj)r}r(hXbuildbot.steps.source.repo.hjhhhjh}r(h]h]h]h]h]uhMGhhh]rhXbuildbot.steps.source.repo.rr}r(hUhjubaubj)r}r(hXRepoDownloadsFromPropertieshjhhhjh}r(h]h]h]h]h]uhMGhhh]rhXRepoDownloadsFromPropertiesrr}r(hUhjubaubeubj)r}r(hUhjhhhjh}r(h]h]h]h]h]uhMGhhh]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:hj hhhhh}r(h]h]h]h]h]uhMHhhh]r(h)r}r(hX``RepoDownloadsFromProperties``h}r(h]h]h]h]h]uhjh]rhXRepoDownloadsFromPropertiesrr}r(hUhjubahhubhX$ can be used as a renderable of the rr}r(hX$ can be used as a renderable of the hjubh)r}r(hX``repoDownload``h}r(h]h]h]h]h]uhjh]rhX repoDownloadrr}r(hUhjubahhubhXW parameter it will look in passed properties for string with following possible format:rr}r(hXW parameter it will look in passed properties for string with following possible format:hjubeubjc)r}r(hUhj hNhjfh}r(h]h]h]h]h]uhNhhh]rji)r}r(hUh}r(jmX-h]h]h]h]h]uhjh]r(jo)r}r(hX9``repo download project change_number/patchset_number``. h}r(h]h]h]h]h]uhjh]rh)r}r(hX8``repo download project change_number/patchset_number``.hjhhhhh}r(h]h]h]h]h]uhMKh]r(h)r}r(hX7``repo download project change_number/patchset_number``h}r(h]h]h]h]h]uhjh]rhX3repo download project change_number/patchset_numberrr}r(hUhjubahhubhX.r}r(hX.hjubeubahj|ubjo)r}r(hX+``project change_number/patchset_number``. h}r(h]h]h]h]h]uhjh]rh)r }r (hX*``project change_number/patchset_number``.hjhhhhh}r (h]h]h]h]h]uhMMh]r (h)r }r(hX)``project change_number/patchset_number``h}r(h]h]h]h]h]uhj h]rhX%project change_number/patchset_numberrr}r(hUhj ubahhubhX.r}r(hX.hj ubeubahj|ubjo)r}r(hX+``project/change_number/patchset_number``. h}r(h]h]h]h]h]uhjh]rh)r}r(hX*``project/change_number/patchset_number``.hjhhhhh}r(h]h]h]h]h]uhMOh]r(h)r}r(hX)``project/change_number/patchset_number``h}r (h]h]h]h]h]uhjh]r!hX%project/change_number/patchset_numberr"r#}r$(hUhjubahhubhX.r%}r&(hX.hjubeubahj|ubehjubaubh)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.hj hhhhh}r)(h]h]h]h]h]uhMQhhh]r*(hX2All of these properties will be translated into a r+r,}r-(hX2All of these properties will be translated into a hj'ubj)r.}r/(hX:command:`repo download`h}r0(h]h]r1jah]h]h]uhj'h]r2hX repo downloadr3r4}r5(hUhj.ubahj ubhX. 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.r6r7}r8(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 )r9}r:(hUhj hNhj#h}r;(h]h]h]h]h]Uentries]r<(j'XYbuildbot.steps.source.repo.RepoDownloadsFromChangeSource (class in buildbot.steps.source)hTUtr=auhNhhh]ubjj)r>}r?(hUhj hNhjmh}r@(jojpXpyh]h]h]h]h]jqXclassrAjsjAuhNhhh]rB(ju)rC}rD(hX8buildbot.steps.source.repo.RepoDownloadsFromChangeSourcehj>hhhjxh}rE(h]rFhTaj{j|h]h]h]h]rGhTaj~X8buildbot.steps.source.repo.RepoDownloadsFromChangeSourcejXbuildbot.steps.source.repojuhMWhhh]rH(j)rI}rJ(hXclass hjChhhjh}rK(h]h]h]h]h]uhMWhhh]rLhXclass rMrN}rO(hUhjIubaubj)rP}rQ(hXbuildbot.steps.source.repo.hjChhhjh}rR(h]h]h]h]h]uhMWhhh]rShXbuildbot.steps.source.repo.rTrU}rV(hUhjPubaubj)rW}rX(hXRepoDownloadsFromChangeSourcehjChhhjh}rY(h]h]h]h]h]uhMWhhh]rZhXRepoDownloadsFromChangeSourcer[r\}r](hUhjWubaubeubj)r^}r_(hUhj>hhhjh}r`(h]h]h]h]h]uhMWhhh]ubeubh)ra}rb(hX_``RepoDownloadsFromChangeSource`` can be used as a renderable of the ``repoDownload`` parameterrchj hhhhh}rd(h]h]h]h]h]uhMXhhh]re(h)rf}rg(hX!``RepoDownloadsFromChangeSource``h}rh(h]h]h]h]h]uhjah]rihXRepoDownloadsFromChangeSourcerjrk}rl(hUhjfubahhubhX$ can be used as a renderable of the rmrn}ro(hX$ can be used as a renderable of the hjaubh)rp}rq(hX``repoDownload``h}rr(h]h]h]h]h]uhjah]rshX repoDownloadrtru}rv(hUhjpubahhubhX parameterrwrx}ry(hX parameterhjaubeubh)rz}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.hj hhhhh}r|(h]h]h]h]h]uhMZhhh]r}(hX!This rendereable integrates with r~r}r(hX!This rendereable integrates with hjzubh)r}r(hX:bb:chsrc:`GerritChangeSource`rhjzhhhhh}r(UreftypeXchsrch͉hXGerritChangeSourceU refdomainXbbrh]h]U refexplicith]h]h]hhuhMZh]rh)r}r(hjh}r(h]h]r(hjXbb-chsrcreh]h]h]uhjh]rhXGerritChangeSourcerr}r(hUhjubahhubaubhX!, and will automatically use the rr}r(hX!, and will automatically use the hjzubj)r}r(hX:command:`repo download`h}r(h]h]rjah]h]h]uhjzh]rhX repo downloadrr}r(hUhjubahj ubhXW command of repo to download the additionnal changes introduced by a pending changeset.rr}r(hXW command of repo to download the additionnal changes introduced by a pending changeset.hjzubeubcdocutils.nodes note r)r}r(hXryou can use the two above Rendereable in conjuction by using the class ``buildbot.process.properties.FlattenList``rhj hhhUnoterh}r(h]h]h]h]h]uhNhhh]rh)r}r(hjhjhhhhh}r(h]h]h]h]h]uhM^h]r(hXGyou can use the two above Rendereable in conjuction by using the class rr}r(hXGyou can use the two above Rendereable in conjuction by using the class hjubh)r}r(hX+``buildbot.process.properties.FlattenList``h}r(h]h]h]h]h]uhjh]rhX'buildbot.process.properties.FlattenListrr}r(hUhjubahhubeubaubh)r}r(hX for example::rhj hhhhh}r(h]h]h]h]h]uhM`hhh]rhX for example:rr}r(hX for example:hjubaubj>)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") ] ) ))hj hhhjAh}r(jCjDh]h]h]h]h]uhMbhhh]rhX1from 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") ] ) ))rr}r(hUhjubaubj )r}r(hUhj hhhj#h}r(h]h]h]h]h]j%]r(UpairrX#Gerrit integration; Repo Build StepUindex-10rUtraj*uhMmhhh]ubh)r}r(hUhj hhhhh}r(h]h]h]h]h]hjuhMohhh]ubjeubhhh}hhh}r(h]h]h]h]h]hUsource-checkout-slave-sideruhMphhh}rjjsh]ubshhh}r(h]h]h]h]r(jjUid8reh]r(h:h`euhMshhh}r(jjjjuh]r(h)r}r(hXSource Checkout (Slave-Side)rhjhhhhh}r(h]h]h]h]h]uhMshhh]rhXSource Checkout (Slave-Side)rr}r(hjhjubaubh)r}r(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`.hjhhhhh}r(h]h]h]h]h]uhMuhhh]r(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 rr}r(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 hjubh)r}r(hX:ref:`Source-Checkout`rhjhhhhh}r(UreftypeXrefh͈hXsource-checkoutU refdomainXstdrh]h]U refexplicith]h]h]hhuhMuh]rjq)r}r(hjh}r(h]h]r(hjXstd-refreh]h]h]uhjh]rhXSource-Checkoutrr}r(hUhjubahj{ubaubhX.r}r(hX.hjubeubh)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`.hjhhhhh}r(h]h]h]h]h]uhMzhhh]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 rr}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 hjubh)r}r(hX:ref:`Version-Control-Systems`rhjhhhhh}r(UreftypeXrefh͈hXversion-control-systemsU refdomainXstdrh]h]U refexplicith]h]h]hhuhMzh]rjq)r}r(hjh}r(h]h]r(hjXstd-refreh]h]h]uhjh]rhXVersion-Control-Systemsrr }r (hUhjubahj{ubaubhX.r }r (hX.hjubeubh)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.rhjhhhhh}r(h]h]h]h]h]uhMhhh]rhXAll 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.rr}r(hjhj ubaubj)r}r(hUhjhNhjh}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). hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX``mode``rhjhhhjh}r (h]h]h]h]h]uhMh]r!h)r"}r#(hjh}r$(h]h]h]h]h]uhjh]r%hXmoder&r'}r((hUhj"ubahhubaubj)r)}r*(hUh}r+(h]h]h]h]h]uhjh]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]uhMh]r0(hXJa string describing the kind of VC operation that is desired. Defaults to r1r2}r3(hXJa string describing the kind of VC operation that is desired. Defaults to hj-ubh)r4}r5(hX ``update``h}r6(h]h]h]h]h]uhj-h]r7hXupdater8r9}r:(hUhj4ubahhubhX.r;}r<(hX.hj-ubeubj)r=}r>(hUh}r?(h]h]h]h]h]uhj)h]r@(j)rA}rB(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}rC(h]h]h]h]h]uhMh]rD(j)rE}rF(hX ``update``rGhjAhhhjh}rH(h]h]h]h]h]uhMh]rIh)rJ}rK(hjGh}rL(h]h]h]h]h]uhjEh]rMhXupdaterNrO}rP(hUhjJubahhubaubj)rQ}rR(hUh}rS(h]h]h]h]h]uhjAh]rTh)rU}rV(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.hjQhhhhh}rW(h]h]h]h]h]uhMh]rX(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 rYrZ}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 hjUubjq)r\}r](hX *clean build*h}r^(h]h]h]h]h]uhjUh]r_hX clean buildr`ra}rb(hUhj\ubahj{ubhX. 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 rcrd}re(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 hjUubjq)rf}rg(hX*from scratch*h}rh(h]h]h]h]h]uhjUh]rihX from scratchrjrk}rl(hUhjfubahj{ubhXh or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style.rmrn}ro(hXh or incrementally, but it is useful to test both kinds: this mode exercises the incremental-build style.hjUubeubahjubeubj)rp}rq(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}rr(h]h]h]h]h]uhMh]rs(j)rt}ru(hX``copy``rvhjphhhjh}rw(h]h]h]h]h]uhMh]rxh)ry}rz(hjvh}r{(h]h]h]h]h]uhjth]r|hXcopyr}r~}r(hUhjyubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjph]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.hjhhhhh}r(h]h]h]h]h]uhMh]r(hXZspecifies that the CVS workspace should be maintained in a separate directory (called the rr}r(hXZspecifies that the CVS workspace should be maintained in a separate directory (called the hjubh)r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uhjh]rhXcopydirrr}r(hXcopydirhjubahhubhXs), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (rr}r(hXs), using checkout or update as necessary. For each build, a new workdir is created with a copy of the source tree (hjubh)r}r(hX)``rm -rf workdir; cp -r copydir workdir``h}r(h]h]h]h]h]uhjh]rhX%rm -rf workdir; cp -r copydir workdirrr}r(hUhjubahhubhXt). 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.rr}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.hjubeubcdocutils.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(jCjDh]h]h]h]h]uhjh]rhX}TODO: something is screwy about this, revisit. Is it the source directory or the working directory that is deleted each time?rr}r(hUhjubahUcommentrubehjubeubj)r}r(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}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(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.hjhhhhh}r(h]h]h]h]h]uhMh]r(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 rr}r(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 hjubjq)r}r(hX*from-scratch*h}r(h]h]h]h]h]uhjh]rhX from-scratchrr}r(hUhjubahj{ubhX build style.rr}r(hX build style.hjubeubahjubeubj)r}r(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}r(h]h]h]h]h]uhMh]r(j)r}r(hX ``export``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXexportrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(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).hjhhhhh}r(h]h]h]h]h]uhMh]r(hX this is like rr}r(hX this is like hjubh)r}r(hX ``clobber``h}r(h]h]h]h]h]uhjh]rhXclobberrr}r(hUhjubahhubhX, except that the rr}r(hX, except that the hjubh)r}r(hX``cvs export``h}r(h]h]h]h]h]uhjh]rhX cvs exportrr}r(hUhjubahhubhXc command is used to create the working directory. This command removes all CVS metadata files (the rr}r(hXc command is used to create the working directory. This command removes all CVS metadata files (the hjubh)r}r(hUh}r(h]h]h]h]rXfileraUrolejh]uhjh]rhXCVS/rr}r(hXCVS/hjubahhubhX directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file).rr}r (hX directories) from the tree, which is sometimes useful for creating source tarballs (to avoid including the metadata in the tar file).hjubeubahjubeubehjubehjubeubj)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). hjhhhjh}r (h]h]h]h]h]uhMhhh]r (j)r}r(hX ``workdir``rhj hhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXworkdirrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhj h]rh)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 hjhhhhh}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 hjubaubahjubeubj)r&}r'(hX``alwaysUseLatest`` if ``True``, bypass the usual `update to the last Change` behavior, and always update to the latest changes instead. hjhhhjh}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/}r0(hj,h}r1(h]h]h]h]h]uhj*h]r2hXalwaysUseLatestr3r4}r5(hUhj/ubahhubaubj)r6}r7(hUh}r8(h]h]h]h]h]uhj&h]r9h)r:}r;(hXtif ``True``, bypass the usual `update to the last Change` behavior, and always update to the latest changes instead.hj6hhhhh}r<(h]h]h]h]h]uhMh]r=(hXif r>r?}r@(hXif hj:ubh)rA}rB(hX``True``h}rC(h]h]h]h]h]uhj:h]rDhXTruerErF}rG(hUhjAubahhubhX, bypass the usual rHrI}rJ(hX, bypass the usual hj:ubj_)rK}rL(hX`update to the last Change`h}rM(h]h]h]h]h]uhj:h]rNhXupdate to the last ChangerOrP}rQ(hUhjKubahjgubhX; behavior, and always update to the latest changes instead.rRrS}rT(hX; behavior, and always update to the latest changes instead.hj:ubeubahjubeubj)rU}rV(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. hjhhhjh}rW(h]h]h]h]h]uhMhhh]rX(j)rY}rZ(hX ``retry``r[hjUhhhjh}r\(h]h]h]h]h]uhMh]r]h)r^}r_(hj[h}r`(h]h]h]h]h]uhjYh]rahXretryrbrc}rd(hUhj^ubahhubaubj)re}rf(hUh}rg(h]h]h]h]h]uhjUh]rhh)ri}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.hjehhhhh}rk(h]h]h]h]h]uhMh]rl(hX"If set, this specifies a tuple of rmrn}ro(hX"If set, this specifies a tuple of hjiubh)rp}rq(hX``(delay, repeats)``h}rr(h]h]h]h]h]uhjih]rshX(delay, repeats)rtru}rv(hUhjpubahhubhXL which means that when a full VC checkout fails, it should be retried up to rwrx}ry(hXL which means that when a full VC checkout fails, it should be retried up to hjiubj_)rz}r{(hX `repeats`h}r|(h]h]h]h]h]uhjih]r}hXrepeatsr~r}r(hUhjzubahjgubhX times, waiting rr}r(hX times, waiting hjiubj_)r}r(hX`delay`h}r(h]h]h]h]h]uhjih]rhXdelayrr}r(hUhjubahjgubhXE seconds between attempts. If you don't provide this, it defaults to rr}r(hXE seconds between attempts. If you don't provide this, it defaults to hjiubh)r}r(hX``None``h}r(h]h]h]h]h]uhjih]rhXNonerr}r(hUhjubahhubhX, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.rr}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.hjiubeubahjubeubj)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. hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX``repository``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX repositoryrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(h)r}r(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:hjhhhhh}r(h]h]h]h]h]uhMh]r(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 rr}r(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 hjubh)r}r(hX ``repourl``h}r(h]h]h]h]h]uhjh]rhXrepourlrr}r(hUhjubahhubhX as well as for rr}r(hX as well as for hjubh)r}r(hX ``baseURL``h}r(h]h]h]h]h]uhjh]rhXbaseURLrr}r(hUhjubahhubhX (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:rr}r(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:hjubeubj)r}r(hUh}r(h]h]h]h]h]uhjh]r(j)r}r(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. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX``None``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXNonerr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(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.rhjhhhhh}r(h]h]h]h]h]uhMh]rhXIn 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.rr}r(hjhjubaubahjubeubj)r}r(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. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hXstringrhjhhhjh}r(h]h]h]h]h]uhMh]rhXstringrr}r(hjhjubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)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.rhjhhhhh}r(h]h]h]h]h]uhMh]rhXThe 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.rr}r(hjhjubaubahjubeubj)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. hjhhhjh}r(h]h]h]h]h]uhMh]r(j)r}r(hX format stringrhjhhhjh}r(h]h]h]h]h]uhMh]rhX format stringrr }r (hjhjubaubj)r }r (hUh}r (h]h]h]h]h]uhjh]rh)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 rr}r(hX(If the parameter is a string containing hjubh)r}r(hX``%s``h}r(h]h]h]h]h]uhjh]rhX%srr}r(hUhjubahhubhX., then this the repository attribute from the rr}r(hX., then this the repository attribute from the hjubh)r }r!(hX:class:`Change`r"hjhhhhh}r#(UreftypeXclassh͉hXChangeU 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/r0}r1(hX will be place in place of the hjubh)r2}r3(hX``%s``h}r4(h]h]h]h]h]uhjh]r5hX%sr6r7}r8(hUhj2ubahhubhX. 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 r9r:}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 hjubh)r<}r=(hX``ssh://server/%s``h}r>(h]h]h]h]h]uhjh]r?hXssh://server/%sr@rA}rB(hUhj<ubahhubhXQ makes sense if the the repository attribute is the local path of the repository.rCrD}rE(hXQ makes sense if the the repository attribute is the local path of the repository.hjubeubahjubeubj)rF}rG(hX|dict In this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter. hjhhhjh}rH(h]h]h]h]h]uhMh]rI(j)rJ}rK(hXdictrLhjFhhhjh}rM(h]h]h]h]h]uhMh]rNhXdictrOrP}rQ(hjLhjJubaubj)rR}rS(hUh}rT(h]h]h]h]h]uhjFh]rUh)rV}rW(hXvIn this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter.rXhjRhhhhh}rY(h]h]h]h]h]uhMh]rZhXvIn this case, the repository URL will be the value indexed by the repository attribute in the dict given as parameter.r[r\}r](hjXhjVubaubahjubeubj)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. hjhhhjh}r`(h]h]h]h]h]uhMh]ra(j)rb}rc(hXcallablerdhj^hhhjh}re(h]h]h]h]h]uhMh]rfhXcallablergrh}ri(hjdhjbubaubj)rj}rk(hUh}rl(h]h]h]h]h]uhj^h]rmh)rn}ro(hXThe callable given as parameter will take the repository attribute from the Change and its return value will be used as repository URL.rphjjhhhhh}rq(h]h]h]h]h]uhMh]rrhXThe callable given as parameter will take the repository attribute from the Change and its return value will be used as repository URL.rsrt}ru(hjphjnubaubahjubeubehjubj)rv}rw(hXthis is quite similar to the mechanism used by the WebStatus for the ``changecommentlink``, ``projects`` or ``repositories`` parameter.h}rx(h]h]h]h]h]uhjh]ryh)rz}r{(hXthis is quite similar to the mechanism used by the WebStatus for the ``changecommentlink``, ``projects`` or ``repositories`` parameter.hjvhhhhh}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 hjzubh)r}r(hX``changecommentlink``h}r(h]h]h]h]h]uhjzh]rhXchangecommentlinkrr}r(hUhjubahhubhX, rr}r(hX, hjzubh)r}r(hX ``projects``h}r(h]h]h]h]h]uhjzh]rhXprojectsrr}r(hUhjubahhubhX or rr}r(hX or hjzubh)r}r(hX``repositories``h}r(h]h]h]h]h]uhjzh]rhX repositoriesrr}r(hUhjubahhubhX parameter.rr}r(hX parameter.hjzubeubahjubehjubeubj)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). hjhhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``timeout``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXtimeoutrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}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).rhjhhhhh}r(h]h]h]h]h]uhMh]rhXSpecifies 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).rr}r(hjhjubaubahjubeubeubh)r}r(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.hjhhhhh}r(h]h]h]h]h]uhMhhh]r(hX#My habit as a developer is to do a rr}r(hX#My habit as a developer is to do a hjubh)r}r(hX``cvs update``h}r(h]h]h]h]h]uhjh]rhX cvs updaterr}r(hUhjubahhubhX and rr}r(hX and hjubj)r}r(hX:command:`make`h}r(h]h]rjah]h]h]uhjh]rhXmakerr}r(hUhjubahj ubhX 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 rr}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 hjubh)r}r(hX``mode='update'``h}r(h]h]h]h]h]uhjh]rhX mode='update'rr}r(hUhjubahhubhX setting.rr}r(hX setting.hjubeubh)r}r(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).rhjhhhhh}r(h]h]h]h]h]uhMhhh]rhXiOn 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).rr}r(hjhjubaubh)r}r(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.hjhhhhh}r(h]h]h]h]h]uhMhhh]r(j_)r}r(hX `official`h}r(h]h]h]h]h]uhjh]rhXofficialrr}r(hUhjubahjgubhX 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 rr}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 hjubj_)r}r(hX`full`h}r(h]h]h]h]h]uhjh]rhXfullrr}r(hUhjubahjgubhX r}r(hX hjubh)r}r(hX:class:`Builder`rhjhhhhh}r(UreftypeXclassh͉hXBuilderU refdomainXpyrh]h]U refexplicith]h]h]hhhNhj|uhMh]rh)r}r(hjh}r(h]h]r (hjXpy-classr eh]h]h]uhjh]r hXBuilderr r }r(hUhjubahhubaubhX. which behaves this way would want to use the rr}r(hX. which behaves this way would want to use the hjubh)r}r(hX``mode='clobber'``h}r(h]h]h]h]h]uhjh]rhXmode='clobber'rr}r(hUhjubahhubhX setting.rr}r(hX setting.hjubeubh)r}r(hXoEach VC system has a corresponding source checkout class: their arguments are described on the following pages.rhjhhhhh}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#(hjhjubaubj )r$}r%(hUhjhhhj#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*euhM hhh]ubh)r+}r,(hUhjhhhhh}r-(h]h]h]h]h]hj(uhM hhh]ubh)r.}r/(hX.. _Step-CVS-Slave-Side:hjhhh}hhh}r0(h]h]h]h]h]hUstep-cvs-slave-sider1uhM hhh}r2j(j+sh]ubh)r3}r4(hUhjhhh}r5h>j.shhh}r6(h]h]h]h]r7(Ucvs-slave-sider8j1j(eh]r9(hh>euhMhhh}r:(j1j.j(j+uh]r;(h)r<}r=(hXCVS (Slave-Side)r>hj3hhhhh}r?(h]h]h]h]h]uhMhhh]r@hXCVS (Slave-Side)rArB}rC(hj>hj<ubaubh)rD}rE(hXThe :class:`CVS ` build step performs a `CVS `_ checkout or update. It takes the following arguments:hj3hhhhh}rF(h]h]h]h]h]uhMhhh]rG(hXThe rHrI}rJ(hXThe hjDubh)rK}rL(hX:class:`CVS `rMhjDhhhhh}rN(UreftypeXclassh͉hXCVS (Slave-Side)U refdomainXpyrOh]h]U refexplicith]h]h]hhhNhj|uhMh]rPh)rQ}rR(hjMh}rS(h]h]rT(hjOXpy-classrUeh]h]h]uhjKh]rVhXCVSrWrX}rY(hUhjQubahhubaubhX build step performs a rZr[}r\(hX build step performs a hjDubj)r]}r^(hX#`CVS `_h}r_(UnameXCVSjXhttp://www.nongnu.org/cvs/r`h]h]h]h]h]uhjDh]rahXCVSrbrc}rd(hUhj]ubahjubh)re}rf(hX hKhjDhhh}rg(Urefurij`h]rhUid9riah]h]rjXcvsrkah]h]uh]ubhX6 checkout or update. It takes the following arguments:rlrm}rn(hX6 checkout or update. It takes the following arguments:hjDubeubj)ro}rp(hUhj3hhhjh}rq(h]h]h]h]h]uhNhhh]rr(j)rs}rt(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`` hjohhhjh}ru(h]h]h]h]h]uhMh]rv(j)rw}rx(hX ``cvsroot``ryhjshhhjh}rz(h]h]h]h]h]uhMh]r{h)r|}r}(hjyh}r~(h]h]h]h]h]uhjwh]rhXcvsrootrr}r(hUhj|ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjsh]rh)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``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, the cvsroot value you would use to get a copy of the Buildbot source code is rr}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 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(hUhjubahhubeubahjubeubj)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``. hjohhhjh}r(h]h]h]h]h]uhMhhh]r(j)r}r(hX ``cvsmodule``rhjhhhjh}r(h]h]h]h]h]uhMh]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhX cvsmodulerr}r(hUhjubahhubaubj)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]rhXmodulerr}r(hUhjubahhubhX8, which is generally a subdirectory of the CVSROOT. The rr}r(hX8, which is generally a subdirectory of the CVSROOT. The hjubj_)r}r(hX `cvsmodule`h}r(h]h]h]h]h]uhjh]rhX cvsmodulerr}r(hUhjubahjgubhX! for the Buildbot source code is rr}r(hX! for the Buildbot source code is hjubh)r}r(hX ``buildbot``h}r(h]h]h]h]h]uhjh]rhXbuildbotrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(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``. hjohhhjh}r(h]h]h]h]h]uhM"hhh]r(j)r}r(hX ``branch``rhjhhhjh}r(h]h]h]h]h]uhM"h]rh)r}r(hjh}r(h]h]h]h]h]uhjh]rhXbranchrr}r(hUhjubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(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``.hjhhhhh}r(h]h]h]h]h]uhM!h]r(hX!a string which will be used in a rr}r(hX!a string which will be used in a hjubh)r}r(hX :option:`-r`rhjhhhhh}r(UreftypeXoptionh͉hX-rU refdomainXstdrjNh]h]U refexplicith]h]h]hhuhM!h]rj)r}r(hjh}r(h]h]r(hjX std-optionreh]h]h]uhjh]rhX-rrr}r(hUhjubahjubaubhXO argument. This is most useful for specifying a branch to work on. Defaults to rr}r(hXO argument. This is most useful for specifying a branch to work on. Defaults to hjubh)r}r(hX``HEAD``h}r(h]h]h]h]h]uhjh]rhXHEADrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubj)r}r(hXQ``global_options`` a list of flags to be put before the verb in the CVS command. hjohhhjh}r(h]h]h]h]h]uhM%hhh]r(j)r}r(hX``global_options``r hjhhhjh}r (h]h]h]h]h]uhM%h]r h)r }r (hj h}r(h]h]h]h]h]uhjh]rhXglobal_optionsrr}r(hUhj ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjh]rh)r}r(hX=a list of flags to be put before the verb in the CVS command.rhjhhhhh}r(h]h]h]h]h]uhM%h]rhX=a list of flags to be put before the verb in the CVS command.rr}r(hjhjubaubahjubeubeubh)r}r (hX``checkout_options``r!hj3hhhhh}r"(h]h]h]h]h]uhM'hhh]r#h)r$}r%(hj!h}r&(h]h]h]h]h]uhjh]r'hXcheckout_optionsr(r)}r*(hUhj$ubahhubaubh)r+}r,(hX``export_options``r-hj3hhhhh}r.(h]h]h]h]h]uhM)hhh]r/h)r0}r1(hj-h}r2(h]h]h]h]h]uhj+h]r3hXexport_optionsr4r5}r6(hUhj0ubahhubaubj)r7}r8(hUhj3hhhjh}r9(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. hj7hhhjh}r=(h]h]h]h]h]uhM/h]r>(j)r?}r@(hX``extra_options``rAhj;hhhjh}rB(h]h]h]h]h]uhM/h]rCh)rD}rE(hjAh}rF(h]h]h]h]h]uhj?h]rGhX extra_optionsrHrI}rJ(hUhjDubahhubaubj)rK}rL(hUh}rM(h]h]h]h]h]uhj;h]rNh)rO}rP(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.hjKhhhhh}rQ(h]h]h]h]h]uhM,h]rR(hX=a list of flags to be put after the verb in the CVS command. rSrT}rU(hX=a list of flags to be put after the verb in the CVS command. hjOubh)rV}rW(hX``checkout_options``h}rX(h]h]h]h]h]uhjOh]rYhXcheckout_optionsrZr[}r\(hUhjVubahhubhX' is only used for checkout operations, r]r^}r_(hX' is only used for checkout operations, hjOubh)r`}ra(hX``export_options``h}rb(h]h]h]h]h]uhjOh]rchXexport_optionsrdre}rf(hUhj`ubahhubhX) is only used for export operations, and rgrh}ri(hX) is only used for export operations, and hjOubh)rj}rk(hX``extra_options``h}rl(h]h]h]h]h]uhjOh]rmhX extra_optionsrnro}rp(hUhjjubahhubhX is used for both.rqrr}rs(hX is used for both.hjOubeubahjubeubj)rt}ru(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``. hj7hhhjh}rv(h]h]h]h]h]uhM4hhh]rw(j)rx}ry(hX``checkoutDelay``rzhjthhhjh}r{(h]h]h]h]h]uhM4h]r|h)r}}r~(hjzh}r(h]h]h]h]h]uhjxh]rhX checkoutDelayrr}r(hUhj}ubahhubaubj)r}r(hUh}r(h]h]h]h]h]uhjth]rh)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``.hjhhhhh}r(h]h]h]h]h]uhM2h]r(hXoif set, the number of seconds to put between the timestamp of the last known Change and the value used for the rr}r(hXoif set, the number of seconds to put between the timestamp of the last known Change and the value used for the hjubh)r}r(hX :option:`-D`rhjhhhhh}r(UreftypeXoptionh͉hX-DU refdomainXstdrjNh]h]U refexplicith]h]h]hhuhM2h]rj)r}r(hjh}r(h]h]r(hjX std-optionreh]h]h]uhjh]rhX-Drr}r(hUhjubahjubaubhX( option. Defaults to half of the parent rr}r(hX( option. Defaults to half of the parent hjubh)r}r(hX:class:`Build`rhjhhhhh}r(UreftypeXclassh͉hXBuildU refdomainXpyrh]h]U refexplicith]h]h]hhhNhj|uhM2h]rh)r}r(hjh}r(h]h]r(hjXpy-classreh]h]h]uhjh]rhXBuildrr}r(hUhjubahhubaubhX's rr}r(hX\'s hjubh)r}r(hX``treeStableTimer``h}r(h]h]h]h]h]uhjh]rhXtreeStableTimerrr}r(hUhjubahhubhX.r}r(hX.hjubeubahjubeubeubj )r}r(hUhj3hhhj#h}r(h]h]h]h]h]Uentries]r((UsingleXBuild Steps; SVN (Slave-Side)Xstep-SVN (Slave-Side)rjtr(UsingleXSVN (Slave-Side) Build StepjjtreuhM7hhh]ubh)r}r(hUhj3hhhhh}r(h]h]h]h]h]hjuhM7hhh]ubh)r}r(hX.. _Step-SVN-Slave-Side:hj3hhh}hhh}r(h]h]h]h]h]hUstep-svn-slave-sideruhM8hhh}rjjsh]ubeubh)r}r(hUhjhhh}rhsjshhh}r(h]h]h]h]r(Usvn-slave-siderjjeh]r(hPhseuhM;hhh}r(jjjjuh]r(h)r}r(hXSVN (Slave-Side)rhjhhhhh}r(h]h]h]h]h]uhM;hhh]rhXSVN (Slave-Side)rr}r(hjhjubaubh)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.hjhhhhh}r(h]h]h]h]h]uhM=hhh]r(hXThe rr}r(hXThe hjubh)r}r(hX!:bb:step:`SVN `rhjhhhhh}r(UreftypeXsteph͉hXSVN (Slave-Side)U refdomainXbbrh]h]U refexplicith]h]h]hhuhM=h]rh)r}r(hjh}r(h]h]r(hjXbb-stepreh]h]h]uhjh]rhXSVNrr}r(hUhjubahhubaubhX build step performs a rr}r(hX build step performs a hjubj)r}r(hX,`Subversion `_h}r(UnameX SubversionjXhttp://subversion.tigris.orgrh]h]h]h]h]uhjh]rhX Subversionrr}r(hUhjubahjubh)r}r(hX hKhjhhh}r(Urefurijh]r Uid10r 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.hjubeubh)r }r (hXRThe most versatile way to create the ``SVN`` step is with the ``svnurl`` argument:hjhhhhh}r (h]h]h]h]h]uhMBhhh]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# (hUhjhhhjh}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]uhMOh]r) (j)r* }r+ (hX ``svnurl``r, hj& hhhjh}r- (h]h]h]h]h]uhMOh]r. h)r/ }r0 (hj, h}r1 (h]h]h]h]h]uhj* h]r2 hXsvnurlr3 r4 }r5 (hUhj/ ubahhubaubj)r6 }r7 (hUh}r8 (h]h]h]h]h]uhj& h]r9 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.hj6 hhhhh}r< (h]h]h]h]h]uhMFh]r= (hX(required): this specifies the r> r? }r@ (hX(required): this specifies the hj: ubh)rA }rB (hX``URL``h}rC (h]h]h]h]h]uhj: h]rD hXURLrE rF }rG (hUhjA ubahhubhX$ argument that will be given to the rH rI }rJ (hX$ argument that will be given to the hj: ubh)rK }rL (hX``svn checkout``h}rM (h]h]h]h]h]uhj: h]rN hX svn checkoutrO rP }rQ (hUhjK 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 rR rS }rT (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)rU }rV (hX ``cvsroot``h}rW (h]h]h]h]h]uhj: h]rX hXcvsrootrY rZ }r[ (hUhjU ubahhubhX and r\ r] }r^ (hX and hj: ubh)r_ }r` (hX ``cvsmodule``h}ra (h]h]h]h]h]uhj: h]rb hX cvsmodulerc rd }re (hUhj_ ubahhubhXv arguments. For example, if you are using a remote Subversion repository which is accessible through HTTP at a URL of rf rg }rh (hXv arguments. For example, if you are using a remote Subversion repository which is accessible through HTTP at a URL of hj: ubh)ri }rj (hX ``http://svn.example.com/repos``h}rk (h]h]h]h]h]uhj: h]rl hXhttp://svn.example.com/reposrm rn }ro (hUhji ubahhubhX", and you wanted to check out the rp rq }rr (hX", and you wanted to check out the hj: ubh)rs }rt (hX``trunk/calc``h}ru (h]h]h]h]h]uhj: h]rv hX trunk/calcrw rx }ry (hUhjs ubahhubhX sub-tree, you would use rz 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.hjhhhhh}r (h]h]h]h]h]uhMQhhh]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:hjhhhhh}r (h]h]h]h]h]uhMUhhh]r (hXeAlternatively, if you are building from multiple branches, then you should preferentially create the r r }r (hXeAlternatively, if you are building from multiple branches, then you should preferentially create the hj ubh)r }r (hX``SVN``h}r (h]h]h]h]h]uhj h]r hXSVNr r }r (hUhj ubahhubhX step with the r r }r (hX step with the hj ubh)r }r (hX ``baseURL``h}r (h]h]h]h]h]uhj h]r hXbaseURLr r }r (hUhj ubahhubhX and r r }r (hX and hj ubh)r }r (hX``defaultBranch``h}r (h]h]h]h]h]uhj h]r hX defaultBranchr r }r (hUhj ubahhubhX arguments instead:r r }r (hX arguments instead:hj ubeubj)r }r (hUhjhhhjh}r (h]h]h]h]h]uhNhhh]r (j)r }r (hX``baseURL`` (required): this specifies 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]uhM[h]r (j)r }r (hX ``baseURL``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 hXbaseURLr r }r (hUhj ubahhubaubj)r }r (hUh}r (h]h]h]h]h]uhj h]r h)r }r (hX(required): this specifies the base repository URL, to which a branch name will be appended. It should probably end in a slash.r hj hhhhh}r (h]h]h]h]h]uhMZh]r hX(required): this specifies the base repository URL, to which a branch name will be appended. It should probably end in a slash.r r }r (hj hj ubaubahjubeubj)r }r (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. hj hhhjh}r (h]h]h]h]h]uhMehhh]r (j)r }r (hX``defaultBranch``r hj hhhjh}r (h]h]h]h]h]uhMeh]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(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]uhM^h]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]uhMch]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/!}r0!(hX steps that use either the hj !ubh)r1!}r2!(hX ``svnurl``h}r3!(h]h]h]h]h]uhj !h]r4!hXsvnurlr5!r6!}r7!(hUhj1!ubahhubhX or r8!r9!}r:!(hX or hj !ubh)r;!}r!hXbaseURLr?!r@!}rA!(hUhj;!ubahhubhX) arguments but not both at the same time.rB!rC!}rD!(hX) arguments but not both at the same time.hj !ubeubehjubeubj)rE!}rF!(hX|``username`` (optional): if specified, this will be passed to the :command:`svn` binary with a :option:`--username` option. hj hhhjh}rG!(h]h]h]h]h]uhMihhh]rH!(j)rI!}rJ!(hX ``username``rK!hjE!hhhjh}rL!(h]h]h]h]h]uhMih]rM!h)rN!}rO!(hjK!h}rP!(h]h]h]h]h]uhjI!h]rQ!hXusernamerR!rS!}rT!(hUhjN!ubahhubaubj)rU!}rV!(hUh}rW!(h]h]h]h]h]uhjE!h]rX!h)rY!}rZ!(hXn(optional): if specified, this will be passed to the :command:`svn` binary with a :option:`--username` option.hjU!hhhhh}r[!(h]h]h]h]h]uhMhh]r\!(hX5(optional): if specified, this will be passed to the r]!r^!}r_!(hX5(optional): if specified, this will be passed to the hjY!ubj)r`!}ra!(hX:command:`svn`h}rb!(h]h]rc!jah]h]h]uhjY!h]rd!hXsvnre!rf!}rg!(hUhj`!ubahj ubhX binary with a rh!ri!}rj!(hX binary with a hjY!ubh)rk!}rl!(hX:option:`--username`rm!hjY!hhhhh}rn!(UreftypeXoptionh͉hX --usernameU refdomainXstdro!jNh]h]U refexplicith]h]h]hhuhMhh]rp!j)rq!}rr!(hjm!h}rs!(h]h]rt!(hjo!X std-optionru!eh]h]h]uhjk!h]rv!hX --usernamerw!rx!}ry!(hUhjq!ubahjubaubhX option.rz!r{!}r|!(hX option.hjY!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. hj hhhjh}r!(h]h]h]h]h]uhMnhhh]r!(j)r!}r!(hX ``password``r!hj}!hhhjh}r!(h]h]h]h]h]uhMnh]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]uhMlh]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!(UreftypeXoptionh͉hX --passwordU refdomainXstdr!jNh]h]U refexplicith]h]h]hhuhMlh]r!j)r!}r!(hj!h}r!(h]h]r!(hj!X std-optionr!eh]h]h]uhj!h]r!hX --passwordr!r!}r!(hUhj!ubahjubaubhXF option. The password itself will be suitably obfuscated in the logs.r!r!}r!(hXF option. The password itself will be suitably obfuscated in the logs.hj!ubeubahjubeubj)r!}r!(hX``extra_args`` (optional): if specified, an array of strings that will be passed as extra arguments to the :command:`svn` binary. hj hhhjh}r!(h]h]h]h]h]uhMrhhh]r!(j)r!}r!(hX``extra_args``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 extra_argsr!r!}r!(hUhj!ubahhubaubj)r!}r!(hUh}r!(h]h]h]h]h]uhj!h]r!h)r!}r!(hXr(optional): if specified, an array of strings that will be passed as extra arguments to the :command:`svn` binary.hj!hhhhh}r!(h]h]h]h]h]uhMqh]r!(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the r!r!}r!(hX\(optional): if specified, an array of strings that will be passed as extra arguments to the hj!ubj)r!}r!(hX:command:`svn`h}r!(h]h]r!jah]h]h]uhj!h]r!hXsvnr!r!}r!(hUhj!ubahj ubhX binary.r!r!}r!(hX binary.hj!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. hj hhhjh}r!(h]h]h]h]h]uhMvhhh]r!(j)r!}r!(hX``keep_on_purge``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!hX keep_on_purger!r!}r!(hUhj!ubahhubaubj)r!}r!(hUh}r!(h]h]h]h]h]uhj!h]r!h)r!}r!(hX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.r!hj!hhhhh}r!(h]h]h]h]h]uhMuh]r!hX|(optional): specific files or directories to keep between purges, like some build outputs that can be reused between builds.r!r!}r!(hj!hj!ubaubahjubeubj)r!}r!(hX``ignore_ignores`` (optional): when purging changes, don't use rules defined in ``svn:ignore`` properties and global-ignores in subversion/config. hj hhhjh}r!(h]h]h]h]h]uhMzhhh]r!(j)r!}r!(hX``ignore_ignores``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"hXignore_ignoresr"r"}r"(hUhj!ubahhubaubj)r"}r"(hUh}r"(h]h]h]h]h]uhj!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]uhMyh]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``. hj hhhjh}r"(h]h]h]h]h]uhMhhh]r"(j)r"}r "(hX``always_purge``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 always_purger("r)"}r*"(hUhj$"ubahhubaubj)r+"}r,"(hUh}r-"(h]h]h]h]h]uhj"h]r."h)r/"}r0"(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}r1"(h]h]h]h]h]uhM}h]r2"(hX(optional): if set to r3"r4"}r5"(hX(optional): if set to hj/"ubh)r6"}r7"(hX``True``h}r8"(h]h]h]h]h]uhj/"h]r9"hXTruer:"r;"}r<"(hUhj6"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@"}rA"(hX``svn status``h}rB"(h]h]h]h]h]uhj/"h]rC"hX svn statusrD"rE"}rF"(hUhj@"ubahhubhX.rG"}rH"(hX.hj/"ubeubahjubeubj)rI"}rJ"(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}rK"(h]h]h]h]h]uhMhhh]rL"(j)rM"}rN"(hX ``depth``rO"hjI"hhhjh}rP"(h]h]h]h]h]uhMh]rQ"h)rR"}rS"(hjO"h}rT"(h]h]h]h]h]uhjM"h]rU"hXdepthrV"rW"}rX"(hUhjR"ubahhubaubj)rY"}rZ"(hUh}r["(h]h]h]h]h]uhjI"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_"hjY"hhhhh}r`"(h]h]h]h]h]uhMh]ra"hXu(optional): Specify depth argument to achieve sparse checkout. Only available if slave has Subversion 1.5 or higher.rb"rc"}rd"(hj_"hj]"ubaubh)re"}rf"(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.rg"hjY"hhhhh}rh"(h]h]h]h]h]uhMh]ri"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.rj"rk"}rl"(hjg"hje"ubaubehjubeubeubh)rm"}rn"(hXsIf you are using branches, you must also make sure your :class:`ChangeSource` will report the correct branch names.hjhhhhh}ro"(h]h]h]h]h]uhMhhh]rp"(hX8If you are using branches, you must also make sure your rq"rr"}rs"(hX8If you are using branches, you must also make sure your hjm"ubh)rt"}ru"(hX:class:`ChangeSource`rv"hjm"hhhhh}rw"(UreftypeXclassh͉hX ChangeSourceU refdomainXpyrx"h]h]U refexplicith]h]h]hhhNhj|uhMh]ry"h)rz"}r{"(hjv"h}r|"(h]h]r}"(hjx"Xpy-classr~"eh]h]h]uhjt"h]r"hX ChangeSourcer"r"}r"(hUhjz"ubahhubaubhX& will report the correct branch names.r"r"}r"(hX& will report the correct branch names.hjm"ubeubj )r"}r"(hUhjhhhj#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"(hUhjhhhhh}r"(h]h]h]h]h]hj"uhMhhh]ubeubh)r"}r"(hUhjhhh}hhh}r"(h]h]h]h]r"(Udarcs-slave-sider"j"eh]r"hYauhMhhh}r"j"j"sh]r"(h)r"}r"(hXDarcs (Slave-Side)r"hj"hhhhh}r"(h]h]h]h]h]uhMhhh]r"hXDarcs (Slave-Side)r"r"}r"(hj"hj"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"(UreftypeXsteph͉hXDarcs (Slave-Side)U 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"hXDarcsr"r"}r"(hUhj"ubahhubaubhX build step performs a r"r"}r"(hX build step performs a hj"ubj)r"}r"(hX`Darcs `_h}r"(UnameXDarcsjXhttp://darcs.net/r"h]h]h]h]h]uhj"h]r"hXDarcsr"r"}r"(hUhj"ubahjubh)r"}r"(hX hKhj"hhh}r"(Urefurij"h]r"Udarcsr"ah]h]h]h]r"h"auh]ubhX checkout or update.r"r"}r"(hX checkout or update.hj"ubeubh)r"}r"(hXLike :bb:step:`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.hj"hhhhh}r"(h]h]h]h]h]uhMhhh]r"(hXLike r"r"}r"(hXLike hj"ubh)r"}r"(hX!:bb:step:`SVN `r"hj"hhhhh}r"(UreftypeXsteph͉hXSVN (Slave-Side)U 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"hXSVNr"r"}r"(hUhj"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 r"r"}r"(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 hj"ubh)r"}r"(hX ``baseURL``h}r"(h]h]h]h]h]uhj"h]r"hXbaseURLr"r"}r"(hUhj"ubahhubhXK with the branch name, and if no particular branch is requested, it uses a r"r"}r"(hXK with the branch name, and if no particular branch is requested, it uses a hj"ubh)r"}r"(hX``defaultBranch``h}r"(h]h]h]h]h]uhj"h]r"hX defaultBranchr"r"}r"(hUhj"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 r"r"}r"(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 hj"ubh)r"}r"(hX ``baseURL``h}r"(h]h]h]h]h]uhj"h]r"hXbaseURLr"r"}r"(hUhj"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 hj"ubh)r#}r#(hX ``baseURL``h}r#(h]h]h]h]h]uhj"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.hj"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/#r0#}r1#(hX(required unless hj+#ubh)r2#}r3#(hX ``baseURL``h}r4#(h]h]h]h]h]uhj+#h]r5#hXbaseURLr6#r7#}r8#(hUhj2#ubahhubhXI is provided): the URL at which the Darcs source repository is available.r9#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@#}rA#(hX ``baseURL``rB#hj<#hhhjh}rC#(h]h]h]h]h]uhMh]rD#h)rE#}rF#(hjB#h}rG#(h]h]h]h]h]uhj@#h]rH#hXbaseURLrI#rJ#}rK#(hUhjE#ubahhubaubj)rL#}rM#(hUh}rN#(h]h]h]h]h]uhj<#h]rO#h)rP#}rQ#(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.hjL#hhhhh}rR#(h]h]h]h]h]uhMh]rS#(hX(required unless rT#rU#}rV#(hX(required unless hjP#ubh)rW#}rX#(hX ``repourl``h}rY#(h]h]h]h]h]uhjP#h]rZ#hXrepourlr[#r\#}r]#(hUhjW#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.hjP#ubeubahjubeubj)ra#}rb#(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}rc#(h]h]h]h]h]uhMhhh]rd#(j)re#}rf#(hX``defaultBranch``rg#hja#hhhjh}rh#(h]h]h]h]h]uhMh]ri#h)rj#}rk#(hjg#h}rl#(h]h]h]h]h]uhje#h]rm#hX defaultBranchrn#ro#}rp#(hUhjj#ubahhubaubj)rq#}rr#(hUh}rs#(h]h]h]h]h]uhja#h]rt#h)ru#}rv#(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.hjq#hhhhh}rw#(h]h]h]h]h]uhMh]rx#(hX(allowed if and only if ry#rz#}r{#(hX(allowed if and only if hju#ubh)r|#}r}#(hX ``baseURL``h}r~#(h]h]h]h]h]uhju#h]r#hXbaseURLr#r#}r#(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 r#r#}r#(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 hju#ubh)r#}r#(hX ``baseURL``h}r#(h]h]h]h]h]uhju#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 hju#ubh)r#}r#(hX ``darcs get``h}r#(h]h]h]h]h]uhju#h]r#hX darcs getr#r#}r#(hUhj#ubahhubhX command.r#r#}r#(hX command.hju#ubeubahjubeubeubj )r#}r#(hUhj"hhhj#h}r#(h]h]h]h]h]Uentries]r#((UsingleX#Build Steps; Mercurial (Slave-Side)Xstep-Mercurial (Slave-Side)r#j#tr#(UsingleX!Mercurial (Slave-Side) Build Stepj#j#tr#euhMhhh]ubh)r#}r#(hUhj"hhhhh}r#(h]h]h]h]h]hj#uhMhhh]ubeubh)r#}r#(hUhjhhh}hhh}r#(h]h]h]h]r#(Umercurial-slave-sider#j#eh]r#hauhMhhh}r#j#j#sh]r#(h)r#}r#(hXMercurial (Slave-Side)r#hj#hhhhh}r#(h]h]h]h]h]uhMhhh]r#hXMercurial (Slave-Side)r#r#}r#(hj#hj#ubaubh)r#}r#(hXThe :bb:step:`Mercurial ` build step performs a `Mercurial `_ (aka `hg`) 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:`Mercurial `r#hj#hhhhh}r#(UreftypeXsteph͉hXMercurial (Slave-Side)U 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#hX Mercurialr#r#}r#(hUhj#ubahhubaubhX build step performs a r#r#}r#(hX build step performs a hj#ubj)r#}r#(hX+`Mercurial `_h}r#(UnameX MercurialjXhttp://selenic.com/mercurialr#h]h]h]h]h]uhj#h]r#hX Mercurialr#r#}r#(hUhj#ubahjubh)r#}r#(hX hKhj#hhh}r#(Urefurij#h]r#Uid11r#ah]h]r#X mercurialr#ah]h]uh]ubhX (aka r#r#}r#(hX (aka hj#ubj_)r#}r#(hX`hg`h}r#(h]h]h]h]h]uhj#h]r#hXhgr#r#}r#(hUhj#ubahjgubhX) checkout or update.r#r#}r#(hX) checkout or update.hj#ubeubh)r#}r#(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#hhhhh}r#(h]h]h]h]h]uhMhhh]r#(hX%Branches are available in two modes: r#r#}r#(hX%Branches are available in two modes: hj#ubj_)r#}r#(hX `dirname`h}r#(h]h]h]h]h]uhj#h]r#hXdirnamer#r#}r#(hUhj#ubahjgubhX like r#r#}r#(hX like hj#ubh)r#}r#(hX%:bb:step:`Darcs `r#hj#hhhhh}r#(UreftypeXsteph͉hXDarcs (Slave-Side)U 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$hXDarcsr$r$}r$(hUhj$ubahhubaubhX, or r $r $}r $(hX, or hj#ubj_)r $}r $(hX`inrepo`h}r$(h]h]h]h]h]uhj#h]r$hXinrepor$r$}r$(hUhj $ubahjgubhXz, which uses the repository internal branches. Make sure this setting matches your changehook, if you have that installed.r$r$}r$(hXz, which uses the repository internal branches. Make sure this setting matches your changehook, if you have that installed.hj#ubeubh)r$}r$(hX1The Mercurial step takes the following arguments:r$hj#hhhhh}r$(h]h]h]h]h]uhMhhh]r$hX1The Mercurial 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#$(hXv``repourl`` (required unless ``baseURL`` is provided): the URL at which the Mercurial 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/$r0$}r1$(hUhj+$ubahhubaubj)r2$}r3$(hUh}r4$(h]h]h]h]h]uhj"$h]r5$h)r6$}r7$(hXi(required unless ``baseURL`` is provided): the URL at which the Mercurial source repository is available.hj2$hhhhh}r8$(h]h]h]h]h]uhMh]r9$(hX(required unless r:$r;$}r<$(hX(required unless hj6$ubh)r=$}r>$(hX ``baseURL``h}r?$(h]h]h]h]h]uhj6$h]r@$hXbaseURLrA$rB$}rC$(hUhj=$ubahhubhXM is provided): the URL at which the Mercurial source repository is available.rD$rE$}rF$(hXM is provided): the URL at which the Mercurial source repository is available.hj6$ubeubahjubeubj)rG$}rH$(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}rI$(h]h]h]h]h]uhMhhh]rJ$(j)rK$}rL$(hX ``baseURL``rM$hjG$hhhjh}rN$(h]h]h]h]h]uhMh]rO$h)rP$}rQ$(hjM$h}rR$(h]h]h]h]h]uhjK$h]rS$hXbaseURLrT$rU$}rV$(hUhjP$ubahhubaubj)rW$}rX$(hUh}rY$(h]h]h]h]h]uhjG$h]rZ$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.hjW$hhhhh}r]$(h]h]h]h]h]uhMh]r^$(hX(required unless r_$r`$}ra$(hX(required unless hj[$ubh)rb$}rc$(hX ``repourl``h}rd$(h]h]h]h]h]uhj[$h]re$hXrepourlrf$rg$}rh$(hUhjb$ubahhubhXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.ri$rj$}rk$(hXs is provided): the base repository URL, to which a branch name will be appended. It should probably end in a slash.hj[$ubeubahjubeubj)rl$}rm$(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. hj$hhhjh}rn$(h]h]h]h]h]uhMhhh]ro$(j)rp$}rq$(hX``defaultBranch``rr$hjl$hhhjh}rs$(h]h]h]h]h]uhMh]rt$h)ru$}rv$(hjr$h}rw$(h]h]h]h]h]uhjp$h]rx$hX defaultBranchry$rz$}r{$(hUhju$ubahhubaubj)r|$}r}$(hUh}r~$(h]h]h]h]h]uhjl$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 :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.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]r$hXbaseURLr$r$}r$(hUhj$ubahhubhXC is provided): this specifies the name of the branch to use when a r$r$}r$(hXC is provided): this specifies the name of the branch to use when a hj$ubh)r$}r$(hX:class:`Build`r$hj$hhhhh}r$(UreftypeXclassh͉hXBuildU 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$hXBuildr$r$}r$(hUhj$ubahhubaubhX; does not provide one of its own. This will be appended to r$r$}r$(hX; 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 ``hg clone``h}r$(h]h]h]h]h]uhj$h]r$hXhg cloner$r$}r$(hUhj$ubahhubhX command.r$r$}r$(hX command.hj$ubeubahjubeubj)r$}r$(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``. hj$hhhjh}r$(h]h]h]h]h]uhMhhh]r$(j)r$}r$(hX``branchType``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 branchTyper$r$}r$(hUhj$ubahhubaubj)r$}r$(hUh}r$(h]h]h]h]h]uhj$h]r$h)r$}r$(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``.hj$hhhhh}r$(h]h]h]h]h]uhMh]r$(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the r$r$}r$(hXfeither 'dirname' (default) or 'inrepo' depending on whether the branch name should be appended to the hj$ubh)r$}r$(hX ``baseURL``h}r$(h]h]h]h]h]uhj$h]r$hXbaseURLr$r$}r$(hUhj$ubahhubhXG or the branch is a Mercurial named branch and can be found within the r$r$}r$(hXG or the branch is a Mercurial named branch and can be found within the hj$ubh)r$}r$(hX ``repourl``h}r$(h]h]h]h]h]uhj$h]r$hXrepourlr$r$}r$(hUhj$ubahhubhX.r$}r$(hX.hj$ubeubahjubeubj)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. hj$hhhjh}r$(h]h]h]h]h]uhMhhh]r$(j)r$}r$(hX``clobberOnBranchChange``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$hXclobberOnBranchChanger$r$}r$(hUhj$ubahhubaubj)r$}r$(hUh}r$(h]h]h]h]h]uhj$h]r$h)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.hj$hhhhh}r$(h]h]h]h]h]uhMh]r$(hXboolean, defaults to r$r$}r$(hXboolean, defaults to hj$ubh)r%}r%(hX``True``h}r%(h]h]h]h]h]uhj$h]r%hXTruer%r%}r%(hUhj%ubahhubhXr. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.r%r%}r %(hXr. If set and using inrepos branches, clobber the tree at each branch change. Otherwise, just update to the branch.hj$ubeubahjubeubeubj )r %}r %(hUhj#hhhj#h}r %(h]h]h]h]h]Uentries]r %((UsingleXBuild Steps; Bzr (Slave-Side)Xstep-Bzr (Slave-Side)r%j%tr%(UsingleXBzr (Slave-Side) Build Stepj%j%tr%euhMhhh]ubh)r%}r%(hUhj#hhhhh}r%(h]h]h]h]h]hj%uhMhhh]ubeubh)r%}r%(hUhjhhh}hhh}r%(h]h]h]h]r%(Ubzr-slave-sider%j%eh]r%h/auhMhhh}r%j%j%sh]r%(h)r%}r%(hXBzr (Slave-Side)r%hj%hhhhh}r%(h]h]h]h]h]uhMhhh]r %hXBzr (Slave-Side)r!%r"%}r#%(hj%hj%ubaubh)r$%}r%%(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:hj%hhhhh}r&%(h]h]h]h]h]uhMhhh]r'%(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply r(%r)%}r*%(hXIbzr is a descendant of Arch/Baz, and is frequently referred to as simply hj$%ubj_)r+%}r,%(hX`Bazaar`h}r-%(h]h]h]h]h]uhj$%h]r.%hXBazaarr/%r0%}r1%(hUhj+%ubahjgubhX. 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:r2%r3%}r4%(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:hj$%ubeubj)r5%}r6%(hUhj%hhhjh}r7%(h]h]h]h]h]uhNhhh]r8%(j)r9%}r:%(hXp``repourl`` (required unless ``baseURL`` is provided): the URL at which the Bzr source repository is available. hj5%hhhjh}r;%(h]h]h]h]h]uhMh]r<%(j)r=%}r>%(hX ``repourl``r?%hj9%hhhjh}r@%(h]h]h]h]h]uhMh]rA%h)rB%}rC%(hj?%h}rD%(h]h]h]h]h]uhj=%h]rE%hXrepourlrF%rG%}rH%(hUhjB%ubahhubaubj)rI%}rJ%(hUh}rK%(h]h]h]h]h]uhj9%h]rL%h)rM%}rN%(hXc(required unless ``baseURL`` is provided): the URL at which the Bzr source repository is available.hjI%hhhhh}rO%(h]h]h]h]h]uhMh]rP%(hX(required unless rQ%rR%}rS%(hX(required unless hjM%ubh)rT%}rU%(hX ``baseURL``h}rV%(h]h]h]h]h]uhjM%h]rW%hXbaseURLrX%rY%}rZ%(hUhjT%ubahhubhXG is provided): the URL at which the Bzr source repository is available.r[%r\%}r]%(hXG is provided): the URL at which the Bzr source repository is available.hjM%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. hj5%hhhjh}r`%(h]h]h]h]h]uhMhhh]ra%(j)rb%}rc%(hX ``baseURL``rd%hj^%hhhjh}re%(h]h]h]h]h]uhMh]rf%h)rg%}rh%(hjd%h}ri%(h]h]h]h]h]uhjb%h]rj%hXbaseURLrk%rl%}rm%(hUhjg%ubahhubaubj)rn%}ro%(hUh}rp%(h]h]h]h]h]uhj^%h]rq%h)rr%}rs%(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.hjn%hhhhh}rt%(h]h]h]h]h]uhMh]ru%(hX(required unless rv%rw%}rx%(hX(required unless hjr%ubh)ry%}rz%(hX ``repourl``h}r{%(h]h]h]h]h]uhjr%h]r|%hXrepourlr}%r~%}r%(hUhjy%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.hjr%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. hj5%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 ``bzr checkout`` 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]r%hXbaseURLr%r%}r%(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 r%r%}r%(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)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``bzr checkout``h}r%(h]h]h]h]h]uhj%h]r%hX bzr checkoutr%r%}r%(hUhj%ubahhubhX command.r%r%}r%(hX command.hj%ubeubahjubeubj)r%}r%(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. hj5%hhhjh}r%(h]h]h]h]h]uhMhhh]r%(j)r%}r%(hX``forceSharedRepo``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%hXforceSharedRepor%r%}r%(hUhj%ubahhubaubj)r%}r%(hUh}r%(h]h]h]h]h]uhj%h]r%h)r%}r%(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.hj%hhhhh}r%(h]h]h]h]h]uhMh]r%(hX (boolean, optional, defaults to r%r%}r%(hX (boolean, optional, defaults to hj%ubh)r%}r%(hX ``False``h}r%(h]h]h]h]h]uhj%h]r%hXFalser%r%}r%(hUhj%ubahhubhX ): 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, 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.r%r%}r%(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.hj%ubeubahjubeubeubj )r%}r%(hUhj%hhhj#h}r%(h]h]h]h]h]Uentries]r%((UsingleXBuild Steps; P4 (Slave-Side)Xstep-P4 (Slave-Side)r%j%tr%(UsingleXP4 (Slave-Side) Build Stepj%j%tr%euhMhhh]ubh)r%}r%(hUhj%hhhhh}r%(h]h]h]h]h]hj%uhMhhh]ubeubh)r%}r%(hUhjhhh}hhh}r%(h]h]h]h]r%(U p4-slave-sider%j%eh]r%hBauhMhhh}r%j%j%sh]r%(h)r%}r%(hXP4 (Slave-Side)r%hj%hhhhh}r&(h]h]h]h]h]uhMhhh]r&hXP4 (Slave-Side)r&r&}r&(hj%hj%ubaubh)r&}r&(hXThe :bb:step:`P4 (Slave-Side)` build step creates a `Perforce `_ client specification and performs an update.hj%hhhhh}r&(h]h]h]h]h]uhM hhh]r&(hXThe r &r &}r &(hXThe hj&ubh)r &}r &(hX:bb:step:`P4 (Slave-Side)`r&hj&hhhhh}r&(UreftypeXsteph͉hXP4 (Slave-Side)U 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&hXP4 (Slave-Side)r&r&}r&(hUhj&ubahhubaubhX build step creates a r&r&}r&(hX build step creates a hj&ubj)r&}r&(hX&`Perforce `_h}r &(UnameXPerforcejXhttp://www.perforce.com/r!&h]h]h]h]h]uhj&h]r"&hXPerforcer#&r$&}r%&(hUhj&ubahjubh)r&&}r'&(hX hKhj&hhh}r(&(Urefurij!&h]r)&Uid12r*&ah]h]r+&Xperforcer,&ah]h]uh]ubhX- client specification and performs an update.r-&r.&}r/&(hX- client specification and performs an update.hj&ubeubj)r0&}r1&(hUhj%hhhjh}r2&(h]h]h]h]h]uhNhhh]r3&(j)r4&}r5&(hXn``p4base`` A view into the Perforce depot without branch name or trailing "...". Typically ``//depot/proj/``. hj0&hhhjh}r6&(h]h]h]h]h]uhMh]r7&(j)r8&}r9&(hX ``p4base``r:&hj4&hhhjh}r;&(h]h]h]h]h]uhMh]r<&h)r=&}r>&(hj:&h}r?&(h]h]h]h]h]uhj8&h]r@&hXp4baserA&rB&}rC&(hUhj=&ubahhubaubj)rD&}rE&(hUh}rF&(h]h]h]h]h]uhj4&h]rG&h)rH&}rI&(hXbA view into the Perforce depot without branch name or trailing "...". Typically ``//depot/proj/``.hjD&hhhhh}rJ&(h]h]h]h]h]uhMh]rK&(hXPA view into the Perforce depot without branch name or trailing "...". Typically rL&rM&}rN&(hXPA view into the Perforce depot without branch name or trailing "...". Typically hjH&ubh)rO&}rP&(hX``//depot/proj/``h}rQ&(h]h]h]h]h]uhjH&h]rR&hX //depot/proj/rS&rT&}rU&(hUhjO&ubahhubhX.rV&}rW&(hX.hjH&ubeubahjubeubj)rX&}rY&(hXg``defaultBranch`` A branch name to append on build requests if none is specified. Typically ``trunk``. hj0&hhhjh}rZ&(h]h]h]h]h]uhMhhh]r[&(j)r\&}r]&(hX``defaultBranch``r^&hjX&hhhjh}r_&(h]h]h]h]h]uhMh]r`&h)ra&}rb&(hj^&h}rc&(h]h]h]h]h]uhj\&h]rd&hX defaultBranchre&rf&}rg&(hUhja&ubahhubaubj)rh&}ri&(hUh}rj&(h]h]h]h]h]uhjX&h]rk&h)rl&}rm&(hXTA branch name to append on build requests if none is specified. Typically ``trunk``.hjh&hhhhh}rn&(h]h]h]h]h]uhMh]ro&(hXJA branch name to append on build requests if none is specified. Typically rp&rq&}rr&(hXJA branch name to append on build requests if none is specified. Typically hjl&ubh)rs&}rt&(hX ``trunk``h}ru&(h]h]h]h]h]uhjl&h]rv&hXtrunkrw&rx&}ry&(hUhjs&ubahhubhX.rz&}r{&(hX.hjl&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. hj0&hhhjh}r~&(h]h]h]h]h]uhMhhh]r&(j)r&}r&(hX ``p4port``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&hXp4portr&r&}r&(hUhj&ubahhubaubj)r&}r&(hUh}r&(h]h]h]h]h]uhj|&h]r&h)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.hj&hhhhh}r&(h]h]h]h]h]uhMh]r&(hX(optional): the r&r&}r&(hX(optional): the hj&ubh)r&}r&(hUh}r&(h]h]h]h]r&Xsampr&aUrolej&h]uhj&h]r&(jq)r&}r&(hXhosth}r&(h]h]h]h]h]uhj&h]r&hXhostr&r&}r&(hUhj&ubahj{ubhX:r&}r&(hX:hj&ubjq)r&}r&(hXporth}r&(h]h]h]h]h]uhj&h]r&hXportr&r&}r&(hUhj&ubahj{ubehhubhXH string describing how to get to the P4 Depot (repository), used as the r&r&}r&(hXH string describing how to get to the P4 Depot (repository), used as the hj&ubh)r&}r&(hX :option:`-p`r&hj&hhhhh}r&(UreftypeXoptionh͉hX-pU refdomainXstdr&jNh]h]U refexplicith]h]h]hhuhMh]r&j)r&}r&(hj&h}r&(h]h]r&(hj&X std-optionr&eh]h]h]uhj&h]r&hX-pr&r&}r&(hUhj&ubahjubaubhX argument for all p4 commands.r&r&}r&(hX argument for all p4 commands.hj&ubeubahjubeubj)r&}r&(hX```p4user`` (optional): the Perforce user, used as the :option:`-u` argument to all p4 commands. hj0&hhhjh}r&(h]h]h]h]h]uhMhhh]r&(j)r&}r&(hX ``p4user``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&hXp4userr&r&}r&(hUhj&ubahhubaubj)r&}r&(hUh}r&(h]h]h]h]h]uhj&h]r&h)r&}r&(hXT(optional): the Perforce user, used as the :option:`-u` argument to all p4 commands.hj&hhhhh}r&(h]h]h]h]h]uhMh]r&(hX+(optional): the Perforce user, used as the r&r&}r&(hX+(optional): the Perforce user, used as the hj&ubh)r&}r&(hX :option:`-u`r&hj&hhhhh}r&(UreftypeXoptionh͉hX-uU refdomainXstdr&jNh]h]U refexplicith]h]h]hhuhMh]r&j)r&}r&(hj&h}r&(h]h]r&(hj&X std-optionr&eh]h]h]uhj&h]r&hX-ur&r&}r&(hUhj&ubahjubaubhX argument to all p4 commands.r&r&}r&(hX argument to all p4 commands.hj&ubeubahjubeubj)r&}r&(hXf``p4passwd`` (optional): the Perforce password, used as the :option:`-p` argument to all p4 commands. hj0&hhhjh}r&(h]h]h]h]h]uhMhhh]r&(j)r&}r&(hX ``p4passwd``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&hXp4passwdr&r&}r&(hUhj&ubahhubaubj)r&}r'(hUh}r'(h]h]h]h]h]uhj&h]r'h)r'}r'(hXX(optional): the Perforce password, used as the :option:`-p` argument to all p4 commands.hj&hhhhh}r'(h]h]h]h]h]uhMh]r'(hX/(optional): the Perforce password, used as the r'r'}r '(hX/(optional): the Perforce password, used as the hj'ubh)r '}r '(hX :option:`-p`r 'hj'hhhhh}r '(UreftypeXoptionh͉hX-pU refdomainXstdr'jNh]h]U refexplicith]h]h]hhuhMh]r'j)r'}r'(hj 'h}r'(h]h]r'(hj'X std-optionr'eh]h]h]uhj 'h]r'hX-pr'r'}r'(hUhj'ubahjubaubhX argument to all p4 commands.r'r'}r'(hX argument to all p4 commands.hj'ubeubahjubeubj)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. hj0&hhhjh}r'(h]h]h]h]h]uhM%hhh]r'(j)r '}r!'(hX``p4extra_views``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 p4extra_viewsr)'r*'}r+'(hUhj%'ubahhubaubj)r,'}r-'(hUh}r.'(h]h]h]h]h]uhj'h]r/'h)r0'}r1'(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.hj,'hhhhh}r2'(h]h]h]h]h]uhM"h]r3'(hX(optional): a list of r4'r5'}r6'(hX(optional): a list of hj0'ubh)r7'}r8'(hX``(depotpath, clientpath)``h}r9'(h]h]h]h]h]uhj0'h]r:'hX(depotpath, clientpath)r;'r<'}r='(hUhj7'ubahhubhX 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.r>'r?'}r@'(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.hj0'ubeubahjubeubj)rA'}rB'(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`. hj0&hhhjh}rC'(h]h]h]h]h]uhM-hhh]rD'(j)rE'}rF'(hX ``p4client``rG'hjA'hhhjh}rH'(h]h]h]h]h]uhM-h]rI'h)rJ'}rK'(hjG'h}rL'(h]h]h]h]h]uhjE'h]rM'hXp4clientrN'rO'}rP'(hUhjJ'ubahhubaubj)rQ'}rR'(hUh}rS'(h]h]h]h]h]uhjA'h]rT'h)rU'}rV'(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`.hjQ'hhhhh}rW'(h]h]h]h]h]uhM(h]rX'(hX.(optional): The name of the client to use. In rY'rZ'}r['(hX.(optional): The name of the client to use. In hjU'ubh)r\'}r]'(hX``mode='copy'``h}r^'(h]h]h]h]h]uhjU'h]r_'hX mode='copy'r`'ra'}rb'(hUhj\'ubahhubhX and rc'rd'}re'(hX and hjU'ubh)rf'}rg'(hX``mode='update'``h}rh'(h]h]h]h]h]uhjU'h]ri'hX mode='update'rj'rk'}rl'(hUhjf'ubahhubhX%, 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 rm'rn'}ro'(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 hjU'ubj_)rp'}rq'(hX`buildbot_%(slave)s_%(build)s`h}rr'(h]h]h]h]h]uhjU'h]rs'hXbuildbot_%(slave)s_%(build)srt'ru'}rv'(hUhjp'ubahjgubhX.rw'}rx'(hX.hjU'ubeubahjubeubj)ry'}rz'(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``. hj0&hhhjh}r{'(h]h]h]h]h]uhM2hhh]r|'(j)r}'}r~'(hX``p4line_end``r'hjy'hhhjh}r'(h]h]h]h]h]uhM2h]r'h)r'}r'(hj'h}r'(h]h]h]h]h]uhj}'h]r'hX p4line_endr'r'}r'(hUhj'ubahhubaubj)r'}r'(hUh}r'(h]h]h]h]h]uhjy'h]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``.hj'hhhhh}r'(h]h]h]h]h]uhM0h]r'(hXi(optional): The type of line ending handling P4 should use. This is added directly to the client spec's r'r'}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]r'hXLineEndr'r'}r'(hUhj'ubahhubhX property. The default is r'r'}r'(hX property. The default is hj'ubh)r'}r'(hX ``local``h}r'(h]h]h]h]h]uhj'h]r'hXlocalr'r'}r'(hUhj'ubahhubhX.r'}r'(hX.hj'ubeubahjubeubeubj )r'}r'(hUhj%hhhj#h}r'(h]h]h]h]h]Uentries]r'((UsingleXBuild Steps; Git (Slave-Side)Xstep-Git (Slave-Side)r'j'tr'(UsingleXGit (Slave-Side) Build Stepj'j'tr'euhM5hhh]ubh)r'}r'(hUhj%hhhhh}r'(h]h]h]h]h]hj'uhM5hhh]ubeubh)r'}r'(hUhjhhh}hhh}r'(h]h]h]h]r'(Ugit-slave-sider'j'eh]r'h4auhM7hhh}r'j'j'sh]r'(h)r'}r'(hXGit (Slave-Side)r'hj'hhhhh}r'(h]h]h]h]h]uhM7hhh]r'hXGit (Slave-Side)r'r'}r'(hj'hj'ubaubh)r'}r'(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'hhhhh}r'(h]h]h]h]h]uhM9hhh]r'(hXThe r'r'}r'(hXThe hj'ubh)r'}r'(hX!:bb:step:`Git `r'hj'hhhhh}r'(UreftypeXsteph͉hXGit (Slave-Side)U refdomainXbbr'h]h]U refexplicith]h]h]hhuhM9h]r'h)r'}r'(hj'h}r'(h]h]r'(hj'Xbb-stepr'eh]h]h]uhj'h]r'hXGitr'r'}r'(hUhj'ubahhubaubhX build step clones or updates a r'r'}r'(hX build step clones or updates a hj'ubj)r'}r'(hX`Git `_h}r'(UnameXGitjXhttp://git.or.cz/r'h]h]h]h]h]uhj'h]r'hXGitr'r'}r'(hUhj'ubahjubh)r'}r'(hX hKhj'hhh}r'(Urefurij'h]r'Uid13r'ah]h]r'Xgitr'ah]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 r'r'}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 hj'ubh)r'}r'(hX ``git init``h}r'(h]h]h]h]h]uhj'h]r'hXgit initr'r'}r'(hUhj'ubahhubhX command that the buildbot uses.r'r'}r'(hX command that the buildbot uses.hj'ubeubh)r'}r'(hX/The ``Git`` step takes the following arguments:r'hj'hhhhh}r'(h]h]h]h]h]uhM?hhh]r'(hXThe r'r'}r'(hXThe hj'ubh)r'}r'(hX``Git``h}r((h]h]h]h]h]uhj'h]r(hXGitr(r(}r((hUhj'ubahhubhX$ step takes the following arguments:r(r(}r((hX$ step takes the following arguments:hj'ubeubj)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. hj(hhhjh}r((h]h]h]h]h]uhMBh]r((j)r(}r((hX ``repourl``r(hj (hhhjh}r((h]h]h]h]h]uhMBh]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!((hX3(required): the URL of the upstream Git repository.r"(hj(hhhhh}r#((h]h]h]h]h]uhMBh]r$(hX3(required): the URL of the upstream Git repository.r%(r&(}r'((hj"(hj (ubaubahjubeubj)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 :class:`Build` does not provide a branch, the `master` branch will be used. hj(hhhjh}r*((h]h]h]h]h]uhMHhhh]r+((j)r,(}r-((hX ``branch``r.(hj((hhhjh}r/((h]h]h]h]h]uhMHh]r0(h)r1(}r2((hj.(h}r3((h]h]h]h]h]uhj,(h]r4(hXbranchr5(r6(}r7((hUhj1(ubahhubaubj)r8(}r9((hUh}r:((h]h]h]h]h]uhj((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. If this this parameter is not specified, and the :class:`Build` does not provide a branch, the `master` branch will be used.hj8(hhhhh}r>((h]h]h]h]h]uhMEh]r?((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 r@(rA(}rB((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 hj<(ubh)rC(}rD((hX:class:`Build`rE(hj<(hhhhh}rF((UreftypeXclassh͉hXBuildU refdomainXpyrG(h]h]U refexplicith]h]h]hhhNhj|uhMEh]rH(h)rI(}rJ((hjE(h}rK((h]h]rL((hjG(Xpy-classrM(eh]h]h]uhjC(h]rN(hXBuildrO(rP(}rQ((hUhjI(ubahhubaubhX does not provide a branch, the rR(rS(}rT((hX does not provide a branch, the hj<(ubj_)rU(}rV((hX`master`h}rW((h]h]h]h]h]uhj<(h]rX(hXmasterrY(rZ(}r[((hUhjU(ubahjgubhX branch will be used.r\(r](}r^((hX branch will be used.hj<(ubeubahjubeubj)r_(}r`((hXq``ignore_ignores`` (optional): when purging changes, don't use :file:`.gitignore` and :file:`.git/info/exclude`. hj(hhhjh}ra((h]h]h]h]h]uhMLhhh]rb((j)rc(}rd((hX``ignore_ignores``re(hj_(hhhjh}rf((h]h]h]h]h]uhMLh]rg(h)rh(}ri((hje(h}rj((h]h]h]h]h]uhjc(h]rk(hXignore_ignoresrl(rm(}rn((hUhjh(ubahhubaubj)ro(}rp((hUh}rq((h]h]h]h]h]uhj_(h]rr(h)rs(}rt((hX](optional): when purging changes, don't use :file:`.gitignore` and :file:`.git/info/exclude`.hjo(hhhhh}ru((h]h]h]h]h]uhMKh]rv((hX,(optional): when purging changes, don't use rw(rx(}ry((hX,(optional): when purging changes, don't use hjs(ubh)rz(}r{((hUh}r|((h]h]h]h]r}(Xfiler~(aUrolej~(h]uhjs(h]r(hX .gitignorer(r(}r((hX .gitignorehjz(ubahhubhX and r(r(}r((hX and hjs(ubh)r(}r((hUh}r((h]h]h]h]r(Xfiler(aUrolej(h]uhjs(h]r(hX.git/info/excluder(r(}r((hX.git/info/excludehj(ubahhubhX.r(}r((hX.hjs(ubeubahjubeubj)r(}r((hX``submodules`` (optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: ``False``. hj(hhhjh}r((h]h]h]h]h]uhMPhhh]r((j)r(}r((hX``submodules``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 submodulesr(r(}r((hUhj(ubahhubaubj)r(}r((hUh}r((h]h]h]h]h]uhj(h]r(h)r(}r((hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: ``False``.hj(hhhhh}r((h]h]h]h]h]uhMOh]r((hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: r(r(}r((hX(optional): when initializing/updating a Git repository, this decides whether or not buildbot should consider Git submodules. Default: 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``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. hj(hhhjh}r((h]h]h]h]h]uhMUhhh]r((j)r(}r((hX ``reference``r(hj(hhhjh}r((h]h]h]h]h]uhMUh]r(h)r(}r((hj(h}r((h]h]h]h]h]uhj(h]r(hX referencer(r(}r((hUhj(ubahhubaubj)r(}r((hUh}r((h]h]h]h]h]uhj(h]r(h)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.r(hj(hhhhh}r((h]h]h]h]h]uhMSh]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.r(r(}r((hj(hj(ubaubahjubeubj)r(}r((hX``shallow`` (optional): instructs Git to attempt shallow clones (``--depth 1``). If the user/scheduler asks for a specific revision, this parameter is ignored. hj(hhhjh}r((h]h]h]h]h]uhMYhhh]r((j)r(}r((hX ``shallow``r(hj(hhhjh}r((h]h]h]h]h]uhMYh]r(h)r(}r((hj(h}r((h]h]h]h]h]uhj(h]r(hXshallowr(r(}r((hUhj(ubahhubaubj)r(}r((hUh}r((h]h]h]h]h]uhj(h]r(h)r(}r((hX(optional): instructs Git to attempt shallow clones (``--depth 1``). If the user/scheduler asks for a specific revision, this parameter is ignored.hj(hhhhh}r((h]h]h]h]h]uhMXh]r((hX5(optional): instructs Git to attempt shallow clones (r(r(}r((hX5(optional): instructs Git to attempt shallow clones (hj(ubh)r(}r((hX ``--depth 1``h}r((h]h]h]h]h]uhj(h]r(hX --depth 1r(r(}r((hUhj(ubahhubhXR). If the user/scheduler asks for a specific revision, this parameter is ignored.r(r(}r((hXR). If the user/scheduler asks for a specific revision, this parameter is ignored.hj(ubeubahjubeubj)r(}r((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. hj(hhhjh}r((h]h]h]h]h]uhM^hhh]r((j)r(}r((hX ``progress``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)hXprogressr)r)}r)(hUhj(ubahhubaubj)r)}r)(hUh}r)(h]h]h]h]h]uhj(h]r )h)r )}r )(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.hj)hhhhh}r )(h]h]h]h]h]uhM\h]r )(hX(optional): passes the (r)r)}r)(hX(optional): passes the (hj )ubh)r)}r)(hX``--progress``h}r)(h]h]h]h]h]uhj )h]r)hX --progressr)r)}r)(hUhj)ubahhubhX ) flag to (r)r)}r)(hX ) flag to (hj )ubh)r)}r)(hX ``git fetch``h}r)(h]h]h]h]h]uhj )h]r)hX git fetchr)r )}r!)(hUhj)ubahhubhXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.r")r#)}r$)(hXj). This solves issues of long fetches being killed due to lack of output, but requires Git 1.7.2 or later.hj )ubeubahjubeubeubh)r%)}r&)(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'hhhhh}r')(h]h]h]h]h]uhM`hhh]r()(hX!This Source step integrates with r))r*)}r+)(hX!This Source step integrates with hj%)ubh)r,)}r-)(hX:bb:chsrc:`GerritChangeSource`r.)hj%)hhhhh}r/)(UreftypeXchsrch͉hXGerritChangeSourceU refdomainXbbr0)h]h]U refexplicith]h]h]hhuhM`h]r1)h)r2)}r3)(hj.)h}r4)(h]h]r5)(hj0)Xbb-chsrcr6)eh]h]h]uhj,)h]r7)hXGerritChangeSourcer8)r9)}r:)(hUhj2)ubahhubaubhX8, and will automatically use Gerrit's "virtual branch" (r;)r<)}r=)(hX8, and will automatically use Gerrit's "virtual branch" (hj%)ubh)r>)}r?)(hX``refs/changes/*``h}r@)(h]h]h]h]h]uhj%)h]rA)hXrefs/changes/*rB)rC)}rD)(hUhj>)ubahhubhXH) to download the additionnal changes introduced by a pending changeset.rE)rF)}rG)(hXH) to download the additionnal changes introduced by a pending changeset.hj%)ubeubj )rH)}rI)(hUhj'hhhj#h}rJ)(h]h]h]h]h]j%]rK)(jX/Gerrit integration; Git (Slave-Side) Build StepUindex-11rL)UtrM)aj*uhMdhhh]ubh)rN)}rO)(hUhj'hhhhh}rP)(h]h]h]h]h]hjL)uhMehhh]ubh)rQ)}rR)(hXGerrit integration can be also triggered using forced build with ``gerrit_change`` property with value in format: ``change_number/patchset_number``.hj'hhh}hhh}rS)(h]h]h]h]rT)jL)ah]uhMfhhh}rU)jL)jN)sh]rV)(hXAGerrit integration can be also triggered using forced build with rW)rX)}rY)(hXAGerrit integration can be also triggered using forced build with hjQ)ubh)rZ)}r[)(hX``gerrit_change``h}r\)(h]h]h]h]h]uhjQ)h]r])hX gerrit_changer^)r_)}r`)(hUhjZ)ubahhubhX property with value in format: ra)rb)}rc)(hX property with value in format: hjQ)ubh)rd)}re)(hX!``change_number/patchset_number``h}rf)(h]h]h]h]h]uhjQ)h]rg)hXchange_number/patchset_numberrh)ri)}rj)(hUhjd)ubahhubhX.rk)}rl)(hX.hjQ)ubeubj )rm)}rn)(hUhj'hhhj#h}ro)(h]h]h]h]h]Uentries]rp)((UsingleXBuild Steps; BK (Slave-Side)Xstep-BK (Slave-Side)rq)jq)trr)(UsingleXBK (Slave-Side) Build Stepjq)jq)trs)euhMjhhh]ubh)rt)}ru)(hUhj'hhhhh}rv)(h]h]h]h]h]hjq)uhMjhhh]ubeubh)rw)}rx)(hUhjhhh}hhh}ry)(h]h]h]h]rz)(Ubitkeeper-slave-sider{)jq)eh]r|)h1auhMlhhh}r})jq)jt)sh]r~)(h)r)}r)(hXBitKeeper (Slave-Side)r)hjw)hhhhh}r)(h]h]h]h]h]uhMlhhh]r)hXBitKeeper (Slave-Side)r)r)}r)(hj)hj)ubaubh)r)}r)(hXvThe :bb:step:`BK ` build step performs a `BitKeeper `_ checkout or update.hjw)hhhhh}r)(h]h]h]h]h]uhMnhhh]r)(hXThe r)r)}r)(hXThe hj)ubh)r)}r)(hX:bb:step:`BK `r)hj)hhhhh}r)(UreftypeXsteph͉hXBK (Slave-Side)U refdomainXbbr)h]h]U refexplicith]h]h]hhuhMnh]r)h)r)}r)(hj)h}r)(h]h]r)(hj)Xbb-stepr)eh]h]h]uhj)h]r)hXBKr)r)}r)(hUhj)ubahhubaubhX build step performs a r)r)}r)(hX build step performs a hj)ubj)r)}r)(hX(`BitKeeper `_h}r)(UnameX BitKeeperjXhttp://www.bitkeeper.com/r)h]h]h]h]h]uhj)h]r)hX BitKeeperr)r)}r)(hUhj)ubahjubh)r)}r)(hX hKhj)hhh}r)(Urefurij)h]r)U bitkeeperr)ah]h]h]h]r)hyauh]ubhX checkout or update.r)r)}r)(hX checkout or update.hj)ubeubh)r)}r)(hX1The BitKeeper step takes the following arguments:r)hjw)hhhhh}r)(h]h]h]h]h]uhMqhhh]r)hX1The BitKeeper step takes the following arguments:r)r)}r)(hj)hj)ubaubj)r)}r)(hUhjw)hhhjh}r)(h]h]h]h]h]uhNhhh]r)(j)r)}r)(hXv``repourl`` (required unless ``baseURL`` is provided): the URL at which the BitKeeper source repository is available. hj)hhhjh}r)(h]h]h]h]h]uhMuh]r)(j)r)}r)(hX ``repourl``r)hj)hhhjh}r)(h]h]h]h]h]uhMuh]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)(hXi(required unless ``baseURL`` is provided): the URL at which the BitKeeper source repository is available.hj)hhhhh}r)(h]h]h]h]h]uhMth]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)ubahhubhXM is provided): the URL at which the BitKeeper source repository is available.r)r)}r)(hXM is provided): the URL at which the BitKeeper 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]uhMzhhh]r)(j)r)}r)(hX ``baseURL``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)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]uhMxh]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)ubeubahjubeubeubj )r*}r*(hUhjw)hhhj#h}r *(h]h]h]h]h]Uentries]r *((UsingleXBuild Steps; Repo (Slave-Side)Xstep-Repo (Slave-Side)r *j *tr *(UsingleXRepo (Slave-Side) Build Stepj *j *tr *euhM}hhh]ubh)r*}r*(hUhjw)hhhhh}r*(h]h]h]h]h]hj *uhM}hhh]ubeubh)r*}r*(hUhjhhh}hhh}r*(h]h]h]h]r*(Urepo-slave-sider*j *eh]r*hGauhMhhh}r*j *j*sh]r*(h)r*}r*(hXRepo (Slave-Side)r*hj*hhhhh}r*(h]h]h]h]h]uhMhhh]r*hXRepo (Slave-Side)r*r*}r *(hj*hj*ubaubj )r!*}r"*(hUhj*hNhj#h}r#*(h]h]h]h]h]Uentries]r$*(j'X;buildbot.steps.source.Repo (class in buildbot.steps.source)hUtr%*auhNhhh]ubjj)r&*}r'*(hUhj*hNhjmh}r(*(jojpXpyh]h]h]h]h]jqXclassr)*jsj)*uhNhhh]r**(ju)r+*}r,*(hXbuildbot.steps.source.Repohj&*hhhjxh}r-*(h]r.*haj{j|h]h]h]h]r/*haj~Xbuildbot.steps.source.RepojXbuildbot.steps.sourcejuhMhhh]r0*(j)r1*}r2*(hXclass hj+*hhhjh}r3*(h]h]h]h]h]uhMhhh]r4*hXclass r5*r6*}r7*(hUhj1*ubaubj)r8*}r9*(hXbuildbot.steps.source.hj+*hhhjh}r:*(h]h]h]h]h]uhMhhh]r;*hXbuildbot.steps.source.r<*r=*}r>*(hUhj8*ubaubj)r?*}r@*(hXRepohj+*hhhjh}rA*(h]h]h]h]h]uhMhhh]rB*hXReporC*rD*}rE*(hUhj?*ubaubeubj)rF*}rG*(hUhj&*hhhjh}rH*(h]h]h]h]h]uhMhhh]ubeubh)rI*}rJ*(hXoThe :bb:step:`Repo (Slave-Side)` build step performs a `Repo `_ init and sync.hj*hhhhh}rK*(h]h]h]h]h]uhMhhh]rL*(hXThe rM*rN*}rO*(hXThe hjI*ubh)rP*}rQ*(hX:bb:step:`Repo (Slave-Side)`rR*hjI*hhhhh}rS*(UreftypeXsteph͉hXRepo (Slave-Side)U refdomainXbbrT*h]h]U refexplicith]h]h]hhuhMh]rU*h)rV*}rW*(hjR*h}rX*(h]h]rY*(hjT*Xbb-steprZ*eh]h]h]uhjP*h]r[*hXRepo (Slave-Side)r\*r]*}r^*(hUhjV*ubahhubaubhX build step performs a r_*r`*}ra*(hX build step performs a hjI*ubj)rb*}rc*(hX)`Repo `_h}rd*(UnameXRepojXhttp://lwn.net/Articles/304488/re*h]h]h]h]h]uhjI*h]rf*hXReporg*rh*}ri*(hUhjb*ubahjubh)rj*}rk*(hX" hKhjI*hhh}rl*(Urefurije*h]rm*Uid14rn*ah]h]ro*Xreporp*ah]h]uh]ubhX init and sync.rq*rr*}rs*(hX init and sync.hjI*ubeubh)rt*}ru*(hXPThis step is obsolete and should not be used anymore. please use: `Repo` insteadrv*hj*hhhhh}rw*(h]h]h]h]h]uhMhhh]rx*(hXBThis step is obsolete and should not be used anymore. please use: ry*rz*}r{*(hXBThis step is obsolete and should not be used anymore. please use: hjt*ubj_)r|*}r}*(hX`Repo`h}r~*(h]h]h]h]h]uhjt*h]r*hXRepor*r*}r*(hUhj|*ubahjgubhX insteadr*r*}r*(hX insteadhjt*ubeubh)r*}r*(hX,The Repo step takes the following arguments:r*hj*hhhhh}r*(h]h]h]h]h]uhMhhh]r*hX,The Repo 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*(hXc``manifest_url`` (required): the URL at which the Repo's manifests source repository is available. hj*hhhjh}r*(h]h]h]h]h]uhMh]r*(j)r*}r*(hX``manifest_url``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 manifest_urlr*r*}r*(hUhj*ubahhubaubj)r*}r*(hUh}r*(h]h]h]h]h]uhj*h]r*h)r*}r*(hXQ(required): the URL at which the Repo's manifests source repository is available.r*hj*hhhhh}r*(h]h]h]h]h]uhMh]r*hXQ(required): the URL at which the Repo's manifests source repository is available.r*r*}r*(hj*hj*ubaubahjubeubj)r*}r*(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. hj*hhhjh}r*(h]h]h]h]h]uhMhhh]r*(j)r*}r*(hX``manifest_branch``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*hXmanifest_branchr*r*}r*(hUhj*ubahhubaubj)r*}r*(hUh}r*(h]h]h]h]h]uhj*h]r*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.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 ``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*ubj)r*}r*(hX:command:`repo init`h}r*(h]h]r*jah]h]h]uhj*h]r*hX repo initr*r*}r*(hUhj*ubahj ubhX command.r*r*}r*(hX command.hj*ubeubahjubeubj)r*}r*(hX``manifest_file`` (optional, defaults to ``default.xml``): the manifest filename. Corresponds to the ``-m`` argument to the :command:`repo init` command. hj*hhhjh}r*(h]h]h]h]h]uhMhhh]r*(j)r*}r*(hX``manifest_file``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 manifest_filer*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]uhMh]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*ubj)r+}r+(hX:command:`repo init`h}r+(h]h]r+jah]h]h]uhj*h]r+hX repo initr+r+}r+(hUhj+ubahj ubhX command.r+r +}r!+(hX command.hj*ubeubahjubeubj)r"+}r#+(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. hj*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/+r0+}r1+(hUhj++ubahhubaubj)r2+}r3+(hUh}r4+(h]h]h]h]h]uhj"+h]r5+h)r6+}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.hj2+hhhhh}r8+(h]h]h]h]h]uhMh]r9+(hX(optional, defaults to r:+r;+}r<+(hX(optional, defaults to hj6+ubh)r=+}r>+(hX``None``h}r?+(h]h]h]h]h]uhj6+h]r@+hXNonerA+rB+}rC+(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 rD+rE+}rF+(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 hj6+ubh)rG+}rH+(hX ``.repo``h}rI+(h]h]h]h]h]uhj6+h]rJ+hX.reporK+rL+}rM+(hUhjG+ubahhubhXq directory which contains all the Git objects. This feature helps to minimize network usage on very big projects.rN+rO+}rP+(hXq directory which contains all the Git objects. This feature helps to minimize network usage on very big projects.hj6+ubeubahjubeubj)rQ+}rR+(hX``jobs`` (optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j". hj*hhhjh}rS+(h]h]h]h]h]uhMhhh]rT+(j)rU+}rV+(hX``jobs``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]+hXjobsr^+r_+}r`+(hUhjZ+ubahhubaubj)ra+}rb+(hUh}rc+(h]h]h]h]h]uhjQ+h]rd+h)re+}rf+(hX(optional, defaults to ``None``): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hja+hhhhh}rg+(h]h]h]h]h]uhMh]rh+(hX(optional, defaults to ri+rj+}rk+(hX(optional, defaults to hje+ubh)rl+}rm+(hX``None``h}rn+(h]h]h]h]h]uhje+h]ro+hXNonerp+rq+}rr+(hUhjl+ubahhubhXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".rs+rt+}ru+(hXf): Number of projects to fetch simultaneously while syncing. Passed to repo sync subcommand with "-j".hje+ubeubahjubeubeubh)rv+}rw+(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.hj*hhhhh}rx+(h]h]h]h]h]uhMhhh]ry+(hX!This Source step integrates with rz+r{+}r|+(hX!This Source step integrates with hjv+ubh)r}+}r~+(hX:bb:chsrc:`GerritChangeSource`r+hjv+hhhhh}r+(UreftypeXchsrch͉hXGerritChangeSourceU 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 hjv+ubj)r+}r+(hX:command:`repo download`h}r+(h]h]r+jah]h]h]uhjv+h]r+hX repo downloadr+r+}r+(hUhj+ubahj ubhXW 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.hjv+ubeubj )r+}r+(hUhj*hhhj#h}r+(h]h]h]h]h]j%]r+(jX0Gerrit integration; Repo (Slave-Side) Build StepUindex-12r+Utr+aj*uhMhhh]ubh)r+}r+(hUhj*hhhhh}r+(h]h]h]h]h]hj+uhMhhh]ubh)r+}r+(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.hj*hhh}hhh}r+(h]h]h]h]r+j+ah]uhMhhh}r+j+j+sh]r+(hXWGerrit integration can be also triggered using forced build with following properties: r+r+}r+(hXWGerrit integration can be also triggered using forced build with following properties: hj+ubh)r+}r+(hX ``repo_d``h}r+(h]h]h]h]h]uhj+h]r+hXrepo_dr+r+}r+(hUhj+ubahhubhX, r+r+}r+(hX, hj+ubh)r+}r+(hX``repo_d[0-9]``h}r+(h]h]h]h]h]uhj+h]r+hX repo_d[0-9]r+r+}r+(hUhj+ubahhubhX, r+r+}r+(hX, hj+ubh)r+}r+(hX``repo_download``h}r+(h]h]h]h]h]uhj+h]r+hX repo_downloadr+r+}r+(hUhj+ubahhubhX, r+r+}r+(hX, hj+ubh)r+}r+(hX``repo_download[0-9]``h}r+(h]h]h]h]h]uhj+h]r+hXrepo_download[0-9]r+r+}r+(hUhj+ubahhubhX with values in format: r+r+}r+(hX with values in format: hj+ubh)r+}r+(hX)``project/change_number/patchset_number``h}r+(h]h]h]h]h]uhj+h]r+hX%project/change_number/patchset_numberr+r+}r+(hUhj+ubahhubhX4. All of these properties will be translated into a r+r+}r+(hX4. All of these properties will be translated into a hj+ubj)r+}r+(hX:command:`repo download`h}r+(h]h]r+jah]h]h]uhj+h]r+hX repo downloadr+r+}r+(hUhj+ubahj ubhX. 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+(hUhj*hhhj#h}r+(h]h]h]h]h]Uentries]r+((UsingleX"Build Steps; Monotone (Slave-Side)Xstep-Monotone (Slave-Side)r+j+tr+(UsingleX Monotone (Slave-Side) Build Stepj+j+tr+euhMhhh]ubh)r+}r+(hUhj*hhhhh}r+(h]h]h]h]h]hj+uhMhhh]ubeubh)r+}r+(hUhjhhh}hhh}r+(h]h]h]h]r+(Umonotone-slave-sider+j+eh]r+hrauhMhhh}r+j+j+sh]r+(h)r+}r+(hXMonotone (Slave-Side)r+hj+hhhhh}r+(h]h]h]h]h]uhMhhh]r+hXMonotone (Slave-Side)r,r,}r,(hj+hj+ubaubh)r,}r,(hXThe :bb:step:`Monotone ` build step performs a `Monotone `_, (aka ``mtn``) 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:`Monotone `r ,hj,hhhhh}r ,(UreftypeXsteph͉hXMonotone (Slave-Side)U 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,hXMonotoner,r,}r,(hUhj,ubahhubaubhX build step performs a r,r,}r,(hX build step performs a hj,ubj)r,}r,(hX$`Monotone `_h}r,(UnameXMonotonejXhttp://www.monotone.car,h]h]h]h]h]uhj,h]r ,hXMonotoner!,r",}r#,(hUhj,ubahjubh)r$,}r%,(hX hKhj,hhh}r&,(Urefurij,h]r',Umonotoner(,ah]h]h]h]r),h;auh]ubhX, (aka r*,r+,}r,,(hX, (aka hj,ubh)r-,}r.,(hX``mtn``h}r/,(h]h]h]h]h]uhj,h]r0,hXmtnr1,r2,}r3,(hUhj-,ubahhubhX) checkout or update.r4,r5,}r6,(hX) checkout or update.hj,ubeubh)r7,}r8,(hX0The Monotone step takes the following arguments:r9,hj+hhhhh}r:,(h]h]h]h]h]uhMhhh]r;,hX0The Monotone step takes the following arguments:r<,r=,}r>,(hj9,hj7,ubaubj)r?,}r@,(hUhj+hhhjh}rA,(h]h]h]h]h]uhNhhh]rB,(j)rC,}rD,(hXJ``repourl`` the URL at which the Monotone source repository is available. hj?,hhhjh}rE,(h]h]h]h]h]uhMh]rF,(j)rG,}rH,(hX ``repourl``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,hXrepourlrP,rQ,}rR,(hUhjL,ubahhubaubj)rS,}rT,(hUh}rU,(h]h]h]h]h]uhjC,h]rV,h)rW,}rX,(hX=the URL at which the Monotone source repository is available.rY,hjS,hhhhh}rZ,(h]h]h]h]h]uhMh]r[,hX=the URL at which the Monotone source repository is available.r\,r],}r^,(hjY,hjW,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}ra,(h]h]h]h]h]uhMhhh]rb,(j)rc,}rd,(hX ``branch``re,hj_,hhhjh}rf,(h]h]h]h]h]uhMh]rg,h)rh,}ri,(hje,h}rj,(h]h]h]h]h]uhjc,h]rk,hXbranchrl,rm,}rn,(hUhjh,ubahhubaubj)ro,}rp,(hUh}rq,(h]h]h]h]h]uhj_,h]rr,h)rs,}rt,(hXZthis specifies the name of the branch to use when a Build does not provide one of its own.ru,hjo,hhhhh}rv,(h]h]h]h]h]uhMh]rw,hXZthis specifies the name of the branch to use when a Build does not provide one of its own.rx,ry,}rz,(hju,hjs,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]uhMhhh]r~,(j)r,}r,(hX ``progress``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,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]uhMh]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,ubeubahjubeubeubj )r,}r,(hUhj+hhhj#h}r,(h]h]h]h]h]Uentries]r,((UsingleXBuild Steps; ShellCommandXstep-ShellCommandr,j,tr,(UsingleXShellCommand Build Stepj,j,tr,euhMhhh]ubh)r,}r,(hUhj+hhhhh}r,(h]h]h]h]h]hj,uhMhhh]ubeubeubh)r,}r,(hUhhhhh}hhh}r,(h]h]h]h]r,(U shellcommandr,j,eh]r,h-auhMhhh}r,j,j,sh]r,(h)r,}r,(hX ShellCommandr,hj,hhhhh}r,(h]h]h]h]h]uhMhhh]r,hX ShellCommandr,r,}r,(hj,hj,ubaubh)r,}r,(hXMost interesting steps involve executing a process of some sort on the buildslave. The :bb:step:`ShellCommand` class handles this activity.hj,hhhhh}r,(h]h]h]h]h]uhMhhh]r,(hXXMost interesting steps involve executing a process of some sort on the buildslave. The r,r,}r,(hXXMost interesting steps involve executing a process of some sort on the buildslave. The hj,ubh)r,}r,(hX:bb:step:`ShellCommand`r,hj,hhhhh}r,(UreftypeXsteph͉hX ShellCommandU 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,hX ShellCommandr,r,}r,(hUhj,ubahhubaubhX class handles this activity.r,r,}r,(hX class handles this activity.hj,ubeubh)r,}r,(hXeSeveral subclasses of :bb:step:`ShellCommand` are provided as starting points for common build steps.hj,hhhhh}r,(h]h]h]h]h]uhMhhh]r,(hXSeveral subclasses of r,r,}r,(hXSeveral subclasses of hj,ubh)r,}r,(hX:bb:step:`ShellCommand`r,hj,hhhhh}r,(UreftypeXsteph͉hX ShellCommandU 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,hX ShellCommandr,r,}r,(hUhj,ubahhubaubhX8 are provided as starting points for common build steps.r,r,}r,(hX8 are provided as starting points for common build steps.hj,ubeubh)r,}r,(hUhj,hhhhh}r,(h]h]h]h]r,Uusing-shellcommandsr,ah]r,h%auhMhhh]r,(h)r,}r,(hXUsing ShellCommandsr,hj,hhhhh}r,(h]h]h]h]h]uhMhhh]r-hXUsing ShellCommandsr-r-}r-(hj,hj,ubaubj )r-}r-(hUhj,hNhj#h}r-(h]h]h]h]h]Uentries]r-(j'XBbuildbot.steps.shell.ShellCommand (class in buildbot.steps.source)h@Utr-auhNhhh]ubjj)r -}r -(hUhj,hNhjmh}r -(jojpXpyh]h]h]h]h]jqXclassr -jsj -uhNhhh]r -(ju)r-}r-(hX!buildbot.steps.shell.ShellCommandhj -hhhjxh}r-(h]r-h@aj{j|h]h]h]h]r-h@aj~X!buildbot.steps.shell.ShellCommandjXbuildbot.steps.shelljuhMhhh]r-(j)r-}r-(hXclass hj-hhhjh}r-(h]h]h]h]h]uhMhhh]r-hXclass r-r-}r-(hUhj-ubaubj)r-}r-(hXbuildbot.steps.shell.hj-hhhjh}r-(h]h]h]h]h]uhMhhh]r-hXbuildbot.steps.shell.r-r -}r!-(hUhj-ubaubj)r"-}r#-(hX ShellCommandhj-hhhjh}r$-(h]h]h]h]h]uhMhhh]r%-hX ShellCommandr&-r'-}r(-(hUhj"-ubaubeubj)r)-}r*-(hUhj -hhhjh}r+-(h]h]h]h]h]uhMhhh]ubeubh)r,-}r--(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,hhhhh}r.-(h]h]h]h]h]uhMhhh]r/-(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 r0-r1-}r2-(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 hj,-ubh)r3-}r4-(hX:class:`LogFile`r5-hj,-hhhhh}r6-(UreftypeXclassh͉hXLogFileU refdomainXpyr7-h]h]U refexplicith]h]h]hhhNhj|uhMh]r8-h)r9-}r:-(hj5-h}r;-(h]h]r<-(hj7-Xpy-classr=-eh]h]h]uhj3-h]r>-hXLogFiler?-r@-}rA-(hUhj9-ubahhubaubhX-. The step usually finishes with a status of rB-rC-}rD-(hX-. The step usually finishes with a status of hj,-ubh)rE-}rF-(hX ``FAILURE``h}rG-(h]h]h]h]h]uhj,-h]rH-hXFAILURErI-rJ-}rK-(hUhjE-ubahhubhXF if the command's exit code is non-zero, otherwise it has a status of rL-rM-}rN-(hXF if the command's exit code is non-zero, otherwise it has a status of hj,-ubh)rO-}rP-(hX ``SUCCESS``h}rQ-(h]h]h]h]h]uhj,-h]rR-hXSUCCESSrS-rT-}rU-(hUhjO-ubahhubhX.rV-}rW-(hX.hj,-ubeubh)rX-}rY-(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,hhhhh}rZ-(h]h]h]h]h]uhMhhh]r[-(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 r\-r]-}r^-(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 hjX-ubh)r_-}r`-(hUh}ra-(h]h]h]h]rb-Xsamprc-aUrolejc-h]uhjX-h]rd-(hX /bin/sh -c re-rf-}rg-(hX /bin/sh -c hj_-ubjq)rh-}ri-(hXCOMMANDh}rj-(h]h]h]h]h]uhj_-h]rk-hXCOMMANDrl-rm-}rn-(hUhjh-ubahj{ubehhubhX for parsing.ro-rp-}rq-(hX for parsing.hjX-ubeubh)rr-}rs-(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,hhhhh}rt-(h]h]h]h]h]uhMhhh]ru-(hX!On Windows, commands are run via rv-rw-}rx-(hX!On Windows, commands are run via hjr-ubh)ry-}rz-(hX``cmd.exe /c``h}r{-(h]h]h]h]h]uhjr-h]r|-hX cmd.exe /cr}-r~-}r-(hUhjy-ubahhubhX 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: r-r-}r-(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: hjr-ubh)r-}r-(hX#``cmd=['call', 'myfile.bat', ...]``h}r-(h]h]h]h]h]uhjr-h]r-hXcmd=['call', 'myfile.bat', ...]r-r-}r-(hUhj-ubahhubhX.r-}r-(hX.hjr-ubeubh)r-}r-(hX*The :bb:step:`ShellCommand` arguments are:r-hj,hhhhh}r-(h]h]h]h]h]uhMhhh]r-(hXThe r-r-}r-(hXThe hj-ubh)r-}r-(hX:bb:step:`ShellCommand`r-hj-hhhhh}r-(UreftypeXsteph͉hX ShellCommandU 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-hX ShellCommandr-r-}r-(hUhj-ubahhubaubhX arguments are:r-r-}r-(hX arguments are:hj-ubeubj)r-}r-(hUhj,hhhjh}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-ubj)r-}r-(hX:command:`/bin/sh`h}r-(h]h]r-jah]h]h]uhj-h]r-hX/bin/shr-r-}r-(hUhj-ubahj ubhXy for interpretation, which raises all sorts of difficult questions about how to escape or interpret shell metacharacters.r-r-}r-(hXy for interpretation, which raises all sorts of difficult questions about how to escape or interpret shell metacharacters.hj-ubeubh)r-}r-(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 hj-ubh)r-}r-(hX ``command``h}r-(h]h]h]h]h]uhj-h]r-hXcommandr-r-}r-(hUhj-ubahhubhX} contains nested lists (for example, from a properties substitution), then that list will be flattened before it is executed.r-r-}r-(hX} contains nested lists (for example, from a properties substitution), then that list will be flattened before it is executed.hj-ubeubh)r-}r-(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}r-(h]h]h]h]h]uhMh]r-(hXKOn the topic of shell metacharacters, note that in DOS the pipe character (r-r-}r-(hXKOn the topic of shell metacharacters, note that in DOS the pipe character (hj-ubh)r-}r-(hX``|``h}r-(h]h]h]h]h]uhj-h]r-hX|r-}r-(hUhj-ubahhubhX) is conditionally escaped (to r-r-}r-(hX) is conditionally escaped (to hj-ubh)r-}r-(hX``^|``h}r-(h]h]h]h]h]uhj-h]r-hX^|r-r-}r-(hUhj-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-r-}r-(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.hj-ubeubehjubeubj)r-}r-(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}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.(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`).hj .hhhhh}r.(h]h]h]h]h]uhMh]r.(hX,All ShellCommands are run by default in the r.r.}r.(hX,All ShellCommands are run by default in the hj.ubh)r.}r.(hX ``workdir``h}r.(h]h]h]h]h]uhj.h]r.hXworkdirr.r.}r.(hUhj.ubahhubhX, which defaults to the r.r.}r.(hX, which defaults to the hj.ubh)r .}r!.(hUh}r".(h]h]h]h]r#.Xfiler$.aUrolej$.h]uhj.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 hj.ubh)r,.}r-.(hX``buildslave create-slave``h}r..(h]h]h]h]h]uhj.h]r/.hXbuildslave create-slaver0.r1.}r2.(hUhj,.ubahhubhX, r3.r4.}r5.(hX, hj.ubh)r6.}r7.(hX:ref:`Creating-a-buildslave`r8.hj.hhhhh}r9.(UreftypeXrefh͈hXcreating-a-buildslaveU refdomainXstdr:.h]h]U refexplicith]h]h]hhuhMh]r;.jq)r<.}r=.(hj8.h}r>.(h]h]r?.(hj:.Xstd-refr@.eh]h]h]uhj6.h]rA.hXCreating-a-buildslaverB.rC.}rD.(hUhj<.ubahj{ubaubhX3) plus the builder's basedir (set in the builder's rE.rF.}rG.(hX3) plus the builder's basedir (set in the builder's hj.ubh)rH.}rI.(hX ``builddir``h}rJ.(h]h]h]h]h]uhj.h]rK.hXbuilddirrL.rM.}rN.(hUhjH.ubahhubhX key in rO.rP.}rQ.(hX key in hj.ubh)rR.}rS.(hUh}rT.(h]h]h]h]rU.XfilerV.aUrolejV.h]uhj.h]rW.hX master.cfgrX.rY.}rZ.(hX master.cfghjR.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 hj.ubh)r^.}r_.(hUh}r`.(h]h]h]h]ra.Xfilerb.aUrolejb.h]uhj.h]rc.hXbuildrd.re.}rf.(hXbuildhj^.ubahhubhX).rg.rh.}ri.(hX).hj.ubeubh)rj.}rk.(hX For example::hj .hhhhh}rl.(h]h]h]h]h]uhMh]rm.hX For example:rn.ro.}rp.(hX For example:hjj.ubaubj>)rq.}rr.(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], workdir="build/tests"))hj .hjAh}rs.(jCjDh]h]h]h]h]uhMh]rt.hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], workdir="build/tests"))ru.rv.}rw.(hUhjq.ubaubehjubeubj)rx.}ry.(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}rz.(h]h]h]h]h]uhM2hhh]r{.(j)r|.}r}.(hX``env``r~.hjx.hhhjh}r.(h]h]h]h]h]uhM2h]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]uhjx.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]uhM h]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.ubaubj>)r.}r.(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], env={'LANG': 'fr_FR'}))hj.hjAh}r.(jCjDh]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.(UreftypeXclassh͉hXBuilderU 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.((j'X PYTHONPATHr.Uindex-13r.Utr.(j'X 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.(UreftypeXenvvarh͉hj.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.hX PYTHONPATHr.r.}r.(hUhj.ubahhubaubhX<, which is merged with (actually prepended to) any existing r.r.}r.(hX<, which is merged with (actually prepended to) any existing hj.ubj )r.}r.(hUh}r.(h]h]h]h]h]j%]r.((j'X PYTHONPATHr.Uindex-14r.Utr.(j'X 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.(UreftypeXenvvarh͉hj.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.hX PYTHONPATHr.r.}r.(hUhj.ubahhubaubhX- setting. The following example will prepend r.r.}r.(hX- setting. The following example will prepend hj.ubh)r.}r.(hUh}r.(h]h]h]h]r.Xfiler.aUrolej.h]uhj.h]r.hX/home/buildbot/lib/pythonr.r.}r.(hX/home/buildbot/lib/pythonhj.ubahhubhX to any existing r.r.}r.(hX to any existing hj.ubj )r.}r.(hUh}r.(h]h]h]h]h]j%]r.((j'X PYTHONPATHr.Uindex-15r/Utr/(j'X 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 /(UreftypeXenvvarh͉hj.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/hX PYTHONPATHr/r/}r/(hUhj /ubahhubaubhX:r/}r/(hX:hj.ubeubj>)r/}r/(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PYTHONPATH': "/home/buildbot/lib/python"}))hj.hjAh}r/(jCjDh]h]h]h]h]uhMh]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]uhM h]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]uhM$h]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}r0/(h]h]h]h]r1/Xfiler2/aUrolej2/h]uhj'/h]r3/hX/home/buildbot/binr4/r5/}r6/(hX/home/buildbot/binhj./ubahhubhX to the r7/r8/}r9/(hX to the hj'/ubj )r:/}r;/(hUh}r/Uindex-16r?/Utr@/(j'Xenvironment variable; PATHj?/UtrA/euhj'/h]hj#ubh)rB/}rC/(hUh}rD/(h]h]h]h]rE/j?/ah]uhj'/h]hhubh)rF/}rG/(hX:envvar:`PATH`rH/hj'/hhhhh}rI/(UreftypeXenvvarh͉hj>/U refdomainXstdrJ/h]h]U refexplicith]h]h]hhuhM$h]rK/h)rL/}rM/(hjH/h}rN/(h]h]rO/(hjJ/X std-envvarrP/eh]h]h]uhjF/h]rQ/hXPATHrR/rS/}rT/(hUhjL/ubahhubaubhX: environment variable, you can do it by putting the value rU/rV/}rW/(hX: environment variable, you can do it by putting the value hj'/ubh)rX/}rY/(hX ``${PATH}``h}rZ/(h]h]h]h]h]uhj'/h]r[/hX${PATH}r\/r]/}r^/(hUhjX/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`/}ra/(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)rb/}rc/(hX``""``h}rd/(h]h]h]h]h]uhj'/h]re/hX""rf/rg/}rh/(hUhjb/ubahhubhX.ri/}rj/(hX.hj'/ubeubj>)rk/}rl/(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))hj.hjAh}rm/(jCjDh]h]h]h]h]uhM*h]rn/hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))ro/rp/}rq/(hUhjk/ubaubh)rr/}rs/(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}rt/(h]h]h]h]h]uhM0h]ru/(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as rv/rw/}rx/(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as hjr/ubh)ry/}rz/(hX``buildnumber``h}r{/(h]h]h]h]h]uhjr/h]r|/hX buildnumberr}/r~/}r/(hUhjy/ubahhubhX must be substituted using r/r/}r/(hX must be substituted using hjr/ubh)r/}r/(hX:ref:`Interpolate`r/hjr/hhhhh}r/(UreftypeXrefh͈hX interpolateU refdomainXstdr/h]h]U refexplicith]h]h]hhuhM0h]r/jq)r/}r/(hj/h}r/(h]h]r/(hj/Xstd-refr/eh]h]h]uhj/h]r/hX Interpolater/r/}r/(hUhj/ubahj{ubaubhX.r/}r/(hX.hjr/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]uhM6hhh]r/(j)r/}r/(hX``want_stdout``r/hj/hhhjh}r/(h]h]h]h]h]uhM6h]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]uhM5h]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/(UreftypeXclassh͉hXLogFileU refdomainXpyr/h]h]U refexplicith]h]h]hhhNhj|uhM5h]r/h)r/}r/(hj/h}r/(h]h]r/(hj/Xpy-classr/eh]h]h]uhj/h]r/hXLogFiler/r/}r/(hUhj/ubahhubaubhX.r/}r/(hX.hj/ubeubahjubeubj)r/}r/(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}r/(h]h]h]h]h]uhM;hhh]r/(j)r/}r/(hX``want_stderr``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_stderrr/r/}r/(hUhj/ubahhubaubj)r/}r/(hUh}r/(h]h]h]h]h]uhj/h]r/h)r/}r/(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`.hj/hhhhh}r/(h]h]h]h]h]uhM9h]r/(hXlike r/r/}r/(hXlike hj/ubh)r/}r/(hX``want_stdout``h}r/(h]h]h]h]h]uhj/h]r/hX want_stdoutr/r/}r/(hUhj/ubahhubhX but for r/r/}r/(hX but for hj/ubh)r/}r/(hUh}r/(h]h]h]h]r/Xfiler/aUrolej/h]uhj/h]r/hXstderrr/r/}r/(hXstderrhj/ubahhubhX<. Note that commands run through a PTY do not have separate r/r/}r/(hX<. Note that commands run through a PTY do not have separate hj/ubh)r/}r/(hUh}r/(h]h]h]h]r/Xfiler/aUrolej/h]uhj/h]r0hXstdoutr0r0}r0(hXstdouthj/ubahhubhX/r0}r0(hX/hj/ubh)r0}r0(hUh}r0(h]h]h]h]r 0Xfiler 0aUrolej 0h]uhj/h]r 0hXstderrr 0r 0}r0(hXstderrhj0ubahhubhX streams: both are merged into r0r0}r0(hX streams: both are merged into hj/ubh)r0}r0(hUh}r0(h]h]h]h]r0Xfiler0aUrolej0h]uhj/h]r0hXstdoutr0r0}r0(hXstdouthj0ubahhubhX.r0}r0(hX.hj/ubeubahjubeubj)r0}r0(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}r0(h]h]h]h]h]uhMRhhh]r 0(j)r!0}r"0(hX ``usePTY``r#0hj0hhhjh}r$0(h]h]h]h]h]uhMRh]r%0h)r&0}r'0(hj#0h}r(0(h]h]h]h]h]uhj!0h]r)0hXusePTYr*0r+0}r,0(hUhj&0ubahhubaubj)r-0}r.0(hUh}r/0(h]h]h]h]h]uhj0h]r00(h)r10}r20(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-0hhhhh}r30(h]h]h]h]h]uhM>h]r40(hX Should this command be run in a r50r60}r70(hX Should this command be run in a hj10ubh)r80}r90(hX``pty``h}r:0(h]h]h]h]h]uhj10h]r;0hXptyr<0r=0}r>0(hUhj80ubahhubhX>? The default is to observe the configuration of the client (r?0r@0}rA0(hX>? The default is to observe the configuration of the client (hj10ubh)rB0}rC0(hX:ref:`Buildslave-Options`rD0hj10hhhhh}rE0(UreftypeXrefh͈hXbuildslave-optionsU refdomainXstdrF0h]h]U refexplicith]h]h]hhuhM>h]rG0jq)rH0}rI0(hjD0h}rJ0(h]h]rK0(hjF0Xstd-refrL0eh]h]h]uhjB0h]rM0hXBuildslave-OptionsrN0rO0}rP0(hUhjH0ubahj{ubaubhX), but specifying rQ0rR0}rS0(hX), but specifying hj10ubh)rT0}rU0(hX``True``h}rV0(h]h]h]h]h]uhj10h]rW0hXTruerX0rY0}rZ0(hUhjT0ubahhubhX or r[0r\0}r]0(hX or hj10ubh)r^0}r_0(hX ``False``h}r`0(h]h]h]h]h]uhj10h]ra0hXFalserb0rc0}rd0(hUhj^0ubahhubhXI here will override the default. This option is not available on Windows.re0rf0}rg0(hXI here will override the default. This option is not available on Windows.hj10ubeubh)rh0}ri0(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-0hhhhh}rj0(h]h]h]h]h]uhMCh]rk0(hXBIn general, you do not want to use a pseudo-terminal. This is is rl0rm0}rn0(hXBIn general, you do not want to use a pseudo-terminal. This is is hjh0ubjq)ro0}rp0(hX*only*h}rq0(h]h]h]h]h]uhjh0h]rr0hXonlyrs0rt0}ru0(hUhjo0ubahj{ubhXC 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.rv0rw0}rx0(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.hjh0ubeubh)ry0}rz0(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-0hhhhh}r{0(h]h]h]h]h]uhMKh]r|0(hXHIn previous versions, the advantage of using a pseudo-terminal was that r}0r~0}r0(hXHIn previous versions, the advantage of using a pseudo-terminal was that hjy0ubh)r0}r0(hX``grandchild``h}r0(h]h]h]h]h]uhjy0h]r0hX grandchildr0r0}r0(hUhj0ubahhubhX 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.r0r0}r0(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.hjy0ubeubh)r0}r0(hX{As of Buildbot-0.8.4, all commands are placed in process groups, and thus grandchild processes will be cleaned up properly.r0hj-0hhhhh}r0(h]h]h]h]h]uhMQh]r0hX{As of Buildbot-0.8.4, all commands are placed in process groups, and thus grandchild processes will be cleaned up properly.r0r0}r0(hj0hj0ubaubehjubeubj)r0}r0(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}r0(h]h]h]h]h]uhM{hhh]r0(j)r0}r0(hX ``logfiles``r0hj0hhhjh}r0(h]h]h]h]h]uhM{h]r0h)r0}r0(hj0h}r0(h]h]h]h]h]uhj0h]r0hXlogfilesr0r0}r0(hUhj0ubahhubaubj)r0}r0(hUh}r0(h]h]h]h]h]uhj0h]r0(h)r0}r0(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.hj0hhhhh}r0(h]h]h]h]h]uhMUh]r0(hXSometimes commands will log interesting data to a local file, rather than emitting everything to stdout or stderr. For example, Twisted's r0r0}r0(hXSometimes commands will log interesting data to a local file, rather than emitting everything to stdout or stderr. For example, Twisted's hj0ubj)r0}r0(hX:command:`trial`h}r0(h]h]r0jah]h]h]uhj0h]r0hXtrialr0r0}r0(hUhj0ubahj ubhXr command (which runs unit tests) only presents summary information to stdout, and puts the rest into a file named r0r0}r0(hXr command (which runs unit tests) only presents summary information to stdout, and puts the rest into a file named hj0ubh)r0}r0(hUh}r0(h]h]h]h]r0Xfiler0aUrolej0h]uhj0h]r0hX_trial_temp/test.logr0r0}r0(hX_trial_temp/test.loghj0ubahhubhXQ. It is often useful to watch these files as the command runs, rather than using r0r0}r0(hXQ. It is often useful to watch these files as the command runs, rather than using hj0ubj)r0}r0(hX:command:`/bin/cat`h}r0(h]h]r0jah]h]h]uhj0h]r0hX/bin/catr0r0}r0(hUhj0ubahj ubhX# to dump their contents afterwards.r0r0}r0(hX# to dump their contents afterwards.hj0ubeubh)r0}r0(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.hj0hhhhh}r0(h]h]h]h]h]uhM]h]r0(hXThe r0r0}r0(hXThe hj0ubh)r0}r0(hX ``logfiles=``h}r0(h]h]h]h]h]uhj0h]r0hX logfiles=r0r0}r0(hUhj0ubahhubhX 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.r0r0}r0(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.hj0ubeubh)r0}r0(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. ::hj0hhhhh}r0(h]h]h]h]h]uhMfh]r0(hXQIf you provide a dictionary of options instead of a string, you must specify the r0r0}r0(hXQIf you provide a dictionary of options instead of a string, you must specify the hj0ubh)r0}r0(hX ``filename``h}r0(h]h]h]h]h]uhj0h]r0hXfilenamer0r0}r0(hUhj0ubahhubhX# key. You can optionally provide a r0r0}r0(hX# key. You can optionally provide a hj0ubh)r0}r0(hX ``follow``h}r0(h]h]h]h]h]uhj0h]r0hXfollowr0r0}r0(hUhj0ubahhubhX 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 r0r0}r0(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 hj0ubh)r0}r0(hX ``follow``h}r0(h]h]h]h]h]uhj0h]r0hXfollowr0r1}r1(hUhj0ubahhubhX is r1r1}r1(hX is hj0ubh)r1}r1(hX ``False``h}r1(h]h]h]h]h]uhj0h]r1hXFalser 1r 1}r 1(hUhj1ubahhubhXD, which gives the same behavior as just providing a string filename.r 1r 1}r1(hXD, which gives the same behavior as just providing a string filename.hj0ubeubj>)r1}r1(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": "_trial_temp/test.log"}))hj0hjAh}r1(jCjDh]h]h]h]h]uhMnh]r1hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": "_trial_temp/test.log"}))r1r1}r1(hUhj1ubaubh)r1}r1(hXwThe above example will add a log named 'triallog' on the master, based on :file:`_trial_temp/test.log` on the slave. ::hj0hhhhh}r1(h]h]h]h]h]uhMsh]r1(hXJThe above example will add a log named 'triallog' on the master, based on r1r1}r1(hXJThe above example will add a log named 'triallog' on the master, based on hj1ubh)r1}r1(hUh}r1(h]h]h]h]r 1Xfiler!1aUrolej!1h]uhj1h]r"1hX_trial_temp/test.logr#1r$1}r%1(hX_trial_temp/test.loghj1ubahhubhX on the slave.r&1r'1}r(1(hX on the slave.hj1ubeubj>)r)1}r*1(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": {"filename": "_trial_temp/test.log", "follow": True,}}))hj0hjAh}r+1(jCjDh]h]h]h]h]uhMvh]r,1hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand( command=["make", "test"], logfiles={"triallog": {"filename": "_trial_temp/test.log", "follow": True,}}))r-1r.1}r/1(hUhj)1ubaubehjubeubj)r01}r11(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}r21(h]h]h]h]h]uhMhhh]r31(j)r41}r51(hX``lazylogfiles``r61hj01hhhjh}r71(h]h]h]h]h]uhMh]r81h)r91}r:1(hj61h}r;1(h]h]h]h]h]uhj41h]r<1hX lazylogfilesr=1r>1}r?1(hUhj91ubahhubaubj)r@1}rA1(hUh}rB1(h]h]h]h]h]uhj01h]rC1h)rD1}rE1(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@1hhhhh}rF1(h]h]h]h]h]uhM~h]rG1(hX If set to rH1rI1}rJ1(hX If set to hjD1ubh)rK1}rL1(hX``True``h}rM1(h]h]h]h]h]uhjD1h]rN1hXTruerO1rP1}rQ1(hUhjK1ubahhubhX, 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 rR1rS1}rT1(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 hjD1ubh)rU1}rV1(hX ``False``h}rW1(h]h]h]h]h]uhjD1h]rX1hXFalserY1rZ1}r[1(hUhjU1ubahhubhX.r\1}r]1(hX.hjD1ubeubahjubeubj)r^1}r_1(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`1(h]h]h]h]h]uhMhhh]ra1(j)rb1}rc1(hX ``timeout``rd1hj^1hhhjh}re1(h]h]h]h]h]uhMh]rf1h)rg1}rh1(hjd1h}ri1(h]h]h]h]h]uhjb1h]rj1hXtimeoutrk1rl1}rm1(hUhjg1ubahhubaubj)rn1}ro1(hUh}rp1(h]h]h]h]h]uhj^1h]rq1h)rr1}rs1(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.hjn1hhhhh}rt1(h]h]h]h]h]uhMh]ru1(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 rv1rw1}rx1(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 hjr1ubh)ry1}rz1(hX``None``h}r{1(h]h]h]h]h]uhjr1h]r|1hXNoner}1r~1}r1(hUhjy1ubahhubhX to disable.r1r1}r1(hX to disable.hjr1ubeubahjubeubj)r1}r1(hXp``maxTime`` if the command takes longer than this many seconds, it will be killed. This is disabled by default. hj-hhhjh}r1(h]h]h]h]h]uhMhhh]r1(j)r1}r1(hX ``maxTime``r1hj1hhhjh}r1(h]h]h]h]h]uhMh]r1h)r1}r1(hj1h}r1(h]h]h]h]h]uhj1h]r1hXmaxTimer1r1}r1(hUhj1ubahhubaubj)r1}r1(hUh}r1(h]h]h]h]h]uhj1h]r1h)r1}r1(hXcif the command takes longer than this many seconds, it will be killed. This is disabled by default.r1hj1hhhhh}r1(h]h]h]h]h]uhMh]r1hXcif the command takes longer than this many seconds, it will be killed. This is disabled by default.r1r1}r1(hj1hj1ubaubahjubeubj)r1}r1(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}r1(h]h]h]h]h]uhMhhh]r1(j)r1}r1(hX``description``r1hj1hhhjh}r1(h]h]h]h]h]uhMh]r1h)r1}r1(hj1h}r1(h]h]h]h]h]uhj1h]r1hX descriptionr1r1}r1(hUhj1ubahhubaubj)r1}r1(hUh}r1(h]h]h]h]h]uhj1h]r1h)r1}r1(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.hj1hhhhh}r1(h]h]h]h]h]uhMh]r1(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 r1r1}r1(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 hj1ubj_)r1}r1(hX `compiling`h}r1(h]h]h]h]h]uhj1h]r1hX compilingr1r1}r1(hUhj1ubahjgubhX or r1r1}r1(hX or hj1ubj_)r1}r1(hX `testing`h}r1(h]h]h]h]h]uhj1h]r1hXtestingr1r1}r1(hUhj1ubahjgubhX. 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.r1r1}r1(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.hj1ubeubahjubeubj)r1}r1(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. :: from buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], description=["testing"], descriptionDone=["tests"])) hj-hhhjh}r1(h]h]h]h]h]uhMhhh]r1(j)r1}r1(hX``descriptionDone``r1hj1hhhjh}r1(h]h]h]h]h]uhMh]r1h)r1}r1(hj1h}r1(h]h]h]h]h]uhj1h]r1hXdescriptionDoner1r1}r1(hUhj1ubahhubaubj)r1}r1(hUh}r1(h]h]h]h]h]uhj1h]r1(h)r1}r1(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.hj1hhhhh}r1(h]h]h]h]h]uhMh]r1(hXSThis will be used to describe the command once it has finished. A simple noun like r1r1}r1(hXSThis will be used to describe the command once it has finished. A simple noun like hj1ubj_)r1}r1(hX `compile`h}r1(h]h]h]h]h]uhj1h]r1hXcompiler1r1}r1(hUhj1ubahjgubhX or r1r1}r1(hX or hj1ubj_)r1}r1(hX`tests`h}r1(h]h]h]h]h]uhj1h]r1hXtestsr1r1}r1(hUhj1ubahjgubhX should be used. Like r1r1}r1(hX should be used. Like hj1ubh)r1}r1(hX``description``h}r1(h]h]h]h]h]uhj1h]r2hX descriptionr2r2}r2(hUhj1ubahhubhX@, this may either be a list of short strings or a single string.r2r2}r2(hX@, this may either be a list of short strings or a single string.hj1ubeubh)r2}r2(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. ::hj1hhhhh}r 2(h]h]h]h]h]uhMh]r 2(hX If neither r 2r 2}r 2(hX If neither hj2ubh)r2}r2(hX``description``h}r2(h]h]h]h]h]uhj2h]r2hX descriptionr2r2}r2(hUhj2ubahhubhX nor r2r2}r2(hX nor hj2ubh)r2}r2(hX``descriptionDone``h}r2(h]h]h]h]h]uhj2h]r2hXdescriptionDoner2r2}r2(hUhj2ubahhubhX 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.r2r 2}r!2(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.hj2ubeubj>)r"2}r#2(hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], description=["testing"], descriptionDone=["tests"]))hj1hjAh}r$2(jCjDh]h]h]h]h]uhMh]r%2hXfrom buildbot.steps.shell import ShellCommand f.addStep(ShellCommand(command=["make", "test"], description=["testing"], descriptionDone=["tests"]))r&2r'2}r(2(hUhj"2ubaubehjubeubj)r)2}r*2(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+2(h]h]h]h]h]uhMhhh]r,2(j)r-2}r.2(hX``descriptionSuffix``r/2hj)2hhhjh}r02(h]h]h]h]h]uhMh]r12h)r22}r32(hj/2h}r42(h]h]h]h]h]uhj-2h]r52hXdescriptionSuffixr62r72}r82(hUhj22ubahhubaubj)r92}r:2(hUh}r;2(h]h]h]h]h]uhj)2h]r<2(h)r=2}r>2(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``.hj92hhhhh}r?2(h]h]h]h]h]uhMh]r@2(hXMThis is an optional suffix appended to the end of the description (ie, after rA2rB2}rC2(hXMThis is an optional suffix appended to the end of the description (ie, after hj=2ubh)rD2}rE2(hX``description``h}rF2(h]h]h]h]h]uhj=2h]rG2hX descriptionrH2rI2}rJ2(hUhjD2ubahhubhX and rK2rL2}rM2(hX and hj=2ubh)rN2}rO2(hX``descriptionDone``h}rP2(h]h]h]h]h]uhj=2h]rQ2hXdescriptionDonerR2rS2}rT2(hUhjN2ubahhubhX). 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 rU2rV2}rW2(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=2ubh)rX2}rY2(hX``None``h}rZ2(h]h]h]h]h]uhj=2h]r[2hXNoner\2r]2}r^2(hUhjX2ubahhubhX.r_2}r`2(hX.hj=2ubeubh)ra2}rb2(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.hj92hhhhh}rc2(h]h]h]h]h]uhMh]rd2(hX%For example, a builder might use the re2rf2}rg2(hX%For example, a builder might use the hja2ubh)rh2}ri2(hX ``Compile``h}rj2(h]h]h]h]h]uhja2h]rk2hXCompilerl2rm2}rn2(hUhjh2ubahhubhX, step to build two different codebases. The ro2rp2}rq2(hX, step to build two different codebases. The hja2ubh)rr2}rs2(hX``descriptionSuffix``h}rt2(h]h]h]h]h]uhja2h]ru2hXdescriptionSuffixrv2rw2}rx2(hUhjr2ubahhubhX could be set to ry2rz2}r{2(hX could be set to hja2ubj_)r|2}r}2(hX `projectFoo`h}r~2(h]h]h]h]h]uhja2h]r2hX projectFoor2r2}r2(hUhj|2ubahjgubhX and r2r2}r2(hX and hja2ubj_)r2}r2(hX `projectBar`h}r2(h]h]h]h]h]uhja2h]r2hX projectBarr2r2}r2(hUhj2ubahjgubhXI, respectively for each step, which will result in the full descriptions r2r2}r2(hXI, respectively for each step, which will result in the full descriptions hja2ubj_)r2}r2(hX`compiling projectFoo`h}r2(h]h]h]h]h]uhja2h]r2hXcompiling projectFoor2r2}r2(hUhj2ubahjgubhX and r2r2}r2(hX and hja2ubj_)r2}r2(hX`compiling projectBar`h}r2(h]h]h]h]h]uhja2h]r2hXcompiling projectBarr2r2}r2(hUhj2ubahjgubhX to be shown in the waterfall.r2r2}r2(hX to be shown in the waterfall.hja2ubeubehjubeubj)r2}r2(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}r2(h]h]h]h]h]uhMhhh]r2(j)r2}r2(hX``logEnviron``r2hj2hhhjh}r2(h]h]h]h]h]uhMh]r2h)r2}r2(hj2h}r2(h]h]h]h]h]uhj2h]r2hX logEnvironr2r2}r2(hUhj2ubahhubaubj)r2}r2(hUh}r2(h]h]h]h]h]uhj2h]r2h)r2}r2(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``.hj2hhhhh}r2(h]h]h]h]h]uhMh]r2(hXIf this option is r2r2}r2(hXIf this option is hj2ubh)r2}r2(hX``True``h}r2(h]h]h]h]h]uhj2h]r2hXTruer2r2}r2(hUhj2ubahhubhX (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 r2r2}r2(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 hj2ubh)r2}r2(hX``logEnviron=False``h}r2(h]h]h]h]h]uhj2h]r2hXlogEnviron=Falser2r2}r2(hUhj2ubahhubhX.r2}r2(hX.hj2ubeubahjubeubj)r2}r2(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}r2(h]h]h]h]h]uhMhhh]r2(j)r2}r2(hX``interruptSignal``r2hj2hhhjh}r2(h]h]h]h]h]uhMh]r2h)r2}r2(hj2h}r2(h]h]h]h]h]uhj2h]r2hXinterruptSignalr2r2}r2(hUhj2ubahhubaubj)r2}r2(hUh}r2(h]h]h]h]h]uhj2h]r2h)r2}r2(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.r2hj2hhhhh}r2(h]h]h]h]h]uhMh]r2hXIf 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.r2r2}r2(hj2hj2ubaubahjubeubj)r2}r2(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}r2(h]h]h]h]h]uhMhhh]r2(j)r2}r2(hX``initialStdin``r2hj2hhhjh}r2(h]h]h]h]h]uhMh]r2h)r2}r2(hj2h}r2(h]h]h]h]h]uhj2h]r2hX initialStdinr2r2}r2(hUhj2ubahhubaubj)r2}r2(hUh}r3(h]h]h]h]h]uhj2h]r3h)r3}r3(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.r3hj2hhhhh}r3(h]h]h]h]h]uhMh]r3hX 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.r3r3}r 3(hj3hj3ubaubahjubeubj)r 3}r 3(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 3(h]h]h]h]h]uhMhhh]r 3(j)r3}r3(hX ``decodeRC``r3hj 3hhhjh}r3(h]h]h]h]h]uhMh]r3h)r3}r3(hj3h}r3(h]h]h]h]h]uhj3h]r3hXdecodeRCr3r3}r3(hUhj3ubahhubaubj)r3}r3(hUh}r3(h]h]h]h]h]uhj 3h]r3h)r3}r3(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``hj3hhhhh}r 3(h]h]h]h]h]uhMh]r!3(hXFThis is a dictionary that decodes exit codes into results value. e.g: r"3r#3}r$3(hXFThis is a dictionary that decodes exit codes into results value. e.g: hj3ubh)r%3}r&3(hX$``{0:SUCCESS,1:FAILURE,2:WARNINGS}``h}r'3(h]h]h]h]h]uhj3h]r(3hX {0:SUCCESS,1:FAILURE,2:WARNINGS}r)3r*3}r+3(hUhj%3ubahhubhX, will treat the exit code r,3r-3}r.3(hX, will treat the exit code hj3ubh)r/3}r03(hX``2``h}r13(h]h]h]h]h]uhj3h]r23hX2r33}r43(hUhj/3ubahhubhX= as WARNINGS. The default is to treat just 0 as successful. (r53r63}r73(hX= as WARNINGS. The default is to treat just 0 as successful. (hj3ubh)r83}r93(hX``{0:SUCCESS}``h}r:3(h]h]h]h]h]uhj3h]r;3hX {0:SUCCESS}r<3r=3}r>3(hUhj83ubahhubhXA) any exit code not present in the dictionary will be treated as r?3r@3}rA3(hXA) any exit code not present in the dictionary will be treated as hj3ubh)rB3}rC3(hX ``FAILURE``h}rD3(h]h]h]h]h]uhj3h]rE3hXFAILURErF3rG3}rH3(hUhjB3ubahhubeubahjubeubeubj )rI3}rJ3(hUhj,hhhj#h}rK3(h]h]h]h]h]Uentries]rL3((UsingleXBuild Steps; ConfigureXstep-ConfigurerM3jM3trN3(UsingleXConfigure Build StepjM3jM3trO3euhMhhh]ubh)rP3}rQ3(hUhj,hhhhh}rR3(h]h]h]h]h]hjM3uhMhhh]ubeubh)rS3}rT3(hUhj,hhh}hhh}rU3(h]h]h]h]rV3(U configurerW3jM3eh]rX3hNauhMhhh}rY3jM3jP3sh]rZ3(h)r[3}r\3(hX Configurer]3hjS3hhhhh}r^3(h]h]h]h]h]uhMhhh]r_3hX Configurer`3ra3}rb3(hj]3hj[3ubaubj )rc3}rd3(hUhjS3hNhj#h}re3(h]h]h]h]h]Uentries]rf3(j'X?buildbot.steps.shell.Configure (class in buildbot.steps.source)h|Utrg3auhNhhh]ubjj)rh3}ri3(hUhjS3hNhjmh}rj3(jojpXpyh]h]h]h]h]jqXclassrk3jsjk3uhNhhh]rl3(ju)rm3}rn3(hXbuildbot.steps.shell.Configurehjh3hhhjxh}ro3(h]rp3h|aj{j|h]h]h]h]rq3h|aj~Xbuildbot.steps.shell.ConfigurejXbuildbot.steps.shelljuhMhhh]rr3(j)rs3}rt3(hXclass hjm3hhhjh}ru3(h]h]h]h]h]uhMhhh]rv3hXclass rw3rx3}ry3(hUhjs3ubaubj)rz3}r{3(hXbuildbot.steps.shell.hjm3hhhjh}r|3(h]h]h]h]h]uhMhhh]r}3hXbuildbot.steps.shell.r~3r3}r3(hUhjz3ubaubj)r3}r3(hX Configurehjm3hhhjh}r3(h]h]h]h]h]uhMhhh]r3hX Configurer3r3}r3(hUhj3ubaubeubj)r3}r3(hUhjh3hhhjh}r3(h]h]h]h]h]uhMhhh]ubeubh)r3}r3(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`. ::hjS3hhhhh}r3(h]h]h]h]h]uhMhhh]r3(hXThis is intended to handle the r3r3}r3(hXThis is intended to handle the hj3ubj)r3}r3(hX:command:`./configure`h}r3(h]h]r3jah]h]h]uhj3h]r3hX ./configurer3r3}r3(hUhj3ubahj ubhX+ step from autoconf-style projects, or the r3r3}r3(hX+ step from autoconf-style projects, or the hj3ubh)r3}r3(hX``perl Makefile.PL``h}r3(h]h]h]h]h]uhj3h]r3hXperl Makefile.PLr3r3}r3(hUhj3ubahhubhX step from perl r3r3}r3(hX step from perl hj3ubh)r3}r3(hUh}r3(h]h]h]h]r3Xfiler3aUrolej3h]uhj3h]r3hX MakeMaker.pmr3r3}r3(hX MakeMaker.pmhj3ubahhubhX'-style modules. The default command is r3r3}r3(hX'-style modules. The default command is hj3ubj)r3}r3(hX:command:`./configure`h}r3(h]h]r3jah]h]h]uhj3h]r3hX ./configurer3r3}r3(hUhj3ubahj ubhX( but you can change this by providing a r3r3}r3(hX( but you can change this by providing a hj3ubh)r3}r3(hX ``command=``h}r3(h]h]h]h]h]uhj3h]r3hXcommand=r3r3}r3(hUhj3ubahhubhX+ parameter. The arguments are identical to r3r3}r3(hX+ parameter. The arguments are identical to hj3ubh)r3}r3(hX:bb:step:`ShellCommand`r3hj3hhhhh}r3(UreftypeXsteph͉hX ShellCommandU refdomainXbbr3h]h]U refexplicith]h]h]hhuhMh]r3h)r3}r3(hj3h}r3(h]h]r3(hj3Xbb-stepr3eh]h]h]uhj3h]r3hX ShellCommandr3r3}r3(hUhj3ubahhubaubhX.r3}r3(hX.hj3ubeubj>)r3}r3(hXAfrom buildbot.steps.shell import Configure f.addStep(Configure())hjS3hhhjAh}r3(jCjDh]h]h]h]h]uhMhhh]r3hXAfrom buildbot.steps.shell import Configure f.addStep(Configure())r3r3}r3(hUhj3ubaubj )r3}r3(hUhjS3hhhj#h}r3(h]h]h]h]h]Uentries]r3((UsingleXBuild Steps; CompileX step-Compiler3j3tr3(UsingleXCompile Build Stepj3j3tr3euhMhhh]ubh)r3}r3(hUhjS3hhhhh}r3(h]h]h]h]h]hj3uhMhhh]ubeubh)r3}r3(hUhj,hhh}hhh}r3(h]h]h]h]r3(Ucompiler3j3eh]r3h]auhMhhh}r3j3j3sh]r3(h)r3}r3(hXCompiler3hj3hhhhh}r3(h]h]h]h]h]uhMhhh]r3hXCompiler3r3}r3(hj3hj3ubaubj )r3}r3(hUhj3hhhj#h}r3(h]h]h]h]h]j%]r3(j'XProperties; warnings-countUindex-17r3Utr3aj*uhMhhh]ubh)r4}r4(hUhj3hhhhh}r4(h]h]h]h]h]hj3uhMhhh]ubh)r4}r4(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.hj3hhh}hhh}r4(h]h]h]h]r4j3ah]uhMhhh}r4j3j4sh]r4(hX]This is meant to handle compiling or building a project written in C. The default command is r 4r 4}r 4(hX]This is meant to handle compiling or building a project written in C. The default command is hj4ubh)r 4}r 4(hX ``make all``h}r4(h]h]h]h]h]uhj4h]r4hXmake allr4r4}r4(hUhj 4ubahhubhX. 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 r4r4}r4(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 hj4ubh)r4}r4(hX$:class:`WarningCountingShellCommand`r4hj4hhhhh}r4(UreftypeXclassh͉hXWarningCountingShellCommandU refdomainXpyr4h]h]U refexplicith]h]h]hhhNhj|uhMh]r4h)r4}r4(hj4h}r4(h]h]r4(hj4Xpy-classr 4eh]h]h]uhj4h]r!4hXWarningCountingShellCommandr"4r#4}r$4(hUhj4ubahhubaubhXH superclass, the number of warnings is stored in a Build Property named r%4r&4}r'4(hXH superclass, the number of warnings is stored in a Build Property named hj4ubj_)r(4}r)4(hX`warnings-count`h}r*4(h]h]h]h]h]uhj4h]r+4hXwarnings-countr,4r-4}r.4(hUhj(4ubahjgubhX , which is accumulated over all r/4r04}r14(hX , which is accumulated over all hj4ubh)r24}r34(hX:bb:step:`Compile`r44hj4hhhhh}r54(UreftypeXsteph͉hXCompileU refdomainXbbr64h]h]U refexplicith]h]h]hhuhMh]r74h)r84}r94(hj44h}r:4(h]h]r;4(hj64Xbb-stepr<4eh]h]h]uhj24h]r=4hXCompiler>4r?4}r@4(hUhj84ubahhubaubhXu steps (so if two warnings are found in one step, and three are found in another step, the overall build will have a rA4rB4}rC4(hXu steps (so if two warnings are found in one step, and three are found in another step, the overall build will have a hj4ubj_)rD4}rE4(hX`warnings-count`h}rF4(h]h]h]h]h]uhj4h]rG4hXwarnings-countrH4rI4}rJ4(hUhjD4ubahjgubhX 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.rK4rL4}rM4(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.hj4ubeubh)rN4}rO4(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::hj3hhhhh}rP4(h]h]h]h]h]uhMhhh]rQ4(hX;The default regular expression used to detect a warning is rR4rS4}rT4(hX;The default regular expression used to detect a warning is hjN4ubh)rU4}rV4(hX``'.*warning[: ].*'``h}rW4(h]h]h]h]h]uhjN4h]rX4hX'.*warning[: ].*'rY4rZ4}r[4(hUhjU4ubahhubhX_ , which is fairly liberal and may cause false-positives. To use a different regexp, provide a r\4r]4}r^4(hX_ , which is fairly liberal and may cause false-positives. To use a different regexp, provide a hjN4ubh)r_4}r`4(hX``warningPattern=``h}ra4(h]h]h]h]h]uhjN4h]rb4hXwarningPattern=rc4rd4}re4(hUhj_4ubahhubhX, argument, or use a subclass which sets the rf4rg4}rh4(hX, argument, or use a subclass which sets the hjN4ubh)ri4}rj4(hX``warningPattern``h}rk4(h]h]h]h]h]uhjN4h]rl4hXwarningPatternrm4rn4}ro4(hUhji4ubahhubhX attribute:rp4rq4}rr4(hX attribute:hjN4ubeubj>)rs4}rt4(hXfrom buildbot.steps.shell import Compile f.addStep(Compile(command=["make", "test"], warningPattern="^Warning: "))hj3hhhjAh}ru4(jCjDh]h]h]h]h]uhMhhh]rv4hXfrom buildbot.steps.shell import Compile f.addStep(Compile(command=["make", "test"], warningPattern="^Warning: "))rw4rx4}ry4(hUhjs4ubaubh)rz4}r{4(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).hj3hhhhh}r|4(h]h]h]h]h]uhMhhh]r}4(hXThe r~4r4}r4(hXThe hjz4ubh)r4}r4(hX``warningPattern=``h}r4(h]h]h]h]h]uhjz4h]r4hXwarningPattern=r4r4}r4(hUhj4ubahhubhX[ can also be a pre-compiled Python regexp object: this makes it possible to add flags like r4r4}r4(hX[ can also be a pre-compiled Python regexp object: this makes it possible to add flags like hjz4ubh)r4}r4(hX``re.I``h}r4(h]h]h]h]h]uhjz4h]r4hXre.Ir4r4}r4(hUhj4ubahhubhX$ (to use case-insensitive matching).r4r4}r4(hX$ (to use case-insensitive matching).hjz4ubeubh)r4}r4(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.hj3hhhhh}r4(h]h]h]h]h]uhMhhh]r4(hXNote that the compiled r4r4}r4(hXNote that the compiled hj4ubh)r4}r4(hX``warningPattern``h}r4(h]h]h]h]h]uhj4h]r4hXwarningPatternr4r4}r4(hUhj4ubahhubhX will have its r4r4}r4(hX will have its hj4ubh)r4}r4(hX :meth:`match`r4hj4hhhhh}r4(UreftypeXmethh͉hXmatchU refdomainXpyr4h]h]U refexplicith]h]h]hhhNhj|uhMh]r4h)r4}r4(hj4h}r4(h]h]r4(hj4Xpy-methr4eh]h]h]uhj4h]r4hXmatchr4r4}r4(hUhj4ubahhubaubhX1 method called, which is subtly different from a r4r4}r4(hX1 method called, which is subtly different from a hj4ubh)r4}r4(hX:meth:`search`r4hj4hhhhh}r4(UreftypeXmethh͉hXsearchU refdomainXpyr4h]h]U refexplicith]h]h]hhhNhj|uhMh]r4h)r4}r4(hj4h}r4(h]h]r4(hj4Xpy-methr4eh]h]h]uhj4h]r4hXsearchr4r4}r4(hUhj4ubahhubaubhX. 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 r4r4}r4(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 hj4ubh)r4}r4(hX``'.*'``h}r4(h]h]h]h]h]uhj4h]r4hX'.*'r4r4}r4(hUhj4ubahhubhX to your regular expression.r4r4}r4(hX to your regular expression.hj4ubeubh)r4}r4(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.hj3hhhhh}r4(h]h]h]h]h]uhMhhh]r4(hXThe r4r4}r4(hXThe hj4ubh)r4}r4(hX``suppressionFile=``h}r4(h]h]h]h]h]uhj4h]r4hXsuppressionFile=r4r4}r4(hUhj4ubahhubhX 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.r4r4}r4(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.hj4ubeubh)r4}r4(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:hj3hhhhh}r4(h]h]h]h]h]uhMhhh]r4(hXgThe file must contain one line per pattern of warnings to ignore. Empty lines and lines beginning with r4r4}r4(hXgThe file must contain one line per pattern of warnings to ignore. Empty lines and lines beginning with hj4ubh)r4}r4(hX``#``h}r4(h]h]h]h]h]uhj4h]r4hX#r4}r4(hUhj4ubahhubhX` are ignored. Other lines must consist of a regexp matching the file name, followed by a colon (r4r4}r4(hX` are ignored. Other lines must consist of a regexp matching the file name, followed by a colon (hj4ubh)r4}r4(hX``:``h}r4(h]h]h]h]h]uhj4h]r4hX:r4}r4(hUhj4ubahhubhX), 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:r4r4}r4(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:hj4ubeubj>)r4}r4(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.* : 51hj3hhhjAh}r5(Ulinenosr5Ulanguager5XnonejCjDh]h]h]h]h]uhMhhh]r5hX# 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.* : 51r5r5}r5(hUhj4ubaubh)r5}r5(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 5hj3hhhhh}r 5(h]h]h]h]h]uhMhhh]r 5hXIf 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 5r 5}r5(hj 5hj5ubaubh)r5}r5(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::hj3hhhhh}r5(h]h]h]h]h]uhMhhh]r5(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 r5r5}r5(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 hj5ubh)r5}r5(hX``warningExtractor=``h}r5(h]h]h]h]h]uhj5h]r5hXwarningExtractor=r5r5}r5(hUhj5ubahhubhX3. The function is called with three arguments: the r5r5}r5(hX3. The function is called with three arguments: the hj5ubh)r 5}r!5(hX:class:`BuildStep`r"5hj5hhhhh}r#5(UreftypeXclassh͉hX BuildStepU refdomainXpyr$5h]h]U refexplicith]h]h]hhhNhj|uhMh]r%5h)r&5}r'5(hj"5h}r(5(h]h]r)5(hj$5Xpy-classr*5eh]h]h]uhj 5h]r+5hX BuildStepr,5r-5}r.5(hUhj&5ubahhubaubhX< object, the line in the log file with the warning, and the r/5r05}r15(hX< object, the line in the log file with the warning, and the hj5ubh)r25}r35(hX ``SRE_Match``h}r45(h]h]h]h]h]uhj5h]r55hX SRE_Matchr65r75}r85(hUhj25ubahhubhX! object of the regexp search for r95r:5}r;5(hX! object of the regexp search for hj5ubh)r<5}r=5(hX``warningPattern``h}r>5(h]h]h]h]h]uhj5h]r?5hXwarningPatternr@5rA5}rB5(hUhj<5ubahhubhX. It should return a tuple rC5rD5}rE5(hX. It should return a tuple hj5ubh)rF5}rG5(hX(``(filename, linenumber, warning_test)``h}rH5(h]h]h]h]h]uhj5h]rI5hX$(filename, linenumber, warning_test)rJ5rK5}rL5(hUhjF5ubahhubhX. For example:rM5rN5}rO5(hX. For example:hj5ubeubj>)rP5}rQ5(hXf.addStep(Compile(command=["make"], warningPattern="^(.\*?):([0-9]+): [Ww]arning: (.\*)$", warningExtractor=Compile.warnExtractFromRegexpGroups, suppressionFile="support-files/compiler_warnings.supp"))hj3hhhjAh}rR5(jCjDh]h]h]h]h]uhM"hhh]rS5hXf.addStep(Compile(command=["make"], warningPattern="^(.\*?):([0-9]+): [Ww]arning: (.\*)$", warningExtractor=Compile.warnExtractFromRegexpGroups, suppressionFile="support-files/compiler_warnings.supp"))rT5rU5}rV5(hUhjP5ubaubh)rW5}rX5(hX(``Compile.warnExtractFromRegexpGroups`` is a pre-defined function that returns the filename, linenumber, and text from groups (1,2,3) of the regexp match).hj3hhhhh}rY5(h]h]h]h]h]uhM'hhh]rZ5(hX(r[5}r\5(hX(hjW5ubh)r]5}r^5(hX'``Compile.warnExtractFromRegexpGroups``h}r_5(h]h]h]h]h]uhjW5h]r`5hX#Compile.warnExtractFromRegexpGroupsra5rb5}rc5(hUhj]5ubahhubhXt is a pre-defined function that returns the filename, linenumber, and text from groups (1,2,3) of the regexp match).rd5re5}rf5(hXt is a pre-defined function that returns the filename, linenumber, and text from groups (1,2,3) of the regexp match).hjW5ubeubh)rg5}rh5(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::hj3hhhhh}ri5(h]h]h]h]h]uhM+hhh]rj5(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 rk5rl5}rm5(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 hjg5ubh)rn5}ro5(hX``directoryEnterPattern=``h}rp5(h]h]h]h]h]uhjg5h]rq5hXdirectoryEnterPattern=rr5rs5}rt5(hUhjn5ubahhubhX and ru5rv5}rw5(hX and hjg5ubh)rx5}ry5(hX``directoryLeavePattern=``h}rz5(h]h]h]h]h]uhjg5h]r{5hXdirectoryLeavePattern=r|5r}5}r~5(hUhjx5ubahhubhX. The r5r5}r5(hX. The hjg5ubh)r5}r5(hX``directoryEnterPattern=``h}r5(h]h]h]h]h]uhjg5h]r5hXdirectoryEnterPattern=r5r5}r5(hUhj5ubahhubhX 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:r5r5}r5(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:hjg5ubeubj>)r5}r5(hX.. directoryEnterPattern = "make.*: Entering directory [\"`'](.*)['`\"]" .. directoryLeavePattern = "make.*: Leaving directory"hj3hhhjAh}r5(jCjDh]h]h]h]h]uhM4hhh]r5hX.. directoryEnterPattern = "make.*: Entering directory [\"`'](.*)['`\"]" .. directoryLeavePattern = "make.*: Leaving directory"r5r5}r5(hUhj5ubaubh)r5}r5(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).r5hj3hhhhh}r5(h]h]h]h]h]uhM7hhh]r5hX(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).r5r5}r5(hj5hj5ubaubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]j%]r5((j'X Visual StudioUindex-18r5Utr5(j'X Visual C++j5Utr5ej*uhM;hhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhM;hhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VC6Xstep-VC6r5j5tr5(UsingleXVC6 Build Stepj5j5tr5euhM<hhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhM<hhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VC7Xstep-VC7r5j5tr5(UsingleXVC7 Build Stepj5j5tr5euhM=hhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhM=hhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VC8Xstep-VC8r5j5tr5(UsingleXVC8 Build Stepj5j5tr5euhM>hhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhM>hhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VC9Xstep-VC9r5j5tr5(UsingleXVC9 Build Stepj5j5tr5euhM?hhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhM?hhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VC10X step-VC10r5j5tr5(UsingleXVC10 Build Stepj5j5tr5euhM@hhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhM@hhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VC11X step-VC11r5j5tr5(UsingleXVC11 Build Stepj5j5tr5euhMAhhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhMAhhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VS2003X step-VS2003r5j5tr5(UsingleXVS2003 Build Stepj5j5tr5euhMBhhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhMBhhh]ubj )r5}r5(hUhj3hhhj#h}r5(h]h]h]h]h]Uentries]r5((UsingleXBuild Steps; VS2005X step-VS2005r5j5tr5(UsingleXVS2005 Build Stepj5j5tr5euhMChhh]ubh)r5}r5(hUhj3hhhhh}r5(h]h]h]h]r5j5ah]uhMChhh]ubj )r5}r5(hUhj3hhhj#h}r6(h]h]h]h]h]Uentries]r6((UsingleXBuild Steps; VS2008X step-VS2008r6j6tr6(UsingleXVS2008 Build Stepj6j6tr6euhMDhhh]ubh)r6}r6(hUhj3hhhhh}r6(h]h]h]h]r6j6ah]uhMDhhh]ubj )r 6}r 6(hUhj3hhhj#h}r 6(h]h]h]h]h]Uentries]r 6((UsingleXBuild Steps; VS2010X step-VS2010r 6j 6tr6(UsingleXVS2010 Build Stepj 6j 6tr6euhMEhhh]ubh)r6}r6(hUhj3hhhhh}r6(h]h]h]h]r6j 6ah]uhMEhhh]ubj )r6}r6(hUhj3hhhj#h}r6(h]h]h]h]h]Uentries]r6((UsingleXBuild Steps; VS2012X step-VS2012r6j6tr6(UsingleXVS2012 Build Stepj6j6tr6euhMFhhh]ubh)r6}r6(hUhj3hhhhh}r6(h]h]h]h]r6j6ah]uhMFhhh]ubj )r6}r 6(hUhj3hhhj#h}r!6(h]h]h]h]h]Uentries]r"6((UsingleXBuild Steps; VCExpress9Xstep-VCExpress9r#6j#6tr$6(UsingleXVCExpress9 Build Stepj#6j#6tr%6euhMGhhh]ubh)r&6}r'6(hUhj3hhhhh}r(6(h]h]h]h]r)6j#6ah]uhMGhhh]ubj )r*6}r+6(hUhj3hhhj#h}r,6(h]h]h]h]h]Uentries]r-6((UsingleXBuild Steps; MsBuildX step-MsBuildr.6j.6tr/6(UsingleXMsBuild Build Stepj.6j.6tr06euhMIhhh]ubh)r16}r26(hUhj3hhhhh}r36(h]h]h]h]h]hj.6uhMIhhh]ubeubh)r46}r56(hUhj,hhh}hhh}r66(h]h]h]h]r76(Uvisual-cr86j.6eh]r96hauhMKhhh}r:6j.6j16sh]r;6(h)r<6}r=6(hX Visual C++r>6hj46hhhhh}r?6(h]h]h]h]h]uhMKhhh]r@6hX Visual C++rA6rB6}rC6(hj>6hj<6ubaubh)rD6}rE6(hXThese steps are meant to handle compilation using Microsoft compilers. VC++ 6-11 (aka Visual Studio 2003-2012 and VCExpress9) are supported via calling ``devenv``. VS2012 as well as Windows Driver Kit 8 are supported via the new ``MsBuild`` step. 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.hj46hhhhh}rF6(h]h]h]h]h]uhMMhhh]rG6(hXThese steps are meant to handle compilation using Microsoft compilers. VC++ 6-11 (aka Visual Studio 2003-2012 and VCExpress9) are supported via calling rH6rI6}rJ6(hXThese steps are meant to handle compilation using Microsoft compilers. VC++ 6-11 (aka Visual Studio 2003-2012 and VCExpress9) are supported via calling hjD6ubh)rK6}rL6(hX ``devenv``h}rM6(h]h]h]h]h]uhjD6h]rN6hXdevenvrO6rP6}rQ6(hUhjK6ubahhubhXC. VS2012 as well as Windows Driver Kit 8 are supported via the new rR6rS6}rT6(hXC. VS2012 as well as Windows Driver Kit 8 are supported via the new hjD6ubh)rU6}rV6(hX ``MsBuild``h}rW6(h]h]h]h]h]uhjD6h]rX6hXMsBuildrY6rZ6}r[6(hUhjU6ubahhubhX step. 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.r\6r]6}r^6(hX step. 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.hjD6ubeubh)r_6}r`6(hXTAll of the classes are in :mod:`buildbot.steps.vstudio`. The available classes are:ra6hj46hhhhh}rb6(h]h]h]h]h]uhMUhhh]rc6(hXAll of the classes are in rd6re6}rf6(hXAll of the classes are in hj_6ubh)rg6}rh6(hX:mod:`buildbot.steps.vstudio`ri6hj_6hhhhh}rj6(UreftypeXmodh͉hXbuildbot.steps.vstudioU refdomainXpyrk6h]h]U refexplicith]h]h]hhhNhj|uhMUh]rl6h)rm6}rn6(hji6h}ro6(h]h]rp6(hjk6Xpy-modrq6eh]h]h]uhjg6h]rr6hXbuildbot.steps.vstudiors6rt6}ru6(hUhjm6ubahhubaubhX. The available classes are:rv6rw6}rx6(hX. The available classes are:hj_6ubeubjc)ry6}rz6(hUhj46hNhjfh}r{6(h]h]h]h]h]uhNhhh]r|6ji)r}6}r~6(hUh}r6(jmX*h]h]h]h]h]uhjy6h]r6(jo)r6}r6(hX``VC6``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhMWh]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVC6r6r6}r6(hUhj6ubahhubaubahj|ubjo)r6}r6(hX``VC7``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhMXh]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVC7r6r6}r6(hUhj6ubahhubaubahj|ubjo)r6}r6(hX``VC8``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhMYh]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVC8r6r6}r6(hUhj6ubahhubaubahj|ubjo)r6}r6(hX``VC9``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhMZh]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVC9r6r6}r6(hUhj6ubahhubaubahj|ubjo)r6}r6(hX``VC10``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhM[h]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVC10r6r6}r6(hUhj6ubahhubaubahj|ubjo)r6}r6(hX``VC11``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhM\h]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVC11r6r6}r6(hUhj6ubahhubaubahj|ubjo)r6}r6(hX ``VS2003``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhM]h]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVS2003r6r6}r6(hUhj6ubahhubaubahj|ubjo)r6}r6(hX ``VS2005``r6h}r6(h]h]h]h]h]uhj}6h]r6h)r6}r6(hj6hj6hhhhh}r6(h]h]h]h]h]uhM^h]r6h)r6}r6(hj6h}r6(h]h]h]h]h]uhj6h]r6hXVS2005r6r6}r7(hUhj6ubahhubaubahj|ubjo)r7}r7(hX ``VS2008``r7h}r7(h]h]h]h]h]uhj}6h]r7h)r7}r7(hj7hj7hhhhh}r7(h]h]h]h]h]uhM_h]r 7h)r 7}r 7(hj7h}r 7(h]h]h]h]h]uhj7h]r 7hXVS2008r7r7}r7(hUhj 7ubahhubaubahj|ubjo)r7}r7(hX ``VS2010``r7h}r7(h]h]h]h]h]uhj}6h]r7h)r7}r7(hj7hj7hhhhh}r7(h]h]h]h]h]uhM`h]r7h)r7}r7(hj7h}r7(h]h]h]h]h]uhj7h]r7hXVS2010r7r7}r 7(hUhj7ubahhubaubahj|ubjo)r!7}r"7(hX ``VS2012``r#7h}r$7(h]h]h]h]h]uhj}6h]r%7h)r&7}r'7(hj#7hj!7hhhhh}r(7(h]h]h]h]h]uhMah]r)7h)r*7}r+7(hj#7h}r,7(h]h]h]h]h]uhj&7h]r-7hXVS2012r.7r/7}r07(hUhj*7ubahhubaubahj|ubjo)r17}r27(hX``VCExpress9``r37h}r47(h]h]h]h]h]uhj}6h]r57h)r67}r77(hj37hj17hhhhh}r87(h]h]h]h]h]uhMbh]r97h)r:7}r;7(hj37h}r<7(h]h]h]h]h]uhj67h]r=7hX VCExpress9r>7r?7}r@7(hUhj:7ubahhubaubahj|ubjo)rA7}rB7(hX ``MsBuild`` h}rC7(h]h]h]h]h]uhj}6h]rD7h)rE7}rF7(hX ``MsBuild``rG7hjA7hhhhh}rH7(h]h]h]h]h]uhMch]rI7h)rJ7}rK7(hjG7h}rL7(h]h]h]h]h]uhjE7h]rM7hXMsBuildrN7rO7}rP7(hUhjJ7ubahhubaubahj|ubehjubaubh)rQ7}rR7(hX'The available constructor arguments arerS7hj46hhhhh}rT7(h]h]h]h]h]uhMehhh]rU7hX'The available constructor arguments arerV7rW7}rX7(hjS7hjQ7ubaubj)rY7}rZ7(hUhj46hhhjh}r[7(h]h]h]h]h]uhNhhh]r\7(j)r]7}r^7(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. hjY7hhhjh}r_7(h]h]h]h]h]uhMlh]r`7(j)ra7}rb7(hX``mode``rc7hj]7hhhjh}rd7(h]h]h]h]h]uhMlh]re7h)rf7}rg7(hjc7h}rh7(h]h]h]h]h]uhja7h]ri7hXmoderj7rk7}rl7(hUhjf7ubahhubaubj)rm7}rn7(hUh}ro7(h]h]h]h]h]uhj]7h]rp7h)rq7}rr7(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.hjm7hhhhh}rs7(h]h]h]h]h]uhMhh]rt7(hXThe mode default to ru7rv7}rw7(hXThe mode default to hjq7ubh)rx7}ry7(hX ``rebuild``h}rz7(h]h]h]h]h]uhjq7h]r{7hXrebuildr|7r}7}r~7(hUhjx7ubahhubhXr, which means that first all the remaining object files will be cleaned by the compiler. The alternate values are r7r7}r7(hXr, which means that first all the remaining object files will be cleaned by the compiler. The alternate values are hjq7ubh)r7}r7(hX ``build``h}r7(h]h]h]h]h]uhjq7h]r7hXbuildr7r7}r7(hUhj7ubahhubhX7, where only the updated files will be recompiled, and r7r7}r7(hX7, where only the updated files will be recompiled, and hjq7ubh)r7}r7(hX ``clean``h}r7(h]h]h]h]h]uhjq7h]r7hXcleanr7r7}r7(hUhj7ubahhubhXF, where the current build files are removed and no compilation occurs.r7r7}r7(hXF, where the current build files are removed and no compilation occurs.hjq7ubeubahjubeubj)r7}r7(hXq``projectfile`` This is a mandatory argument which specifies the project file to be used during the compilation. hjY7hhhjh}r7(h]h]h]h]h]uhMphhh]r7(j)r7}r7(hX``projectfile``r7hj7hhhjh}r7(h]h]h]h]h]uhMph]r7h)r7}r7(hj7h}r7(h]h]h]h]h]uhj7h]r7hX projectfiler7r7}r7(hUhj7ubahhubaubj)r7}r7(hUh}r7(h]h]h]h]h]uhj7h]r7h)r7}r7(hX`This is a mandatory argument which specifies the project file to be used during the compilation.r7hj7hhhhh}r7(h]h]h]h]h]uhMoh]r7hX`This is a mandatory argument which specifies the project file to be used during the compilation.r7r7}r7(hj7hj7ubaubahjubeubj)r7}r7(hXd``config`` This argument defaults to ``release`` an gives to the compiler the configuration to use. hjY7hhhjh}r7(h]h]h]h]h]uhMthhh]r7(j)r7}r7(hX ``config``r7hj7hhhjh}r7(h]h]h]h]h]uhMth]r7h)r7}r7(hj7h}r7(h]h]h]h]h]uhj7h]r7hXconfigr7r7}r7(hUhj7ubahhubaubj)r7}r7(hUh}r7(h]h]h]h]h]uhj7h]r7h)r7}r7(hXXThis argument defaults to ``release`` an gives to the compiler the configuration to use.hj7hhhhh}r7(h]h]h]h]h]uhMsh]r7(hXThis argument defaults to r7r7}r7(hXThis argument defaults to hj7ubh)r7}r7(hX ``release``h}r7(h]h]h]h]h]uhj7h]r7hXreleaser7r7}r7(hUhj7ubahhubhX3 an gives to the compiler the configuration to use.r7r7}r7(hX3 an gives to the compiler the configuration to use.hj7ubeubahjubeubj)r7}r7(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. hjY7hhhjh}r7(h]h]h]h]h]uhMxhhh]r7(j)r7}r7(hX``installdir``r7hj7hhhjh}r7(h]h]h]h]h]uhMxh]r7h)r7}r7(hj7h}r7(h]h]h]h]h]uhj7h]r7hX installdirr7r7}r7(hUhj7ubahhubaubj)r7}r7(hUh}r7(h]h]h]h]h]uhj7h]r7h)r7}r7(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.r7hj7hhhhh}r7(h]h]h]h]h]uhMwh]r7hXThis is the place where the compiler is installed. The default value is compiler specific and is the default place where the compiler is installed.r7r7}r7(hj7hj7ubaubahjubeubj)r7}r7(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``. hjY7hhhjh}r7(h]h]h]h]h]uhMhhh]r7(j)r7}r7(hX ``useenv``r7hj7hhhjh}r7(h]h]h]h]h]uhMh]r7h)r7}r7(hj7h}r7(h]h]h]h]h]uhj7h]r7hXuseenvr8r8}r8(hUhj7ubahhubaubj)r8}r8(hUh}r8(h]h]h]h]h]uhj7h]r8h)r8}r8(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``.hj8hhhhh}r 8(h]h]h]h]h]uhM{h]r 8(hX&This boolean parameter, defaulting to r 8r 8}r 8(hX&This boolean parameter, defaulting to hj8ubh)r8}r8(hX ``False``h}r8(h]h]h]h]h]uhj8h]r8hXFalser8r8}r8(hUhj8ubahhubhXd instruct the compiler to use its own settings or the one defined through the environment variables r8r8}r8(hXd instruct the compiler to use its own settings or the one defined through the environment variables hj8ubj )r8}r8(hUh}r8(h]h]h]h]h]j%]r8((j'XPATHr8Uindex-19r8Utr8(j'Xenvironment variable; PATHj8Utr8euhj8h]hj#ubh)r 8}r!8(hUh}r"8(h]h]h]h]r#8j8ah]uhj8h]hhubh)r$8}r%8(hX:envvar:`PATH`r&8hj8hhhhh}r'8(UreftypeXenvvarh͉hj8U refdomainXstdr(8h]h]U refexplicith]h]h]hhuhM{h]r)8h)r*8}r+8(hj&8h}r,8(h]h]r-8(hj(8X std-envvarr.8eh]h]h]uhj$8h]r/8hXPATHr08r18}r28(hUhj*8ubahhubaubhX, r38r48}r58(hX, hj8ubj )r68}r78(hUh}r88(h]h]h]h]h]j%]r98((j'XINCLUDEr:8Uindex-20r;8Utr<8(j'Xenvironment variable; INCLUDEj;8Utr=8euhj8h]hj#ubh)r>8}r?8(hUh}r@8(h]h]h]h]rA8j;8ah]uhj8h]hhubh)rB8}rC8(hX:envvar:`INCLUDE`rD8hj8hhhhh}rE8(UreftypeXenvvarh͉hj:8U refdomainXstdrF8h]h]U refexplicith]h]h]hhuhM{h]rG8h)rH8}rI8(hjD8h}rJ8(h]h]rK8(hjF8X std-envvarrL8eh]h]h]uhjB8h]rM8hXINCLUDErN8rO8}rP8(hUhjH8ubahhubaubhX, and rQ8rR8}rS8(hX, and hj8ubj )rT8}rU8(hUh}rV8(h]h]h]h]h]j%]rW8((j'XLIBrX8Uindex-21rY8UtrZ8(j'Xenvironment variable; LIBjY8Utr[8euhj8h]hj#ubh)r\8}r]8(hUh}r^8(h]h]h]h]r_8jY8ah]uhj8h]hhubh)r`8}ra8(hX :envvar:`LIB`rb8hj8hhhhh}rc8(UreftypeXenvvarh͉hjX8U refdomainXstdrd8h]h]U refexplicith]h]h]hhuhM{h]re8h)rf8}rg8(hjb8h}rh8(h]h]ri8(hjd8X std-envvarrj8eh]h]h]uhj`8h]rk8hXLIBrl8rm8}rn8(hUhjf8ubahhubaubhX. If any of the ro8rp8}rq8(hX. If any of the hj8ubh)rr8}rs8(hX ``INCLUDE``h}rt8(h]h]h]h]h]uhj8h]ru8hXINCLUDErv8rw8}rx8(hUhjr8ubahhubhX or ry8rz8}r{8(hX or hj8ubh)r|8}r}8(hX``LIB``h}r~8(h]h]h]h]h]uhj8h]r8hXLIBr8r8}r8(hUhj|8ubahhubhX@ parameter is defined, this parameter automatically switches to r8r8}r8(hX@ parameter is defined, this parameter automatically switches to hj8ubh)r8}r8(hX``True``h}r8(h]h]h]h]h]uhj8h]r8hXTruer8r8}r8(hUhj8ubahhubhX.r8}r8(hX.hj8ubeubahjubeubj)r8}r8(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. hjY7hhhjh}r8(h]h]h]h]h]uhMhhh]r8(j)r8}r8(hX``PATH``r8hj8hhhjh}r8(h]h]h]h]h]uhMh]r8h)r8}r8(hj8h}r8(h]h]h]h]h]uhj8h]r8hXPATHr8r8}r8(hUhj8ubahhubaubj)r8}r8(hUh}r8(h]h]h]h]h]uhj8h]r8h)r8}r8(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.hj8hhhhh}r8(h]h]h]h]h]uhMh]r8(hX*This is a list of path to be added to the r8r8}r8(hX*This is a list of path to be added to the hj8ubj )r8}r8(hUh}r8(h]h]h]h]h]j%]r8((j'XPATHr8Uindex-22r8Utr8(j'Xenvironment variable; PATHj8Utr8euhj8h]hj#ubh)r8}r8(hUh}r8(h]h]h]h]r8j8ah]uhj8h]hhubh)r8}r8(hX:envvar:`PATH`r8hj8hhhhh}r8(UreftypeXenvvarh͉hj8U refdomainXstdr8h]h]U refexplicith]h]h]hhuhMh]r8h)r8}r8(hj8h}r8(h]h]r8(hj8X std-envvarr8eh]h]h]uhj8h]r8hXPATHr8r8}r8(hUhj8ubahhubaubhXT environment variable. The default value is the one defined in the compiler options.r8r8}r8(hXT environment variable. The default value is the one defined in the compiler options.hj8ubeubahjubeubj)r8}r8(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. hjY7hhhjh}r8(h]h]h]h]h]uhMhhh]r8(j)r8}r8(hX ``INCLUDE``r8hj8hhhjh}r8(h]h]h]h]h]uhMh]r8h)r8}r8(hj8h}r8(h]h]h]h]h]uhj8h]r8hXINCLUDEr8r8}r8(hUhj8ubahhubaubj)r8}r8(hUh}r8(h]h]h]h]h]uhj8h]r8h)r8}r8(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.r8hj8hhhhh}r8(h]h]h]h]h]uhMh]r8hXThis is a list of path where the compiler will first look for include files. Then comes the default paths defined in the compiler options.r8r8}r8(hj8hj8ubaubahjubeubj)r8}r8(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. hjY7hhhjh}r8(h]h]h]h]h]uhMhhh]r8(j)r8}r8(hX``LIB``r8hj8hhhjh}r8(h]h]h]h]h]uhMh]r8h)r8}r8(hj8h}r8(h]h]h]h]h]uhj8h]r8hXLIBr8r8}r8(hUhj8ubahhubaubj)r8}r8(hUh}r8(h]h]h]h]h]uhj8h]r8h)r8}r8(hXThis is a list of path where the compiler will first look for libraries. Then comes the default path defined in the compiler options.r8hj8hhhhh}r8(h]h]h]h]h]uhMh]r8hXThis is a list of path where the compiler will first look for libraries. Then comes the default path defined in the compiler options.r8r8}r8(hj8hj8ubaubahjubeubj)r9}r9(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 ``MsBuild``. Please see ``platform`` below. hjY7hhhjh}r9(h]h]h]h]h]uhMhhh]r9(j)r9}r9(hX``arch``r9hj9hhhjh}r9(h]h]h]h]h]uhMh]r9h)r 9}r 9(hj9h}r 9(h]h]h]h]h]uhj9h]r 9hXarchr 9r9}r9(hUhj 9ubahhubaubj)r9}r9(hUh}r9(h]h]h]h]h]uhj9h]r9h)r9}r9(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 ``MsBuild``. Please see ``platform`` below.hj9hhhhh}r9(h]h]h]h]h]uhMh]r9(hXThat one is only available with the class VS2005 (VC8). It gives the target architecture of the built artifact. It defaults to r9r9}r9(hXThat one is only available with the class VS2005 (VC8). It gives the target architecture of the built artifact. It defaults to hj9ubh)r9}r9(hX``x86``h}r9(h]h]h]h]h]uhj9h]r9hXx86r9r 9}r!9(hUhj9ubahhubhX and does not apply to r"9r#9}r$9(hX and does not apply to hj9ubh)r%9}r&9(hX ``MsBuild``h}r'9(h]h]h]h]h]uhj9h]r(9hXMsBuildr)9r*9}r+9(hUhj%9ubahhubhX . Please see r,9r-9}r.9(hX . Please see hj9ubh)r/9}r09(hX ``platform``h}r19(h]h]h]h]h]uhj9h]r29hXplatformr39r49}r59(hUhj/9ubahhubhX below.r69r79}r89(hX below.hj9ubeubahjubeubj)r99}r:9(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. hjY7hhhjh}r;9(h]h]h]h]h]uhMhhh]r<9(j)r=9}r>9(hX ``project``r?9hj99hhhjh}r@9(h]h]h]h]h]uhMh]rA9h)rB9}rC9(hj?9h}rD9(h]h]h]h]h]uhj=9h]rE9hXprojectrF9rG9}rH9(hUhjB9ubahhubaubj)rI9}rJ9(hUh}rK9(h]h]h]h]h]uhj99h]rL9h)rM9}rN9(hXThis gives the specific project to build from within a workspace. It defaults to building all projects. This is useful for building cmake generate projects.rO9hjI9hhhhh}rP9(h]h]h]h]h]uhMh]rQ9hXThis gives the specific project to build from within a workspace. It defaults to building all projects. This is useful for building cmake generate projects.rR9rS9}rT9(hjO9hjM9ubaubahjubeubj)rU9}rV9(hX``platform`` This is a mandatory argument for MsBuild 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. hjY7hhhjh}rW9(h]h]h]h]h]uhMhhh]rX9(j)rY9}rZ9(hX ``platform``r[9hjU9hhhjh}r\9(h]h]h]h]h]uhMh]r]9h)r^9}r_9(hj[9h}r`9(h]h]h]h]h]uhjY9h]ra9hXplatformrb9rc9}rd9(hUhj^9ubahhubaubj)re9}rf9(hUh}rg9(h]h]h]h]h]uhjU9h]rh9h)ri9}rj9(hXThis is a mandatory argument for MsBuild 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.rk9hje9hhhhh}rl9(h]h]h]h]h]uhMh]rm9hXThis is a mandatory argument for MsBuild 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.rn9ro9}rp9(hjk9hji9ubaubahjubeubeubh)rq9}rr9(hXHHere is an example on how to drive compilation with Visual Studio 2010::rs9hj46hhhhh}rt9(h]h]h]h]h]uhMhhh]ru9hXGHere is an example on how to drive compilation with Visual Studio 2010:rv9rw9}rx9(hXGHere is an example on how to drive compilation with Visual Studio 2010:hjq9ubaubj>)ry9}rz9(hXfrom buildbot.steps.VisualStudio import VS2010 f.addStep( VS2010(projectfile="project.sln", config="release", arch="x64", mode="build", INCLUDE=[r'C:\3rd-pary\libmagic\include'], LIB=[r'C:\3rd-party\libmagic\lib-x64']))hj46hhhjAh}r{9(jCjDh]h]h]h]h]uhMhhh]r|9hXfrom buildbot.steps.VisualStudio import VS2010 f.addStep( VS2010(projectfile="project.sln", config="release", arch="x64", mode="build", INCLUDE=[r'C:\3rd-pary\libmagic\include'], LIB=[r'C:\3rd-party\libmagic\lib-x64']))r}9r~9}r9(hUhjy9ubaubh)r9}r9(hX+Here is a similar example using "msbuild"::r9hj46hhhhh}r9(h]h]h]h]h]uhMhhh]r9hX*Here is a similar example using "msbuild":r9r9}r9(hX*Here is a similar example using "msbuild":hj9ubaubj>)r9}r9(hXfrom buildbot.steps.VisualStudio import MsBuild # Build one project in Release mode for Win32 f.addStep( MsBuild(projectfile="trunk.sln", config="Release", platform="Win32", workdir="trunk", project="tools\\protoc")) # Build the entire solution in Debug mode for x64 f.addStep( MsBuild(projectfile="trunk.sln", config='Debug', platform='x64', workdir="trunk"))hj46hhhjAh}r9(jCjDh]h]h]h]h]uhMhhh]r9hXfrom buildbot.steps.VisualStudio import MsBuild # Build one project in Release mode for Win32 f.addStep( MsBuild(projectfile="trunk.sln", config="Release", platform="Win32", workdir="trunk", project="tools\\protoc")) # Build the entire solution in Debug mode for x64 f.addStep( MsBuild(projectfile="trunk.sln", config='Debug', platform='x64', workdir="trunk"))r9r9}r9(hUhj9ubaubj )r9}r9(hUhj46hhhj#h}r9(h]h]h]h]h]Uentries]r9((UsingleXBuild Steps; TestX step-Testr9j9tr9(UsingleXTest Build Stepj9j9tr9euhMhhh]ubh)r9}r9(hUhj46hhhhh}r9(h]h]h]h]h]hj9uhMhhh]ubeubh)r9}r9(hUhj,hhh}hhh}r9(h]h]h]h]r9(Utestr9j9eh]r9hpauhMhhh}r9j9j9sh]r9(h)r9}r9(hXTestr9hj9hhhhh}r9(h]h]h]h]h]uhMhhh]r9hXTestr9r9}r9(hj9hj9ubaubj>)r9}r9(hX7from buildbot.steps.shell import Test f.addStep(Test())hj9hhhjAh}r9(jCjDh]h]h]h]h]uhMhhh]r9hX7from buildbot.steps.shell import Test f.addStep(Test())r9r9}r9(hUhj9ubaubh)r9}r9(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`.hj9hhhhh}r9(h]h]h]h]h]uhMhhh]r9(hX;This is meant to handle unit tests. The default command is r9r9}r9(hX;This is meant to handle unit tests. The default command is hj9ubj)r9}r9(hX:command:`make test`h}r9(h]h]r9jah]h]h]uhj9h]r9hX make testr9r9}r9(hUhj9ubahj ubhX , and the r9r9}r9(hX , and the hj9ubh)r9}r9(hX``warnOnFailure``h}r9(h]h]h]h]h]uhj9h]r9hX warnOnFailurer9r9}r9(hUhj9ubahhubhX3 flag is set. The other arguments are identical to r9r9}r9(hX3 flag is set. The other arguments are identical to hj9ubh)r9}r9(hX:bb:step:`ShellCommand`r9hj9hhhhh}r9(UreftypeXsteph͉hX ShellCommandU refdomainXbbr9h]h]U refexplicith]h]h]hhuhMh]r9h)r9}r9(hj9h}r9(h]h]r9(hj9Xbb-stepr9eh]h]h]uhj9h]r9hX ShellCommandr9r9}r9(hUhj9ubahhubaubhX.r9}r9(hX.hj9ubeubj )r9}r9(hUhj9hhhj#h}r9(h]h]h]h]h]Uentries]r9((UsingleXBuild Steps; TreeSizeX step-TreeSizer9j9tr9(UsingleXTreeSize Build Stepj9j9tr9euhMhhh]ubh)r9}r9(hUhj9hhhhh}r9(h]h]h]h]r9j9ah]uhMhhh]ubj )r9}r9(hUhj9hhhj#h}r9(h]h]h]h]h]j%]r9(j'XProperties; tree-size-KiBUindex-23r9Utr9aj*uhMhhh]ubh)r9}r9(hUhj9hhhhh}r9(h]h]h]h]h]hj9uhMhhh]ubeubh)r9}r9(hUhj,hhh}hhh}r9(h]h]h]h]r9(Utreesizer9j9eh]r9hiauhMhhh}r9j9j9sh]r9(h)r9}r9(hXTreeSizer9hj9hhhhh}r9(h]h]h]h]h]uhMhhh]r9hXTreeSizer9r9}r:(hj9hj9ubaubj>)r:}r:(hX?from buildbot.steps.shell import TreeSize f.addStep(TreeSize())hj9hhhjAh}r:(jCjDh]h]h]h]h]uhMhhh]r:hX?from buildbot.steps.shell import TreeSize f.addStep(TreeSize())r:r:}r:(hUhj:ubaubh)r:}r :(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`.hj9hhhhh}r :(h]h]h]h]h]uhMhhh]r :(hX'This is a simple command that uses the r :r :}r:(hX'This is a simple command that uses the hj:ubj)r:}r:(hX :command:`du`h}r:(h]h]r:jah]h]h]uhj:h]r:hXdur:r:}r:(hUhj:ubahj ubhX 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 r:r:}r:(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 hj:ubh)r:}r:(hX``tree-size-KiB``h}r:(h]h]h]h]h]uhj:h]r:hX tree-size-KiBr:r:}r :(hUhj:ubahhubhX6 with the same value. All arguments are identical to r!:r":}r#:(hX6 with the same value. All arguments are identical to hj:ubh)r$:}r%:(hX:bb:step:`ShellCommand`r&:hj:hhhhh}r':(UreftypeXsteph͉hX ShellCommandU 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/:hX ShellCommandr0:r1:}r2:(hUhj*:ubahhubaubhX.r3:}r4:(hX.hj:ubeubj )r5:}r6:(hUhj9hhhj#h}r7:(h]h]h]h]h]Uentries]r8:((UsingleXBuild Steps; PerlModuleTestXstep-PerlModuleTestr9:j9:tr::(UsingleXPerlModuleTest Build Stepj9:j9:tr;:euhMhhh]ubh)r<:}r=:(hUhj9hhhhh}r>:(h]h]h]h]h]hj9:uhMhhh]ubeubh)r?:}r@:(hUhj,hhh}hhh}rA:(h]h]h]h]rB:(UperlmoduletestrC:j9:eh]rD:h&auhMhhh}rE:j9:j<:sh]rF:(h)rG:}rH:(hXPerlModuleTestrI:hj?:hhhhh}rJ:(h]h]h]h]h]uhMhhh]rK:hXPerlModuleTestrL:rM:}rN:(hjI:hjG:ubaubj>)rO:}rP:(hXKfrom buildbot.steps.shell import PerlModuleTest f.addStep(PerlModuleTest())hj?:hhhjAh}rQ:(jCjDh]h]h]h]h]uhMhhh]rR:hXKfrom buildbot.steps.shell import PerlModuleTest f.addStep(PerlModuleTest())rS:rT:}rU:(hUhjO:ubaubh)rV:}rW:(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`.hj?:hhhhh}rX:(h]h]h]h]h]uhMhhh]rY:(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 rZ:r[:}r\:(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 hjV:ubh)r]:}r^:(hX``prove --lib lib -r t``h}r_:(h]h]h]h]h]uhjV:h]r`:hXprove --lib lib -r tra:rb:}rc:(hUhj]:ubahhubhX+, although this can be overridden with the rd:re:}rf:(hX+, although this can be overridden with the hjV:ubh)rg:}rh:(hX ``command``h}ri:(h]h]h]h]h]uhjV:h]rj:hXcommandrk:rl:}rm:(hUhjg:ubahhubhX; argument. All other arguments are identical to those for rn:ro:}rp:(hX; argument. All other arguments are identical to those for hjV:ubh)rq:}rr:(hX:bb:step:`ShellCommand`rs:hjV:hhhhh}rt:(UreftypeXsteph͉hX ShellCommandU refdomainXbbru:h]h]U refexplicith]h]h]hhuhMh]rv:h)rw:}rx:(hjs:h}ry:(h]h]rz:(hju:Xbb-stepr{:eh]h]h]uhjq:h]r|:hX ShellCommandr}:r~:}r:(hUhjw:ubahhubaubhX.r:}r:(hX.hjV:ubeubj )r:}r:(hUhj?:hhhj#h}r:(h]h]h]h]h]Uentries]r:((UsingleXBuild Steps; MTRXstep-MTRr:j:tr:(UsingleXMTR Build Stepj:j:tr:euhMhhh]ubh)r:}r:(hUhj?:hhhhh}r:(h]h]h]h]h]hj:uhMhhh]ubeubh)r:}r:(hUhj,hhh}hhh}r:(h]h]h]h]r:(Umtr-mysql-test-runr:j:eh]r:h;r?;}r@;(hUhj:;ubahhubhX (even if the connection parameters are the same). To avoid that Buildbot thinks the builder configuration has changed because of this, use the rA;rB;}rC;(hX (even if the connection parameters are the same). To avoid that Buildbot thinks the builder configuration has changed because of this, use the hj3;ubh)rD;}rE;(hX0:class:`process.mtrlogobserver.EqConnectionPool`rF;hj3;hhhhh}rG;(UreftypeXclassh͉hX'process.mtrlogobserver.EqConnectionPoolU refdomainXpyrH;h]h]U refexplicith]h]h]hhhNhj|uhMh]rI;h)rJ;}rK;(hjF;h}rL;(h]h]rM;(hjH;Xpy-classrN;eh]h]h]uhjD;h]rO;hX'process.mtrlogobserver.EqConnectionPoolrP;rQ;}rR;(hUhjJ;ubahhubaubhX subclass of rS;rT;}rU;(hX subclass of hj3;ubh)rV;}rW;(hX:class:`ConnectionPool`rX;hj3;hhhhh}rY;(UreftypeXclassh͉hXConnectionPoolU refdomainXpyrZ;h]h]U refexplicith]h]h]hhhNhj|uhMh]r[;h)r\;}r];(hjX;h}r^;(h]h]r_;(hjZ;Xpy-classr`;eh]h]h]uhjV;h]ra;hXConnectionPoolrb;rc;}rd;(hUhj\;ubahhubaubhXC, which implements an equiality operation that avoids this problem.re;rf;}rg;(hXC, which implements an equiality operation that avoids this problem.hj3;ubeubh)rh;}ri;(hX Example use::rj;hj:hhhhh}rk;(h]h]h]h]h]uhMhhh]rl;hX Example use:rm;rn;}ro;(hX Example use:hjh;ubaubj>)rp;}rq;(hXfrom buildbot.process.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:hhhjAh}rr;(jCjDh]h]h]h]h]uhM hhh]rs;hXfrom buildbot.process.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"]))rt;ru;}rv;(hUhjp;ubaubh)rw;}rx;(hX(The :bb:step:`MTR` step's arguments are:ry;hj:hhhhh}rz;(h]h]h]h]h]uhMhhh]r{;(hXThe r|;r};}r~;(hXThe hjw;ubh)r;}r;(hX:bb:step:`MTR`r;hjw;hhhhh}r;(UreftypeXsteph͉hXMTRU 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;hXMTRr;r;}r;(hUhj;ubahhubaubhX step's arguments are:r;r;}r;(hX step's arguments are:hjw;ubeubj)r;}r;(hUhj:hhhjh}r;(h]h]h]h]h]uhNhhh]r;(j)r;}r;(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;hhhjh}r;(h]h]h]h]h]uhMh]r;(j)r;}r;(hX ``textLimit``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 textLimitr;r;}r;(hUhj;ubahhubaubj)r;}r;(hUh}r;(h]h]h]h]h]uhj;h]r;h)r;}r;(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.r;hj;hhhhh}r;(h]h]h]h]h]uhMh]r;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.r;r;}r;(hj;hj;ubaubahjubeubj)r;}r;(hX``testNameLimit`` Maximum length of test names to show unabbreviated in the waterfall page, to avoid excessive column width. Defaults to 16. hj;hhhjh}r;(h]h]h]h]h]uhMhhh]r;(j)r;}r;(hX``testNameLimit``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 testNameLimitr;r;}r;(hUhj;ubahhubaubj)r;}r;(hUh}r;(h]h]h]h]h]uhj;h]r;h)r;}r;(hXzMaximum length of test names to show unabbreviated in the waterfall page, to avoid excessive column width. Defaults to 16.r;hj;hhhhh}r;(h]h]h]h]h]uhMh]r;hXzMaximum length of test names to show unabbreviated in the waterfall page, to avoid excessive column width. Defaults to 16.r;r;}r;(hj;hj;ubaubahjubeubj)r;}r;(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;hhhjh}r;(h]h]h]h]h]uhMhhh]r;(j)r;}r;(hX ``parallel``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;hXparallelr;r;}r;(hUhj;ubahhubaubj)r;}r;(hUh}r;(h]h]h]h]h]uhj;h]r;h)r;}r;(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.hj;hhhhh}r;(h]h]h]h]h]uhMh]r;(hX Value of r;r;}r;(hX Value of hj;ubh)r;}r;(hX:option:`--parallel`r;hj;hhhhh}r;(UreftypeXoptionh͉hX --parallelU refdomainXstdr;jNh]h]U refexplicith]h]h]hhuhMh]r;j)r;}r;(hj;h}r;(h]h]r;(hj;X std-optionr;eh]h]h]uhj;h]r;hX --parallelr;r;}r;(hUhj;ubahjubaubhX option used for r;r;}r;(hX option used for hj;ubh)r;}r;(hUh}r;(h]h]h]h]r;Xfiler;aUrolej;h]uhj;h]r;hXmysql-test-run.plr<r<}r<(hXmysql-test-run.plhj;ubahhubhX (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 r<r<}r<(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 hj;ubh)r<}r<(hX:option:`--parallel`r<hj;hhhhh}r <(UreftypeXoptionh͉hX --parallelU refdomainXstdr <jNh]h]U refexplicith]h]h]hhuhMh]r <j)r <}r <(hj<h}r<(h]h]r<(hj <X std-optionr<eh]h]h]uhj<h]r<hX --parallelr<r<}r<(hUhj <ubahjubaubhXd value greater than the default it needs to be specified, or some server error logs will be missing.r<r<}r<(hXd value greater than the default it needs to be specified, or some server error logs will be missing.hj;ubeubahjubeubj)r<}r<(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;hhhjh}r<(h]h]h]h]h]uhM#hhh]r<(j)r<}r<(hX ``dbpool``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$<hXdbpoolr%<r&<}r'<(hUhj!<ubahhubaubj)r(<}r)<(hUh}r*<(h]h]h]h]h]uhj<h]r+<h)r,<}r-<(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`.hj(<hhhhh}r.<(h]h]h]h]h]uhM!h]r/<(hXAn instance of r0<r1<}r2<(hXAn instance of hj,<ubh)r3<}r4<(hX1:class:`twisted.enterprise.adbapi.ConnectionPool`r5<hj,<hhhhh}r6<(UreftypeXclassh͉hX(twisted.enterprise.adbapi.ConnectionPoolU refdomainXpyr7<h]h]U refexplicith]h]h]hhhNhj|uhM!h]r8<h)r9<}r:<(hj5<h}r;<(h]h]r<<(hj7<Xpy-classr=<eh]h]h]uhj3<h]r><hX(twisted.enterprise.adbapi.ConnectionPoolr?<r@<}rA<(hUhj9<ubahhubaubhX, or rB<rC<}rD<(hX, or hj,<ubh)rE<}rF<(hX``None``h}rG<(h]h]h]h]h]uhj,<h]rH<hXNonerI<rJ<}rK<(hUhjE<ubahhubhX. Defaults to rL<rM<}rN<(hX. Defaults to hj,<ubh)rO<}rP<(hX``None``h}rQ<(h]h]h]h]h]uhj,<h]rR<hXNonerS<rT<}rU<(hUhjO<ubahhubhXA. If specified, results are inserted into the database using the rV<rW<}rX<(hXA. If specified, results are inserted into the database using the hj,<ubh)rY<}rZ<(hX:class:`ConnectionPool`r[<hj,<hhhhh}r\<(UreftypeXclassh͉hXConnectionPoolU refdomainXpyr]<h]h]U refexplicith]h]h]hhhNhj|uhM!h]r^<h)r_<}r`<(hj[<h}ra<(h]h]rb<(hj]<Xpy-classrc<eh]h]h]uhjY<h]rd<hXConnectionPoolre<rf<}rg<(hUhj_<ubahhubaubhX.rh<}ri<(hX.hj,<ubeubahjubeubj)rj<}rk<(hX8``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 :file:`mtrlogobserver.py` source file. hj;hhhjh}rl<(h]h]h]h]h]uhM)hhh]rm<(j)rn<}ro<(hX``autoCreateTables``rp<hjj<hhhjh}rq<(h]h]h]h]h]uhM)h]rr<h)rs<}rt<(hjp<h}ru<(h]h]h]h]h]uhjn<h]rv<hXautoCreateTablesrw<rx<}ry<(hUhjs<ubahhubaubj)rz<}r{<(hUh}r|<(h]h]h]h]h]uhjj<h]r}<h)r~<}r<(hX"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 :file:`mtrlogobserver.py` source file.hjz<hhhhh}r<(h]h]h]h]h]uhM&h]r<(hXBoolean, defaults to r<r<}r<(hXBoolean, defaults to hj~<ubh)r<}r<(hX ``False``h}r<(h]h]h]h]h]uhj~<h]r<hXFalser<r<}r<(hUhj<ubahhubhX. If r<r<}r<(hX. If hj~<ubh)r<}r<(hX``True``h}r<(h]h]h]h]h]uhj~<h]r<hXTruer<r<}r<(hUhj<ubahhubhX (and r<r<}r<(hX (and hj~<ubh)r<}r<(hX ``dbpool``h}r<(h]h]h]h]h]uhj~<h]r<hXdbpoolr<r<}r<(hUhj<ubahhubhX 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 r<r<}r<(hX 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 hj~<ubh)r<}r<(hUh}r<(h]h]h]h]r<Xfiler<aUrolej<h]uhj~<h]r<hXmtrlogobserver.pyr<r<}r<(hXmtrlogobserver.pyhj<ubahhubhX source file.r<r<}r<(hX source file.hj~<ubeubahjubeubj)r<}r<(hX``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. hj;hhhjh}r<(h]h]h]h]h]uhM.hhh]r<(j)r<}r<(hX ``test_type``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 test_typer<r<}r<(hUhj<ubahhubaubj)r<}r<(hUh}r<(h]h]h]h]h]uhj<h]r<h)r<}r<(hXShort 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.r<hj<hhhhh}r<(h]h]h]h]h]uhM,h]r<hXShort 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.r<r<}r<(hj<hj<ubaubahjubeubj)r<}r<(hX``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. hj;hhhjh}r<(h]h]h]h]h]uhM3hhh]r<(j)r<}r<(hX ``test_info``r<hj<hhhjh}r<(h]h]h]h]h]uhM3h]r<h)r<}r<(hj<h}r<(h]h]h]h]h]uhj<h]r<hX test_infor<r<}r<(hUhj<ubahhubaubj)r<}r<(hUh}r<(h]h]h]h]h]uhj<h]r<h)r<}r<(hXDescriptive 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.r<hj<hhhhh}r<(h]h]h]h]h]uhM1h]r<hXDescriptive 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.r<r<}r<(hj<hj<ubaubahjubeubj)r<}r<(hX``mtr_subdir`` The subdirectory in which to look for server error log files. Defaults to :file:`mysql-test`, which is usually correct. :ref:`Interpolate` is supported. hj;hhhjh}r<(h]h]h]h]h]uhM7hhh]r<(j)r<}r<(hX``mtr_subdir``r<hj<hhhjh}r<(h]h]h]h]h]uhM7h]r<h)r<}r<(hj<h}r<(h]h]h]h]h]uhj<h]r<hX mtr_subdirr<r<}r<(hUhj<ubahhubaubj)r<}r<(hUh}r<(h]h]h]h]h]uhj<h]r<h)r<}r<(hXThe subdirectory in which to look for server error log files. Defaults to :file:`mysql-test`, which is usually correct. :ref:`Interpolate` is supported.hj<hhhhh}r<(h]h]h]h]h]uhM6h]r<(hXJThe subdirectory in which to look for server error log files. Defaults to r<r=}r=(hXJThe subdirectory in which to look for server error log files. Defaults to hj<ubh)r=}r=(hUh}r=(h]h]h]h]r=Xfiler=aUrolej=h]uhj<h]r=hX mysql-testr=r =}r =(hX mysql-testhj=ubahhubhX, which is usually correct. r =r =}r =(hX, which is usually correct. hj<ubh)r=}r=(hX:ref:`Interpolate`r=hj<hhhhh}r=(UreftypeXrefh͈hX interpolateU refdomainXstdr=h]h]U refexplicith]h]h]hhuhM6h]r=jq)r=}r=(hj=h}r=(h]h]r=(hj=Xstd-refr=eh]h]h]uhj=h]r=hX Interpolater=r=}r=(hUhj=ubahj{ubaubhX is supported.r=r=}r=(hX is supported.hj<ubeubahjubeubeubj )r =}r!=(hUhj:hhhj#h}r"=(h]h]h]h]h]Uentries]r#=((UsingleX Build Steps; SubunitShellCommandXstep-SubunitShellCommandr$=j$=tr%=(UsingleXSubunitShellCommand 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-SubunitShellCommand:hj:hhh}hhh}r,=(h]h]h]h]h]hUstep-subunitshellcommandr-=uhM;hhh}r.=j$=j'=sh]ubeubh)r/=}r0=(hUhj,hhh}r1=h0j*=shhh}r2=(h]h]h]h]r3=(Usubunitshellcommandr4=j-=j$=eh]r5=(hh0euhM>hhh}r6=(j-=j*=j$=j'=uh]r7=(h)r8=}r9=(hXSubunitShellCommandr:=hj/=hhhhh}r;=(h]h]h]h]h]uhM>hhh]r<=hXSubunitShellCommandr==r>=}r?=(hj:=hj8=ubaubj )r@=}rA=(hUhj/=hNhj#h}rB=(h]h]h]h]h]Uentries]rC=(j'XKbuildbot.steps.subunit.SubunitShellCommand (class in buildbot.steps.source)hMUtrD=auhNhhh]ubjj)rE=}rF=(hUhj/=hNhjmh}rG=(jojpXpyh]h]h]h]h]jqXclassrH=jsjH=uhNhhh]rI=(ju)rJ=}rK=(hX*buildbot.steps.subunit.SubunitShellCommandhjE=hhhjxh}rL=(h]rM=hMaj{j|h]h]h]h]rN=hMaj~X*buildbot.steps.subunit.SubunitShellCommandjXbuildbot.steps.subunitjuhMAhhh]rO=(j)rP=}rQ=(hXclass hjJ=hhhjh}rR=(h]h]h]h]h]uhMAhhh]rS=hXclass rT=rU=}rV=(hUhjP=ubaubj)rW=}rX=(hXbuildbot.steps.subunit.hjJ=hhhjh}rY=(h]h]h]h]h]uhMAhhh]rZ=hXbuildbot.steps.subunit.r[=r\=}r]=(hUhjW=ubaubj)r^=}r_=(hXSubunitShellCommandhjJ=hhhjh}r`=(h]h]h]h]h]uhMAhhh]ra=hXSubunitShellCommandrb=rc=}rd=(hUhj^=ubaubeubj)re=}rf=(hUhjE=hhhjh}rg=(h]h]h]h]h]uhMAhhh]ubeubh)rh=}ri=(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. ::hj/=hhhhh}rj=(h]h]h]h]h]uhMBhhh]rk=(hXThis buildstep is similar to rl=rm=}rn=(hXThis buildstep is similar to hjh=ubh)ro=}rp=(hX:bb:step:`ShellCommand`rq=hjh=hhhhh}rr=(UreftypeXsteph͉hX ShellCommandU refdomainXbbrs=h]h]U refexplicith]h]h]hhuhMBh]rt=h)ru=}rv=(hjq=h}rw=(h]h]rx=(hjs=Xbb-stepry=eh]h]h]uhjo=h]rz=hX ShellCommandr{=r|=}r}=(hUhju=ubahhubaubhXb, except that it runs the log content through a subunit filter to extract test and failure counts.r~=r=}r=(hXb, except that it runs the log content through a subunit filter to extract test and failure counts.hjh=ubeubj>)r=}r=(hXjfrom buildbot.steps.subunit import SubunitShellCommand f.addStep(SubunitShellCommand(command="make test"))hj/=hhhjAh}r=(jCjDh]h]h]h]h]uhMEhhh]r=hXjfrom buildbot.steps.subunit import SubunitShellCommand f.addStep(SubunitShellCommand(command="make test"))r=r=}r=(hUhj=ubaubh)r=}r=(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.hj/=hhhhh}r=(h]h]h]h]h]uhMHhhh]r=(hX This runs r=r=}r=(hX This runs hj=ubh)r=}r=(hX ``make test``h}r=(h]h]h]h]h]uhj=h]r=hX make testr=r=}r=(hUhj=ubahhubhX and filters it through subunit. The 'tests' and 'test failed' progress metrics will now accumulate test data from the test run.r=r=}r=(hX and filters it through subunit. The 'tests' and 'test failed' progress metrics will now accumulate test data from the test run.hj=ubeubh)r=}r=(hXuIf ``failureOnNoTests`` is ``True``, this step will fail if no test is run. By default ``failureOnNoTests`` is False.hj/=hhhhh}r=(h]h]h]h]h]uhMKhhh]r=(hXIf r=r=}r=(hXIf hj=ubh)r=}r=(hX``failureOnNoTests``h}r=(h]h]h]h]h]uhj=h]r=hXfailureOnNoTestsr=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=ubahhubhX4, this step will fail if no test is run. By default r=r=}r=(hX4, this step will fail if no test is run. By default hj=ubh)r=}r=(hX``failureOnNoTests``h}r=(h]h]h]h]h]uhj=h]r=hXfailureOnNoTestsr=r=}r=(hUhj=ubahhubhX is False.r=r=}r=(hX is False.hj=ubeubh)r=}r=(hX.. _Slave-Filesystem-Steps:hj/=hhhhh}r=(h]h]h]h]h]hUslave-filesystem-stepsr=uhMNhhh]ubeubeubh)r=}r=(hUhhhhh}r=hj=shhh}r=(h]h]h]h]r=(j=Uid15r=eh]r=(h$heuhMQhhh}r=j=j=sh]r=(h)r=}r=(hXSlave Filesystem Stepsr=hj=hhhhh}r=(h]h]h]h]h]uhMQhhh]r=hXSlave Filesystem Stepsr=r=}r=(hj=hj=ubaubh)r=}r=(hXAHere are some buildsteps for manipulating the slave's filesystem.r=hj=hhhhh}r=(h]h]h]h]h]uhMShhh]r=hXAHere are some buildsteps for manipulating the slave's filesystem.r=r=}r=(hj=hj=ubaubj )r=}r=(hUhj=hhhj#h}r=(h]h]h]h]h]Uentries]r=((UsingleXBuild Steps; FileExistsXstep-FileExistsr=j=tr=(UsingleXFileExists Build Stepj=j=tr=euhMVhhh]ubh)r=}r=(hUhj=hhhhh}r=(h]h]h]h]h]hj=uhMVhhh]ubh)r=}r=(hUhj=hhh}hhh}r=(h]h]h]h]r=(U fileexistsr=j=eh]r=h9auhMXhhh}r=j=j=sh]r=(h)r=}r=(hX FileExistsr=hj=hhhhh}r=(h]h]h]h]h]uhMXhhh]r=hX FileExistsr=r=}r=(hj=hj=ubaubh)r=}r=(hXzThis step will assert that a given file exists, failing if it does not. The filename can be specified with a property. ::hj=hhhhh}r=(h]h]h]h]h]uhMZhhh]r=hXwThis step will assert that a given file exists, failing if it does not. The filename can be specified with a property.r=r=}r=(hXwThis step will assert that a given file exists, failing if it does not. The filename can be specified with a property.hj=ubaubj>)r=}r=(hXSfrom buildbot.steps.slave import FileExists f.addStep(FileExists(file='test_data'))hj=hhhjAh}r=(jCjDh]h]h]h]h]uhM]hhh]r=hXSfrom buildbot.steps.slave import FileExists f.addStep(FileExists(file='test_data'))r>r>}r>(hUhj=ubaubh)r>}r>(hX0This step requires slave version 0.8.4 or later.r>hj=hhhhh}r>(h]h]h]h]h]uhM`hhh]r>hX0This step requires slave version 0.8.4 or later.r>r >}r >(hj>hj>ubaubj )r >}r >(hUhj=hhhj#h}r >(h]h]h]h]h]Uentries]r>((UsingleXBuild Steps; CopyDirectoryXstep-CopyDirectoryr>j>tr>(UsingleXCopyDirectory Build Stepj>j>tr>euhMchhh]ubh)r>}r>(hUhj=hhhhh}r>(h]h]h]h]h]hj>uhMchhh]ubeubh)r>}r>(hUhj=hhh}hhh}r>(h]h]h]h]r>(U copydirectoryr>j>eh]r>hauhMehhh}r>j>j>sh]r>(h)r>}r>(hX CopyDirectoryr>hj>hhhhh}r >(h]h]h]h]h]uhMehhh]r!>hX CopyDirectoryr">r#>}r$>(hj>hj>ubaubh)r%>}r&>(hX0This command copies a directory on the slave. ::r'>hj>hhhhh}r(>(h]h]h]h]h]uhMghhh]r)>hX-This command copies a directory on the slave.r*>r+>}r,>(hX-This command copies a directory on the slave.hj%>ubaubj>)r->}r.>(hXjfrom buildbot.steps.slave import CopyDirectory f.addStep(CopyDirectory(src="build/data", dest="tmp/data"))hj>hhhjAh}r/>(jCjDh]h]h]h]h]uhMihhh]r0>hXjfrom buildbot.steps.slave import CopyDirectory f.addStep(CopyDirectory(src="build/data", dest="tmp/data"))r1>r2>}r3>(hUhj->ubaubh)r4>}r5>(hX0This step requires slave version 0.8.5 or later.r6>hj>hhhhh}r7>(h]h]h]h]h]uhMlhhh]r8>hX0This step requires slave version 0.8.5 or later.r9>r:>}r;>(hj6>hj4>ubaubh)r<>}r=>(hX5The CopyDirectory step takes the following arguments:r>>hj>hhhhh}r?>(h]h]h]h]h]uhMnhhh]r@>hX5The CopyDirectory step takes the following arguments:rA>rB>}rC>(hj>>hj<>ubaubj)rD>}rE>(hUhj>hhhjh}rF>(h]h]h]h]h]uhNhhh]rG>(j)rH>}rI>(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. hjD>hhhjh}rJ>(h]h]h]h]h]uhMsh]rK>(j)rL>}rM>(hX ``timeout``rN>hjH>hhhjh}rO>(h]h]h]h]h]uhMsh]rP>h)rQ>}rR>(hjN>h}rS>(h]h]h]h]h]uhjL>h]rT>hXtimeoutrU>rV>}rW>(hUhjQ>ubahhubaubj)rX>}rY>(hUh}rZ>(h]h]h]h]h]uhjH>h]r[>h)r\>}r]>(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.hjX>hhhhh}r^>(h]h]h]h]h]uhMqh]r_>(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 r`>ra>}rb>(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 hj\>ubh)rc>}rd>(hX``None``h}re>(h]h]h]h]h]uhj\>h]rf>hXNonerg>rh>}ri>(hUhjc>ubahhubhX to disable.rj>rk>}rl>(hX to disable.hj\>ubeubahjubeubj)rm>}rn>(hXp``maxTime`` if the command takes longer than this many seconds, it will be killed. This is disabled by default. hjD>hhhjh}ro>(h]h]h]h]h]uhMwhhh]rp>(j)rq>}rr>(hX ``maxTime``rs>hjm>hhhjh}rt>(h]h]h]h]h]uhMwh]ru>h)rv>}rw>(hjs>h}rx>(h]h]h]h]h]uhjq>h]ry>hXmaxTimerz>r{>}r|>(hUhjv>ubahhubaubj)r}>}r~>(hUh}r>(h]h]h]h]h]uhjm>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]uhMvh]r>hXcif the command takes longer than this many seconds, it will be killed. This is disabled by default.r>r>}r>(hj>hj>ubaubahjubeubeubj )r>}r>(hUhj>hhhj#h}r>(h]h]h]h]h]Uentries]r>((UsingleXBuild Steps; RemoveDirectoryXstep-RemoveDirectoryr>j>tr>(UsingleXRemoveDirectory Build Stepj>j>tr>euhMzhhh]ubh)r>}r>(hUhj>hhhhh}r>(h]h]h]h]h]hj>uhMzhhh]ubeubh)r>}r>(hUhj=hhh}hhh}r>(h]h]h]h]r>(Uremovedirectoryr>j>eh]r>h auhM|hhh}r>j>j>sh]r>(h)r>}r>(hXRemoveDirectoryr>hj>hhhhh}r>(h]h]h]h]h]uhM|hhh]r>hXRemoveDirectoryr>r>}r>(hj>hj>ubaubh)r>}r>(hX=This command recursively deletes a directory on the slave. ::r>hj>hhhhh}r>(h]h]h]h]h]uhM~hhh]r>hX:This command recursively deletes a directory on the slave.r>r>}r>(hX:This command recursively deletes a directory on the slave.hj>ubaubj>)r>}r>(hX^from buildbot.steps.slave import RemoveDirectory f.addStep(RemoveDirectory(dir="build/build"))hj>hhhjAh}r>(jCjDh]h]h]h]h]uhMhhh]r>hX^from buildbot.steps.slave import RemoveDirectory f.addStep(RemoveDirectory(dir="build/build"))r>r>}r>(hUhj>ubaubh)r>}r>(hX0This step requires slave version 0.8.4 or later.r>hj>hhhhh}r>(h]h]h]h]h]uhMhhh]r>hX0This step requires slave version 0.8.4 or later.r>r>}r>(hj>hj>ubaubj )r>}r>(hUhj>hhhj#h}r>(h]h]h]h]h]Uentries]r>((UsingleXBuild Steps; MakeDirectoryXstep-MakeDirectoryr>j>tr>(UsingleXMakeDirectory Build Stepj>j>tr>euhMhhh]ubh)r>}r>(hUhj>hhhhh}r>(h]h]h]h]h]hj>uhMhhh]ubeubh)r>}r>(hUhj=hhh}hhh}r>(h]h]h]h]r>(U makedirectoryr>j>eh]r>hcauhMhhh}r>j>j>sh]r>(h)r>}r>(hX MakeDirectoryr>hj>hhhhh}r>(h]h]h]h]h]uhMhhh]r>hX MakeDirectoryr>r>}r>(hj>hj>ubaubh)r>}r>(hX1This command creates a directory on the slave. ::r>hj>hhhhh}r>(h]h]h]h]h]uhMhhh]r>hX.This command creates a directory on the slave.r>r>}r>(hX.This command creates a directory on the slave.hj>ubaubj>)r>}r>(hXZfrom buildbot.steps.slave import MakeDirectory f.addStep(MakeDirectory(dir="build/build"))hj>hhhjAh}r>(jCjDh]h]h]h]h]uhMhhh]r>hXZfrom buildbot.steps.slave import MakeDirectory f.addStep(MakeDirectory(dir="build/build"))r>r>}r>(hUhj>ubaubh)r>}r>(hX0This step requires slave version 0.8.5 or later.r>hj>hhhhh}r>(h]h]h]h]h]uhMhhh]r>hX0This step requires slave version 0.8.5 or later.r>r>}r>(hj>hj>ubaubh)r>}r>(hX.. _Python-BuildSteps:hj>hhhhh}r>(h]h]h]h]h]hUpython-buildstepsr>uhMhhh]ubeubeubh)r>}r>(hUhhhhh}r>hDj>shhh}r>(h]h]h]h]r>(j>Uid16r>eh]r>(hhDeuhMhhh}r>j>j>sh]r>(h)r>}r>(hXPython BuildStepsr>hj>hhhhh}r>(h]h]h]h]h]uhMhhh]r>hXPython BuildStepsr>r>}r>(hj>hj>ubaubh)r?}r?(hXcHere are some :class:`BuildStep`\s that are specifically useful for projects implemented in Python.hj>hhhhh}r?(h]h]h]h]h]uhMhhh]r?(hXHere are some r?r?}r?(hXHere are some hj?ubh)r?}r?(hX:class:`BuildStep`r ?hj?hhhhh}r ?(UreftypeXclassh͉hX 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 ?ubahhubaubhXBs that are specifically useful for projects implemented in Python.r?r?}r?(hXC\s that are specifically useful for projects implemented in Python.hj?ubeubj )r?}r?(hUhj>hhhj#h}r?(h]h]h]h]h]Uentries]r?((UsingleXBuild Steps; BuildEPYDocXstep-BuildEPYDocr?j?tr?(UsingleXBuildEPYDoc Build Stepj?j?tr?euhMhhh]ubh)r ?}r!?(hUhj>hhhhh}r"?(h]h]h]h]h]hj?uhMhhh]ubh)r#?}r$?(hX.. _Step-BuildEPYDoc:hj>hhh}hhh}r%?(h]h]h]h]h]hUstep-buildepydocr&?uhMhhh}r'?j?j ?sh]ubh)r(?}r)?(hUhj>hhh}r*?hOj#?shhh}r+?(h]h]h]h]r,?(U buildepydocr-?j&?j?eh]r.?(hFhOeuhMhhh}r/?(j?j ?j&?j#?uh]r0?(h)r1?}r2?(hX BuildEPYDocr3?hj(?hhhhh}r4?(h]h]h]h]h]uhMhhh]r5?hX BuildEPYDocr6?r7?}r8?(hj3?hj1?ubaubj )r9?}r:?(hUhj(?hNhj#h}r;?(h]h]h]h]h]Uentries]r?}r??(hUhj(?hNhjmh}r@?(jojpXpyh]h]h]h]h]jqXclassrA?jsjA?uhNhhh]rB?(ju)rC?}rD?(hX!buildbot.steps.python.BuildEPYDochj>?hhhjxh}rE?(h]rF?huaj{j|h]h]h]h]rG?huaj~X!buildbot.steps.python.BuildEPYDocjXbuildbot.steps.pythonjuhMhhh]rH?(j)rI?}rJ?(hXclass hjC?hhhjh}rK?(h]h]h]h]h]uhMhhh]rL?hXclass rM?rN?}rO?(hUhjI?ubaubj)rP?}rQ?(hXbuildbot.steps.python.hjC?hhhjh}rR?(h]h]h]h]h]uhMhhh]rS?hXbuildbot.steps.python.rT?rU?}rV?(hUhjP?ubaubj)rW?}rX?(hX BuildEPYDochjC?hhhjh}rY?(h]h]h]h]h]uhMhhh]rZ?hX BuildEPYDocr[?r\?}r]?(hUhjW?ubaubeubj)r^?}r_?(hUhj>?hhhjh}r`?(h]h]h]h]h]uhMhhh]ubeubh)ra?}rb?(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).hj(?hhhhh}rc?(h]h]h]h]h]uhMhhh]rd?(j)re?}rf?(hX*`epydoc `_h}rg?(UnamehjXhttp://epydoc.sourceforge.net/rh?h]h]h]h]h]uhja?h]ri?hXepydocrj?rk?}rl?(hUhje?ubahjubh)rm?}rn?(hX! hKhja?hhh}ro?(Urefurijh?h]rp?Uepydocrq?ah]h]h]h]rr?hauh]ubhXg is a tool for generating API documentation for Python modules from their docstrings. It reads all the rs?rt?}ru?(hXg is a tool for generating API documentation for Python modules from their docstrings. It reads all the hja?ubh)rv?}rw?(hUh}rx?(h]h]h]h]ry?Xfilerz?aUrolejz?h]uhja?h]r{?hX.pyr|?r}?}r~?(hX.pyhjv?ubahhubhX\ files from your source tree, processes the docstrings therein, and creates a large tree of r?r?}r?(hX\ files from your source tree, processes the docstrings therein, and creates a large tree of hja?ubh)r?}r?(hUh}r?(h]h]h]h]r?Xfiler?aUrolej?h]uhja?h]r?hX.htmlr?r?}r?(hX.htmlhj?ubahhubhX files (or a single r?r?}r?(hX files (or a single hja?ubh)r?}r?(hUh}r?(h]h]h]h]r?Xfiler?aUrolej?h]uhja?h]r?hX.pdfr?r?}r?(hX.pdfhj?ubahhubhX file).r?r?}r?(hX file).hja?ubeubh)r?}r?(hXThe :bb:step:`BuildEPYDoc` step will run :command:`epydoc` to produce this API documentation, and will count the errors and warnings from its output.hj(?hhhhh}r?(h]h]h]h]h]uhMhhh]r?(hXThe r?r?}r?(hXThe hj?ubh)r?}r?(hX:bb:step:`BuildEPYDoc`r?hj?hhhhh}r?(UreftypeXsteph͉hX BuildEPYDocU 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?hX BuildEPYDocr?r?}r?(hUhj?ubahhubaubhX step will run r?r?}r?(hX step will run hj?ubj)r?}r?(hX:command:`epydoc`h}r?(h]h]r?jah]h]h]uhj?h]r?hXepydocr?r?}r?(hUhj?ubahj ubhX[ to produce this API documentation, and will count the errors and warnings from its output.r?r?}r?(hX[ to produce this API documentation, and will count the errors and warnings from its output.hj?ubeubh)r?}r?(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.hj(?hhhhh}r?(h]h]h]h]h]uhMhhh]r?(hX<You must supply the command line to be used. The default is r?r?}r?(hX<You must supply the command line to be used. The default is hj?ubh)r?}r?(hX``make epydocs``h}r?(h]h]h]h]h]uhj?h]r?hX make epydocsr?r?}r?(hUhj?ubahhubhX(, which assumes that your project has a r?r?}r?(hX(, which assumes that your project has a hj?ubh)r?}r?(hUh}r?(h]h]h]h]r?Xfiler?aUrolej?h]uhj?h]r?hXMakefiler?r?}r?(hXMakefilehj?ubahhubhX with an r?r?}r?(hX with an hj?ubj_)r?}r?(hX `epydocs`h}r?(h]h]h]h]h]uhj?h]r?hXepydocsr?r?}r?(hUhj?ubahjgubhX. target. You might wish to use something like r?r?}r?(hX. target. You might wish to use something like hj?ubh)r?}r?(hUh}r?(h]h]h]h]r?Xsampr?aUrolej?h]uhj?h]r?(hXepydoc -o apiref source/r?r?}r?(hXepydoc -o apiref source/hj?ubjq)r?}r?(hXPKGNAMEh}r?(h]h]h]h]h]uhj?h]r?hXPKGNAMEr?r?}r?(hUhj?ubahj{ubehhubhX% instead. You might also want to add r?r?}r?(hX% instead. You might also want to add hj?ubh)r?}r?(hX:option:`--pdf`r?hj?hhhhh}r?(UreftypeXoptionh͉hX--pdfU refdomainXstdr?jNh]h]U refexplicith]h]h]hhuhMh]r?j)r?}r?(hj?h}r@(h]h]r@(hj?X std-optionr@eh]h]h]uhj?h]r@hX--pdfr@r@}r@(hUhj?ubahjubaubhX> to generate a PDF file instead of a large tree of HTML files.r@r@}r @(hX> to generate a PDF file instead of a large tree of HTML files.hj?ubeubh)r @}r @(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. ::hj(?hhhhh}r @(h]h]h]h]h]uhMhhh]r @(hXpThe API docs are generated in-place in the build tree (under the workdir, in the subdirectory controlled by the r@r@}r@(hXpThe API docs are generated in-place in the build tree (under the workdir, in the subdirectory controlled by the hj @ubh)r@}r@(hX :option:`-o`r@hj @hhhhh}r@(UreftypeXoptionh͉hX-oU refdomainXstdr@jNh]h]U refexplicith]h]h]hhuhMh]r@j)r@}r@(hj@h}r@(h]h]r@(hj@X std-optionr@eh]h]h]uhj@h]r@hX-or@r@}r@(hUhj@ubahjubaubhXs argument). To make them useful, you will probably have to copy them to somewhere they can be read. A command like r @r!@}r"@(hXs argument). To make them useful, you will probably have to copy them to somewhere they can be read. A command like hj @ubh)r#@}r$@(hXB``rsync -ad apiref/ dev.example.com:~public_html/current-apiref/``h}r%@(h]h]h]h]h]uhj @h]r&@hX>rsync -ad apiref/ dev.example.com:~public_html/current-apiref/r'@r(@}r)@(hUhj#@ubahhubhX 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.r*@r+@}r,@(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.hj @ubeubj>)r-@}r.@(hXxfrom buildbot.steps.python import BuildEPYDoc f.addStep(BuildEPYDoc(command=["epydoc", "-o", "apiref", "source/mypkg"]))hj(?hhhjAh}r/@(jCjDh]h]h]h]h]uhMhhh]r0@hXxfrom buildbot.steps.python import BuildEPYDoc f.addStep(BuildEPYDoc(command=["epydoc", "-o", "apiref", "source/mypkg"]))r1@r2@}r3@(hUhj-@ubaubj )r4@}r5@(hUhj(?hhhj#h}r6@(h]h]h]h]h]Uentries]r7@((UsingleXBuild Steps; PyFlakesX step-PyFlakesr8@j8@tr9@(UsingleXPyFlakes Build Stepj8@j8@tr:@euhMhhh]ubh)r;@}r<@(hUhj(?hhhhh}r=@(h]h]h]h]h]hj8@uhMhhh]ubh)r>@}r?@(hX.. _Step-PyFlake:hj(?hhh}hhh}r@@(h]h]h]h]h]hU step-pyflakerA@uhMhhh}rB@j8@j;@sh]ubeubh)rC@}rD@(hUhKhj>hhh}rE@hnj>@shhh}rF@(h]rG@XpyflakesrH@ah]h]h]rI@(UpyflakesrJ@jA@j8@eh]rK@hnauhMhhh}rL@(jA@j>@j8@j;@uh]rM@(h)rN@}rO@(hXPyFlakesrP@hjC@hhhhh}rQ@(h]h]h]h]h]uhMhhh]rR@hXPyFlakesrS@rT@}rU@(hjP@hjN@ubaubj )rV@}rW@(hUhjC@hNhj#h}rX@(h]h]h]h]h]Uentries]rY@(j'X?buildbot.steps.python.PyFlakes (class in buildbot.steps.source)hlUtrZ@auhNhhh]ubjj)r[@}r\@(hUhjC@hNhjmh}r]@(jojpXpyh]h]h]h]h]jqXclassr^@jsj^@uhNhhh]r_@(ju)r`@}ra@(hXbuildbot.steps.python.PyFlakeshj[@hhhjxh}rb@(h]rc@hlaj{j|h]h]h]h]rd@hlaj~Xbuildbot.steps.python.PyFlakesjXbuildbot.steps.pythonjuhMhhh]re@(j)rf@}rg@(hXclass hj`@hhhjh}rh@(h]h]h]h]h]uhMhhh]ri@hXclass rj@rk@}rl@(hUhjf@ubaubj)rm@}rn@(hXbuildbot.steps.python.hj`@hhhjh}ro@(h]h]h]h]h]uhMhhh]rp@hXbuildbot.steps.python.rq@rr@}rs@(hUhjm@ubaubj)rt@}ru@(hXPyFlakeshj`@hhhjh}rv@(h]h]h]h]h]uhMhhh]rw@hXPyFlakesrx@ry@}rz@(hUhjt@ubaubeubj)r{@}r|@(hUhj[@hhhjh}r}@(h]h]h]h]h]uhMhhh]ubeubh)r~@}r@(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.hjC@hhhhh}r@(h]h]h]h]h]uhMhhh]r@(j)r@}r@(hX8`PyFlakes `_h}r@(UnameXPyFlakesjX*http://divmod.org/trac/wiki/DivmodPyflakesr@h]h]h]h]h]uhj~@h]r@hXPyFlakesr@r@}r@(hUhj@ubahjubh)r@}r@(hX- hKhj~@hhh}r@(Urefurij@h]r@Uid17r@ah]h]h]h]r@jH@auh]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 r@r@}r@(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 hj~@ubj)r@}r@(hX:command:`lint`h}r@(h]h]r@jah]h]h]uhj~@h]r@hXlintr@r@}r@(hUhj@ubahj ubhX program. Other tools (like r@r@}r@(hX program. Other tools (like hj~@ubj)r@}r@(hX0`pychecker `_h}r@(UnamehfjX!http://pychecker.sourceforge.net/r@h]h]h]h]h]uhj~@h]r@hX pycheckerr@r@}r@(hUhj@ubahjubh)r@}r@(hX$ hKhj~@hhh}r@(Urefurij@h]r@U pycheckerr@ah]h]h]h]r@hfauh]ubhX7) provide more detailed results but take longer to run.r@r@}r@(hX8\) provide more detailed results but take longer to run.hj~@ubeubh)r@}r@(hXmThe :bb:step:`PyFlakes` step will run pyflakes and count the various kinds of errors and warnings it detects.hjC@hhhhh}r@(h]h]h]h]h]uhMhhh]r@(hXThe r@r@}r@(hXThe hj@ubh)r@}r@(hX:bb:step:`PyFlakes`r@hj@hhhhh}r@(UreftypeXsteph͉hXPyFlakesU 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@hXPyFlakesr@r@}r@(hUhj@ubahhubaubhXV step will run pyflakes and count the various kinds of errors and warnings it detects.r@r@}r@(hXV step will run pyflakes and count the various kinds of errors and warnings it detects.hj@ubeubh)r@}r@(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``. ::hjC@hhhhh}r@(h]h]h]h]h]uhMhhh]r@(hX<You must supply the command line to be used. The default is r@r@}r@(hX<You must supply the command line to be used. The default is hj@ubh)r@}r@(hX``make pyflakes``h}r@(h]h]h]h]h]uhj@h]r@hX make pyflakesr@r@}r@(hUhj@ubahhubhX%, which assumes you have a top-level r@r@}r@(hX%, which assumes you have a top-level hj@ubh)r@}r@(hUh}r@(h]h]h]h]r@Xfiler@aUrolej@h]uhj@h]r@hXMakefiler@r@}r@(hXMakefilehj@ubahhubhX with a r@r@}r@(hX with a hj@ubh)r@}r@(hX ``pyflakes``h}r@(h]h]h]h]h]uhj@h]r@hXpyflakesr@r@}r@(hUhj@ubahhubhX. target. You might want to use something like r@r@}r@(hX. target. You might want to use something like hj@ubh)r@}r@(hX``pyflakes .``h}r@(h]h]h]h]h]uhj@h]r@hX pyflakes .r@r@}r@(hUhj@ubahhubhX or r@r@}r@(hX or hj@ubh)r@}r@(hX``pyflakes src``h}r@(h]h]h]h]h]uhj@h]r@hX pyflakes srcr@r@}r@(hUhj@ubahhubhX.rA}rA(hX.hj@ubeubj>)rA}rA(hX[from buildbot.steps.python import PyFlakes f.addStep(PyFlakes(command=["pyflakes", "src"]))hjC@hhhjAh}rA(jCjDh]h]h]h]h]uhMhhh]rAhX[from buildbot.steps.python import PyFlakes f.addStep(PyFlakes(command=["pyflakes", "src"]))rArA}rA(hUhjAubaubj )r A}r A(hUhjC@hhhj#h}r A(h]h]h]h]h]Uentries]r A((UsingleXBuild Steps; SphinxX step-Sphinxr Aj AtrA(UsingleXSphinx Build Stepj Aj AtrAeuhMhhh]ubh)rA}rA(hUhjC@hhhhh}rA(h]h]h]h]h]hj AuhMhhh]ubh)rA}rA(hX.. _Step-Sphinx:hjC@hhh}hhh}rA(h]h]h]h]h]hU step-sphinxrAuhMhhh}rAj AjAsh]ubeubh)rA}rA(hUhKhj>hhh}rAh jAshhh}rA(h]rAXsphinxrAah]h]h]rA(UsphinxrAjAj Aeh]r Ah auhMhhh}r!A(j AjAjAjAuh]r"A(h)r#A}r$A(hXSphinxr%AhjAhhhhh}r&A(h]h]h]h]h]uhMhhh]r'AhXSphinxr(Ar)A}r*A(hj%Ahj#Aubaubj )r+A}r,A(hUhjAhNhj#h}r-A(h]h]h]h]h]Uentries]r.A(j'X=buildbot.steps.python.Sphinx (class in buildbot.steps.source)hUtr/AauhNhhh]ubjj)r0A}r1A(hUhjAhNhjmh}r2A(jojpXpyh]h]h]h]h]jqXclassr3Ajsj3AuhNhhh]r4A(ju)r5A}r6A(hXbuildbot.steps.python.Sphinxhj0Ahhhjxh}r7A(h]r8Ahaj{j|h]h]h]h]r9Ahaj~Xbuildbot.steps.python.SphinxjXbuildbot.steps.pythonjuhMhhh]r:A(j)r;A}rAhXclass r?Ar@A}rAA(hUhj;Aubaubj)rBA}rCA(hXbuildbot.steps.python.hj5Ahhhjh}rDA(h]h]h]h]h]uhMhhh]rEAhXbuildbot.steps.python.rFArGA}rHA(hUhjBAubaubj)rIA}rJA(hXSphinxhj5Ahhhjh}rKA(h]h]h]h]h]uhMhhh]rLAhXSphinxrMArNA}rOA(hUhjIAubaubeubj)rPA}rQA(hUhj0Ahhhjh}rRA(h]h]h]h]h]uhMhhh]ubeubh)rSA}rTA(hX`Sphinx `_ is the Python Documentation Generator. It uses `RestructuredText `_ as input format.hjAhhhhh}rUA(h]h]h]h]h]uhMhhh]rVA(j)rWA}rXA(hX$`Sphinx `_h}rYA(UnameXSphinxjXhttp://sphinx.pocoo.org/rZAh]h]h]h]h]uhjSAh]r[AhXSphinxr\Ar]A}r^A(hUhjWAubahjubh)r_A}r`A(hX hKhjSAhhh}raA(UrefurijZAh]rbAUid18rcAah]h]h]h]rdAjAauh]ubhX1 is the Python Documentation Generator. It uses reArfA}rgA(hX1 is the Python Documentation Generator. It uses hjSAubj)rhA}riA(hX>`RestructuredText `_h}rjA(UnameXRestructuredTextjX(http://docutils.sourceforge.net/rst.htmlrkAh]h]h]h]h]uhjSAh]rlAhXRestructuredTextrmArnA}roA(hUhjhAubahjubh)rpA}rqA(hX+ hKhjSAhhh}rrA(UrefurijkAh]rsAUrestructuredtextrtAah]h]h]h]ruAhauh]ubhX as input format.rvArwA}rxA(hX as input format.hjSAubeubh)ryA}rzA(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. ::hjAhhhhh}r{A(h]h]h]h]h]uhMhhh]r|A(hXThe r}Ar~A}rA(hXThe hjyAubh)rA}rA(hX:bb:step:`Sphinx`rAhjyAhhhhh}rA(UreftypeXsteph͉hXSphinxU refdomainXbbrAh]h]U refexplicith]h]h]hhuhMh]rAh)rA}rA(hjAh}rA(h]h]rA(hjAXbb-steprAeh]h]h]uhjAh]rAhXSphinxrArA}rA(hUhjAubahhubaubhX step will run rArA}rA(hX step will run hjyAubj)rA}rA(hX:program:`sphinx-build`h}rA(h]h]rAUprogramrAah]h]h]uhjyAh]rAhX sphinx-buildrArA}rA(hUhjAubahj ubhX' or any other program specified in its rArA}rA(hX' or any other program specified in its hjyAubh)rA}rA(hX ``sphinx``h}rA(h]h]h]h]h]uhjyAh]rAhXsphinxrArA}rA(hUhjAubahhubhX> argument and count the various warnings and error it detects.rArA}rA(hX> argument and count the various warnings and error it detects.hjyAubeubj>)rA}rA(hXTfrom buildbot.steps.python import Sphinx f.addStep(Sphinx(sphinx_builddir="_build"))hjAhhhjAh}rA(jCjDh]h]h]h]h]uhMhhh]rAhXTfrom buildbot.steps.python import Sphinx f.addStep(Sphinx(sphinx_builddir="_build"))rArA}rA(hUhjAubaubh)rA}rA(hX(This step takes the following arguments:rAhjAhhhhh}rA(h]h]h]h]h]uhMhhh]rAhX(This step takes the following arguments:rArA}rA(hjAhjAubaubj)rA}rA(hUhjAhhhjh}rA(h]h]h]h]h]uhNhhh]rA(j)rA}rA(hX```sphinx_builddir`` (required) Name of the directory where the documentation will be generated. hjAhhhjh}rA(h]h]h]h]h]uhMh]rA(j)rA}rA(hX``sphinx_builddir``rAhjAhhhjh}rA(h]h]h]h]h]uhMh]rAh)rA}rA(hjAh}rA(h]h]h]h]h]uhjAh]rAhXsphinx_builddirrArA}rA(hUhjAubahhubaubj)rA}rA(hUh}rA(h]h]h]h]h]uhjAh]rAh)rA}rA(hXK(required) Name of the directory where the documentation will be generated.rAhjAhhhhh}rA(h]h]h]h]h]uhMh]rAhXK(required) Name of the directory where the documentation will be generated.rArA}rA(hjAhjAubaubahjubeubj)rA}rA(hXv``sphinx_sourcedir`` (optional, defaulting to ``.``), Name the directory where the :file:`conf.py` file will be found hjAhhhjh}rA(h]h]h]h]h]uhMhhh]rA(j)rA}rA(hX``sphinx_sourcedir``rAhjAhhhjh}rA(h]h]h]h]h]uhMh]rAh)rA}rA(hjAh}rA(h]h]h]h]h]uhjAh]rAhXsphinx_sourcedirrArA}rA(hUhjAubahhubaubj)rA}rA(hUh}rA(h]h]h]h]h]uhjAh]rAh)rA}rA(hX`(optional, defaulting to ``.``), Name the directory where the :file:`conf.py` file will be foundhjAhhhhh}rA(h]h]h]h]h]uhMh]rA(hX(optional, defaulting to rArA}rA(hX(optional, defaulting to hjAubh)rA}rA(hX``.``h}rA(h]h]h]h]h]uhjAh]rAhX.rA}rA(hUhjAubahhubhX ), Name the directory where the rArA}rA(hX ), Name the directory where the hjAubh)rA}rA(hUh}rA(h]h]h]h]rAXfilerAaUrolejAh]uhjAh]rBhXconf.pyrBrB}rB(hXconf.pyhjAubahhubhX file will be foundrBrB}rB(hX file will be foundhjAubeubahjubeubj)rB}rB(hX<``sphinx_builder`` (optional) Indicates the builder to use. hjAhhhjh}r B(h]h]h]h]h]uhMhhh]r B(j)r B}r B(hX``sphinx_builder``r BhjBhhhjh}rB(h]h]h]h]h]uhMh]rBh)rB}rB(hj Bh}rB(h]h]h]h]h]uhj Bh]rBhXsphinx_builderrBrB}rB(hUhjBubahhubaubj)rB}rB(hUh}rB(h]h]h]h]h]uhjBh]rBh)rB}rB(hX((optional) Indicates the builder to use.rBhjBhhhhh}rB(h]h]h]h]h]uhMh]rBhX((optional) Indicates the builder to use.r Br!B}r"B(hjBhjBubaubahjubeubj)r#B}r$B(hX^``sphinx`` (optional, defaulting to :program:`sphinx-build`) Indicates the executable to run. hjAhhhjh}r%B(h]h]h]h]h]uhMhhh]r&B(j)r'B}r(B(hX ``sphinx``r)Bhj#Bhhhjh}r*B(h]h]h]h]h]uhMh]r+Bh)r,B}r-B(hj)Bh}r.B(h]h]h]h]h]uhj'Bh]r/BhXsphinxr0Br1B}r2B(hUhj,Bubahhubaubj)r3B}r4B(hUh}r5B(h]h]h]h]h]uhj#Bh]r6Bh)r7B}r8B(hXR(optional, defaulting to :program:`sphinx-build`) Indicates the executable to run.hj3Bhhhhh}r9B(h]h]h]h]h]uhMh]r:B(hX(optional, defaulting to r;BrB}r?B(hX:program:`sphinx-build`h}r@B(h]h]rABjAah]h]h]uhj7Bh]rBBhX sphinx-buildrCBrDB}rEB(hUhj>Bubahj ubhX") Indicates the executable to run.rFBrGB}rHB(hX") Indicates the executable to run.hj7Bubeubahjubeubj)rIB}rJB(hXH``tags`` (optional) List of ``tags`` to pass to :program:`sphinx-build` hjAhhhjh}rKB(h]h]h]h]h]uhMhhh]rLB(j)rMB}rNB(hX``tags``rOBhjIBhhhjh}rPB(h]h]h]h]h]uhMh]rQBh)rRB}rSB(hjOBh}rTB(h]h]h]h]h]uhjMBh]rUBhXtagsrVBrWB}rXB(hUhjRBubahhubaubj)rYB}rZB(hUh}r[B(h]h]h]h]h]uhjIBh]r\Bh)r]B}r^B(hX>(optional) List of ``tags`` to pass to :program:`sphinx-build`hjYBhhhhh}r_B(h]h]h]h]h]uhMh]r`B(hX(optional) List of raBrbB}rcB(hX(optional) List of hj]Bubh)rdB}reB(hX``tags``h}rfB(h]h]h]h]h]uhj]Bh]rgBhXtagsrhBriB}rjB(hUhjdBubahhubhX to pass to rkBrlB}rmB(hX to pass to hj]Bubj)rnB}roB(hX:program:`sphinx-build`h}rpB(h]h]rqBjAah]h]h]uhj]Bh]rrBhX sphinx-buildrsBrtB}ruB(hUhjnBubahj ubeubahjubeubj)rvB}rwB(hX^``defines`` (optional) Dictionary of defines to overwrite values of the :file:`conf.py` file. hjAhhhjh}rxB(h]h]h]h]h]uhM hhh]ryB(j)rzB}r{B(hX ``defines``r|BhjvBhhhjh}r}B(h]h]h]h]h]uhM h]r~Bh)rB}rB(hj|Bh}rB(h]h]h]h]h]uhjzBh]rBhXdefinesrBrB}rB(hUhjBubahhubaubj)rB}rB(hUh}rB(h]h]h]h]h]uhjvBh]rBh)rB}rB(hXQ(optional) Dictionary of defines to overwrite values of the :file:`conf.py` file.hjBhhhhh}rB(h]h]h]h]h]uhM h]rB(hX<(optional) Dictionary of defines to overwrite values of the rBrB}rB(hX<(optional) Dictionary of defines to overwrite values of the hjBubh)rB}rB(hUh}rB(h]h]h]h]rBXfilerBaUrolejBh]uhjBh]rBhXconf.pyrBrB}rB(hXconf.pyhjBubahhubhX file.rBrB}rB(hX file.hjBubeubahjubeubj)rB}rB(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. hjAhhhjh}rB(h]h]h]h]h]uhM hhh]rB(j)rB}rB(hX``mode``rBhjBhhhjh}rB(h]h]h]h]h]uhM h]rBh)rB}rB(hjBh}rB(h]h]h]h]h]uhjBh]rBhXmoderBrB}rB(hUhjBubahhubaubj)rB}rB(hUh}rB(h]h]h]h]h]uhjBh]rBh)rB}rB(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.hjBhhhhh}rB(h]h]h]h]h]uhM h]rB(hX(optional) String, one of rBrB}rB(hX(optional) String, one of hjBubh)rB}rB(hX``full``h}rB(h]h]h]h]h]uhjBh]rBhXfullrBrB}rB(hUhjBubahhubhX or rBrB}rB(hX or hjBubh)rB}rB(hX``incremental``h}rB(h]h]h]h]h]uhjBh]rBhX incrementalrBrB}rB(hUhjBubahhubhX (the default). If set to rBrB}rB(hX (the default). If set to hjBubh)rB}rB(hX``full``h}rB(h]h]h]h]h]uhjBh]rBhXfullrBrB}rB(hUhjBubahhubhXX, indicates to Sphinx to rebuild everything without re-using the previous build results.rBrB}rB(hXX, indicates to Sphinx to rebuild everything without re-using the previous build results.hjBubeubahjubeubeubj )rB}rB(hUhjAhhhj#h}rB(h]h]h]h]h]Uentries]rB((UsingleXBuild Steps; PyLintX step-PyLintrBjBtrB(UsingleXPyLint Build StepjBjBtrBeuhM hhh]ubh)rB}rB(hUhjAhhhhh}rB(h]h]h]h]h]hjBuhM hhh]ubh)rB}rB(hX.. _Step-PyLint:hjAhhh}hhh}rB(h]h]h]h]h]hU step-pylintrBuhM hhh}rBjBjBsh]ubeubh)rB}rB(hUhj>hhh}rBhWjBshhh}rB(h]h]h]h]rB(UpylintrBjBjBeh]rB(hQhWeuhM hhh}rB(jBjBjBjBuh]rB(h)rB}rB(hXPyLintrBhjBhhhhh}rB(h]h]h]h]h]uhM hhh]rBhXPyLintrBrB}rB(hjBhjBubaubh)rB}rB(hXYSimilarly, the :bb:step:`PyLint` step will run :command:`pylint` and analyze the results.hjBhhhhh}rB(h]h]h]h]h]uhM hhh]rB(hXSimilarly, the rBrB}rB(hXSimilarly, the hjBubh)rB}rB(hX:bb:step:`PyLint`rBhjBhhhhh}rC(UreftypeXsteph͉hXPyLintU refdomainXbbrCh]h]U refexplicith]h]h]hhuhM h]rCh)rC}rC(hjBh}rC(h]h]rC(hjCXbb-steprCeh]h]h]uhjBh]rChXPyLintr Cr C}r C(hUhjCubahhubaubhX step will run r Cr C}rC(hX step will run hjBubj)rC}rC(hX:command:`pylint`h}rC(h]h]rCjah]h]h]uhjBh]rChXpylintrCrC}rC(hUhjCubahj ubhX and analyze the results.rCrC}rC(hX and analyze the results.hjBubeubh)rC}rC(hXDYou must supply the command line to be used. There is no default. ::rChjBhhhhh}rC(h]h]h]h]h]uhM hhh]rChXAYou must supply the command line to be used. There is no default.rCr C}r!C(hXAYou must supply the command line to be used. There is no default.hjCubaubj>)r"C}r#C(hXUfrom buildbot.steps.python import PyLint f.addStep(PyLint(command=["pylint", "src"]))hjBhhhjAh}r$C(jCjDh]h]h]h]h]uhM hhh]r%ChXUfrom buildbot.steps.python import PyLint f.addStep(PyLint(command=["pylint", "src"]))r&Cr'C}r(C(hUhj"Cubaubj )r)C}r*C(hUhjBhhhj#h}r+C(h]h]h]h]h]Uentries]r,C((UsingleXBuild Steps; TrialX step-Trialr-Cj-Ctr.C(UsingleXTrial Build Stepj-Cj-Ctr/CeuhM hhh]ubh)r0C}r1C(hUhjBhhhhh}r2C(h]h]h]h]h]hj-CuhM hhh]ubh)r3C}r4C(hX.. _Step-Trial:hjBhhh}hhh}r5C(h]h]h]h]h]hU step-trialr6CuhM hhh}r7Cj-Cj0Csh]ubeubh)r8C}r9C(hUhj>hhh}r:Ch^j3Cshhh}r;C(h]h]h]h]rC(hCh^euhM hhh}r?C(j-Cj0Cj6Cj3Cuh]r@C(h)rAC}rBC(hXTrialrCChj8Chhhhh}rDC(h]h]h]h]h]uhM hhh]rEChXTrialrFCrGC}rHC(hjCChjACubaubj )rIC}rJC(hUhj8ChNhj#h}rKC(h]h]h]h]h]Uentries]rLC(j'XDbuildbot.steps.python_twisted.Trial (class in buildbot.steps.source)hZUtrMCauhNhhh]ubjj)rNC}rOC(hUhj8ChNhjmh}rPC(jojpXpyh]h]h]h]h]jqXclassrQCjsjQCuhNhhh]rRC(ju)rSC}rTC(hX#buildbot.steps.python_twisted.TrialhjNChhhjxh}rUC(h]rVChZaj{j|h]h]h]h]rWChZaj~X#buildbot.steps.python_twisted.TrialjXbuildbot.steps.python_twistedjuhM! hhh]rXC(j)rYC}rZC(hXclass hjSChhhjh}r[C(h]h]h]h]h]uhM! hhh]r\ChXclass r]Cr^C}r_C(hUhjYCubaubj)r`C}raC(hXbuildbot.steps.python_twisted.hjSChhhjh}rbC(h]h]h]h]h]uhM! hhh]rcChXbuildbot.steps.python_twisted.rdCreC}rfC(hUhj`Cubaubj)rgC}rhC(hXTrialhjSChhhjh}riC(h]h]h]h]h]uhM! hhh]rjChXTrialrkCrlC}rmC(hUhjgCubaubeubj)rnC}roC(hUhjNChhhjh}rpC(h]h]h]h]h]uhM! hhh]ubeubh)rqC}rrC(hX This step runs a unit test suite using :command:`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.hj8Chhhhh}rsC(h]h]h]h]h]uhM" hhh]rtC(hX'This step runs a unit test suite using ruCrvC}rwC(hX'This step runs a unit test suite using hjqCubj)rxC}ryC(hX:command:`trial`h}rzC(h]h]r{Cjah]h]h]uhjqCh]r|ChXtrialr}Cr~C}rC(hUhjxCubahj ubhX, 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.rCrC}rC(hX, 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.hjqCubeubh)rC}rC(hXProjects 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 :file:`petmail/test/test_*.py`. More complicated packages (like Twisted itself) may have multiple test directories, like :file:`twisted/test/test_*.py` for the core functionality and :file:`twisted/mail/test/test_*.py` for the email-specific tests.hj8Chhhhh}rC(h]h]h]h]h]uhM' hhh]rC(hXProjects that use trial typically have all their test cases in a 'test' subdirectory of their top-level library directory. For example, for a package rCrC}rC(hXProjects that use trial typically have all their test cases in a 'test' subdirectory of their top-level library directory. For example, for a package hjCubh)rC}rC(hX ``petmail``h}rC(h]h]h]h]h]uhjCh]rChXpetmailrCrC}rC(hUhjCubahhubhX, the tests might be in rCrC}rC(hX, the tests might be in hjCubh)rC}rC(hUh}rC(h]h]h]h]rCXfilerCaUrolejCh]uhjCh]rChXpetmail/test/test_*.pyrCrC}rC(hXpetmail/test/test_*.pyhjCubahhubhX[. More complicated packages (like Twisted itself) may have multiple test directories, like rCrC}rC(hX[. More complicated packages (like Twisted itself) may have multiple test directories, like hjCubh)rC}rC(hUh}rC(h]h]h]h]rCXfilerCaUrolejCh]uhjCh]rChXtwisted/test/test_*.pyrCrC}rC(hXtwisted/test/test_*.pyhjCubahhubhX for the core functionality and rCrC}rC(hX for the core functionality and hjCubh)rC}rC(hUh}rC(h]h]h]h]rCXfilerCaUrolejCh]uhjCh]rChXtwisted/mail/test/test_*.pyrCrC}rC(hXtwisted/mail/test/test_*.pyhjCubahhubhX for the email-specific tests.rCrC}rC(hX for the email-specific tests.hjCubeubh)rC}rC(hXTo run trial tests manually, you run the :command:`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 :command:`trial petmail.test`, which would locate all the :file:`test_*.py` files under :file:`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 :file:`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.hj8Chhhhh}rC(h]h]h]h]h]uhM. hhh]rC(hX)To run trial tests manually, you run the rCrC}rC(hX)To run trial tests manually, you run the hjCubj)rC}rC(hX:command:`trial`h}rC(h]h]rCjah]h]h]uhjCh]rChXtrialrCrC}rC(hUhjCubahj ubhX 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 rCrC}rC(hX 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 hjCubj)rC}rC(hX:command:`trial petmail.test`h}rC(h]h]rCjah]h]h]uhjCh]rChXtrial petmail.testrCrC}rC(hUhjCubahj ubhX, which would locate all the rCrC}rC(hX, which would locate all the hjCubh)rC}rC(hUh}rC(h]h]h]h]rCXfilerCaUrolejCh]uhjCh]rChX test_*.pyrCrC}rC(hX test_*.pyhjCubahhubhX files under rCrC}rC(hX files under hjCubh)rC}rC(hUh}rC(h]h]h]h]rCXfilerCaUrolejCh]uhjCh]rChX petmail/test/rCrC}rC(hX petmail/test/hjCubahhubhX=, running every test case it could find in them. Unlike the rCrC}rC(hX=, running every test case it could find in them. Unlike the hjCubh)rC}rC(hX``unittest.py``h}rC(h]h]h]h]h]uhjCh]rChX unittest.pyrCrC}rC(hUhjCubahhubhX8 that comes with Python, it is not necessary to run the rCrC}rC(hX8 that comes with Python, it is not necessary to run the hjCubh)rC}rC(hUh}rC(h]h]h]h]rCXfilerCaUrolejCh]uhjCh]rChX test_foo.pyrCrC}rC(hX test_foo.pyhjCubahhubhXL as a script; you always let trial do the importing and running. The step's rDrD}rD(hXL as a script; you always let trial do the importing and running. The step's hjCubh)rD}rD(hX ``tests```h}rD(h]h]h]h]h]uhjCh]rDhXtests`rDrD}r D(hUhjDubahhubhXX parameter controls which tests trial will run: it can be a string or a list of strings.r Dr D}r D(hXX parameter controls which tests trial will run: it can be a string or a list of strings.hjCubeubh)r D}rD(hX 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 :file:`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 :envvar:`PYTHONPATH` is set to before running :command:`trial`.hj8Chhhhh}rD(h]h]h]h]h]uhM8 hhh]rD(hXITo find the test cases, the Python search path must allow something like rDrD}rD(hXITo find the test cases, the Python search path must allow something like hj Dubh)rD}rD(hX``import petmail.test``h}rD(h]h]h]h]h]uhj Dh]rDhXimport petmail.testrDrD}rD(hUhjDubahhubhX; to work. For packages that don't use a separate top-level rDrD}rD(hX; to work. For packages that don't use a separate top-level hj Dubh)rD}rD(hUh}r D(h]h]h]h]r!DXfiler"DaUrolej"Dh]uhj Dh]r#DhXlibr$Dr%D}r&D(hXlibhjDubahhubhX directory, r'Dr(D}r)D(hX directory, hj Dubh)r*D}r+D(hX``PYTHONPATH=.``h}r,D(h]h]h]h]h]uhj Dh]r-DhX PYTHONPATH=.r.Dr/D}r0D(hUhj*DubahhubhXR will work, and will use the test cases (and the code they are testing) in-place. r1Dr2D}r3D(hXR will work, and will use the test cases (and the code they are testing) in-place. hj Dubh)r4D}r5D(hX``PYTHONPATH=build/lib``h}r6D(h]h]h]h]h]uhj Dh]r7DhXPYTHONPATH=build/libr8Dr9D}r:D(hUhj4DubahhubhX or r;DrD}r?D(hX!``PYTHONPATH=build/lib.somearch``h}r@D(h]h]h]h]h]uhj Dh]rADhXPYTHONPATH=build/lib.somearchrBDrCD}rDD(hUhj>DubahhubhX are also useful when you do a rEDrFD}rGD(hX are also useful when you do a hj Dubh)rHD}rID(hX``python setup.py build``h}rJD(h]h]h]h]h]uhj Dh]rKDhXpython setup.py buildrLDrMD}rND(hUhjHDubahhubhX step first. The rODrPD}rQD(hX step first. The hj Dubh)rRD}rSD(hX ``testpath``h}rTD(h]h]h]h]h]uhj Dh]rUDhXtestpathrVDrWD}rXD(hUhjRDubahhubhX' attribute of this class controls what rYDrZD}r[D(hX' attribute of this class controls what hj Dubj )r\D}r]D(hUh}r^D(h]h]h]h]h]j%]r_D((j'X PYTHONPATHr`DUindex-24raDUtrbD(j'X environment variable; PYTHONPATHjaDUtrcDeuhj Dh]hj#ubh)rdD}reD(hUh}rfD(h]h]h]h]rgDjaDah]uhj Dh]hhubh)rhD}riD(hX:envvar:`PYTHONPATH`rjDhj Dhhhhh}rkD(UreftypeXenvvarh͉hj`DU refdomainXstdrlDh]h]U refexplicith]h]h]hhuhM8 h]rmDh)rnD}roD(hjjDh}rpD(h]h]rqD(hjlDX std-envvarrrDeh]h]h]uhjhDh]rsDhX PYTHONPATHrtDruD}rvD(hUhjnDubahhubaubhX is set to before running rwDrxD}ryD(hX is set to before running hj Dubj)rzD}r{D(hX:command:`trial`h}r|D(h]h]r}Djah]h]h]uhj Dh]r~DhXtrialrDrD}rD(hUhjzDubahj ubhX.rD}rD(hX.hj Dubeubh)rD}rD(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``.hj8Chhhhh}rD(h]h]h]h]h]uhMA hhh]rD(hX#Trial has the ability, through the rDrD}rD(hX#Trial has the ability, through the hjDubh)rD}rD(hX``--testmodule``h}rD(h]h]h]h]h]uhjDh]rDhX --testmodulerDrD}rD(hUhjDubahhubhX: flag, to run only the set of test cases named by special rDrD}rD(hX: flag, to run only the set of test cases named by special hjDubh)rD}rD(hX``test-case-name``h}rD(h]h]h]h]h]uhjDh]rDhXtest-case-namerDrD}rD(hUhjDubahhubhX 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 rDrD}rD(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 hjDubh)rD}rD(hX``testChanges``h}rD(h]h]h]h]h]uhjDh]rDhX testChangesrDrD}rD(hUhjDubahhubhX; parameter controls this feature: if set, it will override rDrD}rD(hX; parameter controls this feature: if set, it will override hjDubh)rD}rD(hX ``tests``h}rD(h]h]h]h]h]uhjDh]rDhXtestsrDrD}rD(hUhjDubahhubhX.rD}rD(hX.hjDubeubh)rD}rD(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.hj8Chhhhh}rD(h]h]h]h]h]uhMI hhh]rD(hX.The trial executable itself is typically just rDrD}rD(hX.The trial executable itself is typically just hjDubj)rD}rD(hX:command:`trial`h}rD(h]h]rDjah]h]h]uhjDh]rDhXtrialrDrD}rD(hUhjDubahj ubhXR, and is typically found in the shell search path. It can be overridden with the rDrD}rD(hXR, and is typically found in the shell search path. It can be overridden with the hjDubh)rD}rD(hX ``trial``h}rD(h]h]h]h]h]uhjDh]rDhXtrialrDrD}rD(hUhjDubahhubhX} parameter. This is useful for Twisted's own unittests, which want to use the copy of bin/trial that comes with the sources.rDrD}rD(hX} parameter. This is useful for Twisted's own unittests, which want to use the copy of bin/trial that comes with the sources.hjDubeubh)rD}rD(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']``).hj8Chhhhh}rD(h]h]h]h]h]uhMN hhh]rD(hXeTo influence the version of Python being used for the tests, or to add flags to the command, set the rDrD}rD(hXeTo influence the version of Python being used for the tests, or to add flags to the command, set the hjDubh)rD}rD(hX ``python``h}rD(h]h]h]h]h]uhjDh]rDhXpythonrDrD}rD(hUhjDubahhubhX' parameter. This can be a string (like rDrD}rD(hX' parameter. This can be a string (like hjDubh)rD}rD(hX ``python2.2``h}rD(h]h]h]h]h]uhjDh]rDhX python2.2rDrD}rD(hUhjDubahhubhX) or a list (like rDrD}rD(hX) or a list (like hjDubh)rD}rD(hX``['python2.3', '-Wall']``h}rD(h]h]h]h]h]uhjDh]rDhX['python2.3', '-Wall']rDrD}rD(hUhjDubahhubhX).rDrD}rD(hX).hjDubeubh)rD}rD(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. ::hj8Chhhhh}rD(h]h]h]h]h]uhMR hhh]rD(hX2Trial creates and switches into a directory named rDrD}rD(hX2Trial creates and switches into a directory named hjDubh)rD}rD(hUh}rD(h]h]h]h]rDXfilerDaUrolejDh]uhjDh]rDhX _trial_temp/rErE}rE(hX _trial_temp/hjDubahhubhXe before running the tests, and sends the twisted log (which includes all exceptions) to a file named rErE}rE(hXe before running the tests, and sends the twisted log (which includes all exceptions) to a file named hjDubh)rE}rE(hUh}rE(h]h]h]h]r EXfiler EaUrolej Eh]uhjDh]r EhXtest.logr Er E}rE(hXtest.loghjEubahhubhX^. This file will be pulled up to the master where it can be seen as part of the status output.rErE}rE(hX^. This file will be pulled up to the master where it can be seen as part of the status output.hjDubeubj>)rE}rE(hXVfrom buildbot.steps.python_twisted import Trial f.addStep(Trial(tests='petmail.test'))hj8ChhhjAh}rE(jCjDh]h]h]h]h]uhMW hhh]rEhXVfrom buildbot.steps.python_twisted import Trial f.addStep(Trial(tests='petmail.test'))rErE}rE(hUhjEubaubh)rE}rE(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`.hj8Chhhhh}rE(h]h]h]h]h]uhMZ hhh]rE(hXhTrial has the ability to run tests on several workers in parallel (beginning with Twisted 12.3.0). Set rErE}rE(hXhTrial has the ability to run tests on several workers in parallel (beginning with Twisted 12.3.0). Set hjEubh)r E}r!E(hX``jobs``h}r"E(h]h]h]h]h]uhjEh]r#EhXjobsr$Er%E}r&E(hUhj EubahhubhX> to the number of workers you want to run. Note that running r'Er(E}r)E(hX> to the number of workers you want to run. Note that running hjEubj)r*E}r+E(hX:command:`trial`h}r,E(h]h]r-Ejah]h]h]uhjEh]r.EhXtrialr/Er0E}r1E(hUhj*Eubahj ubhX3 in this way will create multiple log files (named r2Er3E}r4E(hX3 in this way will create multiple log files (named hjEubh)r5E}r6E(hUh}r7E(h]h]h]h]r8EXfiler9EaUrolej9Eh]uhjEh]r:EhX test.N.logr;ErEr?E}r@E(hX, hjEubh)rAE}rBE(hUh}rCE(h]h]h]h]rDEXfilerEEaUrolejEEh]uhjEh]rFEhX err.N.logrGErHE}rIE(hX err.N.loghjAEubahhubhX and rJErKE}rLE(hX and hjEubh)rME}rNE(hUh}rOE(h]h]h]h]rPEXfilerQEaUrolejQEh]uhjEh]rREhX out.N.logrSErTE}rUE(hX out.N.loghjMEubahhubhX starting with rVErWE}rXE(hX starting with hjEubh)rYE}rZE(hX``N=0``h}r[E(h]h]h]h]h]uhjEh]r\EhXN=0r]Er^E}r_E(hUhjYEubahhubhX) rather than a single r`EraE}rbE(hX) rather than a single hjEubh)rcE}rdE(hUh}reE(h]h]h]h]rfEXfilergEaUrolejgEh]uhjEh]rhEhXtest.logriErjE}rkE(hXtest.loghjcEubahhubhX.rlE}rmE(hX.hjEubeubh)rnE}roE(hX(This step takes the following arguments:rpEhj8Chhhhh}rqE(h]h]h]h]h]uhM` hhh]rrEhX(This step takes the following arguments:rsErtE}ruE(hjpEhjnEubaubj)rvE}rwE(hUhj8Chhhjh}rxE(h]h]h]h]h]uhNhhh]ryEj)rzE}r{E(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. hjvEhhhjh}r|E(h]h]h]h]h]uhMe h]r}E(j)r~E}rE(hX``jobs``rEhjzEhhhjh}rE(h]h]h]h]h]uhMe h]rEh)rE}rE(hjEh}rE(h]h]h]h]h]uhj~Eh]rEhXjobsrErE}rE(hUhjEubahhubaubj)rE}rE(hUh}rE(h]h]h]h]h]uhjzEh]rEh)rE}rE(hX(optional) Number of slave-resident workers to use when running the tests. Defaults to 1 worker. Only works with Twisted>=12.3.0.rEhjEhhhhh}rE(h]h]h]h]h]uhMc h]rEhX(optional) Number of slave-resident workers to use when running the tests. Defaults to 1 worker. Only works with Twisted>=12.3.0.rErE}rE(hjEhjEubaubahjubeubaubj )rE}rE(hUhj8Chhhj#h}rE(h]h]h]h]h]Uentries]rE((UsingleXBuild Steps; RemovePYCsXstep-RemovePYCsrEjEtrE(UsingleXRemovePYCs Build StepjEjEtrEeuhMh hhh]ubh)rE}rE(hUhj8Chhhhh}rE(h]h]h]h]h]hjEuhMh hhh]ubeubh)rE}rE(hUhj>hhh}hhh}rE(h]h]h]h]rE(U removepycsrEjEeh]rEhqauhMj hhh}rEjEjEsh]rE(h)rE}rE(hX RemovePYCsrEhjEhhhhh}rE(h]h]h]h]h]uhMj hhh]rEhX RemovePYCsrErE}rE(hjEhjEubaubj )rE}rE(hUhjEhNhj#h}rE(h]h]h]h]h]Uentries]rE(j'XIbuildbot.steps.python_twisted.RemovePYCs (class in buildbot.steps.source)h)UtrEauhNhhh]ubjj)rE}rE(hUhjEhNhjmh}rE(jojpXpyh]h]h]h]h]jqXclassrEjsjEuhNhhh]rE(ju)rE}rE(hX(buildbot.steps.python_twisted.RemovePYCshjEhhhjxh}rE(h]rEh)aj{j|h]h]h]h]rEh)aj~X(buildbot.steps.python_twisted.RemovePYCsjXbuildbot.steps.python_twistedjuhMm hhh]rE(j)rE}rE(hXclass hjEhhhjh}rE(h]h]h]h]h]uhMm hhh]rEhXclass rErE}rE(hUhjEubaubj)rE}rE(hXbuildbot.steps.python_twisted.hjEhhhjh}rE(h]h]h]h]h]uhMm hhh]rEhXbuildbot.steps.python_twisted.rErE}rE(hUhjEubaubj)rE}rE(hX RemovePYCshjEhhhjh}rE(h]h]h]h]h]uhMm hhh]rEhX RemovePYCsrErE}rE(hUhjEubaubeubj)rE}rE(hUhjEhhhjh}rE(h]h]h]h]h]uhMm hhh]ubeubh)rE}rE(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. ::hjEhhhhh}rE(h]h]h]h]h]uhMn hhh]rE(hX0This is a simple built-in step that will remove rErE}rE(hX0This is a simple built-in step that will remove hjEubh)rE}rE(hX``.pyc``h}rE(h]h]h]h]h]uhjEh]rEhX.pycrErE}rE(hUhjEubahhubhXr files from the workdir. This is useful in builds that update their source (and thus do not automatically delete rErE}rE(hXr files from the workdir. This is useful in builds that update their source (and thus do not automatically delete hjEubh)rE}rE(hX``.pyc``h}rE(h]h]h]h]h]uhjEh]rEhX.pycrErE}rE(hUhjEubahhubhX 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.rErE}rE(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.hjEubeubj>)rE}rE(hXLfrom buildbot.steps.python_twisted import RemovePYCs f.addStep(RemovePYCs())hjEhhhjAh}rE(jCjDh]h]h]h]h]uhMt hhh]rEhXLfrom buildbot.steps.python_twisted import RemovePYCs f.addStep(RemovePYCs())rErE}rE(hUhjEubaubj )rE}rE(hUhjEhhhj#h}rE(h]h]h]h]h]j%]rE(j'X File TransferUindex-25rEUtrEaj*uhMw hhh]ubh)rF}rF(hUhjEhhhhh}rF(h]h]h]h]rFjEah]uhMx hhh]ubj )rF}rF(hUhjEhhhj#h}rF(h]h]h]h]h]Uentries]rF((UsingleXBuild Steps; FileUploadXstep-FileUploadrFjFtr F(UsingleXFileUpload Build StepjFjFtr FeuhMy hhh]ubh)r F}r F(hUhjEhhhhh}r F(h]h]h]h]rFjFah]uhMy hhh]ubj )rF}rF(hUhjEhhhj#h}rF(h]h]h]h]h]Uentries]rF((UsingleXBuild Steps; FileDownloadXstep-FileDownloadrFjFtrF(UsingleXFileDownload Build StepjFjFtrFeuhM{ hhh]ubh)rF}rF(hUhjEhhhhh}rF(h]h]h]h]h]hjFuhM{ hhh]ubeubeubh)rF}rF(hUhhhhh}hhh}rF(h]h]h]h]rF(Utransferring-filesrFjFeh]rFhKauhM} hhh}rFjFjFsh]r F(h)r!F}r"F(hXTransferring Filesr#FhjFhhhhh}r$F(h]h]h]h]h]uhM} hhh]r%FhXTransferring Filesr&Fr'F}r(F(hj#Fhj!Fubaubj )r)F}r*F(hUhjFhNhj#h}r+F(h]h]h]h]h]Uentries]r,F(j'XCbuildbot.steps.transfer.FileUpload (class in buildbot.steps.source)hvUtr-FauhNhhh]ubjj)r.F}r/F(hUhjFhNhjmh}r0F(jojpXpyh]h]h]h]h]jqXclassr1Fjsj1FuhNhhh]r2F(ju)r3F}r4F(hX"buildbot.steps.transfer.FileUploadhj.Fhhhjxh}r5F(h]r6Fhvaj{j|h]h]h]h]r7Fhvaj~X"buildbot.steps.transfer.FileUploadjXbuildbot.steps.transferjuhM hhh]r8F(j)r9F}r:F(hXclass hj3Fhhhjh}r;F(h]h]h]h]h]uhM hhh]rF}r?F(hUhj9Fubaubj)r@F}rAF(hXbuildbot.steps.transfer.hj3Fhhhjh}rBF(h]h]h]h]h]uhM hhh]rCFhXbuildbot.steps.transfer.rDFrEF}rFF(hUhj@Fubaubj)rGF}rHF(hX FileUploadhj3Fhhhjh}rIF(h]h]h]h]h]uhM hhh]rJFhX FileUploadrKFrLF}rMF(hUhjGFubaubeubj)rNF}rOF(hUhj.Fhhhjh}rPF(h]h]h]h]h]uhM hhh]ubeubj )rQF}rRF(hUhjFhNhj#h}rSF(h]h]h]h]h]Uentries]rTF(j'XEbuildbot.steps.transfer.FileDownload (class in buildbot.steps.source)h5UtrUFauhNhhh]ubjj)rVF}rWF(hUhjFhNhjmh}rXF(jojpXpyh]h]h]h]h]jqXclassrYFjsjYFuhNhhh]rZF(ju)r[F}r\F(hX$buildbot.steps.transfer.FileDownloadhjVFhhhjxh}r]F(h]r^Fh5aj{j|h]h]h]h]r_Fh5aj~X$buildbot.steps.transfer.FileDownloadjXbuildbot.steps.transferjuhM hhh]r`F(j)raF}rbF(hXclass hj[Fhhhjh}rcF(h]h]h]h]h]uhM hhh]rdFhXclass reFrfF}rgF(hUhjaFubaubj)rhF}riF(hXbuildbot.steps.transfer.hj[Fhhhjh}rjF(h]h]h]h]h]uhM hhh]rkFhXbuildbot.steps.transfer.rlFrmF}rnF(hUhjhFubaubj)roF}rpF(hX FileDownloadhj[Fhhhjh}rqF(h]h]h]h]h]uhM hhh]rrFhX FileDownloadrsFrtF}ruF(hUhjoFubaubeubj)rvF}rwF(hUhjVFhhhjh}rxF(h]h]h]h]h]uhM hhh]ubeubh)ryF}rzF(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.hjFhhhhh}r{F(h]h]h]h]h]uhM hhh]r|F(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 r}Fr~F}rF(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 hjyFubh)rF}rF(hX:bb:step:`FileUpload`rFhjyFhhhhh}rF(UreftypeXsteph͉hX FileUploadU refdomainXbbrFh]h]U refexplicith]h]h]hhuhM h]rFh)rF}rF(hjFh}rF(h]h]rF(hjFXbb-steprFeh]h]h]uhjFh]rFhX FileUploadrFrF}rF(hUhjFubahhubaubhX and rFrF}rF(hX and hjyFubh)rF}rF(hX:bb:step:`FileDownload`rFhjyFhhhhh}rF(UreftypeXsteph͉hX FileDownloadU refdomainXbbrFh]h]U refexplicith]h]h]hhuhM h]rFh)rF}rF(hjFh}rF(h]h]rF(hjFXbb-steprFeh]h]h]uhjFh]rFhX FileDownloadrFrF}rF(hUhjFubahhubaubhX to provide this functionality. rFrF}rF(hX to provide this functionality. hjyFubh)rF}rF(hX:bb:step:`FileUpload`rFhjyFhhhhh}rF(UreftypeXsteph͉hX FileUploadU refdomainXbbrFh]h]U refexplicith]h]h]hhuhM h]rFh)rF}rF(hjFh}rF(h]h]rF(hjFXbb-steprFeh]h]h]uhjFh]rFhX FileUploadrFrF}rF(hUhjFubahhubaubhX moves a file rFrF}rF(hX moves a file hjyFubjq)rF}rF(hX*up to*h}rF(h]h]h]h]h]uhjyFh]rFhXup torFrF}rF(hUhjFubahj{ubhX the master, while rFrF}rF(hX the master, while hjyFubh)rF}rF(hX:bb:step:`FileDownload`rFhjyFhhhhh}rF(UreftypeXsteph͉hX FileDownloadU refdomainXbbrFh]h]U refexplicith]h]h]hhuhM h]rFh)rF}rF(hjFh}rF(h]h]rF(hjFXbb-steprFeh]h]h]uhjFh]rFhX FileDownloadrFrF}rF(hUhjFubahhubaubhX moves a file rFrF}rF(hX moves a file hjyFubjq)rF}rF(hX *down from*h}rF(h]h]h]h]h]uhjyFh]rFhX down fromrFrF}rF(hUhjFubahj{ubhX the master.rFrF}rF(hX the master.hjyFubeubh)rF}rF(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. ::hjFhhhhh}rF(h]h]h]h]h]uhM hhh]rF(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 rFrF}rF(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 hjFubh)rF}rF(hUh}rF(h]h]h]h]rFXfilerFaUrolejFh]uhjFh]rFhX ~/public_htmlrFrF}rF(hX ~/public_htmlhjFubahhubhXz directory, so it can be visible to developers. This file will wind up in the slave-side working directory under the name rFrF}rF(hXz directory, so it can be visible to developers. This file will wind up in the slave-side working directory under the name hjFubh)rF}rF(hUh}rF(h]h]h]h]rFXfilerFaUrolejFh]uhjFh]rFhXdocs/reference.htmlrFrF}rF(hXdocs/reference.htmlhjFubahhubhX). We want to put it into the master-side rFrF}rF(hX). We want to put it into the master-side hjFubh)rF}rF(hUh}rF(h]h]h]h]rFXfilerFaUrolejFh]uhjFh]rGhX~/public_html/ref.htmlrGrG}rG(hX~/public_html/ref.htmlhjFubahhubhX9, and add a link to the HTML status to the uploaded file.rGrG}rG(hX9, and add a link to the HTML status to the uploaded file.hjFubeubj>)rG}rG(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"))hjFhhhjAh}r G(jCjDh]h]h]h]h]uhM hhh]r GhXEfrom 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"))r Gr G}r G(hUhjGubaubh)rG}rG(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.hjFhhhhh}rG(h]h]h]h]h]uhM hhh]rG(hXThe rGrG}rG(hXThe hjGubh)rG}rG(hX``masterdest=``h}rG(h]h]h]h]h]uhjGh]rGhX masterdest=rGrG}rG(hUhjGubahhubhX argument will be passed to rGrG}rG(hX argument will be passed to hjGubh)rG}r G(hX:meth:`os.path.expanduser`r!GhjGhhhhh}r"G(UreftypeXmethh͉hXos.path.expanduserU refdomainXpyr#Gh]h]U refexplicith]h]h]hhhNhj|uhM h]r$Gh)r%G}r&G(hj!Gh}r'G(h]h]r(G(hj#GXpy-methr)Geh]h]h]uhjGh]r*GhXos.path.expanduserr+Gr,G}r-G(hUhj%GubahhubaubhX, so things like r.Gr/G}r0G(hX, so things like hjGubh)r1G}r2G(hX``~``h}r3G(h]h]h]h]h]uhjGh]r4GhX~r5G}r6G(hUhj1GubahhubhX will be expanded properly. Non-absolute paths will be interpreted relative to the buildmaster's base directory. Likewise, the r7Gr8G}r9G(hX will be expanded properly. Non-absolute paths will be interpreted relative to the buildmaster's base directory. Likewise, the hjGubh)r:G}r;G(hX ``slavesrc=``h}rGr?G}r@G(hUhj:GubahhubhXW argument will be expanded and interpreted relative to the builder's working directory.rAGrBG}rCG(hXW argument will be expanded and interpreted relative to the builder's working directory.hjGubeubj)rDG}rEG(hXThe copied file will have the same permissions on the master as on the slave, look at the ``mode=`` parameter to set it differently.hjFhhhjh}rFG(h]h]h]h]h]uhNhhh]rGGh)rHG}rIG(hXThe copied file will have the same permissions on the master as on the slave, look at the ``mode=`` parameter to set it differently.hjDGhhhhh}rJG(h]h]h]h]h]uhM h]rKG(hXZThe copied file will have the same permissions on the master as on the slave, look at the rLGrMG}rNG(hXZThe copied file will have the same permissions on the master as on the slave, look at the hjHGubh)rOG}rPG(hX ``mode=``h}rQG(h]h]h]h]h]uhjHGh]rRGhXmode=rSGrTG}rUG(hUhjOGubahhubhX! parameter to set it differently.rVGrWG}rXG(hX! parameter to set it differently.hjHGubeubaubh)rYG}rZG(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::hjFhhhhh}r[G(h]h]h]h]h]uhM hhh]r\G(hX5To move a file from the master to the slave, use the r]Gr^G}r_G(hX5To move a file from the master to the slave, use the hjYGubh)r`G}raG(hX:bb:step:`FileDownload`rbGhjYGhhhhh}rcG(UreftypeXsteph͉hX FileDownloadU refdomainXbbrdGh]h]U refexplicith]h]h]hhuhM h]reGh)rfG}rgG(hjbGh}rhG(h]h]riG(hjdGXbb-steprjGeh]h]h]uhj`Gh]rkGhX FileDownloadrlGrmG}rnG(hUhjfGubahhubaubhX 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:roGrpG}rqG(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:hjYGubeubj>)rrG}rsG(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"]))hjFhhhjAh}rtG(jCjDh]h]h]h]h]uhM hhh]ruGhXfrom 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"]))rvGrwG}rxG(hUhjrGubaubh)ryG}rzG(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.hjFhhhhh}r{G(h]h]h]h]h]uhM hhh]r|G(hXLike r}Gr~G}rG(hXLike hjyGubh)rG}rG(hX:bb:step:`FileUpload`rGhjyGhhhhh}rG(UreftypeXsteph͉hX FileUploadU refdomainXbbrGh]h]U refexplicith]h]h]hhuhM h]rGh)rG}rG(hjGh}rG(h]h]rG(hjGXbb-steprGeh]h]h]uhjGh]rGhX FileUploadrGrG}rG(hUhjGubahhubaubhX, the rGrG}rG(hX, the hjyGubh)rG}rG(hX``mastersrc=``h}rG(h]h]h]h]h]uhjyGh]rGhX mastersrc=rGrG}rG(hUhjGubahhubhXO argument is interpreted relative to the buildmaster's base directory, and the rGrG}rG(hXO argument is interpreted relative to the buildmaster's base directory, and the hjyGubh)rG}rG(hX``slavedest=``h}rG(h]h]h]h]h]uhjyGh]rGhX slavedest=rGrG}rG(hUhjGubahhubhXZ argument is relative to the builder's working directory. If the buildslave is running in rGrG}rG(hXZ argument is relative to the builder's working directory. If the buildslave is running in hjyGubh)rG}rG(hUh}rG(h]h]h]h]rGXfilerGaUrolejGh]uhjyGh]rGhX ~buildslaverGrG}rG(hX ~buildslavehjGubahhubhX, and the builder's rGrG}rG(hX, and the builder's hjyGubh)rG}rG(hX ``builddir``h}rG(h]h]h]h]h]uhjyGh]rGhXbuilddirrGrG}rG(hUhjGubahhubhX is something like rGrG}rG(hX is something like hjyGubh)rG}rG(hUh}rG(h]h]h]h]rGXfilerGaUrolejGh]uhjyGh]rGhX tests-i386rGrG}rG(hX tests-i386hjGubahhubhX", then the workdir is going to be rGrG}rG(hX", then the workdir is going to be hjyGubh)rG}rG(hUh}rG(h]h]h]h]rGXfilerGaUrolejGh]uhjyGh]rGhX~buildslave/tests-i386/buildrGrG}rG(hX~buildslave/tests-i386/buildhjGubahhubhX, and a rGrG}rG(hX, and a hjyGubh)rG}rG(hX``slavedest=``h}rG(h]h]h]h]h]uhjyGh]rGhX slavedest=rGrG}rG(hUhjGubahhubhX of rGrG}rG(hX of hjyGubh)rG}rG(hUh}rG(h]h]h]h]rGXfilerGaUrolejGh]uhjyGh]rGhX foo/bar.htmlrGrG}rG(hX foo/bar.htmlhjGubahhubhX will get put in rGrG}rG(hX will get put in hjyGubh)rG}rG(hUh}rG(h]h]h]h]rGXfilerGaUrolejGh]uhjyGh]rGhX)~buildslave/tests-i386/build/foo/bar.htmlrGrG}rG(hX)~buildslave/tests-i386/build/foo/bar.htmlhjGubahhubhXI. Both of these commands will create any missing intervening directories.rGrG}rG(hXI. Both of these commands will create any missing intervening directories.hjyGubeubh)rG}rG(hUhjFhhhhh}rG(h]h]h]h]rGUother-parametersrGah]rGhauhM hhh]rG(h)rG}rG(hXOther ParametersrGhjGhhhhh}rH(h]h]h]h]h]uhM hhh]rHhXOther ParametersrHrH}rH(hjGhjGubaubh)rH}rH(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.hjGhhhhh}rH(h]h]h]h]h]uhM hhh]rH(hXThe r Hr H}r H(hXThe hjHubh)r H}r H(hX ``maxsize=``h}rH(h]h]h]h]h]uhjHh]rHhXmaxsize=rHrH}rH(hUhj HubahhubhX 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 rHrH}rH(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 hjHubh)rH}rH(hX``blocksize=``h}rH(h]h]h]h]h]uhjHh]rHhX blocksize=rHrH}rH(hUhjHubahhubhX 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.rHrH}rH(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.hjHubeubh)r H}r!H(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`).hjGhhhhh}r"H(h]h]h]h]h]uhM hhh]r#H(hXThe r$Hr%H}r&H(hXThe hj Hubh)r'H}r(H(hX ``mode=``h}r)H(h]h]h]h]h]uhj Hh]r*HhXmode=r+Hr,H}r-H(hUhj'HubahhubhX argument allows you to control the access permissions of the target file, traditionally expressed as an octal integer. The most common value is probably r.Hr/H}r0H(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 hj Hubh)r1H}r2H(hX``0755``h}r3H(h]h]h]h]h]uhj Hh]r4HhX0755r5Hr6H}r7H(hUhj1HubahhubhX, which sets the r8Hr9H}r:H(hX, which sets the hj Hubj_)r;H}rHhXxr?H}r@H(hUhj;HubahjgubhX[ executable bit on the file (useful for shell scripts and the like). The default value for rAHrBH}rCH(hX[ executable bit on the file (useful for shell scripts and the like). The default value for hj Hubh)rDH}rEH(hX ``mode=``h}rFH(h]h]h]h]h]uhj Hh]rGHhXmode=rHHrIH}rJH(hUhjDHubahhubhX 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 (rKHrLH}rMH(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 (hj Hubh)rNH}rOH(hX:ref:`Buildslave-Options`rPHhj Hhhhhh}rQH(UreftypeXrefh͈hXbuildslave-optionsU refdomainXstdrRHh]h]U refexplicith]h]h]hhuhM h]rSHjq)rTH}rUH(hjPHh}rVH(h]h]rWH(hjRHXstd-refrXHeh]h]h]uhjNHh]rYHhXBuildslave-OptionsrZHr[H}r\H(hUhjTHubahj{ubaubhX).r]Hr^H}r_H(hX).hj Hubeubh)r`H}raH(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.hjGhhhhh}rbH(h]h]h]h]h]uhM hhh]rcH(hXThe rdHreH}rfH(hXThe hj`Hubh)rgH}rhH(hX``keepstamp=``h}riH(h]h]h]h]h]uhj`Hh]rjHhX keepstamp=rkHrlH}rmH(hUhjgHubahhubhX" argument is a boolean that, when rnHroH}rpH(hX" argument is a boolean that, when hj`Hubh)rqH}rrH(hX``True``h}rsH(h]h]h]h]h]uhj`Hh]rtHhXTrueruHrvH}rwH(hUhjqHubahhubhXm, forces the modified and accessed time of the destination file to match the times of the source file. When rxHryH}rzH(hXm, forces the modified and accessed time of the destination file to match the times of the source file. When hj`Hubh)r{H}r|H(hX ``False``h}r}H(h]h]h]h]h]uhj`Hh]r~HhXFalserHrH}rH(hUhj{HubahhubhXw (the default), the modified and accessed times of the destination file are set to the current time on the buildmaster.rHrH}rH(hXw (the default), the modified and accessed times of the destination file are set to the current time on the buildmaster.hj`Hubeubh)rH}rH(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.hjGhhhhh}rH(h]h]h]h]h]uhM hhh]rH(hXThe rHrH}rH(hXThe hjHubh)rH}rH(hX``url=``h}rH(h]h]h]h]h]uhjHh]rHhXurl=rHrH}rH(hUhjHubahhubhX 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 rHrH}rH(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 hjHubh)rH}rH(hX:class:`DirectoryUpload`rHhjHhhhhh}rH(UreftypeXclassh͉hXDirectoryUploadU refdomainXpyrHh]h]U refexplicith]h]h]hhhNhj|uhM h]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXpy-classrHeh]h]h]uhjHh]rHhXDirectoryUploadrHrH}rH(hUhjHubahhubaubhX or file for rHrH}rH(hX or file for hjHubh)rH}rH(hX:class:`FileUpload`rHhjHhhhhh}rH(UreftypeXclassh͉hX FileUploadU refdomainXpyrHh]h]U refexplicith]h]h]hhhNhj|uhM h]rHh)rH}rH(hjHh}rH(h]h]rH(hjHXpy-classrHeh]h]h]uhjHh]rHhX FileUploadrHrH}rH(hUhjHubahhubaubhXj). This allows the user to add a link to the uploaded item if that one is uploaded to an accessible place.rHrH}rH(hXj). This allows the user to add a link to the uploaded item if that one is uploaded to an accessible place.hjHubeubj )rH}rH(hUhjGhhhj#h}rH(h]h]h]h]h]Uentries]rH((UsingleXBuild Steps; DirectoryUploadXstep-DirectoryUploadrHjHtrH(UsingleXDirectoryUpload Build StepjHjHtrHeuhM hhh]ubh)rH}rH(hUhjGhhhhh}rH(h]h]h]h]h]hjHuhM hhh]ubeubh)rH}rH(hUhjFhhh}hhh}rH(h]h]h]h]rH(Utransfering-directoriesrHjHeh]rHhbauhM hhh}rHjHjHsh]rH(h)rH}rH(hXTransfering DirectoriesrHhjHhhhhh}rH(h]h]h]h]h]uhM hhh]rHhXTransfering DirectoriesrHrH}rH(hjHhjHubaubj )rH}rH(hUhjHhNhj#h}rH(h]h]h]h]h]Uentries]rH(j'XHbuildbot.steps.transfer.DirectoryUpload (class in buildbot.steps.source)h=UtrHauhNhhh]ubjj)rH}rH(hUhjHhNhjmh}rH(jojpXpyh]h]h]h]h]jqXclassrHjsjHuhNhhh]rH(ju)rH}rH(hX'buildbot.steps.transfer.DirectoryUploadhjHhhhjxh}rH(h]rHh=aj{j|h]h]h]h]rHh=aj~X'buildbot.steps.transfer.DirectoryUploadjXbuildbot.steps.transferjuhM hhh]rH(j)rH}rH(hXclass hjHhhhjh}rH(h]h]h]h]h]uhM hhh]rHhXclass rHrH}rH(hUhjHubaubj)rH}rH(hXbuildbot.steps.transfer.hjHhhhjh}rH(h]h]h]h]h]uhM hhh]rHhXbuildbot.steps.transfer.rHrH}rH(hUhjHubaubj)rH}rH(hXDirectoryUploadhjHhhhjh}rH(h]h]h]h]h]uhM hhh]rHhXDirectoryUploadrHrH}rH(hUhjHubaubeubj)rH}rH(hUhjHhhhjh}rH(h]h]h]h]h]uhM hhh]ubeubh)rH}rH(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`::hjHhhhhh}rH(h]h]h]h]h]uhM hhh]rH(hXOTo transfer complete directories from the buildslave to the master, there is a rIrI}rI(hXOTo transfer complete directories from the buildslave to the master, there is a hjHubh)rI}rI(hX:class:`BuildStep`rIhjHhhhhh}rI(UreftypeXclassh͉hX BuildStepU refdomainXpyrIh]h]U refexplicith]h]h]hhhNhj|uhM h]rIh)r I}r I(hjIh}r I(h]h]r I(hjIXpy-classr Ieh]h]h]uhjIh]rIhX BuildSteprIrI}rI(hUhj IubahhubaubhX named rIrI}rI(hX named hjHubh)rI}rI(hX:bb:step:`DirectoryUpload`rIhjHhhhhh}rI(UreftypeXsteph͉hXDirectoryUploadU refdomainXbbrIh]h]U refexplicith]h]h]hhuhM h]rIh)rI}rI(hjIh}rI(h]h]rI(hjIXbb-steprIeh]h]h]uhjIh]r IhXDirectoryUploadr!Ir"I}r#I(hUhjIubahhubaubhX. It works like r$Ir%I}r&I(hX. It works like hjHubh)r'I}r(I(hX:bb:step:`FileUpload`r)IhjHhhhhh}r*I(UreftypeXsteph͉hX FileUploadU refdomainXbbr+Ih]h]U refexplicith]h]h]hhuhM h]r,Ih)r-I}r.I(hj)Ih}r/I(h]h]r0I(hj+IXbb-stepr1Ieh]h]h]uhj'Ih]r2IhX FileUploadr3Ir4I}r5I(hUhj-IubahhubaubhX8, just for directories. However it does not support the r6Ir7I}r8I(hX8, just for directories. However it does not support the hjHubh)r9I}r:I(hX ``maxsize``h}r;I(h]h]h]h]h]uhjHh]rI}r?I(hUhj9IubahhubhX, r@IrAI}rBI(hX, hjHubh)rCI}rDI(hX ``blocksize``h}rEI(h]h]h]h]h]uhjHh]rFIhX blocksizerGIrHI}rII(hUhjCIubahhubhX and rJIrKI}rLI(hX and hjHubh)rMI}rNI(hX``mode``h}rOI(h]h]h]h]h]uhjHh]rPIhXmoderQIrRI}rSI(hUhjMIubahhubhX} arguments. As an example, let's assume an generated project documentation, which consists of many files (like the output of rTIrUI}rVI(hX} arguments. As an example, let's assume an generated project documentation, which consists of many files (like the output of hjHubj)rWI}rXI(hX:command:`doxygen`h}rYI(h]h]rZIjah]h]h]uhjHh]r[IhXdoxygenr\Ir]I}r^I(hUhjWIubahj ubhX or r_Ir`I}raI(hX or hjHubj)rbI}rcI(hX:command:`epydoc`h}rdI(h]h]reIjah]h]h]uhjHh]rfIhXepydocrgIrhI}riI(hUhjbIubahj ubhXG). We want to move the entire documentation to the buildmaster, into a rjIrkI}rlI(hXG). We want to move the entire documentation to the buildmaster, into a hjHubh)rmI}rnI(hUh}roI(h]h]h]h]rpIXfilerqIaUrolejqIh]uhjHh]rrIhX~/public_html/docsrsIrtI}ruI(hX~/public_html/docshjmIubahhubhX directory, and add a link to the uploaded documentation on the HTML status page. On the slave-side the directory can be found under rvIrwI}rxI(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 hjHubh)ryI}rzI(hUh}r{I(h]h]h]h]r|IXfiler}IaUrolej}Ih]uhjHh]r~IhXdocsrIrI}rI(hXdocshjyIubahhubhX:rI}rI(hX:hjHubeubj>)rI}rI(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"))hjHhhhjAh}rI(jCjDh]h]h]h]h]uhM hhh]rIhX+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"))rIrI}rI(hUhjIubaubh)rI}rI(hXoThe :bb:step:`DirectoryUpload` step will create all necessary directories and transfers empty directories, too.hjHhhhhh}rI(h]h]h]h]h]uhM hhh]rI(hXThe rIrI}rI(hXThe hjIubh)rI}rI(hX:bb:step:`DirectoryUpload`rIhjIhhhhh}rI(UreftypeXsteph͉hXDirectoryUploadU refdomainXbbrIh]h]U refexplicith]h]h]hhuhM h]rIh)rI}rI(hjIh}rI(h]h]rI(hjIXbb-steprIeh]h]h]uhjIh]rIhXDirectoryUploadrIrI}rI(hUhjIubahhubaubhXQ step will create all necessary directories and transfers empty directories, too.rIrI}rI(hXQ step will create all necessary directories and transfers empty directories, too.hjIubeubh)rI}rI(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).hjHhhhhh}rI(h]h]h]h]h]uhM hhh]rI(hXThe rIrI}rI(hXThe hjIubh)rI}rI(hX ``maxsize``h}rI(h]h]h]h]h]uhjIh]rIhXmaxsizerIrI}rI(hUhjIubahhubhX and rIrI}rI(hX and hjIubh)rI}rI(hX ``blocksize``h}rI(h]h]h]h]h]uhjIh]rIhX blocksizerIrI}rI(hUhjIubahhubhX parameters are the same as for rIrI}rI(hX parameters are the same as for hjIubh)rI}rI(hX:bb:step:`FileUpload`rIhjIhhhhh}rI(UreftypeXsteph͉hX FileUploadU refdomainXbbrIh]h]U refexplicith]h]h]hhuhM h]rIh)rI}rI(hjIh}rI(h]h]rI(hjIXbb-steprIeh]h]h]uhjIh]rIhX FileUploadrIrI}rI(hUhjIubahhubaubhX, 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).rIrI}rI(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).hjIubeubh)rI}rI(hXdThe optional ``compress`` argument can be given as ``'gz'`` or ``'bz2'`` to compress the datastream.hjHhhhhh}rI(h]h]h]h]h]uhM hhh]rI(hX The optional rIrI}rI(hX The optional hjIubh)rI}rI(hX ``compress``h}rI(h]h]h]h]h]uhjIh]rIhXcompressrIrI}rI(hUhjIubahhubhX argument can be given as rIrI}rI(hX argument can be given as hjIubh)rI}rI(hX``'gz'``h}rI(h]h]h]h]h]uhjIh]rIhX'gz'rIrI}rI(hUhjIubahhubhX or rIrI}rI(hX or hjIubh)rI}rI(hX ``'bz2'``h}rI(h]h]h]h]h]uhjIh]rIhX'bz2'rIrI}rI(hUhjIubahhubhX to compress the datastream.rIrI}rI(hX to compress the datastream.hjIubeubj)rI}rI(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.hjHhhhjh}rI(h]h]h]h]h]uhNhhh]rIh)rI}rI(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.hjIhhhhh}rI(h]h]h]h]h]uhM h]rI(hXcThe permissions on the copied files will be the same on the master as originally on the slave, see rIrI}rJ(hXcThe permissions on the copied files will be the same on the master as originally on the slave, see hjIubh)rJ}rJ(hX):option:`buildslave create-slave --umask`rJhjIhhhhh}rJ(UreftypeXoptionh͉hX--umaskU refdomainXstdrJjXbuildslave-create-slaveh]h]U refexplicith]h]h]hhuhM h]rJj)rJ}rJ(hjJh}r J(h]h]r J(hjJX std-optionr Jeh]h]h]uhjJh]r JhXbuildslave create-slave --umaskr JrJ}rJ(hUhjJubahjubaubhX to change the default one.rJrJ}rJ(hX to change the default one.hjIubeubaubj )rJ}rJ(hUhjHhhhj#h}rJ(h]h]h]h]h]Uentries]rJ((UsingleXBuild Steps; StringDownloadXstep-StringDownloadrJjJtrJ(UsingleXStringDownload Build StepjJjJtrJeuhM hhh]ubh)rJ}rJ(hUhjHhhhhh}rJ(h]h]h]h]rJjJah]uhM hhh]ubj )rJ}rJ(hUhjHhhhj#h}r J(h]h]h]h]h]Uentries]r!J((UsingleXBuild Steps; JSONStringDownloadXstep-JSONStringDownloadr"Jj"Jtr#J(UsingleXJSONStringDownload Build Stepj"Jj"Jtr$JeuhM hhh]ubh)r%J}r&J(hUhjHhhhhh}r'J(h]h]h]h]r(Jj"Jah]uhM hhh]ubj )r)J}r*J(hUhjHhhhj#h}r+J(h]h]h]h]h]Uentries]r,J((UsingleX#Build Steps; JSONPropertiesDownloadXstep-JSONPropertiesDownloadr-Jj-Jtr.J(UsingleX!JSONPropertiesDownload Build Stepj-Jj-Jtr/JeuhM hhh]ubh)r0J}r1J(hUhjHhhhhh}r2J(h]h]h]h]h]hj-JuhM hhh]ubeubeubh)r3J}r4J(hUhhhhh}hhh}r5J(h]h]h]h]r6J(Utransfering-stringsr7Jj-Jeh]r8JhaauhM hhh}r9Jj-Jj0Jsh]r:J(h)r;J}rJ(h]h]h]h]h]uhM hhh]r?JhXTransfering Stringsr@JrAJ}rBJ(hj=Jhj;Jubaubj )rCJ}rDJ(hUhj3JhNhj#h}rEJ(h]h]h]h]h]Uentries]rFJ(j'XGbuildbot.steps.transfer.StringDownload (class in buildbot.steps.source)h+UtrGJauhNhhh]ubjj)rHJ}rIJ(hUhj3JhNhjmh}rJJ(jojpXpyh]h]h]h]h]jqXclassrKJjsjKJuhNhhh]rLJ(ju)rMJ}rNJ(hX&buildbot.steps.transfer.StringDownloadhjHJhhhjxh}rOJ(h]rPJh+aj{j|h]h]h]h]rQJh+aj~X&buildbot.steps.transfer.StringDownloadjXbuildbot.steps.transferjuhM hhh]rRJ(j)rSJ}rTJ(hXclass hjMJhhhjh}rUJ(h]h]h]h]h]uhM hhh]rVJhXclass rWJrXJ}rYJ(hUhjSJubaubj)rZJ}r[J(hXbuildbot.steps.transfer.hjMJhhhjh}r\J(h]h]h]h]h]uhM hhh]r]JhXbuildbot.steps.transfer.r^Jr_J}r`J(hUhjZJubaubj)raJ}rbJ(hXStringDownloadhjMJhhhjh}rcJ(h]h]h]h]h]uhM hhh]rdJhXStringDownloadreJrfJ}rgJ(hUhjaJubaubeubj)rhJ}riJ(hUhjHJhhhjh}rjJ(h]h]h]h]h]uhM hhh]ubeubj )rkJ}rlJ(hUhj3JhNhj#h}rmJ(h]h]h]h]h]Uentries]rnJ(j'XKbuildbot.steps.transfer.JSONStringDownload (class in buildbot.steps.source)h?UtroJauhNhhh]ubjj)rpJ}rqJ(hUhj3JhNhjmh}rrJ(jojpXpyh]h]h]h]h]jqXclassrsJjsjsJuhNhhh]rtJ(ju)ruJ}rvJ(hX*buildbot.steps.transfer.JSONStringDownloadhjpJhhhjxh}rwJ(h]rxJh?aj{j|h]h]h]h]ryJh?aj~X*buildbot.steps.transfer.JSONStringDownloadjXbuildbot.steps.transferjuhM hhh]rzJ(j)r{J}r|J(hXclass hjuJhhhjh}r}J(h]h]h]h]h]uhM hhh]r~JhXclass rJrJ}rJ(hUhj{Jubaubj)rJ}rJ(hXbuildbot.steps.transfer.hjuJhhhjh}rJ(h]h]h]h]h]uhM hhh]rJhXbuildbot.steps.transfer.rJrJ}rJ(hUhjJubaubj)rJ}rJ(hXJSONStringDownloadhjuJhhhjh}rJ(h]h]h]h]h]uhM hhh]rJhXJSONStringDownloadrJrJ}rJ(hUhjJubaubeubj)rJ}rJ(hUhjpJhhhjh}rJ(h]h]h]h]h]uhM hhh]ubeubj )rJ}rJ(hUhj3JhNhj#h}rJ(h]h]h]h]h]Uentries]rJ(j'XObuildbot.steps.transfer.JSONPropertiesDownload (class in buildbot.steps.source)h,UtrJauhNhhh]ubjj)rJ}rJ(hUhj3JhNhjmh}rJ(jojpXpyh]h]h]h]h]jqXclassrJjsjJuhNhhh]rJ(ju)rJ}rJ(hX.buildbot.steps.transfer.JSONPropertiesDownloadhjJhhhjxh}rJ(h]rJh,aj{j|h]h]h]h]rJh,aj~X.buildbot.steps.transfer.JSONPropertiesDownloadjXbuildbot.steps.transferjuhM hhh]rJ(j)rJ}rJ(hXclass hjJhhhjh}rJ(h]h]h]h]h]uhM hhh]rJhXclass rJrJ}rJ(hUhjJubaubj)rJ}rJ(hXbuildbot.steps.transfer.hjJhhhjh}rJ(h]h]h]h]h]uhM hhh]rJhXbuildbot.steps.transfer.rJrJ}rJ(hUhjJubaubj)rJ}rJ(hXJSONPropertiesDownloadhjJhhhjh}rJ(h]h]h]h]h]uhM hhh]rJhXJSONPropertiesDownloadrJrJ}rJ(hUhjJubaubeubj)rJ}rJ(hUhjJhhhjh}rJ(h]h]h]h]h]uhM hhh]ubeubh)rJ}rJ(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. ::hj3Jhhhhh}rJ(h]h]h]h]h]uhM hhh]rJhXSometimes 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.rJrJ}rJ(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.hjJubaubj>)rJ}rJ(hXfrom buildbot.steps.transfer import StringDownload f.addStep(StringDownload(Interpolate("%(src::branch)s-%(prop:got_revision)s\n"), slavedest="buildid.txt"))hj3JhhhjAh}rJ(jCjDh]h]h]h]h]uhM hhh]rJhXfrom buildbot.steps.transfer import StringDownload f.addStep(StringDownload(Interpolate("%(src::branch)s-%(prop:got_revision)s\n"), slavedest="buildid.txt"))rJrJ}rJ(hUhjJubaubh)rJ}rJ(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. ::hj3Jhhhhh}rJ(h]h]h]h]h]uhM hhh]rJ(h)rJ}rJ(hX:bb:step:`StringDownload`rJhjJhhhhh}rJ(UreftypeXsteph͉hXStringDownloadU refdomainXbbrJh]h]U refexplicith]h]h]hhuhM h]rJh)rJ}rJ(hjJh}rJ(h]h]rJ(hjJXbb-steprJeh]h]h]uhjJh]rJhXStringDownloadrJrJ}rJ(hUhjJubahhubaubhX works just like rJrJ}rJ(hX works just like hjJubh)rJ}rJ(hX:bb:step:`FileDownload`rJhjJhhhhh}rJ(UreftypeXsteph͉hX FileDownloadU refdomainXbbrJh]h]U refexplicith]h]h]hhuhM h]rJh)rJ}rJ(hjJh}rJ(h]h]rJ(hjJXbb-steprJeh]h]h]uhjJh]rJhX FileDownloadrJrJ}rJ(hUhjJubahhubaubhX$ except it takes a single argument, rJrJ}rJ(hX$ except it takes a single argument, hjJubh)rJ}rJ(hX``s``h}rJ(h]h]h]h]h]uhjJh]rJhXsrJ}rJ(hUhjJubahhubhX3, representing the string to download instead of a rJrJ}rJ(hX3, representing the string to download instead of a hjJubh)rJ}rJ(hX ``mastersrc``h}rJ(h]h]h]h]h]uhjJh]rJhX mastersrcrJrJ}rK(hUhjJubahhubhX argument.rKrK}rK(hX argument.hjJubeubj>)rK}rK(hXfrom buildbot.steps.transfer import JSONStringDownload buildinfo = { branch: Property('branch'), got_revision: Property('got_revision') } f.addStep(JSONStringDownload(buildinfo, slavedest="buildinfo.json"))hj3JhhhjAh}rK(jCjDh]h]h]h]h]uhM hhh]rKhXfrom buildbot.steps.transfer import JSONStringDownload buildinfo = { branch: Property('branch'), got_revision: Property('got_revision') } f.addStep(JSONStringDownload(buildinfo, slavedest="buildinfo.json"))rKr K}r K(hUhjKubaubh)r K}r K(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.hj3Jhhhhh}r K(h]h]h]h]h]uhM hhh]rK(h)rK}rK(hX:bb:step:`JSONStringDownload`rKhj Khhhhh}rK(UreftypeXsteph͉hXJSONStringDownloadU refdomainXbbrKh]h]U refexplicith]h]h]hhuhM h]rKh)rK}rK(hjKh}rK(h]h]rK(hjKXbb-steprKeh]h]h]uhjKh]rKhXJSONStringDownloadrKrK}rK(hUhjKubahhubaubhX is similar, except it takes an rKrK}r K(hX is similar, except it takes an hj Kubh)r!K}r"K(hX``o``h}r#K(h]h]h]h]h]uhj Kh]r$KhXor%K}r&K(hUhj!KubahhubhXe argument, which must be JSON serializable, and transfers that as a JSON-encoded string to the slave.r'Kr(K}r)K(hXe argument, which must be JSON serializable, and transfers that as a JSON-encoded string to the slave.hj Kubeubj )r*K}r+K(hUhj3Jhhhj#h}r,K(h]h]h]h]h]j%]r-K(j'X"Properties; JSONPropertiesDownloadUindex-26r.KUtr/Kaj*uhM# hhh]ubh)r0K}r1K(hUhj3Jhhhhh}r2K(h]h]h]h]h]hj.KuhM$ hhh]ubj>)r3K}r4K(hXfrom buildbot.steps.transfer import JSONPropertiesDownload f.addStep(JSONPropertiesDownload(slavedest="build-properties.json"))hj3Jhhh}hjAh}r5K(jCjDh]r6Kj.Kah]h]h]h]uhM' hhh}r7Kj.Kj0Ksh]r8KhXfrom buildbot.steps.transfer import JSONPropertiesDownload f.addStep(JSONPropertiesDownload(slavedest="build-properties.json"))r9Kr:K}r;K(hUhj3Kubaubh)rK(h]h]h]h]h]uhM* hhh]r?K(h)r@K}rAK(hX!:bb:step:`JSONPropertiesDownload`rBKhj)rK}rK(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"""))hjzKhhhjAh}rL(jCjDh]h]h]h]h]uhMA hhh]rLhXefrom 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"""))rLrL}rL(hUhjKubaubj)rL}rL(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.hjzKhhhjh}rL(h]h]h]h]h]uhNhhh]rLh)r L}r L(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.hjLhhhhh}r L(h]h]h]h]h]uhMJ h]r L(hXBy default, this step passes a copy of the buildmaster's environment variables to the subprocess. To pass an explicit environment instead, add an r LrL}rL(hXBy default, this step passes a copy of the buildmaster's environment variables to the subprocess. To pass an explicit environment instead, add an hj Lubh)rL}rL(hX ``env={..}``h}rL(h]h]h]h]h]uhj Lh]rLhXenv={..}rLrL}rL(hUhjLubahhubhX argument.rLrL}rL(hX argument.hj Lubeubaubh)rL}rL(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 ``""``. ::hjzKhhhhh}rL(h]h]h]h]h]uhMN hhh]rL(hX,Environment variables constructed using the rLrL}r L(hX,Environment variables constructed using the hjLubh)r!L}r"L(hX``env``h}r#L(h]h]h]h]h]uhjLh]r$LhXenvr%Lr&L}r'L(hUhj!LubahhubhXA argument support expansion so that if you just want to prepend r(Lr)L}r*L(hXA argument support expansion so that if you just want to prepend hjLubh)r+L}r,L(hUh}r-L(h]h]h]h]r.LXfiler/LaUrolej/Lh]uhjLh]r0LhX/home/buildbot/binr1Lr2L}r3L(hX/home/buildbot/binhj+LubahhubhX to the r4Lr5L}r6L(hX to the hjLubj )r7L}r8L(hUh}r9L(h]h]h]h]h]j%]r:L((j'XPATHr;LUindex-27rLeuhjLh]hj#ubh)r?L}r@L(hUh}rAL(h]h]h]h]rBLj)rhL}riL(hXfrom buildbot.steps.master import MasterShellCommand f.addStep(MasterShellCommand( command=["make", "www"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))hjzKhhhjAh}rjL(jCjDh]h]h]h]h]uhMT hhh]rkLhXfrom buildbot.steps.master import MasterShellCommand f.addStep(MasterShellCommand( command=["make", "www"], env={'PATH': ["/home/buildbot/bin", "${PATH}"]}))rlLrmL}rnL(hUhjhLubaubh)roL}rpL(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`.hjzKhhhhh}rqL(h]h]h]h]h]uhMZ hhh]rrL(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as rsLrtL}ruL(hXNote that environment values must be strings (or lists that are turned into strings). In particular, numeric properties such as hjoLubh)rvL}rwL(hX``buildnumber``h}rxL(h]h]h]h]h]uhjoLh]ryLhX buildnumberrzLr{L}r|L(hUhjvLubahhubhX must be substituted using r}Lr~L}rL(hX must be substituted using hjoLubh)rL}rL(hX:ref:`Interpolate`rLhjoLhhhhh}rL(UreftypeXrefh͈hX interpolateU refdomainXstdrLh]h]U refexplicith]h]h]hhuhMZ h]rLjq)rL}rL(hjLh}rL(h]h]rL(hjLXstd-refrLeh]h]h]uhjLh]rLhX InterpolaterLrL}rL(hUhjLubahj{ubaubhX.rL}rL(hX.hjoLubeubj)rL}rL(hUhjzKhhhjh}rL(h]h]h]h]h]uhNhhh]rLj)rL}rL(hX]``interruptSignal`` (optional) Signal to use to end the process, if the step is interrupted. hjLhhhjh}rL(h]h]h]h]h]uhM_ h]rL(j)rL}rL(hX``interruptSignal``rLhjLhhhjh}rL(h]h]h]h]h]uhM_ h]rLh)rL}rL(hjLh}rL(h]h]h]h]h]uhjLh]rLhXinterruptSignalrLrL}rL(hUhjLubahhubaubj)rL}rL(hUh}rL(h]h]h]h]h]uhjLh]rLh)rL}rL(hXH(optional) Signal to use to end the process, if the step is interrupted.rLhjLhhhhh}rL(h]h]h]h]h]uhM_ h]rLhXH(optional) Signal to use to end the process, if the step is interrupted.rLrL}rL(hjLhjLubaubahjubeubaubj )rL}rL(hUhjzKhhhj#h}rL(h]h]h]h]h]Uentries]rL((UsingleXBuild Steps; LogRenderableXstep-LogRenderablerLjLtrL(UsingleXLogRenderable Build StepjLjLtrLeuhMb hhh]ubh)rL}rL(hUhjzKhhhhh}rL(h]h]h]h]h]hjLuhMb hhh]ubh)rL}rL(hUhjzKhhh}hhh}rL(h]h]h]h]rL(U logrenderablerLjLeh]rLhJauhMd hhh}rLjLjLsh]rL(h)rL}rL(hX LogRenderablerLhjLhhhhh}rL(h]h]h]h]h]uhMd hhh]rLhX LogRenderablerLrL}rL(hjLhjLubaubj )rL}rL(hUhjLhNhj#h}rL(h]h]h]h]h]Uentries]rL(j'XDbuildbot.steps.master.LogRenderable (class in buildbot.steps.source)h UtrLauhNhhh]ubjj)rL}rL(hUhjLhNhjmh}rL(jojpXpyh]h]h]h]h]jqXclassrLjsjLuhNhhh]rL(ju)rL}rL(hX#buildbot.steps.master.LogRenderablehjLhhhjxh}rL(h]rLh aj{j|h]h]h]h]rLh aj~X#buildbot.steps.master.LogRenderablejXbuildbot.steps.masterjuhMg hhh]rL(j)rL}rL(hXclass hjLhhhjh}rL(h]h]h]h]h]uhMg hhh]rLhXclass rLrL}rL(hUhjLubaubj)rL}rL(hXbuildbot.steps.master.hjLhhhjh}rL(h]h]h]h]h]uhMg hhh]rLhXbuildbot.steps.master.rLrL}rL(hUhjLubaubj)rL}rL(hX LogRenderablehjLhhhjh}rL(h]h]h]h]h]uhMg hhh]rLhX LogRenderablerLrL}rL(hUhjLubaubeubj)rL}rL(hUhjLhhhjh}rL(h]h]h]h]h]uhMg hhh]ubeubh)rL}rL(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.rLhjLhhhhh}rL(h]h]h]h]h]uhMh hhh]rLhXThis 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.rLrL}rL(hjLhjLubaubj )rL}rL(hUhjLhhhj#h}rL(h]h]h]h]h]j%]rL(j'XProperties; from stepsUindex-28rLUtrMaj*uhMk hhh]ubh)rM}rM(hUhjLhhhhh}rM(h]h]h]h]h]hjLuhMl hhh]ubh)rM}rM(hX.. _Setting-Properties:hjLhhh}hhh}rM(h]h]h]h]h]hUsetting-propertiesrMuhMm hhh}rMjLjMsh]ubeubeubh)r M}r M(hUhhhhh}r Mh2jMshhh}r M(h]h]h]h]r M(jMjLUid19rMeh]rM(hkh2euhMp hhh}rM(jLjMjMjMuh]rM(h)rM}rM(hXSetting PropertiesrMhj Mhhhhh}rM(h]h]h]h]h]uhMp hhh]rMhXSetting PropertiesrMrM}rM(hjMhjMubaubh)rM}rM(hXMThese steps set properties on the master based on information from the slave.rMhj Mhhhhh}rM(h]h]h]h]h]uhMr hhh]rMhXMThese steps set properties on the master based on information from the slave.rMr M}r!M(hjMhjMubaubj )r"M}r#M(hUhj Mhhhj#h}r$M(h]h]h]h]h]Uentries]r%M((UsingleXBuild Steps; SetPropertyXstep-SetPropertyr&Mj&Mtr'M(UsingleXSetProperty Build Stepj&Mj&Mtr(MeuhMu hhh]ubh)r)M}r*M(hUhj Mhhhhh}r+M(h]h]h]h]h]hj&MuhMu hhh]ubh)r,M}r-M(hX.. _Step-SetProperty:hj Mhhh}hhh}r.M(h]h]h]h]h]hUstep-setpropertyr/MuhMv hhh}r0Mj&Mj)Msh]ubh)r1M}r2M(hUhj Mhhh}r3Mh7j,Mshhh}r4M(h]h]h]h]r5M(U setpropertyr6Mj/Mj&Meh]r7M(hh7euhMy hhh}r8M(j&Mj)Mj/Mj,Muh]r9M(h)r:M}r;M(hX SetPropertyrMhX SetPropertyr?Mr@M}rAM(hj)rM}rM(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")))hj1MhhhjAh}rM(jCjDh]h]h]h]h]uhM hhh]rMhXfrom 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")))rMrM}rM(hUhjMubaubj )rM}rM(hUhj1Mhhhj#h}rM(h]h]h]h]h]Uentries]rM((UsingleX#Build Steps; SetPropertyFromCommandXstep-SetPropertyFromCommandrMjMtrM(UsingleX!SetPropertyFromCommand Build StepjMjMtrMeuhM hhh]ubh)rM}rM(hUhj1Mhhhhh}rM(h]h]h]h]h]hjMuhM hhh]ubeubh)rM}rM(hUhj Mhhh}hhh}rM(h]h]h]h]rM(UsetpropertyfromcommandrMjMeh]rMh[auhM hhh}rMjMjMsh]rM(h)rM}rM(hXSetPropertyFromCommandrMhjMhhhhh}rM(h]h]h]h]h]uhM hhh]rMhXSetPropertyFromCommandrMrM}rM(hjMhjMubaubj )rM}rM(hUhjMhNhj#h}rM(h]h]h]h]h]Uentries]rM(j'XLbuildbot.steps.shell.SetPropertyFromCommand (class in buildbot.steps.source)hmUtrMauhNhhh]ubjj)rM}rM(hUhjMhNhjmh}rM(jojpXpyh]h]h]h]h]jqXclassrMjsjMuhNhhh]rM(ju)rM}rM(hX+buildbot.steps.shell.SetPropertyFromCommandhjMhhhjxh}rM(h]rMhmaj{j|h]h]h]h]rMhmaj~X+buildbot.steps.shell.SetPropertyFromCommandjXbuildbot.steps.shelljuhM hhh]rM(j)rM}rM(hXclass hjMhhhjh}rM(h]h]h]h]h]uhM hhh]rMhXclass rMrM}rM(hUhjMubaubj)rM}rM(hXbuildbot.steps.shell.hjMhhhjh}rM(h]h]h]h]h]uhM hhh]rMhXbuildbot.steps.shell.rMrM}rM(hUhjMubaubj)rM}rM(hXSetPropertyFromCommandhjMhhhjh}rM(h]h]h]h]h]uhM hhh]rMhXSetPropertyFromCommandrMrM}rM(hUhjMubaubeubj)rM}rM(hUhjMhhhjh}rM(h]h]h]h]h]uhM hhh]ubeubh)rM}rM(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::hjMhhhhh}rN(h]h]h]h]h]uhM hhh]rN(hXThis buildstep is similar to rNrN}rN(hXThis buildstep is similar to hjMubh)rN}rN(hX:bb:step:`ShellCommand`rNhjMhhhhh}rN(UreftypeXsteph͉hX ShellCommandU refdomainXbbr Nh]h]U refexplicith]h]h]hhuhM h]r Nh)r N}r N(hjNh}r N(h]h]rN(hj NXbb-steprNeh]h]h]uhjNh]rNhX ShellCommandrNrN}rN(hUhj NubahhubaubhXc, except that it captures the output of the command into a property. It is usually used like this:rNrN}rN(hXc, except that it captures the output of the command into a property. It is usually used like this:hjMubeubj>)rN}rN(hXnfrom buildbot.steps import shell f.addStep(shell.SetPropertyFromCommand(command="uname -a", property="uname"))hjMhhhjAh}rN(jCjDh]h]h]h]h]uhM hhh]rNhXnfrom buildbot.steps import shell f.addStep(shell.SetPropertyFromCommand(command="uname -a", property="uname"))rNrN}rN(hUhjNubaubh)rN}rN(hXThis runs ``uname -a`` and captures its stdout, stripped of leading and trailing whitespace, in the property ``uname``. To avoid stripping, add ``strip=False``.hjMhhhhh}r N(h]h]h]h]h]uhM hhh]r!N(hX This runs r"Nr#N}r$N(hX This runs hjNubh)r%N}r&N(hX ``uname -a``h}r'N(h]h]h]h]h]uhjNh]r(NhXuname -ar)Nr*N}r+N(hUhj%NubahhubhXW and captures its stdout, stripped of leading and trailing whitespace, in the property r,Nr-N}r.N(hXW and captures its stdout, stripped of leading and trailing whitespace, in the property hjNubh)r/N}r0N(hX ``uname``h}r1N(h]h]h]h]h]uhjNh]r2NhXunamer3Nr4N}r5N(hUhj/NubahhubhX. To avoid stripping, add r6Nr7N}r8N(hX. To avoid stripping, add hjNubh)r9N}r:N(hX``strip=False``h}r;N(h]h]h]h]h]uhjNh]rN}r?N(hUhj9NubahhubhX.r@N}rAN(hX.hjNubeubh)rBN}rCN(hXThe ``property`` argument can be specified as a :ref:`Interpolate` object, allowing the property name to be built from other property values.hjMhhhhh}rDN(h]h]h]h]h]uhM hhh]rEN(hXThe rFNrGN}rHN(hXThe hjBNubh)rIN}rJN(hX ``property``h}rKN(h]h]h]h]h]uhjBNh]rLNhXpropertyrMNrNN}rON(hUhjINubahhubhX! argument can be specified as a rPNrQN}rRN(hX! argument can be specified as a hjBNubh)rSN}rTN(hX:ref:`Interpolate`rUNhjBNhhhhh}rVN(UreftypeXrefh͈hX interpolateU refdomainXstdrWNh]h]U refexplicith]h]h]hhuhM h]rXNjq)rYN}rZN(hjUNh}r[N(h]h]r\N(hjWNXstd-refr]Neh]h]h]uhjSNh]r^NhX Interpolater_Nr`N}raN(hUhjYNubahj{ubaubhXK object, allowing the property name to be built from other property values.rbNrcN}rdN(hXK object, allowing the property name to be built from other property values.hjBNubeubh)reN}rfN(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. ::hjMhhhhh}rgN(h]h]h]h]h]uhM hhh]rhN(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, riNrjN}rkN(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, hjeNubh)rlN}rmN(hX:func:`extract_fn`rnNhjeNhhhhh}roN(UreftypeXfunch͉hX extract_fnU refdomainXpyrpNh]h]U refexplicith]h]h]hhhNhj|uhM h]rqNh)rrN}rsN(hjnNh}rtN(h]h]ruN(hjpNXpy-funcrvNeh]h]h]uhjlNh]rwNhX extract_fnrxNryN}rzN(hUhjrNubahhubaubhX should be passed, and not r{Nr|N}r}N(hX should be passed, and not hjeNubh)r~N}rN(hX:class:`Property`rNhjeNhhhhh}rN(UreftypeXclassh͉hXPropertyU refdomainXpyrNh]h]U refexplicith]h]h]hhhNhj|uhM h]rNh)rN}rN(hjNh}rN(h]h]rN(hjNXpy-classrNeh]h]h]uhj~Nh]rNhXPropertyrNrN}rN(hUhjNubahhubaubhX. The rNrN}rN(hX. The hjeNubh)rN}rN(hX:func:`extract_fn`rNhjeNhhhhh}rN(UreftypeXfunch͉hX extract_fnU refdomainXpyrNh]h]U refexplicith]h]h]hhhNhj|uhM h]rNh)rN}rN(hjNh}rN(h]h]rN(hjNXpy-funcrNeh]h]h]uhjNh]rNhX extract_fnrNrN}rN(hUhjNubahhubaubhX 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.rNrN}rN(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.hjeNubeubj>)rN}rN(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))hjMhhhjAh}rN(jCjDh]h]h]h]h]uhM hhh]rNhXdef 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))rNrN}rN(hUhjNubaubh)rN}rN(hXhNote that any ordering relationship of the contents of stdout and stderr is lost. For example, given ::hjMhhhhh}rN(h]h]h]h]h]uhM hhh]rNhXeNote that any ordering relationship of the contents of stdout and stderr is lost. For example, givenrNrN}rN(hXeNote that any ordering relationship of the contents of stdout and stderr is lost. For example, givenhjNubaubj>)rN}rN(hXwf.addStep(SetPropertyFromCommand( command="echo output1; echo error >&2; echo output2", extract_fn=my_extract))hjMhhhjAh}rN(jCjDh]h]h]h]h]uhM hhh]rNhXwf.addStep(SetPropertyFromCommand( command="echo output1; echo error >&2; echo output2", extract_fn=my_extract))rNrN}rN(hUhjNubaubh)rN}rN(hXVThen ``my_extract`` will see ``stdout="output1\noutput2\n"`` and ``stderr="error\n"``.hjMhhhhh}rN(h]h]h]h]h]uhM hhh]rN(hXThen rNrN}rN(hXThen hjNubh)rN}rN(hX``my_extract``h}rN(h]h]h]h]h]uhjNh]rNhX my_extractrNrN}rN(hUhjNubahhubhX will see rNrN}rN(hX will see hjNubh)rN}rN(hX``stdout="output1\noutput2\n"``h}rN(h]h]h]h]h]uhjNh]rNhXstdout="output1\noutput2\n"rNrN}rN(hUhjNubahhubhX and rNrN}rN(hX and hjNubh)rN}rN(hX``stderr="error\n"``h}rN(h]h]h]h]h]uhjNh]rNhXstderr="error\n"rNrN}rN(hUhjNubahhubhX.rN}rN(hX.hjNubeubj )rN}rN(hUhjMhhhj#h}rN(h]h]h]h]h]Uentries]rN((UsingleX!Build Steps; SetPropertiesFromEnvXstep-SetPropertiesFromEnvrNjNtrN(UsingleXSetPropertiesFromEnv Build StepjNjNtrNeuhM hhh]ubh)rN}rN(hUhjMhhhhh}rN(h]h]h]h]rNjNah]uhM hhh]ubj )rN}rN(hUhjMhNhj#h}rN(h]h]h]h]h]Uentries]rN(j'XJbuildbot.steps.slave.SetPropertiesFromEnv (class in buildbot.steps.source)h!UtrNauhNhhh]ubjj)rN}rN(hUhjMhNhjmh}rN(jojpXpyh]h]h]h]h]jqXclassrNjsjNuhNhhh]rN(ju)rN}rN(hX)buildbot.steps.slave.SetPropertiesFromEnvhjNhhhjxh}rN(h]rNh!aj{j|h]h]h]h]rNh!aj~X)buildbot.steps.slave.SetPropertiesFromEnvjXbuildbot.steps.slavejuhM hhh]rN(j)rN}rN(hXclass hjNhhhjh}rN(h]h]h]h]h]uhM hhh]rNhXclass rNrN}rN(hUhjNubaubj)rN}rN(hXbuildbot.steps.slave.hjNhhhjh}rN(h]h]h]h]h]uhM hhh]rOhXbuildbot.steps.slave.rOrO}rO(hUhjNubaubj)rO}rO(hXSetPropertiesFromEnvhjNhhhjh}rO(h]h]h]h]h]uhM hhh]rOhXSetPropertiesFromEnvrOr O}r O(hUhjOubaubeubj)r O}r O(hUhjNhhhjh}r O(h]h]h]h]h]uhM hhh]ubeubeubh)rO}rO(hUhj Mhhhhh}rO(h]h]h]h]rOUsetpropertiesfromenvrOah]rOhauhM hhh]rO(h)rO}rO(hXSetPropertiesFromEnvrOhjOhhhhh}rO(h]h]h]h]h]uhM hhh]rOhXSetPropertiesFromEnvrOrO}rO(hjOhjOubaubh)rO}rO(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.hjOhhhhh}rO(h]h]h]h]h]uhM hhh]r O(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!Or"O}r#O(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 hjOubh)r$O}r%O(hX:bb:step:`SetPropertiesFromEnv`r&OhjOhhhhh}r'O(UreftypeXsteph͉hXSetPropertiesFromEnvU refdomainXbbr(Oh]h]U refexplicith]h]h]hhuhM h]r)Oh)r*O}r+O(hj&Oh}r,O(h]h]r-O(hj(OXbb-stepr.Oeh]h]h]uhj$Oh]r/OhXSetPropertiesFromEnvr0Or1O}r2O(hUhj*OubahhubaubhX4 step. Pass a variable or list of variables in the r3Or4O}r5O(hX4 step. Pass a variable or list of variables in the hjOubh)r6O}r7O(hX ``variables``h}r8O(h]h]h]h]h]uhjOh]r9OhX variablesr:Or;O}rO}r?O(hXE parameter, then simply use the values as properties in a later step.hjOubeubh)r@O}rAO(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. ::hjOhhhhh}rBO(h]h]h]h]h]uhM hhh]rCO(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 rDOrEO}rFO(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@Oubh)rGO}rHO(hX``variables=['Tmp']``h}rIO(h]h]h]h]h]uhj@Oh]rJOhXvariables=['Tmp']rKOrLO}rMO(hUhjGOubahhubhX&, the result will be a property named rNOrOO}rPO(hX&, the result will be a property named hj@Oubh)rQO}rRO(hX``Tmp``h}rSO(h]h]h]h]h]uhj@Oh]rTOhXTmprUOrVO}rWO(hUhjQOubahhubhX7, even though the environment variable is displayed as rXOrYO}rZO(hX7, even though the environment variable is displayed as hj@Oubj )r[O}r\O(hUh}r]O(h]h]h]h]h]j%]r^O((j'XTMPr_OUindex-29r`OUtraO(j'Xenvironment variable; TMPj`OUtrbOeuhj@Oh]hj#ubh)rcO}rdO(hUh}reO(h]h]h]h]rfOj`Oah]uhj@Oh]hhubh)rgO}rhO(hX :envvar:`TMP`riOhj@Ohhhhh}rjO(UreftypeXenvvarh͉hj_OU refdomainXstdrkOh]h]U refexplicith]h]h]hhuhM h]rlOh)rmO}rnO(hjiOh}roO(h]h]rpO(hjkOX std-envvarrqOeh]h]h]uhjgOh]rrOhXTMPrsOrtO}ruO(hUhjmOubahhubaubhX in the Windows GUI.rvOrwO}rxO(hX in the Windows GUI.hj@Oubeubj>)ryO}rzO(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")))hjOhhhjAh}r{O(jCjDh]h]h]h]h]uhM hhh]r|OhXfrom 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")))r}Or~O}rO(hUhjyOubaubh)rO}rO(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).rOhjOhhhhh}rO(h]h]h]h]h]uhM hhh]rOhXNote 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).rOrO}rO(hjOhjOubaubj )rO}rO(hUhjOhhhj#h}rO(h]h]h]h]h]j%]rO(j'X!Properties; triggering schedulersUindex-30rOUtrOaj*uhM hhh]ubh)rO}rO(hUhjOhhhhh}rO(h]h]h]h]rOjOah]uhM hhh]ubj )rO}rO(hUhjOhhhj#h}rO(h]h]h]h]h]Uentries]rO((UsingleXBuild Steps; TriggerX step-TriggerrOjOtrO(UsingleXTrigger Build StepjOjOtrOeuhM hhh]ubh)rO}rO(hUhjOhhhhh}rO(h]h]h]h]h]hjOuhM hhh]ubh)rO}rO(hX.. _Triggering-Schedulers:hjOhhh}hhh}rO(h]h]h]h]h]hUtriggering-schedulersrOuhM hhh}rOjOjOsh]ubeubeubh)rO}rO(hUhhhhh}rOhjOshhh}rO(h]h]h]h]rO(jOjOUid20rOeh]rO(hheuhM hhh}rO(jOjOjOjOuh]rO(h)rO}rO(hXTriggering SchedulersrOhjOhhhhh}rO(h]h]h]h]h]uhM hhh]rOhXTriggering SchedulersrOrO}rO(hjOhjOubaubh)rO}rO(hXvThe counterpart to the Triggerable described in section :bb:Sched:`Triggerable` is the :bb:step:`Trigger` build step::hjOhhhhh}rO(h]h]h]h]h]uhM hhh]rO(hX8The counterpart to the Triggerable described in section rOrO}rO(hX8The counterpart to the Triggerable described in section hjOubh)rO}rO(hX:bb:Sched:`Triggerable`rOhjOhhhhh}rO(UreftypeXschedh͉hX TriggerableU refdomainXbbrOh]h]U refexplicith]h]h]hhuhM h]rOh)rO}rO(hjOh}rO(h]h]rO(hjOXbb-schedrOeh]h]h]uhjOh]rOhX TriggerablerOrO}rO(hUhjOubahhubaubhX is the rOrO}rO(hX is the hjOubh)rO}rO(hX:bb:step:`Trigger`rOhjOhhhhh}rO(UreftypeXsteph͉hXTriggerU refdomainXbbrOh]h]U refexplicith]h]h]hhuhM h]rOh)rO}rO(hjOh}rO(h]h]rO(hjOXbb-steprOeh]h]h]uhjOh]rOhXTriggerrOrO}rO(hUhjOubahhubaubhX build step:rOrO}rO(hX build step:hjOubeubj>)rO}rO(hXfrom buildbot.steps.trigger import Trigger f.addStep(Trigger(schedulerNames=['build-prep'], waitForFinish=True, updateSourceStamp=True, set_properties={ 'quick' : False })hjOhhhjAh}rO(jCjDh]h]h]h]h]uhM hhh]rOhXfrom buildbot.steps.trigger import Trigger f.addStep(Trigger(schedulerNames=['build-prep'], waitForFinish=True, updateSourceStamp=True, set_properties={ 'quick' : False })rOrO}rO(hUhjOubaubh)rO}rO(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.hjOhhhhh}rO(h]h]h]h]h]uhM hhh]rO(hXThe rOrO}rO(hXThe hjOubh)rO}rO(hX``schedulerNames=``h}rO(h]h]h]h]h]uhjOh]rOhXschedulerNames=rOrO}rO(hUhjOubahhubhX argument lists the rOrO}rO(hX argument lists the hjOubh)rO}rO(hX:bb:sched:`Triggerable`rOhjOhhhhh}rO(UreftypeXschedh͉hX TriggerableU refdomainXbbrOh]h]U refexplicith]h]h]hhuhM h]rOh)rO}rO(hjOh}rO(h]h]rO(hjOXbb-schedrOeh]h]h]uhjOh]rPhX TriggerablerPrP}rP(hUhjOubahhubaubhX 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.rPrP}rP(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.hjOubeubh)rP}rP(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.hjOhhhhh}r P(h]h]h]h]h]uhM hhh]r P(hXIf r Pr P}r P(hXIf hjPubh)rP}rP(hX``waitForFinish``h}rP(h]h]h]h]h]uhjPh]rPhX waitForFinishrPrP}rP(hUhjPubahhubhX is rPrP}rP(hX is hjPubh)rP}rP(hX``True``h}rP(h]h]h]h]h]uhjPh]rPhXTruerPrP}rP(hUhjPubahhubhX, 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 rPr P}r!P(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 hjPubh)r"P}r#P(hX ``False``h}r$P(h]h]h]h]h]uhjPh]r%PhXFalser&Pr'P}r(P(hUhj"PubahhubhXe (the default) or not given, then the buildstep succeeds immediately after triggering the schedulers.r)Pr*P}r+P(hXe (the default) or not given, then the buildstep succeeds immediately after triggering the schedulers.hjPubeubh)r,P}r-P(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 :class:`SourceStamp`s 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 :class:`SourceStamp`s, 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.hjOhhhhh}r.P(h]h]h]h]h]uhM hhh]r/P(hXPThe SourceStamps to use for the triggered build are controlled by the arguments r0Pr1P}r2P(hXPThe SourceStamps to use for the triggered build are controlled by the arguments hj,Pubh)r3P}r4P(hX``updateSourceStamp``h}r5P(h]h]h]h]h]uhj,Ph]r6PhXupdateSourceStampr7Pr8P}r9P(hUhj3PubahhubhX, r:Pr;P}rP(hX``alwaysUseLatest``h}r?P(h]h]h]h]h]uhj,Ph]r@PhXalwaysUseLatestrAPrBP}rCP(hUhj=PubahhubhX, and rDPrEP}rFP(hX, and hj,Pubh)rGP}rHP(hX``sourceStamps``h}rIP(h]h]h]h]h]uhj,Ph]rJPhX sourceStampsrKPrLP}rMP(hUhjGPubahhubhX. If rNPrOP}rPP(hX. If hj,Pubh)rQP}rRP(hX``updateSourceStamp``h}rSP(h]h]h]h]h]uhj,Ph]rTPhXupdateSourceStamprUPrVP}rWP(hUhjQPubahhubhX is rXPrYP}rZP(hX is hj,Pubh)r[P}r\P(hX``True``h}r]P(h]h]h]h]h]uhj,Ph]r^PhXTruer_Pr`P}raP(hUhj[PubahhubhX& (the default), then step updates the rbPrcP}rdP(hX& (the default), then step updates the hj,Pubh)reP}rfP(hX::class:`SourceStamp`s given to the :bb:sched:`Triggerable`rgPhj,Phhhhh}rhP(UreftypeXclassh͉hX1SourceStamp`s given to the :bb:sched:`TriggerableU refdomainXpyriPh]h]U refexplicith]h]h]hhhNhj|uhM h]rjPh)rkP}rlP(hjgPh}rmP(h]h]rnP(hjiPXpy-classroPeh]h]h]uhjePh]rpPhX1SourceStamp`s given to the :bb:sched:`TriggerablerqPrrP}rsP(hUhjkPubahhubaubhX schedulers to include rtPruP}rvP(hX schedulers to include hj,Pubh)rwP}rxP(hX``got_revision``h}ryP(h]h]h]h]h]uhj,Ph]rzPhX got_revisionr{Pr|P}r}P(hUhjwPubahhubhX/ (the revision actually used in this build) as r~PrP}rP(hX/ (the revision actually used in this build) as hj,Pubh)rP}rP(hX ``revision``h}rP(h]h]h]h]h]uhj,Ph]rPhXrevisionrPrP}rP(hUhjPubahhubhXu (the revision to use in the triggered builds). This is useful to ensure that all of the builds use exactly the same rPrP}rP(hXu (the revision to use in the triggered builds). This is useful to ensure that all of the builds use exactly the same hj,Pubh)rP}rP(hX4:class:`SourceStamp`s, even if other :class:`Change`rPhj,Phhhhh}rP(UreftypeXclassh͉hX+SourceStamp`s, even if other :class:`ChangeU refdomainXpyrPh]h]U refexplicith]h]h]hhhNhj|uhM h]rPh)rP}rP(hjPh}rP(h]h]rP(hjPXpy-classrPeh]h]h]uhjPh]rPhX+SourceStamp`s, even if other :class:`ChangerPrP}rP(hUhjPubahhubaubhX0s have occurred while the build was running. If rPrP}rP(hX1\s have occurred while the build was running. If hj,Pubh)rP}rP(hX``updateSourceStamp``h}rP(h]h]h]h]h]uhj,Ph]rPhXupdateSourceStamprPrP}rP(hUhjPubahhubhXl is False (and neither of the other arguments are specified), then the exact same SourceStamps are used. If rPrP}rP(hXl is False (and neither of the other arguments are specified), then the exact same SourceStamps are used. If hj,Pubh)rP}rP(hX``alwaysUseLatest``h}rP(h]h]h]h]h]uhj,Ph]rPhXalwaysUseLatestrPrP}rP(hUhjPubahhubhX 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 rPrP}rP(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,Pubh)rP}rP(hX``sourceStamps``h}rP(h]h]h]h]h]uhj,Ph]rPhX sourceStampsrPrP}rP(hUhjPubahhubhX4 accepts a list of dictionaries containing the keys rPrP}rP(hX4 accepts a list of dictionaries containing the keys hj,Pubh)rP}rP(hX ``branch``h}rP(h]h]h]h]h]uhj,Ph]rPhXbranchrPrP}rP(hUhjPubahhubhX, rPrP}rP(hX, hj,Pubh)rP}rP(hX ``revision``h}rP(h]h]h]h]h]uhj,Ph]rPhXrevisionrPrP}rP(hUhjPubahhubhX, rPrP}rP(hX, hj,Pubh)rP}rP(hX``repository``h}rP(h]h]h]h]h]uhj,Ph]rPhX repositoryrPrP}rP(hUhjPubahhubhX, rPrP}rP(hX, hj,Pubh)rP}rP(hX ``project``h}rP(h]h]h]h]h]uhj,Ph]rPhXprojectrPrP}rP(hUhjPubahhubhX, and optionally rPrP}rP(hX, and optionally hj,Pubh)rP}rP(hX``patch_level``h}rP(h]h]h]h]h]uhj,Ph]rPhX patch_levelrPrP}rP(hUhjPubahhubhX, rPrP}rP(hX, hj,Pubh)rP}rP(hX``patch_body``h}rP(h]h]h]h]h]uhj,Ph]rPhX patch_bodyrPrP}rP(hUhjPubahhubhX, rPrP}rP(hX, hj,Pubh)rP}rP(hX``patch_subdir``h}rP(h]h]h]h]h]uhj,Ph]rPhX patch_subdirrPrP}rP(hUhjPubahhubhX, rPrP}rQ(hX, hj,Pubh)rQ}rQ(hX``patch_author``h}rQ(h]h]h]h]h]uhj,Ph]rQhX patch_authorrQrQ}rQ(hUhjQubahhubhX and rQr Q}r Q(hX and hj,Pubh)r Q}r Q(hX``patch_comment``h}r Q(h]h]h]h]h]uhj,Ph]rQhX patch_commentrQrQ}rQ(hUhj QubahhubhXk and creates the corresponding SourceStamps. If only one sourceStamp has to be specified then the argument rQrQ}rQ(hXk and creates the corresponding SourceStamps. If only one sourceStamp has to be specified then the argument hj,Pubh)rQ}rQ(hX``sourceStamp``h}rQ(h]h]h]h]h]uhj,Ph]rQhX sourceStamprQrQ}rQ(hUhjQubahhubhXQ can be used for a dictionary containing the keys mentioned above. The arguments rQrQ}rQ(hXQ can be used for a dictionary containing the keys mentioned above. The arguments hj,Pubh)rQ}r Q(hX``updateSourceStamp``h}r!Q(h]h]h]h]h]uhj,Ph]r"QhXupdateSourceStampr#Qr$Q}r%Q(hUhjQubahhubhX, r&Qr'Q}r(Q(hX, hj,Pubh)r)Q}r*Q(hX``alwaysUseLatest``h}r+Q(h]h]h]h]h]uhj,Ph]r,QhXalwaysUseLatestr-Qr.Q}r/Q(hUhj)QubahhubhX, and r0Qr1Q}r2Q(hX, and hj,Pubh)r3Q}r4Q(hX``sourceStamp``h}r5Q(h]h]h]h]h]uhj,Ph]r6QhX sourceStampr7Qr8Q}r9Q(hUhj3QubahhubhX# can be specified using properties.r:Qr;Q}rQ(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 ::hjOhhhhh}r?Q(h]h]h]h]h]uhM hhh]r@Q(hXThe rAQrBQ}rCQ(hXThe hj=Qubh)rDQ}rEQ(hX``set_properties``h}rFQ(h]h]h]h]h]uhj=Qh]rGQhXset_propertiesrHQrIQ}rJQ(hUhjDQubahhubhX 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 rKQrLQ}rMQ(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=Qubh)rNQ}rOQ(hX:ref:`Interpolate`rPQhj=Qhhhhh}rQQ(UreftypeXrefh͈hX interpolateU refdomainXstdrRQh]h]U refexplicith]h]h]hhuhM h]rSQjq)rTQ}rUQ(hjPQh}rVQ(h]h]rWQ(hjRQXstd-refrXQeh]h]h]uhjNQh]rYQhX InterpolaterZQr[Q}r\Q(hUhjTQubahj{ubaubhXs here to dynamically construct new property values. For the simple case of copying a property, this might look liker]Qr^Q}r_Q(hXs here to dynamically construct new property values. For the simple case of copying a property, this might look likehj=Qubeubj>)r`Q}raQ(hX2set_properties={"my_prop1" : Property("my_prop1")}hjOhhhjAh}rbQ(jCjDh]h]h]h]h]uhM hhh]rcQhX2set_properties={"my_prop1" : Property("my_prop1")}rdQreQ}rfQ(hUhj`Qubaubh)rgQ}rhQ(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``.riQhjOhhhhh}rjQ(h]h]h]h]h]uhM hhh]rkQ(hXThe rlQrmQ}rnQ(hXThe hjgQubh)roQ}rpQ(hX``copy_properties``h}rqQ(h]h]h]h]h]uhjgQh]rrQhXcopy_propertiesrsQrtQ}ruQ(hUhjoQubahhubhX{ parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of rvQrwQ}rxQ(hX{ parameter, given a list of properties to copy into the new build request, has been deprecated in favor of explicit use of hjgQubh)ryQ}rzQ(hX``set_properties``h}r{Q(h]h]h]h]h]uhjgQh]r|QhXset_propertiesr}Qr~Q}rQ(hUhjyQubahhubhX.rQ}rQ(hX.hjgQubeubeubh)rQ}rQ(hUhhhhhhh}rQ(h]h]h]h]rQUrpm-related-stepsrQah]rQhgauhM hhh]rQ(h)rQ}rQ(hXRPM-Related StepsrQhjQhhhhh}rQ(h]h]h]h]h]uhM hhh]rQhXRPM-Related StepsrQrQ}rQ(hjQhjQubaubh)rQ}rQ(hX*These steps work with RPMs and spec files.rQhjQhhhhh}rQ(h]h]h]h]h]uhM hhh]rQhX*These steps work with RPMs and spec files.rQrQ}rQ(hjQhjQubaubj )rQ}rQ(hUhjQhhhj#h}rQ(h]h]h]h]h]Uentries]rQ((UsingleXBuild Steps; RpmBuildX step-RpmBuildrQjQtrQ(UsingleXRpmBuild Build StepjQjQtrQeuhM hhh]ubh)rQ}rQ(hUhjQhhhhh}rQ(h]h]h]h]h]hjQuhM hhh]ubh)rQ}rQ(hUhjQhhh}hhh}rQ(h]h]h]h]rQ(UrpmbuildrQjQeh]rQh auhM hhh}rQjQjQsh]rQ(h)rQ}rQ(hXRpmBuildrQhjQhhhhh}rQ(h]h]h]h]h]uhM hhh]rQhXRpmBuildrQrQ}rQ(hjQhjQubaubh)rQ}rQ(hX?The :bb:step:`RpmBuild` step builds RPMs based on a spec file::rQhjQhhhhh}rQ(h]h]h]h]h]uhM hhh]rQ(hXThe rQrQ}rQ(hXThe hjQubh)rQ}rQ(hX:bb:step:`RpmBuild`rQhjQhhhhh}rQ(UreftypeXsteph͉hXRpmBuildU refdomainXbbrQh]h]U refexplicith]h]h]hhuhM h]rQh)rQ}rQ(hjQh}rQ(h]h]rQ(hjQXbb-steprQeh]h]h]uhjQh]rQhXRpmBuildrQrQ}rQ(hUhjQubahhubaubhX' step builds RPMs based on a spec file:rQrQ}rQ(hX' step builds RPMs based on a spec file:hjQubeubj>)rQ}rQ(hXnfrom buildbot.steps.package.rpm import RpmBuild f.addStep(RpmBuild(specfile="proj.spec", dist='.el5'))hjQhhhjAh}rQ(jCjDh]h]h]h]h]uhM hhh]rQhXnfrom buildbot.steps.package.rpm import RpmBuild f.addStep(RpmBuild(specfile="proj.spec", dist='.el5'))rQrQ}rQ(hUhjQubaubh)rQ}rQ(hX'The step takes the following parametersrQhjQhhhhh}rQ(h]h]h]h]h]uhM hhh]rQhX'The step takes the following parametersrQrQ}rQ(hjQhjQubaubj)rQ}rQ(hUhjQhhhjh}rQ(h]h]h]h]h]uhNhhh]rQ(j)rQ}rQ(hX.``specfile`` The ``.spec`` file to build from hjQhhhjh}rQ(h]h]h]h]h]uhM h]rQ(j)rQ}rQ(hX ``specfile``rQhjQhhhjh}rQ(h]h]h]h]h]uhM h]rQh)rQ}rQ(hjQh}rQ(h]h]h]h]h]uhjQh]rQhXspecfilerQrQ}rQ(hUhjQubahhubaubj)rQ}rQ(hUh}rQ(h]h]h]h]h]uhjQh]rQh)rQ}rQ(hX The ``.spec`` file to build fromhjQhhhhh}rQ(h]h]h]h]h]uhM h]rQ(hXThe rQrQ}rQ(hXThe hjQubh)rQ}rQ(hX ``.spec``h}rQ(h]h]h]h]h]uhjQh]rQhX.specrQrR}rR(hUhjQubahhubhX file to build fromrRrR}rR(hX file to build fromhjQubeubahjubeubj)rR}rR(hXB``topdir`` Definition for ``_topdir``, defaulting to the workdir. hjQhhhjh}rR(h]h]h]h]h]uhM# hhh]rR(j)r R}r R(hX ``topdir``r RhjRhhhjh}r R(h]h]h]h]h]uhM# h]r Rh)rR}rR(hj Rh}rR(h]h]h]h]h]uhj Rh]rRhXtopdirrRrR}rR(hUhjRubahhubaubj)rR}rR(hUh}rR(h]h]h]h]h]uhjRh]rRh)rR}rR(hX6Definition for ``_topdir``, defaulting to the workdir.hjRhhhhh}rR(h]h]h]h]h]uhM# h]rR(hXDefinition for rRrR}rR(hXDefinition for hjRubh)r R}r!R(hX ``_topdir``h}r"R(h]h]h]h]h]uhjRh]r#RhX_topdirr$Rr%R}r&R(hUhj RubahhubhX, defaulting to the workdir.r'Rr(R}r)R(hX, defaulting to the workdir.hjRubeubahjubeubj)r*R}r+R(hXF``builddir`` Definition for ``_builddir``, defaulting to the workdir. hjQhhhjh}r,R(h]h]h]h]h]uhM& hhh]r-R(j)r.R}r/R(hX ``builddir``r0Rhj*Rhhhjh}r1R(h]h]h]h]h]uhM& h]r2Rh)r3R}r4R(hj0Rh}r5R(h]h]h]h]h]uhj.Rh]r6RhXbuilddirr7Rr8R}r9R(hUhj3Rubahhubaubj)r:R}r;R(hUh}rR}r?R(hX8Definition for ``_builddir``, defaulting to the workdir.hj:Rhhhhh}r@R(h]h]h]h]h]uhM& h]rAR(hXDefinition for rBRrCR}rDR(hXDefinition for hj>Rubh)rER}rFR(hX ``_builddir``h}rGR(h]h]h]h]h]uhj>Rh]rHRhX _builddirrIRrJR}rKR(hUhjERubahhubhX, defaulting to the workdir.rLRrMR}rNR(hX, defaulting to the workdir.hj>Rubeubahjubeubj)rOR}rPR(hXB``rpmdir`` Definition for ``_rpmdir``, defaulting to the workdir. hjQhhhjh}rQR(h]h]h]h]h]uhM) hhh]rRR(j)rSR}rTR(hX ``rpmdir``rURhjORhhhjh}rVR(h]h]h]h]h]uhM) h]rWRh)rXR}rYR(hjURh}rZR(h]h]h]h]h]uhjSRh]r[RhXrpmdirr\Rr]R}r^R(hUhjXRubahhubaubj)r_R}r`R(hUh}raR(h]h]h]h]h]uhjORh]rbRh)rcR}rdR(hX6Definition for ``_rpmdir``, defaulting to the workdir.hj_Rhhhhh}reR(h]h]h]h]h]uhM) h]rfR(hXDefinition for rgRrhR}riR(hXDefinition for hjcRubh)rjR}rkR(hX ``_rpmdir``h}rlR(h]h]h]h]h]uhjcRh]rmRhX_rpmdirrnRroR}rpR(hUhjjRubahhubhX, defaulting to the workdir.rqRrrR}rsR(hX, defaulting to the workdir.hjcRubeubahjubeubj)rtR}ruR(hXH``sourcedir`` Definition for ``_sourcedir``, defaulting to the workdir. hjQhhhjh}rvR(h]h]h]h]h]uhM, hhh]rwR(j)rxR}ryR(hX ``sourcedir``rzRhjtRhhhjh}r{R(h]h]h]h]h]uhM, h]r|Rh)r}R}r~R(hjzRh}rR(h]h]h]h]h]uhjxRh]rRhX sourcedirrRrR}rR(hUhj}Rubahhubaubj)rR}rR(hUh}rR(h]h]h]h]h]uhjtRh]rRh)rR}rR(hX9Definition for ``_sourcedir``, defaulting to the workdir.hjRhhhhh}rR(h]h]h]h]h]uhM, h]rR(hXDefinition for rRrR}rR(hXDefinition for hjRubh)rR}rR(hX``_sourcedir``h}rR(h]h]h]h]h]uhjRh]rRhX _sourcedirrRrR}rR(hUhjRubahhubhX, defaulting to the workdir.rRrR}rR(hX, defaulting to the workdir.hjRubeubahjubeubj)rR}rR(hXH``srcrpmdir`` Definition for ``_srcrpmdir``, defaulting to the workdir. hjQhhhjh}rR(h]h]h]h]h]uhM/ hhh]rR(j)rR}rR(hX ``srcrpmdir``rRhjRhhhjh}rR(h]h]h]h]h]uhM/ h]rRh)rR}rR(hjRh}rR(h]h]h]h]h]uhjRh]rRhX srcrpmdirrRrR}rR(hUhjRubahhubaubj)rR}rR(hUh}rR(h]h]h]h]h]uhjRh]rRh)rR}rR(hX9Definition for ``_srcrpmdir``, defaulting to the workdir.hjRhhhhh}rR(h]h]h]h]h]uhM/ h]rR(hXDefinition for rRrR}rR(hXDefinition for hjRubh)rR}rR(hX``_srcrpmdir``h}rR(h]h]h]h]h]uhjRh]rRhX _srcrpmdirrRrR}rR(hUhjRubahhubhX, defaulting to the workdir.rRrR}rR(hX, defaulting to the workdir.hjRubeubahjubeubj)rR}rR(hXF``dist`` Distribution to build, used as the definition for ``_dist``. hjQhhhjh}rR(h]h]h]h]h]uhM2 hhh]rR(j)rR}rR(hX``dist``rRhjRhhhjh}rR(h]h]h]h]h]uhM2 h]rRh)rR}rR(hjRh}rR(h]h]h]h]h]uhjRh]rRhXdistrRrR}rR(hUhjRubahhubaubj)rR}rR(hUh}rR(h]h]h]h]h]uhjRh]rRh)rR}rR(hX<Distribution to build, used as the definition for ``_dist``.hjRhhhhh}rR(h]h]h]h]h]uhM2 h]rR(hX2Distribution to build, used as the definition for rRrR}rR(hX2Distribution to build, used as the definition for hjRubh)rR}rR(hX ``_dist``h}rR(h]h]h]h]h]uhjRh]rRhX_distrRrR}rR(hUhjRubahhubhX.rR}rR(hX.hjRubeubahjubeubj)rR}rR(hX9``autoRelease`` If true, use the auto-release mechanics. hjQhhhjh}rR(h]h]h]h]h]uhM5 hhh]rR(j)rR}rR(hX``autoRelease``rRhjRhhhjh}rR(h]h]h]h]h]uhM5 h]rRh)rR}rR(hjRh}rR(h]h]h]h]h]uhjRh]rRhX autoReleaserRrR}rR(hUhjRubahhubaubj)rR}rR(hUh}rR(h]h]h]h]h]uhjRh]rRh)rR}rR(hX(If true, use the auto-release mechanics.rRhjRhhhhh}rR(h]h]h]h]h]uhM5 h]rRhX(If true, use the auto-release mechanics.rRrR}rR(hjRhjRubaubahjubeubj)rR}rR(hX``vcsRevision`` If true, use the version-control revision mechanics. This uses the ``got_revision`` property to determine the revision and define ``_revision``. Note that this will not work with multi-codebase builds. hjQhhhjh}rS(h]h]h]h]h]uhM: hhh]rS(j)rS}rS(hX``vcsRevision``rShjRhhhjh}rS(h]h]h]h]h]uhM: h]rSh)rS}rS(hjSh}r S(h]h]h]h]h]uhjSh]r ShX vcsRevisionr Sr S}r S(hUhjSubahhubaubj)rS}rS(hUh}rS(h]h]h]h]h]uhjRh]rSh)rS}rS(hXIf true, use the version-control revision mechanics. This uses the ``got_revision`` property to determine the revision and define ``_revision``. Note that this will not work with multi-codebase builds.hjShhhhh}rS(h]h]h]h]h]uhM8 h]rS(hXDIf true, use the version-control revision mechanics. This uses the rSrS}rS(hXDIf true, use the version-control revision mechanics. This uses the hjSubh)rS}rS(hX``got_revision``h}rS(h]h]h]h]h]uhjSh]rShX got_revisionrSrS}rS(hUhjSubahhubhX/ property to determine the revision and define r Sr!S}r"S(hX/ property to determine the revision and define hjSubh)r#S}r$S(hX ``_revision``h}r%S(h]h]h]h]h]uhjSh]r&ShX _revisionr'Sr(S}r)S(hUhj#SubahhubhX;. Note that this will not work with multi-codebase builds.r*Sr+S}r,S(hX;. Note that this will not work with multi-codebase builds.hjSubeubahjubeubeubj )r-S}r.S(hUhjQhhhj#h}r/S(h]h]h]h]h]Uentries]r0S((UsingleXBuild Steps; RpmLintX step-RpmLintr1Sj1Str2S(UsingleXRpmLint Build Stepj1Sj1Str3SeuhM= hhh]ubh)r4S}r5S(hUhjQhhhhh}r6S(h]h]h]h]h]hj1SuhM= hhh]ubeubh)r7S}r8S(hUhjQhhh}hhh}r9S(h]h]h]h]r:S(Urpmlintr;Sj1Seh]rS(h)r?S}r@S(hXRpmLintrAShj7Shhhhh}rBS(h]h]h]h]h]uhM? hhh]rCShXRpmLintrDSrES}rFS(hjAShj?Subaubh)rGS}rHS(hXVThe :bb:step:`RpmLint` step checks for common problems in RPM packages or spec files::hj7Shhhhh}rIS(h]h]h]h]h]uhMA hhh]rJS(hXThe rKSrLS}rMS(hXThe hjGSubh)rNS}rOS(hX:bb:step:`RpmLint`rPShjGShhhhh}rQS(UreftypeXsteph͉hXRpmLintU refdomainXbbrRSh]h]U refexplicith]h]h]hhuhMA h]rSSh)rTS}rUS(hjPSh}rVS(h]h]rWS(hjRSXbb-steprXSeh]h]h]uhjNSh]rYShXRpmLintrZSr[S}r\S(hUhjTSubahhubaubhX? step checks for common problems in RPM packages or spec files:r]Sr^S}r_S(hX? step checks for common problems in RPM packages or spec files:hjGSubeubj>)r`S}raS(hXCfrom buildbot.steps.package.rpm import RpmLint f.addStep(RpmLint())hj7ShhhjAh}rbS(jCjDh]h]h]h]h]uhMD hhh]rcShXCfrom buildbot.steps.package.rpm import RpmLint f.addStep(RpmLint())rdSreS}rfS(hUhj`Subaubh)rgS}rhS(hX'The step takes the following parametersriShj7Shhhhh}rjS(h]h]h]h]h]uhMG hhh]rkShX'The step takes the following parametersrlSrmS}rnS(hjiShjgSubaubj)roS}rpS(hUhj7Shhhjh}rqS(h]h]h]h]h]uhNhhh]rrS(j)rsS}rtS(hX``fileloc`` The file or directory to check. In case of a directory, it is recursively searched for RPMs and spec files to check. hjoShhhjh}ruS(h]h]h]h]h]uhMK h]rvS(j)rwS}rxS(hX ``fileloc``ryShjsShhhjh}rzS(h]h]h]h]h]uhMK h]r{Sh)r|S}r}S(hjySh}r~S(h]h]h]h]h]uhjwSh]rShXfilelocrSrS}rS(hUhj|Subahhubaubj)rS}rS(hUh}rS(h]h]h]h]h]uhjsSh]rSh)rS}rS(hXtThe file or directory to check. In case of a directory, it is recursively searched for RPMs and spec files to check.rShjShhhhh}rS(h]h]h]h]h]uhMJ h]rShXtThe file or directory to check. In case of a directory, it is recursively searched for RPMs and spec files to check.rSrS}rS(hjShjSubaubahjubeubj)rS}rS(hXd``config`` Path to a rpmlint config file. This is passed as the user configuration file if present. hjoShhhjh}rS(h]h]h]h]h]uhMO hhh]rS(j)rS}rS(hX ``config``rShjShhhjh}rS(h]h]h]h]h]uhMO h]rSh)rS}rS(hjSh}rS(h]h]h]h]h]uhjSh]rShXconfigrSrS}rS(hUhjSubahhubaubj)rS}rS(hUh}rS(h]h]h]h]h]uhjSh]rSh)rS}rS(hXXPath to a rpmlint config file. This is passed as the user configuration file if present.rShjShhhhh}rS(h]h]h]h]h]uhMN h]rShXXPath to a rpmlint config file. This is passed as the user configuration file if present.rSrS}rS(hjShjSubaubahjubeubeubeubh)rS}rS(hUhjQhhhhh}rS(h]h]h]h]rSU mock-stepsrSah]rShwauhMR hhh]rS(h)rS}rS(hX Mock StepsrShjShhhhh}rS(h]h]h]h]h]uhMR hhh]rShX Mock StepsrSrS}rS(hjShjSubaubh)rS}rS(hXGMock (http://fedoraproject.org/wiki/Projects/Mock) creates chroots and builds packages in them. 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 ``root`` parameter. To use mock your buildbot user must be added to the ``mock`` group.hjShhhhh}rS(h]h]h]h]h]uhMT hhh]rS(hXMock (rSrS}rS(hXMock (hjSubj)rS}rS(hX+http://fedoraproject.org/wiki/Projects/MockrSh}rS(UrefurijSh]h]h]h]h]uhjSh]rShX+http://fedoraproject.org/wiki/Projects/MockrSrS}rS(hUhjSubahjubhX) creates chroots and builds packages in them. 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 rSrS}rS(hX) creates chroots and builds packages in them. 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 hjSubh)rS}rS(hX``root``h}rS(h]h]h]h]h]uhjSh]rShXrootrSrS}rS(hUhjSubahhubhX@ parameter. To use mock your buildbot user must be added to the rSrS}rS(hX@ parameter. To use mock your buildbot user must be added to the hjSubh)rS}rS(hX``mock``h}rS(h]h]h]h]h]uhjSh]rShXmockrSrS}rS(hUhjSubahhubhX group.rSrS}rS(hX group.hjSubeubj )rS}rS(hUhjShhhj#h}rS(h]h]h]h]h]Uentries]rS((UsingleXBuild Steps; MockBuildSRPMXstep-MockBuildSRPMrSjStrS(UsingleXMockBuildSRPM Build StepjSjStrSeuhM[ hhh]ubh)rS}rS(hUhjShhhhh}rS(h]h]h]h]h]hjSuhM[ hhh]ubeubh)rS}rS(hUhjQhhh}hhh}rS(h]h]h]h]rS(Umockbuildsrpm-steprSjSeh]rShEauhM] hhh}rSjSjSsh]rS(h)rS}rS(hXMockBuildSRPM SteprShjShhhhh}rS(h]h]h]h]h]uhM] hhh]rShXMockBuildSRPM SteprSrS}rS(hjShjSubaubh)rS}rS(hXmThe :bb:step:`MockBuildSRPM` step builds a SourceRPM based on a spec file and optionally a source directory::hjShhhhh}rS(h]h]h]h]h]uhM_ hhh]rS(hXThe rSrS}rT(hXThe hjSubh)rT}rT(hX:bb:step:`MockBuildSRPM`rThjShhhhh}rT(UreftypeXsteph͉hX MockBuildSRPMU refdomainXbbrTh]h]U refexplicith]h]h]hhuhM_ h]rTh)rT}rT(hjTh}r T(h]h]r T(hjTXbb-stepr Teh]h]h]uhjTh]r ThX MockBuildSRPMr TrT}rT(hUhjTubahhubaubhXP step builds a SourceRPM based on a spec file and optionally a source directory:rTrT}rT(hXP step builds a SourceRPM based on a spec file and optionally a source directory:hjSubeubj>)rT}rT(hXpfrom buildbot.steps.package.rpm import MockBuildSRPM f.addStep(MockBuildSRPM(root='default', spec='mypkg.spec'))hjShhhjAh}rT(jCjDh]h]h]h]h]uhMb hhh]rThXpfrom buildbot.steps.package.rpm import MockBuildSRPM f.addStep(MockBuildSRPM(root='default', spec='mypkg.spec'))rTrT}rT(hUhjTubaubh)rT}rT(hX'The step takes the following parametersrThjShhhhh}rT(h]h]h]h]h]uhMe hhh]rThX'The step takes the following parametersrTr T}r!T(hjThjTubaubj)r"T}r#T(hUhjShhhjh}r$T(h]h]h]h]h]uhNhhh]r%T(j)r&T}r'T(hXG``root`` Use chroot configuration defined in ``/etc/mock/.cfg``. hj"Thhhjh}r(T(h]h]h]h]h]uhMh h]r)T(j)r*T}r+T(hX``root``r,Thj&Thhhjh}r-T(h]h]h]h]h]uhMh h]r.Th)r/T}r0T(hj,Th}r1T(h]h]h]h]h]uhj*Th]r2ThXrootr3Tr4T}r5T(hUhj/Tubahhubaubj)r6T}r7T(hUh}r8T(h]h]h]h]h]uhj&Th]r9Th)r:T}r;T(hX=Use chroot configuration defined in ``/etc/mock/.cfg``.hj6Thhhhh}rTr?T}r@T(hX$Use chroot configuration defined in hj:Tubh)rAT}rBT(hX``/etc/mock/.cfg``h}rCT(h]h]h]h]h]uhj:Th]rDThX/etc/mock/.cfgrETrFT}rGT(hUhjATubahhubhX.rHT}rIT(hX.hj:Tubeubahjubeubj)rJT}rKT(hXQ``resultdir`` The directory where the logfiles and the SourceRPM are written to. hj"Thhhjh}rLT(h]h]h]h]h]uhMk hhh]rMT(j)rNT}rOT(hX ``resultdir``rPThjJThhhjh}rQT(h]h]h]h]h]uhMk h]rRTh)rST}rTT(hjPTh}rUT(h]h]h]h]h]uhjNTh]rVThX resultdirrWTrXT}rYT(hUhjSTubahhubaubj)rZT}r[T(hUh}r\T(h]h]h]h]h]uhjJTh]r]Th)r^T}r_T(hXBThe directory where the logfiles and the SourceRPM are written to.r`ThjZThhhhh}raT(h]h]h]h]h]uhMk h]rbThXBThe directory where the logfiles and the SourceRPM are written to.rcTrdT}reT(hj`Thj^Tubaubahjubeubj)rfT}rgT(hX2``spec`` Build the SourceRPM from this spec file. hj"Thhhjh}rhT(h]h]h]h]h]uhMn hhh]riT(j)rjT}rkT(hX``spec``rlThjfThhhjh}rmT(h]h]h]h]h]uhMn h]rnTh)roT}rpT(hjlTh}rqT(h]h]h]h]h]uhjjTh]rrThXspecrsTrtT}ruT(hUhjoTubahhubaubj)rvT}rwT(hUh}rxT(h]h]h]h]h]uhjfTh]ryTh)rzT}r{T(hX(Build the SourceRPM from this spec file.r|ThjvThhhhh}r}T(h]h]h]h]h]uhMn h]r~ThX(Build the SourceRPM from this spec file.rTrT}rT(hj|ThjzTubaubahjubeubj)rT}rT(hXO``sources`` Path to the directory containing the sources, defaulting to ``.``. hj"Thhhjh}rT(h]h]h]h]h]uhMq hhh]rT(j)rT}rT(hX ``sources``rThjThhhjh}rT(h]h]h]h]h]uhMq h]rTh)rT}rT(hjTh}rT(h]h]h]h]h]uhjTh]rThXsourcesrTrT}rT(hUhjTubahhubaubj)rT}rT(hUh}rT(h]h]h]h]h]uhjTh]rTh)rT}rT(hXBPath to the directory containing the sources, defaulting to ``.``.hjThhhhh}rT(h]h]h]h]h]uhMq h]rT(hX<Path to the directory containing the sources, defaulting to rTrT}rT(hX<Path to the directory containing the sources, defaulting to hjTubh)rT}rT(hX``.``h}rT(h]h]h]h]h]uhjTh]rThX.rT}rT(hUhjTubahhubhX.rT}rT(hX.hjTubeubahjubeubeubj )rT}rT(hUhjShhhj#h}rT(h]h]h]h]h]Uentries]rT((UsingleXBuild Steps; MockRebuildXstep-MockRebuildrTjTtrT(UsingleXMockRebuild Build StepjTjTtrTeuhMt hhh]ubh)rT}rT(hUhjShhhhh}rT(h]h]h]h]h]hjTuhMt hhh]ubeubh)rT}rT(hUhjQhhh}hhh}rT(h]h]h]h]rT(Umockrebuild-steprTjTeh]rThauhMv hhh}rTjTjTsh]rT(h)rT}rT(hXMockRebuild SteprThjThhhhh}rT(h]h]h]h]h]uhMv hhh]rThXMockRebuild SteprTrT}rT(hjThjTubaubh)rT}rT(hX>The :bb:step:`MockRebuild` step rebuilds a SourceRPM package::rThjThhhhh}rT(h]h]h]h]h]uhMx hhh]rT(hXThe rTrT}rT(hXThe hjTubh)rT}rT(hX:bb:step:`MockRebuild`rThjThhhhh}rT(UreftypeXsteph͉hX MockRebuildU refdomainXbbrTh]h]U refexplicith]h]h]hhuhMx h]rTh)rT}rT(hjTh}rT(h]h]rT(hjTXbb-steprTeh]h]h]uhjTh]rThX MockRebuildrTrT}rT(hUhjTubahhubaubhX# step rebuilds a SourceRPM package:rTrT}rT(hX# step rebuilds a SourceRPM package:hjTubeubj>)rT}rT(hXufrom buildbot.steps.package.rpm import MockRebuild f.addStep(MockRebuild(root='default', spec='mypkg-1.0-1.src.rpm'))hjThhhjAh}rT(jCjDh]h]h]h]h]uhMz hhh]rThXufrom buildbot.steps.package.rpm import MockRebuild f.addStep(MockRebuild(root='default', spec='mypkg-1.0-1.src.rpm'))rTrT}rT(hUhjTubaubh)rT}rT(hX'The step takes the following parametersrThjThhhhh}rT(h]h]h]h]h]uhM} hhh]rThX'The step takes the following parametersrTrT}rT(hjThjTubaubj)rT}rT(hUhjThhhjh}rT(h]h]h]h]h]uhNhhh]rT(j)rT}rT(hXH``root`` Uses chroot configuration defined in ``/etc/mock/.cfg``. hjThhhjh}rT(h]h]h]h]h]uhM h]rT(j)rT}rT(hX``root``rThjThhhjh}rT(h]h]h]h]h]uhM h]rTh)rT}rT(hjTh}rT(h]h]h]h]h]uhjTh]rThXrootrTrT}rT(hUhjTubahhubaubj)rT}rT(hUh}rT(h]h]h]h]h]uhjTh]rTh)rU}rU(hX>Uses chroot configuration defined in ``/etc/mock/.cfg``.hjThhhhh}rU(h]h]h]h]h]uhM h]rU(hX%Uses chroot configuration defined in rUrU}rU(hX%Uses chroot configuration defined in hjUubh)rU}rU(hX``/etc/mock/.cfg``h}r U(h]h]h]h]h]uhjUh]r UhX/etc/mock/.cfgr Ur U}r U(hUhjUubahhubhX.rU}rU(hX.hjUubeubahjubeubj)rU}rU(hXQ``resultdir`` The directory where the logfiles and the SourceRPM are written to. hjThhhjh}rU(h]h]h]h]h]uhM hhh]rU(j)rU}rU(hX ``resultdir``rUhjUhhhjh}rU(h]h]h]h]h]uhM h]rUh)rU}rU(hjUh}rU(h]h]h]h]h]uhjUh]rUhX resultdirrUrU}rU(hUhjUubahhubaubj)r U}r!U(hUh}r"U(h]h]h]h]h]uhjUh]r#Uh)r$U}r%U(hXBThe directory where the logfiles and the SourceRPM are written to.r&Uhj Uhhhhh}r'U(h]h]h]h]h]uhM h]r(UhXBThe directory where the logfiles and the SourceRPM are written to.r)Ur*U}r+U(hj&Uhj$Uubaubahjubeubj)r,U}r-U(hX/``srpm`` The path to the SourceRPM to rebuild. hjThhhjh}r.U(h]h]h]h]h]uhM hhh]r/U(j)r0U}r1U(hX``srpm``r2Uhj,Uhhhjh}r3U(h]h]h]h]h]uhM h]r4Uh)r5U}r6U(hj2Uh}r7U(h]h]h]h]h]uhj0Uh]r8UhXsrpmr9Ur:U}r;U(hUhj5Uubahhubaubj)rU(h]h]h]h]h]uhj,Uh]r?Uh)r@U}rAU(hX%The path to the SourceRPM to rebuild.rBUhj)rU}rU(hXTfrom buildbot.steps.package.deb.pbuilder import DebPbuilder f.addStep(DebPbuilder())hjaUhhhjAh}rU(jCjDh]h]h]h]h]uhM hhh]rUhXTfrom buildbot.steps.package.deb.pbuilder import DebPbuilder f.addStep(DebPbuilder())rUrU}rU(hUhjUubaubh)rU}rU(hX'The step takes the following parametersrUhjaUhhhhh}rU(h]h]h]h]h]uhM hhh]rUhX'The step takes the following parametersrUrU}rU(hjUhjUubaubj)rU}rU(hUhjaUhhhjh}rU(h]h]h]h]h]uhNhhh]rU(j)rU}rU(hX3``architecture`` Architecture to build chroot for. hjUhhhjh}rU(h]h]h]h]h]uhM h]rU(j)rU}rU(hX``architecture``rUhjUhhhjh}rU(h]h]h]h]h]uhM h]rUh)rU}rU(hjUh}rU(h]h]h]h]h]uhjUh]rUhX architecturerUrU}rU(hUhjUubahhubaubj)rU}rU(hUh}rU(h]h]h]h]h]uhjUh]rUh)rU}rU(hX!Architecture to build chroot for.rUhjUhhhhh}rU(h]h]h]h]h]uhM h]rUhX!Architecture to build chroot for.rUrU}rU(hjUhjUubaubahjubeubj)rU}rU(hXO``distribution`` Name, or nickname, of the distribution. Defaults to 'stable'. hjUhhhjh}rU(h]h]h]h]h]uhM hhh]rU(j)rU}rU(hX``distribution``rUhjUhhhjh}rU(h]h]h]h]h]uhM h]rUh)rU}rU(hjUh}rU(h]h]h]h]h]uhjUh]rUhX distributionrUrU}rU(hUhjUubahhubaubj)rU}rU(hUh}rU(h]h]h]h]h]uhjUh]rUh)rU}rU(hX=Name, or nickname, of the distribution. Defaults to 'stable'.rUhjUhhhhh}rU(h]h]h]h]h]uhM h]rUhX=Name, or nickname, of the distribution. Defaults to 'stable'.rUrU}rU(hjUhjUubaubahjubeubj)rU}rU(hX5``basetgz`` Path of the basetgz to use for building. hjUhhhjh}rU(h]h]h]h]h]uhM hhh]rU(j)rU}rU(hX ``basetgz``rUhjUhhhjh}rU(h]h]h]h]h]uhM h]rUh)rU}rU(hjUh}rU(h]h]h]h]h]uhjUh]rUhXbasetgzrVrV}rV(hUhjUubahhubaubj)rV}rV(hUh}rV(h]h]h]h]h]uhjUh]rVh)rV}rV(hX(Path of the basetgz to use for building.r VhjVhhhhh}r V(h]h]h]h]h]uhM h]r VhX(Path of the basetgz to use for building.r Vr V}rV(hj VhjVubaubahjubeubj)rV}rV(hXA``mirror`` URL of the mirror used to download the packages from. hjUhhhjh}rV(h]h]h]h]h]uhM hhh]rV(j)rV}rV(hX ``mirror``rVhjVhhhjh}rV(h]h]h]h]h]uhM h]rVh)rV}rV(hjVh}rV(h]h]h]h]h]uhjVh]rVhXmirrorrVrV}rV(hUhjVubahhubaubj)rV}r V(hUh}r!V(h]h]h]h]h]uhjVh]r"Vh)r#V}r$V(hX5URL of the mirror used to download the packages from.r%VhjVhhhhh}r&V(h]h]h]h]h]uhM h]r'VhX5URL of the mirror used to download the packages from.r(Vr)V}r*V(hj%Vhj#Vubaubahjubeubj)r+V}r,V(hXN``extrapackages`` List if packages to install in addition to the base system. hjUhhhjh}r-V(h]h]h]h]h]uhM hhh]r.V(j)r/V}r0V(hX``extrapackages``r1Vhj+Vhhhjh}r2V(h]h]h]h]h]uhM h]r3Vh)r4V}r5V(hj1Vh}r6V(h]h]h]h]h]uhj/Vh]r7VhX extrapackagesr8Vr9V}r:V(hUhj4Vubahhubaubj)r;V}rVh)r?V}r@V(hX;List if packages to install in addition to the base system.rAVhj;Vhhhhh}rBV(h]h]h]h]h]uhM h]rCVhX;List if packages to install in addition to the base system.rDVrEV}rFV(hjAVhj?Vubaubahjubeubj)rGV}rHV(hX``keyring`` Path to a gpg keyring to verify the downloaded packages. This is necessary if you build for a foreign distribution. hjUhhhjh}rIV(h]h]h]h]h]uhM hhh]rJV(j)rKV}rLV(hX ``keyring``rMVhjGVhhhjh}rNV(h]h]h]h]h]uhM h]rOVh)rPV}rQV(hjMVh}rRV(h]h]h]h]h]uhjKVh]rSVhXkeyringrTVrUV}rVV(hUhjPVubahhubaubj)rWV}rXV(hUh}rYV(h]h]h]h]h]uhjGVh]rZVh)r[V}r\V(hXsPath to a gpg keyring to verify the downloaded packages. This is necessary if you build for a foreign distribution.r]VhjWVhhhhh}r^V(h]h]h]h]h]uhM h]r_VhXsPath to a gpg keyring to verify the downloaded packages. This is necessary if you build for a foreign distribution.r`VraV}rbV(hj]Vhj[Vubaubahjubeubj)rcV}rdV(hX6``components`` Repos to activate for chroot building. hjUhhhjh}reV(h]h]h]h]h]uhM hhh]rfV(j)rgV}rhV(hX``components``riVhjcVhhhjh}rjV(h]h]h]h]h]uhM h]rkVh)rlV}rmV(hjiVh}rnV(h]h]h]h]h]uhjgVh]roVhX componentsrpVrqV}rrV(hUhjlVubahhubaubj)rsV}rtV(hUh}ruV(h]h]h]h]h]uhjcVh]rvVh)rwV}rxV(hX&Repos to activate for chroot building.ryVhjsVhhhhh}rzV(h]h]h]h]h]uhM h]r{VhX&Repos to activate for chroot building.r|Vr}V}r~V(hjyVhjwVubaubahjubeubeubj )rV}rV(hUhjaUhhhj#h}rV(h]h]h]h]h]Uentries]rV((UsingleXBuild Steps; DebCowbuilderXstep-DebCowbuilderrVjVtrV(UsingleXDebCowbuilder Build StepjVjVtrVeuhM hhh]ubh)rV}rV(hUhjaUhhhhh}rV(h]h]h]h]h]hjVuhM hhh]ubeubh)rV}rV(hUhjHUhhh}hhh}rV(h]h]h]h]rV(U debcowbuilderrVjVeh]rVhxauhM hhh}rVjVjVsh]rV(h)rV}rV(hX DebCowbuilderrVhjVhhhhh}rV(h]h]h]h]h]uhM hhh]rVhX DebCowbuilderrVrV}rV(hjVhjVubaubh)rV}rV(hXtThe :bb:step:`DebCowbuilder` step is a subclass of :bb:step:`DebPbuilder`, which use cowbuilder instead of pbuilder.hjVhhhhh}rV(h]h]h]h]h]uhM hhh]rV(hXThe rVrV}rV(hXThe hjVubh)rV}rV(hX:bb:step:`DebCowbuilder`rVhjVhhhhh}rV(UreftypeXsteph͉hX DebCowbuilderU refdomainXbbrVh]h]U refexplicith]h]h]hhuhM h]rVh)rV}rV(hjVh}rV(h]h]rV(hjVXbb-steprVeh]h]h]uhjVh]rVhX DebCowbuilderrVrV}rV(hUhjVubahhubaubhX step is a subclass of rVrV}rV(hX step is a subclass of hjVubh)rV}rV(hX:bb:step:`DebPbuilder`rVhjVhhhhh}rV(UreftypeXsteph͉hX DebPbuilderU refdomainXbbrVh]h]U refexplicith]h]h]hhuhM h]rVh)rV}rV(hjVh}rV(h]h]rV(hjVXbb-steprVeh]h]h]uhjVh]rVhX DebPbuilderrVrV}rV(hUhjVubahhubaubhX+, which use cowbuilder instead of pbuilder.rVrV}rV(hX+, which use cowbuilder instead of pbuilder.hjVubeubj )rV}rV(hUhjVhhhj#h}rV(h]h]h]h]h]Uentries]rV((UsingleXBuild Steps; DebLintianXstep-DebLintianrVjVtrV(UsingleXDebLintian Build StepjVjVtrVeuhM hhh]ubh)rV}rV(hUhjVhhhhh}rV(h]h]h]h]h]hjVuhM hhh]ubeubh)rV}rV(hUhjHUhhh}hhh}rV(h]h]h]h]rV(U deblintianrVjVeh]rVhauhM hhh}rVjVjVsh]rV(h)rV}rV(hX DebLintianrVhjVhhhhh}rV(h]h]h]h]h]uhM hhh]rVhX DebLintianrVrV}rV(hjVhjVubaubh)rV}rV(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``hjVhhhhh}rV(h]h]h]h]h]uhM hhh]rV(hXThe rVrV}rV(hXThe hjVubh)rV}rV(hX:bb:step:`DebLintian`rVhjVhhhhh}rV(UreftypeXsteph͉hX DebLintianU refdomainXbbrVh]h]U refexplicith]h]h]hhuhM h]rVh)rV}rV(hjVh}rV(h]h]rV(hjVXbb-steprVeh]h]h]uhjVh]rVhX DebLintianrVrV}rV(hUhjVubahhubaubhXo step checks a build .deb for bugs and policy violations. The packages or changes file to test is specified in rVrV}rV(hXo step checks a build .deb for bugs and policy violations. The packages or changes file to test is specified in hjVubh)rV}rV(hX ``fileloc``h}rV(h]h]h]h]h]uhjVh]rVhXfilelocrVrV}rV(hUhjVubahhubeubj>)rV}rV(hX|from buildbot.steps.package.deb.lintian import DebLintian f.addStep(DebLintian(fileloc=Interpolate("%(prop:deb-changes)s")))hjVhhhjAh}rW(jCjDh]h]h]h]h]uhM hhh]rWhX|from buildbot.steps.package.deb.lintian import DebLintian f.addStep(DebLintian(fileloc=Interpolate("%(prop:deb-changes)s")))rWrW}rW(hUhjVubaubeubeubh)rW}rW(hUhhhhhhh}rW(h]h]h]h]rWUmiscellaneous-buildstepsr Wah]r Wh'auhM hhh]r W(h)r W}r W(hXMiscellaneous BuildStepsrWhjWhhhhh}rW(h]h]h]h]h]uhM hhh]rWhXMiscellaneous BuildStepsrWrW}rW(hjWhj Wubaubh)rW}rW(hX;A number of steps do not fall into any particular category.rWhjWhhhhh}rW(h]h]h]h]h]uhM hhh]rWhX;A number of steps do not fall into any particular category.rWrW}rW(hjWhjWubaubj )rW}rW(hUhjWhhhj#h}rW(h]h]h]h]h]Uentries]rW((UsingleXBuild Steps; HLintX step-HLintr Wj Wtr!W(UsingleXHLint Build Stepj Wj Wtr"WeuhM hhh]ubh)r#W}r$W(hUhjWhhhhh}r%W(h]h]h]h]h]hj WuhM hhh]ubh)r&W}r'W(hUhjWhhh}hhh}r(W(h]h]h]h]r)W(Uhlintr*Wj Weh]r+WhIauhM hhh}r,Wj Wj#Wsh]r-W(h)r.W}r/W(hXHLintr0Whj&Whhhhh}r1W(h]h]h]h]h]uhM hhh]r2WhXHLintr3Wr4W}r5W(hj0Whj.Wubaubh)r6W}r7W(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.hj&Whhhhh}r8W(h]h]h]h]h]uhM hhh]r9W(hXThe r:Wr;W}rW(hX:bb:step:`HLint`r?Whj6Whhhhh}r@W(UreftypeXsteph͉hXHLintU refdomainXbbrAWh]h]U refexplicith]h]h]hhuhM h]rBWh)rCW}rDW(hj?Wh}rEW(h]h]rFW(hjAWXbb-steprGWeh]h]h]uhj=Wh]rHWhXHLintrIWrJW}rKW(hUhjCWubahhubaubhX; step runs Twisted Lore, a lint-like checker over a set of rLWrMW}rNW(hX; step runs Twisted Lore, a lint-like checker over a set of hj6Wubh)rOW}rPW(hX ``.xhtml``h}rQW(h]h]h]h]h]uhj6Wh]rRWhX.xhtmlrSWrTW}rUW(hUhjOWubahhubhXT files. Any deviations from recommended style is flagged and put in the output log.rVWrWW}rXW(hXT files. Any deviations from recommended style is flagged and put in the output log.hj6Wubeubh)rYW}rZW(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.hj&Whhhhh}r[W(h]h]h]h]h]uhM hhh]r\W(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 r]Wr^W}r_W(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 hjYWubh)r`W}raW(hX ``.xhtml``h}rbW(h]h]h]h]h]uhjYWh]rcWhX.xhtmlrdWreW}rfW(hUhj`WubahhubhX files in the top-level rgWrhW}riW(hX files in the top-level hjYWubh)rjW}rkW(hX ``sandbox/``h}rlW(h]h]h]h]h]uhjYWh]rmWhXsandbox/rnWroW}rpW(hUhjjWubahhubhX directory.rqWrrW}rsW(hX directory.hjYWubeubh)rtW}ruW(hXvThe step takes a single, optional, parameter: ``python``. This specifies the Python executable to use to run Lore. ::hj&Whhhhh}rvW(h]h]h]h]h]uhM hhh]rwW(hX.The step takes a single, optional, parameter: rxWryW}rzW(hX.The step takes a single, optional, parameter: hjtWubh)r{W}r|W(hX ``python``h}r}W(h]h]h]h]h]uhjtWh]r~WhXpythonrWrW}rW(hUhj{WubahhubhX;. This specifies the Python executable to use to run Lore.rWrW}rW(hX;. This specifies the Python executable to use to run Lore.hjtWubeubj>)rW}rW(hXBfrom buildbot.steps.python_twisted import HLint f.addStep(HLint())hj&WhhhjAh}rW(jCjDh]h]h]h]h]uhM hhh]rWhXBfrom buildbot.steps.python_twisted import HLint f.addStep(HLint())rWrW}rW(hUhjWubaubeubh)rW}rW(hUhjWhhhhh}rW(h]h]h]h]rWUmaxqrWah]rWhoauhM hhh]rW(h)rW}rW(hXMaxQrWhjWhhhhh}rW(h]h]h]h]h]uhM hhh]rWhXMaxQrWrW}rW(hjWhjWubaubj )rW}rW(hUhjWhhhj#h}rW(h]h]h]h]h]Uentries]rW((UsingleXBuild Steps; MaxQX step-MaxQrWjWtrW(UsingleXMaxQ Build StepjWjWtrWeuhM hhh]ubh)rW}rW(hUhjWhhhhh}rW(h]h]h]h]h]hjWuhM hhh]ubh)rW}rW(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. ::hjWhhh}hhh}rW(h]h]h]h]rWjWah]uhM hhh}rWjWjWsh]rW(hXMaxQ (rWrW}rW(hXMaxQ (hjWubj)rW}rW(hXhttp://maxq.tigris.org/rWh}rW(UrefurijWh]h]h]h]h]uhjWh]rWhXhttp://maxq.tigris.org/rWrW}rW(hUhjWubahjubhXY) is a web testing tool that allows you to record HTTP sessions and play them back. The rWrW}rW(hXY) is a web testing tool that allows you to record HTTP sessions and play them back. The hjWubh)rW}rW(hX:bb:step:`MaxQ`rWhjWhhhhh}rW(UreftypeXsteph͉hXMaxQU refdomainXbbrWh]h]U refexplicith]h]h]hhuhM h]rWh)rW}rW(hjWh}rW(h]h]rW(hjWXbb-steprWeh]h]h]uhjWh]rWhXMaxQrWrW}rW(hUhjWubahhubaubhX step runs this framework.rWrW}rW(hX step runs this framework.hjWubeubj>)rW}rW(hXFfrom buildbot.steps.maxq import MaxQ f.addStep(MaxQ(testdir='tests/'))hjWhhhjAh}rW(jCjDh]h]h]h]h]uhM hhh]rWhXFfrom buildbot.steps.maxq import MaxQ f.addStep(MaxQ(testdir='tests/'))rWrW}rW(hUhjWubaubh)rW}rW(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.hjWhhhhh}rW(h]h]h]h]h]uhM hhh]rW(hXThe single argument, rWrW}rW(hXThe single argument, hjWubh)rW}rW(hX ``testdir``h}rW(h]h]h]h]h]uhjWh]rWhXtestdirrWrW}rW(hUhjWubahhubhXP, specifies where the tests should be run. This directory will be passed to the rWrW}rW(hXP, specifies where the tests should be run. This directory will be passed to the hjWubh)rW}rW(hX``run_maxq.py``h}rW(h]h]h]h]h]uhjWh]rWhX run_maxq.pyrWrW}rW(hUhjWubahhubhX# command, and the results analyzed.rWrW}rW(hX# command, and the results analyzed.hjWubeubeubeubeubhhh}rWh.jshhh}rW(h]h]h]h]rW(Xmodule-buildbot.steps.sourcerWUid2rWjeh]rW(hHh.euhKhhh}rWjjsh]rW(h)rW}rW(hXSource CheckoutrWhhhhhhh}rW(h]h]h]h]h]uhKhhh]rWhXSource CheckoutrWrW}rW(hjWhjWubaubj )rW}rW(hUhhhhhj#h}rW(h]h]h]h]h]Uentries]rX(j'Xbuildbot.steps.source (module)Xmodule-buildbot.steps.sourceUtrXauhKhhh]ubh)rX}rX(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}rX(h]h]h]h]h]uhKhhh]rX(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 (rXrX}rX(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 (hjXubh)r X}r X(hX!:ref:`Source-Checkout-Slave-Side`r XhjXhhhhh}r X(UreftypeXrefh͈hXsource-checkout-slave-sideU refdomainXstdr Xh]h]U refexplicith]h]h]hhuhKh]rXjq)rX}rX(hj Xh}rX(h]h]rX(hj XXstd-refrXeh]h]h]uhj Xh]rXhXSource-Checkout-Slave-SiderXrX}rX(hUhjXubahj{ubaubhXc) handles the logic on the slave side, and some of the classes have a bewildering array of options.rXrX}rX(hXc) handles the logic on the slave side, and some of the classes have a bewildering array of options.hjXubeubcdocutils.nodes caution rX)rX}rX(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 GithhhhhUcautionrXh}rX(h]h]h]h]h]uhNhhh]r X(h)r!X}r"X(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`.hjXhhhhh}r#X(h]h]h]h]h]uhKh]r$X(hX|Master-side source checkout steps are recently developed and not stable yet. If you find any bugs please report them on the r%Xr&X}r'X(hX|Master-side source checkout steps are recently developed and not stable yet. If you find any bugs please report them on the hj!Xubj)r(X}r)X(hX5`Buildbot Trac `_h}r*X(UnameX Buildbot TracjX"http://trac.buildbot.net/newticketr+Xh]h]h]h]h]uhj!Xh]r,XhX Buildbot Tracr-Xr.X}r/X(hUhj(Xubahjubh)r0X}r1X(hX% hKhj!Xhhh}r2X(Urefurij+Xh]r3XU buildbot-tracr4Xah]h]h]h]r5Xhauh]ubhX2. The older Slave-side described source steps are r6Xr7X}r8X(hX2. The older Slave-side described source steps are hj!Xubh)r9X}r:X(hX!:ref:`Source-Checkout-Slave-Side`r;Xhj!Xhhhhh}rXjq)r?X}r@X(hj;Xh}rAX(h]h]rBX(hj=XXstd-refrCXeh]h]h]uhj9Xh]rDXhXSource-Checkout-Slave-SiderEXrFX}rGX(hUhj?Xubahj{ubaubhX.rHX}rIX(hX.hj!Xubeubh)rJX}rKX(hX-The old source steps are imported like this::hjXhhhhh}rLX(h]h]h]h]h]uhKh]rMXhX,The old source steps are imported like this:rNXrOX}rPX(hX,The old source steps are imported like this:hjJXubaubj>)rQX}rRX(hX%from buildbot.steps.source import GithjXhjAh}rSX(jCjDh]h]h]h]h]uhKh]rTXhX%from buildbot.steps.source import GitrUXrVX}rWX(hUhjQXubaubh)rXX}rYX(hXXwhile new source steps are in separate source-packages for each version-control system::hjXhhhhh}rZX(h]h]h]h]h]uhKh]r[XhXWwhile new source steps are in separate source-packages for each version-control system:r\Xr]X}r^X(hXWwhile new source steps are in separate source-packages for each version-control system:hjXXubaubj>)r_X}r`X(hX)from buildbot.steps.source.git import GithjXhjAh}raX(jCjDh]h]h]h]h]uhKh]rbXhX)from buildbot.steps.source.git import GitrcXrdX}reX(hUhj_Xubaubeubh)rfX}rgX(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.rhXhhhhhhh}riX(h]h]h]h]h]uhKhhh]rjXhXNew 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.rkXrlX}rmX(hjhXhjfXubaubh)rnX}roX(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.rpXhhhhhhh}rqX(h]h]h]h]h]uhKhhh]rrXhXSome 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.rsXrtX}ruX(hjpXhjnXubaubhjIjDj?j:j5j+j eubhhhhh}rvX(h]rwXj8ah]h]h]rxXUid3ryXah]uhKhhh]rzX(h)r{X}r|X(hXCommon Parametersr}Xhhhhhhh}r~X(h]h]h]h]h]uhKhhh]rXhXCommon ParametersrXrX}rX(hj}Xhj{Xubaubh)rX}rX(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.rXhhhhhhh}rX(h]h]h]h]h]uhKhhh]rXhXAll 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.rXrX}rX(hjXhjXubaubh)rX}rX(hX``mode`` ``method``hhhhhhh}rX(h]h]h]h]h]uhKhhh]rX(h)rX}rX(hX``mode``h}rX(h]h]h]h]h]uhjXh]rXhXmoderXrX}rX(hUhjXubahhubhX rX}rX(hX hjXubh)rX}rX(hX ``method``h}rX(h]h]h]h]h]uhjXh]rXhXmethodrXrX}rX(hUhjXubahhubeubjc)rX}rX(hUhhhhhjfh}rX(h]h]h]h]h]uhNhhh]rX(h)rX}rX(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. ::hjXhhhhh}rX(h]h]h]h]h]uhKh]rX(hXKThese two parameters specify the means by which the source is checked out. rXrX}rX(hXKThese two parameters specify the means by which the source is checked out. hjXubh)rX}rX(hX``mode``h}rX(h]h]h]h]h]uhjXh]rXhXmoderXrX}rX(hUhjXubahhubhX$ specifies the type of checkout and rXrX}rX(hX$ specifies the type of checkout and hjXubh)rX}rX(hX ``method``h}rX(h]h]h]h]h]uhjXh]rXhXmethodrXrX}rX(hUhjXubahhubhX% tells about the way to implement it.rXrX}rX(hX% tells about the way to implement it.hjXubeubj>)rX}rX(hXfactory = BuildFactory() from buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh'))hjXhjAh}rX(jCjDh]h]h]h]h]uhKh]rXhXfactory = BuildFactory() from buildbot.steps.source.mercurial import Mercurial factory.addStep(Mercurial(repourl='path/to/repo', mode='full', method='fresh'))rXrX}rX(hUhjXubaubh)rX}rX(hXThe ``mode`` parameter a string describing the kind of VC operation that is desired, defaulting to ``incremental``. The options arehjXhhhhh}rX(h]h]h]h]h]uhKh]rX(hXThe rXrX}rX(hXThe hjXubh)rX}rX(hX``mode``h}rX(h]h]h]h]h]uhjXh]rXhXmoderXrX}rX(hUhjXubahhubhXW parameter a string describing the kind of VC operation that is desired, defaulting to rXrX}rX(hXW parameter a string describing the kind of VC operation that is desired, defaulting to hjXubh)rX}rX(hX``incremental``h}rX(h]h]h]h]h]uhjXh]rXhX incrementalrXrX}rX(hUhjXubahhubhX. The options arerXrX}rX(hX. The options arehjXubeubj)rX}rX(hUh}rX(h]h]h]h]h]uhjXh]rX(j)rX}rX(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. hjXhhhjh}rX(h]h]h]h]h]uhKh]rX(j)rX}rX(hX``incremental``rXhjXhhhjh}rX(h]h]h]h]h]uhKh]rXh)rX}rX(hjXh}rX(h]h]h]h]h]uhjXh]rXhX incrementalrXrX}rX(hUhjXubahhubaubj)rX}rX(hUh}rX(h]h]h]h]h]uhjXh]rXh)rX}rX(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.hjXhhhhh}rX(h]h]h]h]h]uhKh]rX(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 rXrX}rX(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 hjXubh)rX}rY(hX ``update``h}rY(h]h]h]h]h]uhjXh]rYhXupdaterYrY}rY(hUhjXubahhubhX mode.rYrY}rY(hX mode.hjXubeubahjubeubj)r Y}r Y(hX``full`` Update the source, but delete remnants of previous builds. Build steps that follow will need to regenerate all object files. hjXhhhjh}r Y(h]h]h]h]h]uhKh]r Y(j)r Y}rY(hX``full``rYhj Yhhhjh}rY(h]h]h]h]h]uhKh]rYh)rY}rY(hjYh}rY(h]h]h]h]h]uhj Yh]rYhXfullrYrY}rY(hUhjYubahhubaubj)rY}rY(hUh}rY(h]h]h]h]h]uhj Yh]rYh)rY}rY(hX}Update the source, but delete remnants of previous builds. Build steps that follow will need to regenerate all object files.rYhjYhhhhh}r Y(h]h]h]h]h]uhKh]r!YhX}Update the source, but delete remnants of previous builds. Build steps that follow will need to regenerate all object files.r"Yr#Y}r$Y(hjYhjYubaubahjubeubehjubh)r%Y}r&Y(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'YhjXhhhhh}r(Y(h]h]h]h]h]uhKh]r)YhXMethods 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*Yr+Y}r,Y(hj'Yhj%Yubaubeubj)r-Y}r.Y(hUhhhhhjh}r/Y(h]h]h]h]h]uhNhhh]r0Y(j)r1Y}r2Y(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). hj-Yhhhjh}r3Y(h]h]h]h]h]uhKh]r4Y(j)r5Y}r6Y(hX ``workdir``r7Yhj1Yhhhjh}r8Y(h]h]h]h]h]uhKh]r9Yh)r:Y}r;Y(hj7Yh}rYr?Y}r@Y(hUhj:Yubahhubaubj)rAY}rBY(hUh}rCY(h]h]h]h]h]uhj1Yh]rDYh)rEY}rFY(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).rGYhjAYhhhhh}rHY(h]h]h]h]h]uhKh]rIYhXlike 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).rJYrKY}rLY(hjGYhjEYubaubahjubeubj)rMY}rNY(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. hj-Yhhhjh}rOY(h]h]h]h]h]uhKhhh]rPY(j)rQY}rRY(hX``alwaysUseLatest``rSYhjMYhhhjh}rTY(h]h]h]h]h]uhKh]rUYh)rVY}rWY(hjSYh}rXY(h]h]h]h]h]uhjQYh]rYYhXalwaysUseLatestrZYr[Y}r\Y(hUhjVYubahhubaubj)r]Y}r^Y(hUh}r_Y(h]h]h]h]h]uhjMYh]r`Yh)raY}rbY(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.rcYhj]Yhhhhh}rdY(h]h]h]h]h]uhKh]reYhXif 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.rfYrgY}rhY(hjcYhjaYubaubahjubeubj)riY}rjY(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-Yhhhjh}rkY(h]h]h]h]h]uhKhhh]rlY(j)rmY}rnY(hX ``retry``roYhjiYhhhjh}rpY(h]h]h]h]h]uhKh]rqYh)rrY}rsY(hjoYh}rtY(h]h]h]h]h]uhjmYh]ruYhXretryrvYrwY}rxY(hUhjrYubahhubaubj)ryY}rzY(hUh}r{Y(h]h]h]h]h]uhjiYh]r|Yh)r}Y}r~Y(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.hjyYhhhhh}rY(h]h]h]h]h]uhKh]rY(hX"If set, this specifies a tuple of rYrY}rY(hX"If set, this specifies a tuple of hj}Yubh)rY}rY(hX``(delay, repeats)``h}rY(h]h]h]h]h]uhj}Yh]rYhX(delay, repeats)rYrY}rY(hUhjYubahhubhXL which means that when a full VC checkout fails, it should be retried up to rYrY}rY(hXL which means that when a full VC checkout fails, it should be retried up to hj}Yubh)rY}rY(hX ``repeats``h}rY(h]h]h]h]h]uhj}Yh]rYhXrepeatsrYrY}rY(hUhjYubahhubhX times, waiting rYrY}rY(hX times, waiting hj}Yubh)rY}rY(hX ``delay``h}rY(h]h]h]h]h]uhj}Yh]rYhXdelayrYrY}rY(hUhjYubahhubhXE seconds between attempts. If you don't provide this, it defaults to rYrY}rY(hXE seconds between attempts. If you don't provide this, it defaults to hj}Yubh)rY}rY(hX``None``h}rY(h]h]h]h]h]uhj}Yh]rYhXNonerYrY}rY(hUhjYubahhubhX, which means VC operations should not be retried. This is provided to make life easier for buildslaves which are stuck behind poor network connections.rYrY}rY(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}Yubeubahjubeubj)rY}rY(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. hj-Yhhhjh}rY(h]h]h]h]h]uhKhhh]rY(j)rY}rY(hX``repository``rYhjYhhhjh}rY(h]h]h]h]h]uhKh]rYh)rY}rY(hjYh}rY(h]h]h]h]h]uhjYh]rYhX repositoryrYrY}rY(hUhjYubahhubaubj)rY}rY(hUh}rY(h]h]h]h]h]uhjYh]rY(h)rY}rY(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).hjYhhhhh}rY(h]h]h]h]h]uhKh]rY(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 rYrY}rY(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 hjYubh)rY}rY(hX ``repourl``h}rY(h]h]h]h]h]uhjYh]rYhXrepourlrYrY}rY(hUhjYubahhubhX as well as for rYrY}rY(hX as well as for hjYubh)rY}rY(hX ``baseURL``h}rY(h]h]h]h]h]uhjYh]rYhXbaseURLrYrY}rY(hUhjYubahhubhX (when applicable).rYrY}rY(hX (when applicable).hjYubeubh)rY}rY(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.hjYhhhhh}rY(h]h]h]h]h]uhKh]rY(hXA common idiom is to pass rYrY}rY(hXA common idiom is to pass hjYubh)rY}rY(hX5``Property('repository', 'url://default/repo/path')``h}rY(h]h]h]h]h]uhjYh]rYhX1Property('repository', 'url://default/repo/path')rYrY}rY(hUhjYubahhubhX 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 rYrY}rY(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 hjYubh)rY}rY(hX:class:`WebStatus`rYhjYhhhhh}rY(UreftypeXclassh͉hX WebStatusU refdomainXpyrYh]h]U refexplicith]h]h]hhhNhj|uhKh]rYh)rY}rY(hjYh}rY(h]h]rY(hjYXpy-classrYeh]h]h]uhjYh]rYhX WebStatusrYrY}rY(hUhjYubahhubaubhXY change hooks enabled; as the buildslave will download code from an arbitrary repository.rYrY}rY(hXY change hooks enabled; as the buildslave will download code from an arbitrary repository.hjYubeubehjubeubj)rY}rY(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. hj-Yhhhjh}rZ(h]h]h]h]h]uhKhhh]rZ(j)rZ}rZ(hX ``codebase``rZhjYhhhjh}rZ(h]h]h]h]h]uhKh]rZh)rZ}rZ(hjZh}r Z(h]h]h]h]h]uhjZh]r ZhXcodebaser Zr Z}r Z(hUhjZubahhubaubj)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjYh]rZh)rZ}rZ(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.hjZhhhhh}rZ(h]h]h]h]h]uhKh]rZ(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 rZrZ}rZ(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 hjZubh)rZ}rZ(hX:bb:cfg:`codebaseGenerator`rZhjZhhhhh}rZ(UreftypeXcfgh͉hXcodebaseGeneratorU refdomainXbbrZh]h]U refexplicith]h]h]hhuhKh]rZh)rZ}r Z(hjZh}r!Z(h]h]r"Z(hjZXbb-cfgr#Zeh]h]h]uhjZh]r$ZhXcodebaseGeneratorr%Zr&Z}r'Z(hUhjZubahhubaubhX. 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.r(Zr)Z}r*Z(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.hjZubeubahjubeubj)r+Z}r,Z(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-Yhhhjh}r-Z(h]h]h]h]h]uhKhhh]r.Z(j)r/Z}r0Z(hX ``timeout``r1Zhj+Zhhhjh}r2Z(h]h]h]h]h]uhKh]r3Zh)r4Z}r5Z(hj1Zh}r6Z(h]h]h]h]h]uhj/Zh]r7ZhXtimeoutr8Zr9Z}r:Z(hUhj4Zubahhubaubj)r;Z}rZh)r?Z}r@Z(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).rAZhj;Zhhhhh}rBZ(h]h]h]h]h]uhKh]rCZhXSpecifies 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).rDZrEZ}rFZ(hjAZhj?Zubaubahjubeubj)rGZ}rHZ(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-Yhhhjh}rIZ(h]h]h]h]h]uhKhhh]rJZ(j)rKZ}rLZ(hX``logEnviron``rMZhjGZhhhjh}rNZ(h]h]h]h]h]uhKh]rOZh)rPZ}rQZ(hjMZh}rRZ(h]h]h]h]h]uhjKZh]rSZhX logEnvironrTZrUZ}rVZ(hUhjPZubahhubaubj)rWZ}rXZ(hUh}rYZ(h]h]h]h]h]uhjGZh]rZZh)r[Z}r\Z(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.r]ZhjWZhhhhh}r^Z(h]h]h]h]h]uhKh]r_ZhXIf 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.r`ZraZ}rbZ(hj]Zhj[Zubaubahjubeubj)rcZ}rdZ(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`. hj-Yhhhjh}reZ(h]h]h]h]h]uhKhhh]rfZ(j)rgZ}rhZ(hX``env``riZhjcZhhhjh}rjZ(h]h]h]h]h]uhKh]rkZh)rlZ}rmZ(hjiZh}rnZ(h]h]h]h]h]uhjgZh]roZhXenvrpZrqZ}rrZ(hUhjlZubahhubaubj)rsZ}rtZ(hUh}ruZ(h]h]h]h]h]uhjcZh]rvZh)rwZ}rxZ(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`.hjsZhhhhh}ryZ(h]h]h]h]h]uhKh]rzZ(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 r{Zr|Z}r}Z(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 hjwZubh)r~Z}rZ(hX:ref:`Properties`rZhjwZhhhhh}rZ(UreftypeXrefh͈hX propertiesU refdomainXstdrZh]h]U refexplicith]h]h]hhuhKh]rZjq)rZ}rZ(hjZh}rZ(h]h]rZ(hjZXstd-refrZeh]h]h]uhj~Zh]rZhX PropertiesrZrZ}rZ(hUhjZubahj{ubaubhX.rZ}rZ(hX.hjwZubeubahjubeubeubj )rZ}rZ(hUhhhhhj#h}rZ(h]h]h]h]h]Uentries]rZ((UsingleXBuild Steps; MercurialjQjQtrZ(UsingleXMercurial Build StepjQjQtrZeuhKhhh]ubjRjLeubhhhUsystem_messagerZh}rZ(h]UlevelKh]h]rZjyXaUsourcehh]h]UlineKUtypeUINFOrZuhKhhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhhh]rZhX4Duplicate implicit target name: "common parameters".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhjIhhhjZh}rZ(h]UlevelKh]h]rZjaUsourcehh]h]UlineKUtypejZuhMhhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX,Duplicate implicit target name: "mercurial".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhjDhhhjZh}rZ(h]UlevelKh]h]rZjaUsourcehh]h]UlineKUtypejZuhMGhhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX&Duplicate implicit target name: "git".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhj:hhhjZh}rZ(h]UlevelKh]h]rZj[aUsourcehh]h]UlineKUtypejZuhMAhhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX&Duplicate implicit target name: "cvs".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhj hhhjZh}rZ(h]UlevelKh]h]rZjaUsourcehh]h]UlineKUtypejZuhMhhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX'Duplicate implicit target name: "repo".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhj3hhhjZh}rZ(h]UlevelKh]h]rZjiaUsourcehh]h]UlineKUtypejZuhMhhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX&Duplicate explicit target name: "cvs".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhjhhhjZh}rZ(h]UlevelKh]h]rZj aUsourcehh]h]UlineKUtypejZuhM@hhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX-Duplicate explicit target name: "subversion".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhj#hhhjZh}rZ(h]UlevelKh]h]rZj#aUsourcehh]h]UlineKUtypejZuhMhhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX,Duplicate explicit target name: "mercurial".rZrZ}rZ(hUhjZubahhubaubh)rZ}rZ(hUhj%hhhjZh}rZ(h]UlevelKh]h]rZj*&aUsourcehh]h]UlineKUtypejZuhM hhh]rZh)rZ}rZ(hUh}rZ(h]h]h]h]h]uhjZh]rZhX+Duplicate explicit target name: "perforce".rZrZ}r[(hUhjZubahhubaubh)r[}r[(hUhj'hhhjZh}r[(h]UlevelKh]h]r[j'aUsourcehh]h]UlineKUtypejZuhM=hhh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r [hX&Duplicate explicit target name: "git".r [r [}r [(hUhj[ubahhubaubh)r [}r[(hUhj*hhhjZh}r[(h]UlevelKh]h]r[jn*aUsourcehh]h]UlineKUtypejZuhMhhh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj [h]r[hX'Duplicate explicit target name: "repo".r[r[}r[(hUhj[ubahhubaubh)r[}r[(hUhjC@hhhjZh}r[(h]UlevelKh]h]r[j@aUsourcehh]h]UlineKUtypejZuhMhhh]r[h)r[}r[(hUh}r [(h]h]h]h]h]uhj[h]r![hX+Duplicate implicit target name: "pyflakes".r"[r#[}r$[(hUhj[ubahhubaubh)r%[}r&[(hUhjAhhhjZh}r'[(h]UlevelKh]h]r([jcAaUsourcehh]h]UlineKUtypejZuhMhhh]r)[h)r*[}r+[(hUh}r,[(h]h]h]h]h]uhj%[h]r-[hX)Duplicate implicit target name: "sphinx".r.[r/[}r0[(hUhj*[ubahhubaubeUcurrent_sourcer1[NU decorationr2[NUautofootnote_startr3[KUnameidsr4[}r5[(hjq?hj86hj4Xh jh jQh h h j>h h hjOhj/hjOhjtAhj>hj hj8hjVhhhj=hhhj>hjOhj4=hjhjGhhhhh jAh!h!h"j"h#jh$j=h%j,h&jC:h'j Wh(h(h)h)h*jLUh+h+h,h,h-j,h.jh/j%h0j-=h1j{)h2jMh3jOh4j'h5h5h6j;Sh7j/Mh8h8h9j=h:jh;j(,hj1h?h?h@h@hAhAhBj%hCj=ChDj>hEjShFj-?hGj*hHjWhIj*WhJjLhKjFhLjhMhMhNjW3hOj&?hPjhQjBhRjHhSNhThThUhUhVhVhWjBhXj/hYj"hZhZh[jMh\j[h]j3h^j6Ch_jeUh`jhaj7JhbjHhcj>hdj~KhejP hfj@hgjQhhhhij9hjj1hkjMhlhlhmhmhnjA@hojWhpj9hqjEhrj+hsjhththuhuhvhvhwjShxjVhyj)hzjT h{h{h|h|h}jcAh~j3hj@hj#hjThj6Mhj?hhuh]r6[(hhehUU transformerr7[NU footnote_refsr8[}r9[Urefnamesr:[}r;[Usymbol_footnotesr<[]r=[Uautofootnote_refsr>[]r?[Usymbol_footnote_refsr@[]rA[U citationsrB[]rC[hhU current_linerD[NUtransform_messagesrE[]rF[(h)rG[}rH[(hUh}rI[(h]UlevelKh]h]Usourcehh]h]UlineKUtypejZuh]rJ[h)rK[}rL[(hUh}rM[(h]h]h]h]h]uhjG[h]rN[hX1Hyperlink target "build-steps" is not referenced.rO[rP[}rQ[(hUhjK[ubahhubahjZubh)rR[}rS[(hUh}rT[(h]UlevelKh]h]Usourcehh]h]UlineK%UtypejZuh]rU[h)rV[}rW[(hUh}rX[(h]h]h]h]h]uhjR[h]rY[hX-Hyperlink target "index-0" is not referenced.rZ[r[[}r\[(hUhjV[ubahhubahjZubh)r][}r^[(hUh}r_[(h]UlevelKh]h]Usourcehh]h]UlineK&UtypejZuh]r`[h)ra[}rb[(hUh}rc[(h]h]h]h]h]uhj][h]rd[hXAHyperlink target "buildstep-common-parameters" is not referenced.re[rf[}rg[(hUhja[ubahhubahjZubh)rh[}ri[(hUh}rj[(h]UlevelKh]h]Usourcehh]h]UlineK7UtypejZuh]rk[h)rl[}rm[(hUh}rn[(h]h]h]h]h]uhjh[h]ro[hX-Hyperlink target "index-1" is not referenced.rp[rq[}rr[(hUhjl[ubahhubahjZubh)rs[}rt[(hUh}ru[(h]UlevelKh]h]Usourcehh]h]UlineKAUtypejZuh]rv[h)rw[}rx[(hUh}ry[(h]h]h]h]h]uhjs[h]rz[hX-Hyperlink target "index-2" is not referenced.r{[r|[}r}[(hUhjw[ubahhubahjZubh)r~[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKGUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj~[h]r[hX-Hyperlink target "index-3" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKMUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX-Hyperlink target "index-4" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKTUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX-Hyperlink target "index-5" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKZUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX-Hyperlink target "index-6" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineK`UtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX-Hyperlink target "index-7" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKjUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX-Hyperlink target "index-8" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKtUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX-Hyperlink target "index-9" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineK|UtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX5Hyperlink target "source-checkout" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX4Hyperlink target "step-Mercurial" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineKUtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX4Hyperlink target "step-mercurial" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineM;UtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX.Hyperlink target "step-Git" is not referenced.r[r[}r[(hUhj[ubahhubahjZubh)r[}r[(hUh}r[(h]UlevelKh]h]Usourcehh]h]UlineM<UtypejZuh]r[h)r[}r[(hUh}r[(h]h]h]h]h]uhj[h]r[hX.Hyperlink target "step-git" is not referenced.r[r\}r\(hUhj[ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r \hX.Hyperlink target "step-SVN" is not referenced.r \r \}r \(hUhj\ubahhubahjZubh)r \}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj \h]r\hX.Hyperlink target "step-svn" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineM8UtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX.Hyperlink target "step-CVS" is not referenced.r \r!\}r"\(hUhj\ubahhubahjZubh)r#\}r$\(hUh}r%\(h]UlevelKh]h]Usourcehh]h]UlineM9UtypejZuh]r&\h)r'\}r(\(hUh}r)\(h]h]h]h]h]uhj#\h]r*\hX.Hyperlink target "step-cvs" is not referenced.r+\r,\}r-\(hUhj'\ubahhubahjZubh)r.\}r/\(hUh}r0\(h]UlevelKh]h]Usourcehh]h]UlineMyUtypejZuh]r1\h)r2\}r3\(hUh}r4\(h]h]h]h]h]uhj.\h]r5\hX.Hyperlink target "step-Bzr" is not referenced.r6\r7\}r8\(hUhj2\ubahhubahjZubh)r9\}r:\(hUh}r;\(h]UlevelKh]h]Usourcehh]h]UlineMzUtypejZuh]r<\h)r=\}r>\(hUh}r?\(h]h]h]h]h]uhj9\h]r@\hX.Hyperlink target "step-bzr" is not referenced.rA\rB\}rC\(hUhj=\ubahhubahjZubh)rD\}rE\(hUh}rF\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]rG\h)rH\}rI\(hUh}rJ\(h]h]h]h]h]uhjD\h]rK\hX-Hyperlink target "step-P4" is not referenced.rL\rM\}rN\(hUhjH\ubahhubahjZubh)rO\}rP\(hUh}rQ\(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]rR\h)rS\}rT\(hUh}rU\(h]h]h]h]h]uhjO\h]rV\hX/Hyperlink target "step-Repo" is not referenced.rW\rX\}rY\(hUhjS\ubahhubahjZubh)rZ\}r[\(hUh}r\\(h]UlevelKh]h]Usourcehh]h]UlineMoUtypejZuh]r]\h)r^\}r_\(hUh}r`\(h]h]h]h]h]uhjZ\h]ra\hX.Hyperlink target "index-10" is not referenced.rb\rc\}rd\(hUhj^\ubahhubahjZubh)re\}rf\(hUh}rg\(h]UlevelKh]h]Usourcehh]h]UlineMpUtypejZuh]rh\h)ri\}rj\(hUh}rk\(h]h]h]h]h]uhje\h]rl\hX@Hyperlink target "source-checkout-slave-side" is not referenced.rm\rn\}ro\(hUhji\ubahhubahjZubh)rp\}rq\(hUh}rr\(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]rs\h)rt\}ru\(hUh}rv\(h]h]h]h]h]uhjp\h]rw\hX;Hyperlink target "step-CVS (Slave-Side)" is not referenced.rx\ry\}rz\(hUhjt\ubahhubahjZubh)r{\}r|\(hUh}r}\(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r~\h)r\}r\(hUh}r\(h]h]h]h]h]uhj{\h]r\hX9Hyperlink target "step-cvs-slave-side" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineM7UtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX;Hyperlink target "step-SVN (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineM8UtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX9Hyperlink target "step-svn-slave-side" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX=Hyperlink target "step-Darcs (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hXAHyperlink target "step-Mercurial (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX;Hyperlink target "step-Bzr (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX:Hyperlink target "step-P4 (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineM5UtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX;Hyperlink target "step-Git (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMeUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX.Hyperlink target "index-11" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMjUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX:Hyperlink target "step-BK (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineM}UtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX<Hyperlink target "step-Repo (Slave-Side)" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r\(hUh}r\(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r\h)r\}r\(hUh}r\(h]h]h]h]h]uhj\h]r\hX.Hyperlink target "index-12" is not referenced.r\r\}r\(hUhj\ubahhubahjZubh)r\}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj\h]r]hX@Hyperlink target "step-Monotone (Slave-Side)" is not referenced.r]r]}r ](hUhj]ubahhubahjZubh)r ]}r ](hUh}r ](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r ]h)r]}r](hUh}r](h]h]h]h]h]uhj ]h]r]hX7Hyperlink target "step-ShellCommand" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX.Hyperlink target "index-13" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r ]}r!](hUh}r"](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r#]h)r$]}r%](hUh}r&](h]h]h]h]h]uhj ]h]r']hX.Hyperlink target "index-14" is not referenced.r(]r)]}r*](hUhj$]ubahhubahjZubh)r+]}r,](hUh}r-](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r.]h)r/]}r0](hUh}r1](h]h]h]h]h]uhj+]h]r2]hX.Hyperlink target "index-15" is not referenced.r3]r4]}r5](hUhj/]ubahhubahjZubh)r6]}r7](hUh}r8](h]UlevelKh]h]Usourcehh]h]UlineM$UtypejZuh]r9]h)r:]}r;](hUh}r<](h]h]h]h]h]uhj6]h]r=]hX.Hyperlink target "index-16" is not referenced.r>]r?]}r@](hUhj:]ubahhubahjZubh)rA]}rB](hUh}rC](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]rD]h)rE]}rF](hUh}rG](h]h]h]h]h]uhjA]h]rH]hX4Hyperlink target "step-Configure" is not referenced.rI]rJ]}rK](hUhjE]ubahhubahjZubh)rL]}rM](hUh}rN](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]rO]h)rP]}rQ](hUh}rR](h]h]h]h]h]uhjL]h]rS]hX2Hyperlink target "step-Compile" is not referenced.rT]rU]}rV](hUhjP]ubahhubahjZubh)rW]}rX](hUh}rY](h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]rZ]h)r[]}r\](hUh}r]](h]h]h]h]h]uhjW]h]r^]hX.Hyperlink target "index-17" is not referenced.r_]r`]}ra](hUhj[]ubahhubahjZubh)rb]}rc](hUh}rd](h]UlevelKh]h]Usourcehh]h]UlineM;UtypejZuh]re]h)rf]}rg](hUh}rh](h]h]h]h]h]uhjb]h]ri]hX.Hyperlink target "index-18" is not referenced.rj]rk]}rl](hUhjf]ubahhubahjZubh)rm]}rn](hUh}ro](h]UlevelKh]h]Usourcehh]h]UlineM<UtypejZuh]rp]h)rq]}rr](hUh}rs](h]h]h]h]h]uhjm]h]rt]hX.Hyperlink target "step-VC6" is not referenced.ru]rv]}rw](hUhjq]ubahhubahjZubh)rx]}ry](hUh}rz](h]UlevelKh]h]Usourcehh]h]UlineM=UtypejZuh]r{]h)r|]}r}](hUh}r~](h]h]h]h]h]uhjx]h]r]hX.Hyperlink target "step-VC7" is not referenced.r]r]}r](hUhj|]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineM>UtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX.Hyperlink target "step-VC8" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineM?UtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX.Hyperlink target "step-VC9" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineM@UtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX/Hyperlink target "step-VC10" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMAUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX/Hyperlink target "step-VC11" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMBUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX1Hyperlink target "step-VS2003" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMCUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX1Hyperlink target "step-VS2005" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMDUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX1Hyperlink target "step-VS2008" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMEUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX1Hyperlink target "step-VS2010" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMFUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX1Hyperlink target "step-VS2012" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMGUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX5Hyperlink target "step-VCExpress9" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineMIUtypejZuh]r]h)r]}r](hUh}r](h]h]h]h]h]uhj]h]r]hX2Hyperlink target "step-MsBuild" is not referenced.r]r]}r](hUhj]ubahhubahjZubh)r]}r](hUh}r](h]UlevelKh]h]Usourcehh]h]UlineM{UtypejZuh]r]h)r^}r^(hUh}r^(h]h]h]h]h]uhj]h]r^hX.Hyperlink target "index-19" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r ^(h]UlevelKh]h]Usourcehh]h]UlineM{UtypejZuh]r ^h)r ^}r ^(hUh}r ^(h]h]h]h]h]uhj^h]r^hX.Hyperlink target "index-20" is not referenced.r^r^}r^(hUhj ^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineM{UtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX.Hyperlink target "index-21" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r ^h)r!^}r"^(hUh}r#^(h]h]h]h]h]uhj^h]r$^hX.Hyperlink target "index-22" is not referenced.r%^r&^}r'^(hUhj!^ubahhubahjZubh)r(^}r)^(hUh}r*^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r+^h)r,^}r-^(hUh}r.^(h]h]h]h]h]uhj(^h]r/^hX/Hyperlink target "step-Test" is not referenced.r0^r1^}r2^(hUhj,^ubahhubahjZubh)r3^}r4^(hUh}r5^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r6^h)r7^}r8^(hUh}r9^(h]h]h]h]h]uhj3^h]r:^hX3Hyperlink target "step-TreeSize" is not referenced.r;^r<^}r=^(hUhj7^ubahhubahjZubh)r>^}r?^(hUh}r@^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]rA^h)rB^}rC^(hUh}rD^(h]h]h]h]h]uhj>^h]rE^hX.Hyperlink target "index-23" is not referenced.rF^rG^}rH^(hUhjB^ubahhubahjZubh)rI^}rJ^(hUh}rK^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]rL^h)rM^}rN^(hUh}rO^(h]h]h]h]h]uhjI^h]rP^hX9Hyperlink target "step-PerlModuleTest" is not referenced.rQ^rR^}rS^(hUhjM^ubahhubahjZubh)rT^}rU^(hUh}rV^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]rW^h)rX^}rY^(hUh}rZ^(h]h]h]h]h]uhjT^h]r[^hX.Hyperlink target "step-MTR" is not referenced.r\^r]^}r^^(hUhjX^ubahhubahjZubh)r_^}r`^(hUh}ra^(h]UlevelKh]h]Usourcehh]h]UlineM:UtypejZuh]rb^h)rc^}rd^(hUh}re^(h]h]h]h]h]uhj_^h]rf^hX>Hyperlink target "step-SubunitShellCommand" is not referenced.rg^rh^}ri^(hUhjc^ubahhubahjZubh)rj^}rk^(hUh}rl^(h]UlevelKh]h]Usourcehh]h]UlineM;UtypejZuh]rm^h)rn^}ro^(hUh}rp^(h]h]h]h]h]uhjj^h]rq^hX>Hyperlink target "step-subunitshellcommand" is not referenced.rr^rs^}rt^(hUhjn^ubahhubahjZubh)ru^}rv^(hUh}rw^(h]UlevelKh]h]Usourcehh]h]UlineMNUtypejZuh]rx^h)ry^}rz^(hUh}r{^(h]h]h]h]h]uhju^h]r|^hX<Hyperlink target "slave-filesystem-steps" is not referenced.r}^r~^}r^(hUhjy^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMVUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX5Hyperlink target "step-FileExists" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMcUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX8Hyperlink target "step-CopyDirectory" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMzUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX:Hyperlink target "step-RemoveDirectory" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX8Hyperlink target "step-MakeDirectory" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX7Hyperlink target "python-buildsteps" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX6Hyperlink target "step-BuildEPYDoc" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX6Hyperlink target "step-buildepydoc" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX3Hyperlink target "step-PyFlakes" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX2Hyperlink target "step-pyflake" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX1Hyperlink target "step-Sphinx" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineMUtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r^hX1Hyperlink target "step-sphinx" is not referenced.r^r^}r^(hUhj^ubahhubahjZubh)r^}r^(hUh}r^(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r^h)r^}r^(hUh}r^(h]h]h]h]h]uhj^h]r_hX1Hyperlink target "step-PyLint" is not referenced.r_r_}r_(hUhj^ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r_h)r_}r _(hUh}r _(h]h]h]h]h]uhj_h]r _hX1Hyperlink target "step-pylint" is not referenced.r _r _}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX0Hyperlink target "step-Trial" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r_h)r_}r_(hUh}r _(h]h]h]h]h]uhj_h]r!_hX0Hyperlink target "step-trial" is not referenced.r"_r#_}r$_(hUhj_ubahhubahjZubh)r%_}r&_(hUh}r'_(h]UlevelKh]h]Usourcehh]h]UlineM8 UtypejZuh]r(_h)r)_}r*_(hUh}r+_(h]h]h]h]h]uhj%_h]r,_hX.Hyperlink target "index-24" is not referenced.r-_r._}r/_(hUhj)_ubahhubahjZubh)r0_}r1_(hUh}r2_(h]UlevelKh]h]Usourcehh]h]UlineMh UtypejZuh]r3_h)r4_}r5_(hUh}r6_(h]h]h]h]h]uhj0_h]r7_hX5Hyperlink target "step-RemovePYCs" is not referenced.r8_r9_}r:_(hUhj4_ubahhubahjZubh)r;_}r<_(hUh}r=_(h]UlevelKh]h]Usourcehh]h]UlineMx UtypejZuh]r>_h)r?_}r@_(hUh}rA_(h]h]h]h]h]uhj;_h]rB_hX.Hyperlink target "index-25" is not referenced.rC_rD_}rE_(hUhj?_ubahhubahjZubh)rF_}rG_(hUh}rH_(h]UlevelKh]h]Usourcehh]h]UlineMy UtypejZuh]rI_h)rJ_}rK_(hUh}rL_(h]h]h]h]h]uhjF_h]rM_hX5Hyperlink target "step-FileUpload" is not referenced.rN_rO_}rP_(hUhjJ_ubahhubahjZubh)rQ_}rR_(hUh}rS_(h]UlevelKh]h]Usourcehh]h]UlineM{ UtypejZuh]rT_h)rU_}rV_(hUh}rW_(h]h]h]h]h]uhjQ_h]rX_hX7Hyperlink target "step-FileDownload" is not referenced.rY_rZ_}r[_(hUhjU_ubahhubahjZubh)r\_}r]_(hUh}r^_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r__h)r`_}ra_(hUh}rb_(h]h]h]h]h]uhj\_h]rc_hX:Hyperlink target "step-DirectoryUpload" is not referenced.rd_re_}rf_(hUhj`_ubahhubahjZubh)rg_}rh_(hUh}ri_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]rj_h)rk_}rl_(hUh}rm_(h]h]h]h]h]uhjg_h]rn_hX9Hyperlink target "step-StringDownload" is not referenced.ro_rp_}rq_(hUhjk_ubahhubahjZubh)rr_}rs_(hUh}rt_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]ru_h)rv_}rw_(hUh}rx_(h]h]h]h]h]uhjr_h]ry_hX=Hyperlink target "step-JSONStringDownload" is not referenced.rz_r{_}r|_(hUhjv_ubahhubahjZubh)r}_}r~_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj}_h]r_hXAHyperlink target "step-JSONPropertiesDownload" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM$ UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX.Hyperlink target "index-26" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM/ UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX=Hyperlink target "step-MasterShellCommand" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineMN UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX.Hyperlink target "index-27" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineMb UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX8Hyperlink target "step-LogRenderable" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineMl UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX.Hyperlink target "index-28" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineMm UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX8Hyperlink target "setting-properties" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineMu UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX6Hyperlink target "step-SetProperty" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineMv UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX6Hyperlink target "step-setproperty" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hXAHyperlink target "step-SetPropertyFromCommand" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX?Hyperlink target "step-SetPropertiesFromEnv" is not referenced.r_r_}r_(hUhj_ubahhubahjZubh)r_}r_(hUh}r_(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r_h)r_}r_(hUh}r_(h]h]h]h]h]uhj_h]r_hX.Hyperlink target "index-29" is not referenced.r_r_}r`(hUhj_ubahhubahjZubh)r`}r`(hUh}r`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r`h)r`}r`(hUh}r`(h]h]h]h]h]uhj`h]r`hX.Hyperlink target "index-30" is not referenced.r `r `}r `(hUhj`ubahhubahjZubh)r `}r `(hUh}r`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r`h)r`}r`(hUh}r`(h]h]h]h]h]uhj `h]r`hX2Hyperlink target "step-Trigger" is not referenced.r`r`}r`(hUhj`ubahhubahjZubh)r`}r`(hUh}r`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r`h)r`}r`(hUh}r`(h]h]h]h]h]uhj`h]r`hX;Hyperlink target "triggering-schedulers" is not referenced.r`r `}r!`(hUhj`ubahhubahjZubh)r"`}r#`(hUh}r$`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r%`h)r&`}r'`(hUh}r(`(h]h]h]h]h]uhj"`h]r)`hX3Hyperlink target "step-RpmBuild" is not referenced.r*`r+`}r,`(hUhj&`ubahhubahjZubh)r-`}r.`(hUh}r/`(h]UlevelKh]h]Usourcehh]h]UlineM= UtypejZuh]r0`h)r1`}r2`(hUh}r3`(h]h]h]h]h]uhj-`h]r4`hX2Hyperlink target "step-RpmLint" is not referenced.r5`r6`}r7`(hUhj1`ubahhubahjZubh)r8`}r9`(hUh}r:`(h]UlevelKh]h]Usourcehh]h]UlineM[ UtypejZuh]r;`h)r<`}r=`(hUh}r>`(h]h]h]h]h]uhj8`h]r?`hX8Hyperlink target "step-MockBuildSRPM" is not referenced.r@`rA`}rB`(hUhj<`ubahhubahjZubh)rC`}rD`(hUh}rE`(h]UlevelKh]h]Usourcehh]h]UlineMt UtypejZuh]rF`h)rG`}rH`(hUh}rI`(h]h]h]h]h]uhjC`h]rJ`hX6Hyperlink target "step-MockRebuild" is not referenced.rK`rL`}rM`(hUhjG`ubahhubahjZubh)rN`}rO`(hUh}rP`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]rQ`h)rR`}rS`(hUh}rT`(h]h]h]h]h]uhjN`h]rU`hX6Hyperlink target "step-DebPbuilder" is not referenced.rV`rW`}rX`(hUhjR`ubahhubahjZubh)rY`}rZ`(hUh}r[`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r\`h)r]`}r^`(hUh}r_`(h]h]h]h]h]uhjY`h]r``hX8Hyperlink target "step-DebCowbuilder" is not referenced.ra`rb`}rc`(hUhj]`ubahhubahjZubh)rd`}re`(hUh}rf`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]rg`h)rh`}ri`(hUh}rj`(h]h]h]h]h]uhjd`h]rk`hX5Hyperlink target "step-DebLintian" is not referenced.rl`rm`}rn`(hUhjh`ubahhubahjZubh)ro`}rp`(hUh}rq`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]rr`h)rs`}rt`(hUh}ru`(h]h]h]h]h]uhjo`h]rv`hX0Hyperlink target "step-HLint" is not referenced.rw`rx`}ry`(hUhjs`ubahhubahjZubh)rz`}r{`(hUh}r|`(h]UlevelKh]h]Usourcehh]h]UlineM UtypejZuh]r}`h)r~`}r`(hUh}r`(h]h]h]h]h]uhjz`h]r`hX/Hyperlink target "step-MaxQ" is not referenced.r`r`}r`(hUhj~`ubahhubahjZubeUreporterr`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`NhNUerror_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`UV/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-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_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`(jq?jm?j7Jj3Jj%j%j/j/j5j5jMjMj>j>j+j+jSjSjj:j.j.h jLjQjQh5j[Fj>j>h jvhhjOjOj/j5j5j5jTjTjOjOjtAjpAj>j>j j jVjVj+j+jVjVj>j>j=j=hjIjJjJj/Mj1Mj5j5j5j5j5j5j5j5jL)jQ)j4=j/=j&j j$=j/=hjh{jLMhj5Aj>j>jAjAh!jNj6j6j"j"j"j"jLj Mj5j5j8@jC@j9j9jYjIjY8j\8j;8j>8jj>jHjHj`OjcOjSjShujC?j-?j(?j(j5j1Sj7Sj#j#j[UjaUjQjQj86j46j-Jj3Jj9:j?:jGjGj~KjzKjBjBjEjDhMjJ=j*&j&&j'j j jj#j#j'j'j'j'jn*jj*j=j=j>j>j@j@jcAj_AjMj Mj"j"j5j5jW3jS3j+j+j&?j(?jVjVjBjBjHjDjq)jw)h@j-hTjCj*Wj&WjNjNj Wj&Wj8j 8hUjj4Xj0Xj(j3jBjBjtKjzKj/j+j'j'jLjLj8j3hZjSCjMjMjj:j3j3jQjQj6Cj8CjeUjaUjjjjjFjFj WjWj>j>jP j?j@j@j?j(?jQjIj9j9j:j3j1j3j:j:j#6j&6j0j+j"Jj%Jj:j:j%j%jA@jC@j;Sj7SjM3jS3jOjOj#j#jFj Fj.j.j9j9jEjEj AjAj.6j46jjjFjFjOjOj{)jw)jLUjHUhtjj hj+*hvj3Fj%j%jVjVj)j)jOjOhlj`@hmjMjTjTjT j?j9j9jI j?j,j,jAjAhVj[j=j=jJ@jC@jijej,j,jHjHj?/jB/j-Cj8Cj&Mj1Mj3j4j6Mj1Mj?jDhhuUsubstitution_namesr`}r`hhh}r`(h]h]h]Usourcehh]h]uU footnotesr`]r`Urefidsr`}r`(jM]r`jMaj>]r`j>aj]r`j=aj8@]r`j;@ajV]r`jVaj]r`jajO]r`jOaj/]r`j8aj+]r`j+ajQ]r`jQaj=]r`j=aj/M]r`j,MajW]r`jWaj-C]r`j0Caj>]r`j>ajA]r`jAaj"]r`j"ajL]r`jMaj9]r`j9aj.K]r`j0Kaj3]r`j3aj%]r`j%aj]r`jaj9]r`j9aj-=]r`j*=ajM]r`jMajE]r`jEajO]r`jLaj3]r`j4aj+]raj+aj]rajajL)]rajN)aj]rajajW]rajYaj]rajaj]rajaj(]raj+aj]rajajk]r ajmaj]r ajaj7]r aj9aj]r ajaj]r ajaj1]raj.aj8]raj;aj *]raj*aj>]raj>aj-J]raj0Jaj(]raj+aj1S]raj4Saj#]raj#aj[U]raj^Uaj9:]raj<:ajB]rajBaj']raj)aj']raj'aj&?]raj#?ajV]rajVajq)]rajt)aj W]raj#Waj>]raj>aj(]r aj+ajB]r!ajBajtK]r"ajwKajL]r#ajLajS]r$ajSaj]r%ajaj6C]r&aj3CajP ]r'ajBajQ]r(ajRaj1]r)aj.aj0]r*aj3aj:]r+aj:aj?]r,aj ?ajA@]r-aj>@ajM3]r.ajP3aj$=]r/aj'=aj A]r0ajAaj.6]r1aj16aj]r2ajajF]r3ajFajO]r4ajOaj%]r5aj%ajT]r6ajTajI ]r7ajL aj,]r8aj,aj=]r9aj=ajH]r:ajHaj&M]r;aj)Maj?]rcdocutils.nodes section q?)q@}qA(h=UU referencedqBKh>h?)qC}qD(h=Uh>h?)qE}qF(h=Uh>hUsourceqGcdocutils.nodes reprunicode qHXY/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-changesources.rstqIqJ}qKbUexpect_referenced_by_nameqL}qMh3cdocutils.nodes target qN)qO}qP(h=X.. _Change-Sources:h>hhGhJUtagnameqQUtargetqRU attributesqS}qT(UidsqU]UbackrefsqV]UdupnamesqW]UclassesqX]UnamesqY]UrefidqZUchange-sourcesq[uUlineq\KUdocumentq]hUchildrenq^]ubshQUsectionq_hS}q`(hW]hX]hV]hU]qa(h[Uid1qbehY]qc(h2h3euh\Kh]hUexpect_referenced_by_idqd}qeh[hOsh^]qf(cdocutils.nodes title qg)qh}qi(h=XChange Sourcesqjh>hEhGhJhQUtitleqkhS}ql(hW]hX]hV]hU]hY]uh\Kh]hh^]qmcdocutils.nodes Text qnXChange Sourcesqoqp}qq(h=hjh>hhubaubcdocutils.nodes paragraph qr)qs}qt(h=XA Version Control System maintains a source tree, and tells the buildmaster when it changes. The first step of each :class:`Build` is typically to acquire a copy of some version of this tree.h>hEhGhJhQU paragraphquhS}qv(hW]hX]hV]hU]hY]uh\Kh]hh^]qw(hnXtA Version Control System maintains a source tree, and tells the buildmaster when it changes. The first step of each qxqy}qz(h=XtA Version Control System maintains a source tree, and tells the buildmaster when it changes. The first step of each h>hsubcsphinx.addnodes pending_xref q{)q|}q}(h=X:class:`Build`q~h>hshGhJhQU pending_xrefqhS}q(UreftypeXclassUrefwarnqU reftargetqXBuildU refdomainXpyqhU]hV]U refexplicithW]hX]hY]UrefdocqXmanual/cfg-changesourcesqUpy:classqNU py:moduleqNuh\Kh^]qcdocutils.nodes literal q)q}q(h=h~hS}q(hW]hX]q(UxrefqhXpy-classqehV]hU]hY]uh>h|h^]qhnXBuildqq}q(h=Uh>hubahQUliteralqubaubhnX= is typically to acquire a copy of some version of this tree.qq}q(h=X= is typically to acquire a copy of some version of this tree.h>hsubeubhr)q}q(h=XThis chapter describes how the Buildbot learns about what :class:`Change`\s have occurred. For more information on VC systems and :class:`Change`\s, see :ref:`Version-Control-Systems`.h>hEhGhJhQhuhS}q(hW]hX]hV]hU]hY]uh\K h]hh^]q(hnX:This chapter describes how the Buildbot learns about what qq}q(h=X:This chapter describes how the Buildbot learns about what h>hubh{)q}q(h=X:class:`Change`qh>hhGhJhQhhS}q(UreftypeXclasshhXChangeU refdomainXpyqhU]hV]U refexplicithW]hX]hY]hhhNhNuh\K h^]qh)q}q(h=hhS}q(hW]hX]q(hhXpy-classqehV]hU]hY]uh>hh^]qhnXChangeqq}q(h=Uh>hubahQhubaubhnX8s have occurred. For more information on VC systems and qq}q(h=X9\s have occurred. For more information on VC systems and h>hubh{)q}q(h=X:class:`Change`qh>hhGhJhQhhS}q(UreftypeXclasshhXChangeU refdomainXpyqhU]hV]U refexplicithW]hX]hY]hhhNhNuh\K h^]qh)q}q(h=hhS}q(hW]hX]q(hhXpy-classqehV]hU]hY]uh>hh^]qhnXChangeqq}q(h=Uh>hubahQhubaubhnXs, see qq}q(h=X\s, see h>hubh{)q}q(h=X:ref:`Version-Control-Systems`qh>hhGhJhQhhS}q(UreftypeXrefhhXversion-control-systemsU refdomainXstdqhU]hV]U refexplicithW]hX]hY]hhuh\K h^]qcdocutils.nodes emphasis q)q}q(h=hhS}q(hW]hX]q(hhXstd-refqehV]hU]hY]uh>hh^]qhnXVersion-Control-SystemsqЅq}q(h=Uh>hubahQUemphasisqubaubhnX.q}q(h=X.h>hubeubhr)q}q(h=X#:class:`Change`\s can be provided by a variety of :class:`ChangeSource` types, although any given project will typically have only a single :class:`ChangeSource` active. This section provides a description of all available :class:`ChangeSource` types and explains how to set up each of them.h>hEhGhJhQhuhS}q(hW]hX]hV]hU]hY]uh\Kh]hh^]q(h{)q}q(h=X:class:`Change`qh>hhGhJhQhhS}q(UreftypeXclasshhXChangeU refdomainXpyqhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]qh)q}q(h=hhS}q(hW]hX]q(hhXpy-classqehV]hU]hY]uh>hh^]qhnXChangeq慁q}q(h=Uh>hubahQhubaubhnX"s can be provided by a variety of q酁q}q(h=X#\s can be provided by a variety of h>hubh{)q}q(h=X:class:`ChangeSource`qh>hhGhJhQhhS}q(UreftypeXclasshhX ChangeSourceU refdomainXpyqhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]qh)q}q(h=hhS}q(hW]hX]q(hhXpy-classqehV]hU]hY]uh>hh^]qhnX ChangeSourceqq}q(h=Uh>hubahQhubaubhnXE types, although any given project will typically have only a single qq}q(h=XE types, although any given project will typically have only a single h>hubh{)q}q(h=X:class:`ChangeSource`rh>hhGhJhQhhS}r(UreftypeXclasshhX ChangeSourceU refdomainXpyrhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rh)r}r(h=jhS}r(hW]hX]r(hjXpy-classrehV]hU]hY]uh>hh^]r hnX ChangeSourcer r }r (h=Uh>jubahQhubaubhnX> active. This section provides a description of all available r r}r(h=X> active. This section provides a description of all available h>hubh{)r}r(h=X:class:`ChangeSource`rh>hhGhJhQhhS}r(UreftypeXclasshhX ChangeSourceU refdomainXpyrhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rh)r}r(h=jhS}r(hW]hX]r(hjXpy-classrehV]hU]hY]uh>jh^]rhnX ChangeSourcerr}r(h=Uh>jubahQhubaubhnX/ types and explains how to set up each of them.rr }r!(h=X/ types and explains how to set up each of them.h>hubeubhN)r"}r#(h=X.. _Choosing-a-Change-Source:h>hEhGhJhQhRhS}r$(hU]hV]hW]hX]hY]hZUchoosing-a-change-sourcer%uh\Kh]hh^]ubh?)r&}r'(h=Uh>hEhGhJhL}r(hj"shQh_hS}r)(hW]hX]hV]hU]r*(j%Uid2r+ehY]r,(h(heuh\Kh]hhd}r-j%j"sh^]r.(hg)r/}r0(h=XChoosing a Change Sourcer1h>j&hGhJhQhkhS}r2(hW]hX]hV]hU]hY]uh\Kh]hh^]r3hnXChoosing a Change Sourcer4r5}r6(h=j1h>j/ubaubhr)r7}r8(h=XThere are a variety of :class:`ChangeSource` classes available, some of which are meant to be used in conjunction with other tools to deliver :class:`Change` events from the VC repository to the buildmaster.h>j&hGhJhQhuhS}r9(hW]hX]hV]hU]hY]uh\Kh]hh^]r:(hnXThere are a variety of r;r<}r=(h=XThere are a variety of h>j7ubh{)r>}r?(h=X:class:`ChangeSource`r@h>j7hGhJhQhhS}rA(UreftypeXclasshhX ChangeSourceU refdomainXpyrBhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rCh)rD}rE(h=j@hS}rF(hW]hX]rG(hjBXpy-classrHehV]hU]hY]uh>j>h^]rIhnX ChangeSourcerJrK}rL(h=Uh>jDubahQhubaubhnXb classes available, some of which are meant to be used in conjunction with other tools to deliver rMrN}rO(h=Xb classes available, some of which are meant to be used in conjunction with other tools to deliver h>j7ubh{)rP}rQ(h=X:class:`Change`rRh>j7hGhJhQhhS}rS(UreftypeXclasshhXChangeU refdomainXpyrThU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rUh)rV}rW(h=jRhS}rX(hW]hX]rY(hjTXpy-classrZehV]hU]hY]uh>jPh^]r[hnXChanger\r]}r^(h=Uh>jVubahQhubaubhnX2 events from the VC repository to the buildmaster.r_r`}ra(h=X2 events from the VC repository to the buildmaster.h>j7ubeubhr)rb}rc(h=XFAs a quick guide, here is a list of VC systems and the :class:`ChangeSource`\s 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.h>j&hGhJhQhuhS}rd(hW]hX]hV]hU]hY]uh\Kh]hh^]re(hnX7As a quick guide, here is a list of VC systems and the rfrg}rh(h=X7As a quick guide, here is a list of VC systems and the h>jbubh{)ri}rj(h=X:class:`ChangeSource`rkh>jbhGhJhQhhS}rl(UreftypeXclasshhX ChangeSourceU refdomainXpyrmhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rnh)ro}rp(h=jkhS}rq(hW]hX]rr(hjmXpy-classrsehV]hU]hY]uh>jih^]rthnX ChangeSourcerurv}rw(h=Uh>joubahQhubaubhnXs 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.rxry}rz(h=X\s 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.h>jbubeubcdocutils.nodes definition_list r{)r|}r}(h=Uh>j&hGNhQUdefinition_listr~hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]r(cdocutils.nodes definition_list_item r)r}r(h=XCVS * :bb:chsrc:`CVSMaildirSource` (watching mail sent by ``contrib/buildbot_cvs_mail.py`` script) * :bb:chsrc:`PBChangeSource` (listening for connections from ``buildbot sendchange`` run in a loginfo script) * :bb:chsrc:`PBChangeSource` (listening for connections from a long-running :file:`contrib/viewcvspoll.py` polling process which examines the ViewCVS database directly) * :bb:chsrc:`Change Hooks` in WebStatus h>j|hGhJhQUdefinition_list_itemrhS}r(hW]hX]hV]hU]hY]uh\K)h^]r(cdocutils.nodes term r)r}r(h=XCVSrh>jhGhJhQUtermrhS}r(hW]hX]hV]hU]hY]uh\K)h^]rhnXCVSrr}r(h=jh>jubaubcdocutils.nodes definition r)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rcdocutils.nodes bullet_list r)r}r(h=UhS}r(UbulletrX*hU]hV]hW]hX]hY]uh>jh^]r(cdocutils.nodes list_item r)r}r(h=X\:bb:chsrc:`CVSMaildirSource` (watching mail sent by ``contrib/buildbot_cvs_mail.py`` script)rhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=jh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K#h^]r(h{)r}r(h=X:bb:chsrc:`CVSMaildirSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXCVSMaildirSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K#h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXCVSMaildirSourcerr}r(h=Uh>jubahQhubaubhnX (watching mail sent by rr}r(h=X (watching mail sent by h>jubh)r}r(h=X ``contrib/buildbot_cvs_mail.py``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXcontrib/buildbot_cvs_mail.pyrr}r(h=Uh>jubahQhubhnX script)rr}r(h=X script)h>jubeubahQU list_itemrubj)r}r(h=Xk:bb:chsrc:`PBChangeSource` (listening for connections from ``buildbot sendchange`` run in a loginfo script)hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xk:bb:chsrc:`PBChangeSource` (listening for connections from ``buildbot sendchange`` run in a loginfo script)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K$h^]r(h{)r}r(h=X:bb:chsrc:`PBChangeSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K$h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX! (listening for connections from rr}r(h=X! (listening for connections from h>jubh)r}r(h=X``buildbot sendchange``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbuildbot sendchangerr}r(h=Uh>jubahQhubhnX run in a loginfo script)rr}r(h=X run in a loginfo script)h>jubeubahQjubj)r}r(h=X:bb:chsrc:`PBChangeSource` (listening for connections from a long-running :file:`contrib/viewcvspoll.py` polling process which examines the ViewCVS database directly)hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X:bb:chsrc:`PBChangeSource` (listening for connections from a long-running :file:`contrib/viewcvspoll.py` polling process which examines the ViewCVS database directly)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K&h^]r(h{)r}r(h=X:bb:chsrc:`PBChangeSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K&h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX0 (listening for connections from a long-running rr}r(h=X0 (listening for connections from a long-running h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXcontrib/viewcvspoll.pyrr}r (h=Xcontrib/viewcvspoll.pyh>jubahQhubhnX> polling process which examines the ViewCVS database directly)r r }r (h=X> polling process which examines the ViewCVS database directly)h>jubeubahQjubj)r }r(h=X&:bb:chsrc:`Change Hooks` in WebStatus hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X%:bb:chsrc:`Change Hooks` in WebStatush>j hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K)h^]r(h{)r}r(h=X:bb:chsrc:`Change Hooks`rh>jhGhJhQhhS}r(UreftypeXchsrchhX Change HooksU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K)h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]r hnX Change Hooksr!r"}r#(h=Uh>jubahQhubaubhnX in WebStatusr$r%}r&(h=X in WebStatush>jubeubahQjubehQU bullet_listr'ubahQU definitionr(ubeubj)r)}r*(h=X;SVN * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/svn_buildbot.py` run in a postcommit script) * :bb:chsrc:`PBChangeSource` (listening for connections from a long-running :file:`contrib/svn_watcher.py` or :file:`contrib/svnpoller.py` polling process * :bb:chsrc:`SVNCommitEmailMaildirSource` (watching for email sent by :file:`commit-email.pl`) * :bb:chsrc:`SVNPoller` (polling the SVN repository) * :bb:chsrc:`Change Hooks` in WebStatus * :bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository) h>j|hGhJhQjhS}r+(hW]hX]hV]hU]hY]uh\K6h]hh^]r,(j)r-}r.(h=XSVNr/h>j)hGhJhQjhS}r0(hW]hX]hV]hU]hY]uh\K6h^]r1hnXSVNr2r3}r4(h=j/h>j-ubaubj)r5}r6(h=UhS}r7(hW]hX]hV]hU]hY]uh>j)h^]r8j)r9}r:(h=UhS}r;(jX*hU]hV]hW]hX]hY]uh>j5h^]r<(j)r=}r>(h=Xv:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/svn_buildbot.py` run in a postcommit script)hS}r?(hW]hX]hV]hU]hY]uh>j9h^]r@hr)rA}rB(h=Xv:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/svn_buildbot.py` run in a postcommit script)h>j=hGhJhQhuhS}rC(hW]hX]hV]hU]hY]uh\K,h^]rD(h{)rE}rF(h=X:bb:chsrc:`PBChangeSource`rGh>jAhGhJhQhhS}rH(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrIhU]hV]U refexplicithW]hX]hY]hhuh\K,h^]rJh)rK}rL(h=jGhS}rM(hW]hX]rN(hjIXbb-chsrcrOehV]hU]hY]uh>jEh^]rPhnXPBChangeSourcerQrR}rS(h=Uh>jKubahQhubaubhnX! (listening for connections from rTrU}rV(h=X! (listening for connections from h>jAubh)rW}rX(h=UhS}rY(hU]hV]hW]hX]rZXfiler[aUrolej[hY]uh>jAh^]r\hnXcontrib/svn_buildbot.pyr]r^}r_(h=Xcontrib/svn_buildbot.pyh>jWubahQhubhnX run in a postcommit script)r`ra}rb(h=X run in a postcommit script)h>jAubeubahQjubj)rc}rd(h=X:bb:chsrc:`PBChangeSource` (listening for connections from a long-running :file:`contrib/svn_watcher.py` or :file:`contrib/svnpoller.py` polling processhS}re(hW]hX]hV]hU]hY]uh>j9h^]rfhr)rg}rh(h=X:bb:chsrc:`PBChangeSource` (listening for connections from a long-running :file:`contrib/svn_watcher.py` or :file:`contrib/svnpoller.py` polling processh>jchGhJhQhuhS}ri(hW]hX]hV]hU]hY]uh\K.h^]rj(h{)rk}rl(h=X:bb:chsrc:`PBChangeSource`rmh>jghGhJhQhhS}rn(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrohU]hV]U refexplicithW]hX]hY]hhuh\K.h^]rph)rq}rr(h=jmhS}rs(hW]hX]rt(hjoXbb-chsrcruehV]hU]hY]uh>jkh^]rvhnXPBChangeSourcerwrx}ry(h=Uh>jqubahQhubaubhnX0 (listening for connections from a long-running rzr{}r|(h=X0 (listening for connections from a long-running h>jgubh)r}}r~(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jgh^]rhnXcontrib/svn_watcher.pyrr}r(h=Xcontrib/svn_watcher.pyh>j}ubahQhubhnX or rr}r(h=X or h>jgubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jgh^]rhnXcontrib/svnpoller.pyrr}r(h=Xcontrib/svnpoller.pyh>jubahQhubhnX polling processrr}r(h=X polling processh>jgubeubahQjubj)r}r(h=X\:bb:chsrc:`SVNCommitEmailMaildirSource` (watching for email sent by :file:`commit-email.pl`)hS}r(hW]hX]hV]hU]hY]uh>j9h^]rhr)r}r(h=X\:bb:chsrc:`SVNCommitEmailMaildirSource` (watching for email sent by :file:`commit-email.pl`)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K1h^]r(h{)r}r(h=X':bb:chsrc:`SVNCommitEmailMaildirSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXSVNCommitEmailMaildirSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K1h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXSVNCommitEmailMaildirSourcerr}r(h=Uh>jubahQhubaubhnX (watching for email sent by rr}r(h=X (watching for email sent by h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXcommit-email.plrr}r(h=Xcommit-email.plh>jubahQhubhnX)r}r(h=X)h>jubeubahQjubj)r}r(h=X2:bb:chsrc:`SVNPoller` (polling the SVN repository)rhS}r(hW]hX]hV]hU]hY]uh>j9h^]rhr)r}r(h=jh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K3h^]r(h{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K3h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX (polling the SVN repository)rr}r(h=X (polling the SVN repository)h>jubeubahQjubj)r}r(h=X%:bb:chsrc:`Change Hooks` in WebStatusrhS}r(hW]hX]hV]hU]hY]uh>j9h^]rhr)r}r(h=jh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K4h^]r(h{)r}r(h=X:bb:chsrc:`Change Hooks`rh>jhGhJhQhhS}r(UreftypeXchsrchhX Change HooksU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K4h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX Change Hooksrr}r(h=Uh>jubahQhubaubhnX in WebStatusrr}r(h=X in WebStatush>jubeubahQjubj)r}r(h=X[:bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository) hS}r(hW]hX]hV]hU]hY]uh>j9h^]rhr)r}r(h=XZ:bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K5h^]r(h{)r}r(h=X :bb:chsrc:`GoogleCodeAtomPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXGoogleCodeAtomPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K5h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXGoogleCodeAtomPollerrr}r(h=Uh>jubahQhubaubhnX: (polling the commit feed for a GoogleCode Git repository)rr}r (h=X: (polling the commit feed for a GoogleCode Git repository)h>jubeubahQjubehQj'ubahQj(ubeubj)r }r (h=XDarcs * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/darcs_buildbot.py` in a commit script) * :bb:chsrc:`Change Hooks` in WebStatus h>j|hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\K;h]hh^]r (j)r}r(h=XDarcsrh>j hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\K;h^]rhnXDarcsrr}r(h=jh>jubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>j h^]rj)r}r(h=UhS}r(jX*hU]hV]hW]hX]hY]uh>jh^]r(j)r}r(h=Xp:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/darcs_buildbot.py` in a commit script)hS}r (hW]hX]hV]hU]hY]uh>jh^]r!hr)r"}r#(h=Xp:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/darcs_buildbot.py` in a commit script)h>jhGhJhQhuhS}r$(hW]hX]hV]hU]hY]uh\K9h^]r%(h{)r&}r'(h=X:bb:chsrc:`PBChangeSource`r(h>j"hGhJhQhhS}r)(UreftypeXchsrchhXPBChangeSourceU refdomainXbbr*hU]hV]U refexplicithW]hX]hY]hhuh\K9h^]r+h)r,}r-(h=j(hS}r.(hW]hX]r/(hj*Xbb-chsrcr0ehV]hU]hY]uh>j&h^]r1hnXPBChangeSourcer2r3}r4(h=Uh>j,ubahQhubaubhnX! (listening for connections from r5r6}r7(h=X! (listening for connections from h>j"ubh)r8}r9(h=UhS}r:(hU]hV]hW]hX]r;Xfiler<aUrolej<hY]uh>j"h^]r=hnXcontrib/darcs_buildbot.pyr>r?}r@(h=Xcontrib/darcs_buildbot.pyh>j8ubahQhubhnX in a commit script)rArB}rC(h=X in a commit script)h>j"ubeubahQjubj)rD}rE(h=X&:bb:chsrc:`Change Hooks` in WebStatus hS}rF(hW]hX]hV]hU]hY]uh>jh^]rGhr)rH}rI(h=X%:bb:chsrc:`Change Hooks` in WebStatush>jDhGhJhQhuhS}rJ(hW]hX]hV]hU]hY]uh\K;h^]rK(h{)rL}rM(h=X:bb:chsrc:`Change Hooks`rNh>jHhGhJhQhhS}rO(UreftypeXchsrchhX Change HooksU refdomainXbbrPhU]hV]U refexplicithW]hX]hY]hhuh\K;h^]rQh)rR}rS(h=jNhS}rT(hW]hX]rU(hjPXbb-chsrcrVehV]hU]hY]uh>jLh^]rWhnX Change HooksrXrY}rZ(h=Uh>jRubahQhubaubhnX in WebStatusr[r\}r](h=X in WebStatush>jHubeubahQjubehQj'ubahQj(ubeubj)r^}r_(h=XMercurial * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/hg_buildbot.py` run in an 'changegroup' hook) * :bb:chsrc:`Change Hooks` in WebStatus * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`buildbot/changes/hgbuildbot.py` run as an in-process 'changegroup' hook) * :bb:chsrc:`HgPoller` (polling a remote Mercurial repository) * :bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository) h>j|hGhJhQjhS}r`(hW]hX]hV]hU]hY]uh\KFh]hh^]ra(j)rb}rc(h=X Mercurialrdh>j^hGhJhQjhS}re(hW]hX]hV]hU]hY]uh\KFh^]rfhnX Mercurialrgrh}ri(h=jdh>jbubaubj)rj}rk(h=UhS}rl(hW]hX]hV]hU]hY]uh>j^h^]rmj)rn}ro(h=UhS}rp(jX*hU]hV]hW]hX]hY]uh>jjh^]rq(j)rr}rs(h=Xw:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/hg_buildbot.py` run in an 'changegroup' hook)hS}rt(hW]hX]hV]hU]hY]uh>jnh^]ruhr)rv}rw(h=Xw:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/hg_buildbot.py` run in an 'changegroup' hook)h>jrhGhJhQhuhS}rx(hW]hX]hV]hU]hY]uh\K>h^]ry(h{)rz}r{(h=X:bb:chsrc:`PBChangeSource`r|h>jvhGhJhQhhS}r}(UreftypeXchsrchhXPBChangeSourceU refdomainXbbr~hU]hV]U refexplicithW]hX]hY]hhuh\K>h^]rh)r}r(h=j|hS}r(hW]hX]r(hj~Xbb-chsrcrehV]hU]hY]uh>jzh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX! (listening for connections from rr}r(h=X! (listening for connections from h>jvubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jvh^]rhnXcontrib/hg_buildbot.pyrr}r(h=Xcontrib/hg_buildbot.pyh>jubahQhubhnX run in an 'changegroup' hook)rr}r(h=X run in an 'changegroup' hook)h>jvubeubahQjubj)r}r(h=X%:bb:chsrc:`Change Hooks` in WebStatusrhS}r(hW]hX]hV]hU]hY]uh>jnh^]rhr)r}r(h=jh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\K@h^]r(h{)r}r(h=X:bb:chsrc:`Change Hooks`rh>jhGhJhQhhS}r(UreftypeXchsrchhX Change HooksU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\K@h^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX Change Hooksrr}r(h=Uh>jubahQhubaubhnX in WebStatusrr}r(h=X in WebStatush>jubeubahQjubj)r}r(h=X:bb:chsrc:`PBChangeSource` (listening for connections from :file:`buildbot/changes/hgbuildbot.py` run as an in-process 'changegroup' hook)hS}r(hW]hX]hV]hU]hY]uh>jnh^]rhr)r}r(h=X:bb:chsrc:`PBChangeSource` (listening for connections from :file:`buildbot/changes/hgbuildbot.py` run as an in-process 'changegroup' hook)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\KAh^]r(h{)r}r(h=X:bb:chsrc:`PBChangeSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\KAh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX! (listening for connections from rr}r(h=X! (listening for connections from h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXbuildbot/changes/hgbuildbot.pyrr}r(h=Xbuildbot/changes/hgbuildbot.pyh>jubahQhubhnX) run as an in-process 'changegroup' hook)rr}r(h=X) run as an in-process 'changegroup' hook)h>jubeubahQjubj)r}r(h=X<:bb:chsrc:`HgPoller` (polling a remote Mercurial repository)rhS}r(hW]hX]hV]hU]hY]uh>jnh^]rhr)r}r(h=jh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\KDh^]r(h{)r}r(h=X:bb:chsrc:`HgPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\KDh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXHgPollerrr}r(h=Uh>jubahQhubaubhnX( (polling a remote Mercurial repository)rr}r(h=X( (polling a remote Mercurial repository)h>jubeubahQjubj)r}r(h=X[:bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository) hS}r(hW]hX]hV]hU]hY]uh>jnh^]rhr)r}r(h=XZ:bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\KEh^]r(h{)r}r(h=X :bb:chsrc:`GoogleCodeAtomPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXGoogleCodeAtomPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\KEh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXGoogleCodeAtomPollerrr }r (h=Uh>jubahQhubaubhnX: (polling the commit feed for a GoogleCode Git repository)r r }r (h=X: (polling the commit feed for a GoogleCode Git repository)h>jubeubahQjubehQj'ubahQj(ubeubj)r}r(h=XBzr (the newer Bazaar) * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/bzr_buildbot.py` run in a post-change-branch-tip or commit hook) * :bb:chsrc:`BzrPoller` (polling the Bzr repository) * :bb:chsrc:`Change Hooks` in WebStatus h>j|hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\KLh]hh^]r(j)r}r(h=XBzr (the newer Bazaar)rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\KLh^]rhnXBzr (the newer Bazaar)rr}r(h=jh>jubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rj)r}r(h=UhS}r (jX*hU]hV]hW]hX]hY]uh>jh^]r!(j)r"}r#(h=X:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/bzr_buildbot.py` run in a post-change-branch-tip or commit hook)hS}r$(hW]hX]hV]hU]hY]uh>jh^]r%hr)r&}r'(h=X:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/bzr_buildbot.py` run in a post-change-branch-tip or commit hook)h>j"hGhJhQhuhS}r((hW]hX]hV]hU]hY]uh\KIh^]r)(h{)r*}r+(h=X:bb:chsrc:`PBChangeSource`r,h>j&hGhJhQhhS}r-(UreftypeXchsrchhXPBChangeSourceU refdomainXbbr.hU]hV]U refexplicithW]hX]hY]hhuh\KIh^]r/h)r0}r1(h=j,hS}r2(hW]hX]r3(hj.Xbb-chsrcr4ehV]hU]hY]uh>j*h^]r5hnXPBChangeSourcer6r7}r8(h=Uh>j0ubahQhubaubhnX! (listening for connections from r9r:}r;(h=X! (listening for connections from h>j&ubh)r<}r=(h=UhS}r>(hU]hV]hW]hX]r?Xfiler@aUrolej@hY]uh>j&h^]rAhnXcontrib/bzr_buildbot.pyrBrC}rD(h=Xcontrib/bzr_buildbot.pyh>j<ubahQhubhnX0 run in a post-change-branch-tip or commit hook)rErF}rG(h=X0 run in a post-change-branch-tip or commit hook)h>j&ubeubahQjubj)rH}rI(h=X2:bb:chsrc:`BzrPoller` (polling the Bzr repository)rJhS}rK(hW]hX]hV]hU]hY]uh>jh^]rLhr)rM}rN(h=jJh>jHhGhJhQhuhS}rO(hW]hX]hV]hU]hY]uh\KKh^]rP(h{)rQ}rR(h=X:bb:chsrc:`BzrPoller`rSh>jMhGhJhQhhS}rT(UreftypeXchsrchhX BzrPollerU refdomainXbbrUhU]hV]U refexplicithW]hX]hY]hhuh\KKh^]rVh)rW}rX(h=jShS}rY(hW]hX]rZ(hjUXbb-chsrcr[ehV]hU]hY]uh>jQh^]r\hnX BzrPollerr]r^}r_(h=Uh>jWubahQhubaubhnX (polling the Bzr repository)r`ra}rb(h=X (polling the Bzr repository)h>jMubeubahQjubj)rc}rd(h=X&:bb:chsrc:`Change Hooks` in WebStatus hS}re(hW]hX]hV]hU]hY]uh>jh^]rfhr)rg}rh(h=X%:bb:chsrc:`Change Hooks` in WebStatush>jchGhJhQhuhS}ri(hW]hX]hV]hU]hY]uh\KLh^]rj(h{)rk}rl(h=X:bb:chsrc:`Change Hooks`rmh>jghGhJhQhhS}rn(UreftypeXchsrchhX Change HooksU refdomainXbbrohU]hV]U refexplicithW]hX]hY]hhuh\KLh^]rph)rq}rr(h=jmhS}rs(hW]hX]rt(hjoXbb-chsrcruehV]hU]hY]uh>jkh^]rvhnX Change Hooksrwrx}ry(h=Uh>jqubahQhubaubhnX in WebStatusrzr{}r|(h=X in WebStatush>jgubeubahQjubehQj'ubahQj(ubeubj)r}}r~(h=XLGit * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/git_buildbot.py` run in the post-receive hook) * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/github_buildbot.py`, which listens for notifications from GitHub) * :bb:chsrc:`Change Hooks` in WebStatus * GitHub change hook (specifically designed for GitHub notifications, but requiring a publicly-accessible WebStatus) * :bb:chsrc:`GitPoller` (polling a remote Git repository) * :bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository) h>j|hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\KZh]hh^]r(j)r}r(h=XGitrh>j}hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\KZh^]rhnXGitrr}r(h=jh>jubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>j}h^]rj)r}r(h=UhS}r(jX*hU]hV]hW]hX]hY]uh>jh^]r(j)r}r(h=Xx:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/git_buildbot.py` run in the post-receive hook)hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xx:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/git_buildbot.py` run in the post-receive hook)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\KOh^]r(h{)r}r(h=X:bb:chsrc:`PBChangeSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\KOh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX! (listening for connections from rr}r(h=X! (listening for connections from h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXcontrib/git_buildbot.pyrr}r(h=Xcontrib/git_buildbot.pyh>jubahQhubhnX run in the post-receive hook)rr}r(h=X run in the post-receive hook)h>jubeubahQjubj)r}r(h=X:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/github_buildbot.py`, which listens for notifications from GitHub)hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X:bb:chsrc:`PBChangeSource` (listening for connections from :file:`contrib/github_buildbot.py`, which listens for notifications from GitHub)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\KQh^]r(h{)r}r(h=X:bb:chsrc:`PBChangeSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\KQh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX! (listening for connections from rr}r(h=X! (listening for connections from h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXcontrib/github_buildbot.pyrr}r(h=Xcontrib/github_buildbot.pyh>jubahQhubhnX., which listens for notifications from GitHub)rr}r(h=X., which listens for notifications from GitHub)h>jubeubahQjubj)r}r(h=X%:bb:chsrc:`Change Hooks` in WebStatusrhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=jh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\KTh^]r(h{)r}r(h=X:bb:chsrc:`Change Hooks`rh>jhGhJhQhhS}r(UreftypeXchsrchhX Change HooksU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\KTh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX Change Hooksrr}r(h=Uh>jubahQhubaubhnX in WebStatusrr}r(h=X in WebStatush>jubeubahQjubj)r}r(h=XrGitHub change hook (specifically designed for GitHub notifications, but requiring a publicly-accessible WebStatus)hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XrGitHub change hook (specifically designed for GitHub notifications, but requiring a publicly-accessible WebStatus)rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\KUh^]rhnXrGitHub change hook (specifically designed for GitHub notifications, but requiring a publicly-accessible WebStatus)rr}r(h=jh>jubaubahQjubj)r}r(h=X7:bb:chsrc:`GitPoller` (polling a remote Git repository)rhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r }r (h=jh>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\KWh^]r (h{)r }r(h=X:bb:chsrc:`GitPoller`rh>j hGhJhQhhS}r(UreftypeXchsrchhX GitPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\KWh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>j h^]rhnX GitPollerrr}r(h=Uh>jubahQhubaubhnX" (polling a remote Git repository)rr}r(h=X" (polling a remote Git repository)h>j ubeubahQjubj)r}r (h=X\:bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository) hS}r!(hW]hX]hV]hU]hY]uh>jh^]r"hr)r#}r$(h=XZ:bb:chsrc:`GoogleCodeAtomPoller` (polling the commit feed for a GoogleCode Git repository)h>jhGhJhQhuhS}r%(hW]hX]hV]hU]hY]uh\KXh^]r&(h{)r'}r((h=X :bb:chsrc:`GoogleCodeAtomPoller`r)h>j#hGhJhQhhS}r*(UreftypeXchsrchhXGoogleCodeAtomPollerU refdomainXbbr+hU]hV]U refexplicithW]hX]hY]hhuh\KXh^]r,h)r-}r.(h=j)hS}r/(hW]hX]r0(hj+Xbb-chsrcr1ehV]hU]hY]uh>j'h^]r2hnXGoogleCodeAtomPollerr3r4}r5(h=Uh>j-ubahQhubaubhnX: (polling the commit feed for a GoogleCode Git repository)r6r7}r8(h=X: (polling the commit feed for a GoogleCode Git repository)h>j#ubeubahQjubehQj'ubahQj(ubeubj)r9}r:(h=XgRepo/Git * :bb:chsrc:`GerritChangeSource` connects to Gerrit via SSH to get a live stream of changes h>j|hGhJhQjhS}r;(hW]hX]hV]hU]hY]uh\K^h]hh^]r<(j)r=}r>(h=XRepo/Gitr?h>j9hGhJhQjhS}r@(hW]hX]hV]hU]hY]uh\K^h^]rAhnXRepo/GitrBrC}rD(h=j?h>j=ubaubj)rE}rF(h=UhS}rG(hW]hX]hV]hU]hY]uh>j9h^]rHj)rI}rJ(h=UhS}rK(jX*hU]hV]hW]hX]hY]uh>jEh^]rLj)rM}rN(h=XZ:bb:chsrc:`GerritChangeSource` connects to Gerrit via SSH to get a live stream of changes hS}rO(hW]hX]hV]hU]hY]uh>jIh^]rPhr)rQ}rR(h=XY:bb:chsrc:`GerritChangeSource` connects to Gerrit via SSH to get a live stream of changesh>jMhGhJhQhuhS}rS(hW]hX]hV]hU]hY]uh\K]h^]rT(h{)rU}rV(h=X:bb:chsrc:`GerritChangeSource`rWh>jQhGhJhQhhS}rX(UreftypeXchsrchhXGerritChangeSourceU refdomainXbbrYhU]hV]U refexplicithW]hX]hY]hhuh\K]h^]rZh)r[}r\(h=jWhS}r](hW]hX]r^(hjYXbb-chsrcr_ehV]hU]hY]uh>jUh^]r`hnXGerritChangeSourcerarb}rc(h=Uh>j[ubahQhubaubhnX; connects to Gerrit via SSH to get a live stream of changesrdre}rf(h=X; connects to Gerrit via SSH to get a live stream of changesh>jQubeubahQjubahQj'ubahQj(ubeubj)rg}rh(h=XMonotone * :bb:chsrc:`PBChangeSource` (listening for connections from :file:`monotone-buildbot.lua`, which is available with Monotone) h>j|hGhJhQjhS}ri(hW]hX]hV]hU]hY]uh\Kbh]hh^]rj(j)rk}rl(h=XMonotonermh>jghGhJhQjhS}rn(hW]hX]hV]hU]hY]uh\Kbh^]rohnXMonotonerprq}rr(h=jmh>jkubaubj)rs}rt(h=UhS}ru(hW]hX]hV]hU]hY]uh>jgh^]rvj)rw}rx(h=UhS}ry(jX*hU]hV]hW]hX]hY]uh>jsh^]rzj)r{}r|(h=X|:bb:chsrc:`PBChangeSource` (listening for connections from :file:`monotone-buildbot.lua`, which is available with Monotone) hS}r}(hW]hX]hV]hU]hY]uh>jwh^]r~hr)r}r(h=X{:bb:chsrc:`PBChangeSource` (listening for connections from :file:`monotone-buildbot.lua`, which is available with Monotone)h>j{hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Kah^]r(h{)r}r(h=X:bb:chsrc:`PBChangeSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Kah^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX! (listening for connections from rr}r(h=X! (listening for connections from h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXmonotone-buildbot.luarr}r(h=Xmonotone-buildbot.luah>jubahQhubhnX#, which is available with Monotone)rr}r(h=X#, which is available with Monotone)h>jubeubahQjubahQj'ubahQj(ubeubeubhr)r}r(h=XAll VC systems can be driven by a :bb:chsrc:`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 :ref:`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.h>j&hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Kdh]hh^]r(hnX"All VC systems can be driven by a rr}r(h=X"All VC systems can be driven by a h>jubh{)r}r(h=X:bb:chsrc:`PBChangeSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXPBChangeSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Kdh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXPBChangeSourcerr}r(h=Uh>jubahQhubaubhnX and the rr}r(h=X and the h>jubh)r}r(h=X``buildbot sendchange``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbuildbot sendchangerr}r(h=Uh>jubahQhubhnX~ tool run from some form of commit script. If you write an email parsing function, they can also all be driven by a suitable rr}r(h=X~ tool run from some form of commit script. If you write an email parsing function, they can also all be driven by a suitable h>jubh{)r}r(h=X7:ref:`mail-parsing source `rh>jhGhJhQhhS}r(UreftypeXrefhhXmail-parsing-changesourcesU refdomainXstdrhU]hV]U refexplicithW]hX]hY]hhuh\Kdh^]rh)r}r(h=jhS}r(hW]hX]r(hjXstd-refrehV]hU]hY]uh>jh^]rhnXmail-parsing sourcerr}r(h=Uh>jubahQhubaubhnX. 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.rr}r(h=X. 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>jubeubhr)r}r(h=X8See :bb:index:`chsrc` for a full list of change sources.rh>j&hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Klh]hh^]r(hnXSee rr}r(h=XSee h>jubh{)r}r(h=X:bb:index:`chsrc`rh>jhGhJhQhhS}r(UreftypeXindexhhXchsrcU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Klh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-indexrehV]hU]hY]uh>jh^]rhnXchsrcrr}r(h=Uh>jubahQhubaubhnX# for a full list of change sources.rr}r(h=X# for a full list of change sources.h>jubeubcsphinx.addnodes index r)r}r(h=Uh>j&hGhJhQUindexrhS}r(hU]hV]hW]hX]hY]Uentriesr]r(UsinglerXChange SourcesUindex-0rUtraUinlineruh\Knh]hh^]ubhN)r}r(h=Uh>j&hGhJhQhRhS}r(hW]hX]hV]hU]rjahY]uh\Koh]hh^]ubj)r}r(h=Uh>j&hGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleX!Buildmaster Config; change_sourceXcfg-change_sourcerjtr(UsingleX"change_source (Buildmaster Config)jjtreuh\Kqh]hh^]ubhN)r}r(h=Uh>j&hGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Kqh]hh^]ubeubh?)r }r (h=Uh>hEhGhJhL}hQh_hS}r (hW]hX]hV]hU]r (Uconfiguring-change-sourcesr jehY]rh1auh\Ksh]hhd}rjjsh^]r(hg)r}r(h=XConfiguring Change Sourcesrh>j hGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Ksh]hh^]rhnXConfiguring Change Sourcesrr}r(h=jh>jubaubhr)r}r(h=XdThe :bb:cfg:`change_source` configuration key holds all active change sources for the configuration.h>j hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Kuh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r }r!(h=X:bb:cfg:`change_source`r"h>jhGhJhQhhS}r#(UreftypeXcfghhX change_sourceU refdomainXbbr$hU]hV]U refexplicithW]hX]hY]hhuh\Kuh^]r%h)r&}r'(h=j"hS}r((hW]hX]r)(hj$Xbb-cfgr*ehV]hU]hY]uh>j h^]r+hnX change_sourcer,r-}r.(h=Uh>j&ubahQhubaubhnXI configuration key holds all active change sources for the configuration.r/r0}r1(h=XI configuration key holds all active change sources for the configuration.h>jubeubhr)r2}r3(h=X^Most configurations have a single :class:`ChangeSource`, watching only a single tree, e.g., ::h>j hGhJhQhuhS}r4(hW]hX]hV]hU]hY]uh\Kxh]hh^]r5(hnX"Most configurations have a single r6r7}r8(h=X"Most configurations have a single h>j2ubh{)r9}r:(h=X:class:`ChangeSource`r;h>j2hGhJhQhhS}r<(UreftypeXclasshhX ChangeSourceU refdomainXpyr=hU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kxh^]r>h)r?}r@(h=j;hS}rA(hW]hX]rB(hj=Xpy-classrCehV]hU]hY]uh>j9h^]rDhnX ChangeSourcerErF}rG(h=Uh>j?ubahQhubaubhnX$, watching only a single tree, e.g.,rHrI}rJ(h=X$, watching only a single tree, e.g.,h>j2ubeubcdocutils.nodes literal_block rK)rL}rM(h=X%c['change_source'] = PBChangeSource()h>j hGhJhQU literal_blockrNhS}rO(U xml:spacerPUpreserverQhU]hV]hW]hX]hY]uh\K{h]hh^]rRhnX%c['change_source'] = PBChangeSource()rSrT}rU(h=Uh>jLubaubhr)rV}rW(h=XQFor more advanced configurations, the parameter can be a list of change sources::rXh>j hGhJhQhuhS}rY(hW]hX]hV]hU]hY]uh\K}h]hh^]rZhnXPFor more advanced configurations, the parameter can be a list of change sources:r[r\}r](h=XPFor more advanced configurations, the parameter can be a list of change sources:h>jVubaubjK)r^}r_(h=XEsource1 = ... source2 = ... c['change_source'] = [ source1, source1 ]h>j hGhJhQjNhS}r`(jPjQhU]hV]hW]hX]hY]uh\Kh]hh^]rahnXEsource1 = ... source2 = ... c['change_source'] = [ source1, source1 ]rbrc}rd(h=Uh>j^ubaubh?)re}rf(h=Uh>j hGhJhQh_hS}rg(hW]hX]hV]hU]rhUrepository-and-projectriahY]rjh$auh\Kh]hh^]rk(hg)rl}rm(h=XRepository and Projectrnh>jehGhJhQhkhS}ro(hW]hX]hV]hU]hY]uh\Kh]hh^]rphnXRepository and Projectrqrr}rs(h=jnh>jlubaubhr)rt}ru(h=X:class:`ChangeSource`\s will, in general, automatically provide the proper :attr:`repository` attribute for any changes they produce. For systems which operate on URL-like specifiers, this is a repository URL. Other :class:`ChangeSource`\s adapt the concept as necessary.h>jehGhJhQhuhS}rv(hW]hX]hV]hU]hY]uh\Kh]hh^]rw(h{)rx}ry(h=X:class:`ChangeSource`rzh>jthGhJhQhhS}r{(UreftypeXclasshhX ChangeSourceU refdomainXpyr|hU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]r}h)r~}r(h=jzhS}r(hW]hX]r(hj|Xpy-classrehV]hU]hY]uh>jxh^]rhnX ChangeSourcerr}r(h=Uh>j~ubahQhubaubhnX5s will, in general, automatically provide the proper rr}r(h=X6\s will, in general, automatically provide the proper h>jtubh{)r}r(h=X:attr:`repository`rh>jthGhJhQhhS}r(UreftypeXattrhhX repositoryU refdomainXpyrhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rh)r}r(h=jhS}r(hW]hX]r(hjXpy-attrrehV]hU]hY]uh>jh^]rhnX repositoryrr}r(h=Uh>jubahQhubaubhnX| attribute for any changes they produce. For systems which operate on URL-like specifiers, this is a repository URL. Other rr}r(h=X| attribute for any changes they produce. For systems which operate on URL-like specifiers, this is a repository URL. Other h>jtubh{)r}r(h=X:class:`ChangeSource`rh>jthGhJhQhhS}r(UreftypeXclasshhX ChangeSourceU refdomainXpyrhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rh)r}r(h=jhS}r(hW]hX]r(hjXpy-classrehV]hU]hY]uh>jh^]rhnX ChangeSourcerr}r(h=Uh>jubahQhubaubhnX!s adapt the concept as necessary.rr}r(h=X"\s adapt the concept as necessary.h>jtubeubhr)r}r(h=XZMany :class:`ChangeSource`\s 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. :class:`Scheduler`\s can filter on project, so you can configure different builders to run for each project.h>jehGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Kh]hh^]r(hnXMany rr}r(h=XMany h>jubh{)r}r(h=X:class:`ChangeSource`rh>jhGhJhQhhS}r(UreftypeXclasshhX ChangeSourceU refdomainXpyrhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rh)r}r(h=jhS}r(hW]hX]r(hjXpy-classrehV]hU]hY]uh>jh^]rhnX ChangeSourcerr}r(h=Uh>jubahQhubaubhnXs 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. rr}r(h=X\s 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. h>jubh{)r}r(h=X:class:`Scheduler`rh>jhGhJhQhhS}r(UreftypeXclasshhX SchedulerU refdomainXpyrhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Kh^]rh)r}r(h=jhS}r(hW]hX]r(hjXpy-classrehV]hU]hY]uh>jh^]rhnX Schedulerrr}r(h=Uh>jubahQhubaubhnXYs can filter on project, so you can configure different builders to run for each project.rr}r(h=XZ\s can filter on project, so you can configure different builders to run for each project.h>jubeubhN)r}r(h=X.. _Mail-parsing-ChangeSources:h>jehGhJhQhRhS}r(hU]hV]hW]hX]hY]hZUmail-parsing-changesourcesruh\Kh]hh^]ubeubeubhCh?)r}r(h=UhBKh>hEhGhJhL}rhhN)r}r(h=X.. _PBChangeSource:h>h?)r}r(h=UhBKh>hChGhJhL}rhhN)r}r(h=X#.. _BzrLaunchpadEmailMaildirSource:h>h?)r}r(h=UhBKh>hChGhJhL}rhhN)r}r(h=X .. _SVNCommitEmailMaildirSource:h>h?)r}r(h=Uh>h@hGhJhQh_hS}r(hW]hX]hV]hU]rU-configuration-of-cvs-and-buildbot-cvs-mail-pyrahY]rhauh\MMh]hh^]r(hg)r}r(h=X-Configuration of CVS and buildbot_cvs_mail.pyrh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\MMh]hh^]rhnX-Configuration of CVS and buildbot_cvs_mail.pyrr}r(h=jh>jubaubhr)r}r(h=XCVS 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.rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MOh]hh^]rhnXCVS 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.rr}r(h=jh>jubaubhr)r}r(h=XTo update this, first do::rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MRh]hh^]rhnXTo update this, first do:rr }r (h=XTo update this, first do:h>jubaubjK)r }r (h=Xcvs checkout CVSROOTh>jhGhJhQjNhS}r (jPjQhU]hV]hW]hX]hY]uh\MTh]hh^]rhnXcvs checkout CVSROOTrr}r(h=Uh>j ubaubhr)r}r(h=XKcd to the CVSROOT directory and edit the file loginfo, adding a line like::rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MVh]hh^]rhnXJcd to the CVSROOT directory and edit the file loginfo, adding a line like:rr}r(h=XJcd to the CVSROOT directory and edit the file loginfo, adding a line like:h>jubaubjK)r}r(h=XwSomeModule /cvsroot/CVSROOT/buildbot_cvs_mail.py --cvsroot :ext:example.com:/cvsroot -e buildbot -P SomeModule %@{sVv@}h>jhGhJhQjNhS}r(jPjQhU]hV]hW]hX]hY]uh\MXh]hh^]rhnXwSomeModule /cvsroot/CVSROOT/buildbot_cvs_mail.py --cvsroot :ext:example.com:/cvsroot -e buildbot -P SomeModule %@{sVv@}rr}r (h=Uh>jubaubcdocutils.nodes note r!)r"}r#(h=X~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.h>jhGhJhQUnoter$hS}r%(hW]hX]hV]hU]hY]uh\Nh]hh^]r&hr)r'}r((h=X~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.h>j"hGhJhQhuhS}r)(hW]hX]hV]hU]hY]uh\MZh^]r*(hnXFor cvs version 1.12.x, the r+r,}r-(h=XFor cvs version 1.12.x, the h>j'ubh)r.}r/(h=X ``--path %p``hS}r0(hW]hX]hV]hU]hY]uh>j'h^]r1hnX --path %pr2r3}r4(h=Uh>j.ubahQhubhnXU option is required. Version 1.11.x and 1.12.x report the directory path differently.r5r6}r7(h=XU option is required. Version 1.11.x and 1.12.x report the directory path differently.h>j'ubeubaubhr)r8}r9(h=XDThe 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.h>jhGhJhQhuhS}r:(hW]hX]hV]hU]hY]uh\M]h]hh^]r;(hnXThe 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 r<r=}r>(h=XThe 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 h>j8ubh)r?}r@(h=X``-e``hS}rA(hW]hX]hV]hU]hY]uh>j8h^]rBhnX-erCrD}rE(h=Uh>j?ubahQhubhnX (email) and rFrG}rH(h=X (email) and h>j8ubh)rI}rJ(h=X``-P``hS}rK(hW]hX]hV]hU]hY]uh>j8h^]rLhnX-PrMrN}rO(h=Uh>jIubahQhubhnX7 (project) should be specified. The line must end with rPrQ}rR(h=X7 (project) should be specified. The line must end with h>j8ubh)rS}rT(h=X ``%{sVv}``hS}rU(hW]hX]hV]hU]hY]uh>j8h^]rVhnX%{sVv}rWrX}rY(h=Uh>jSubahQhubhnX2 This is expanded to the files that were modified.rZr[}r\(h=X2 This is expanded to the files that were modified.h>j8ubeubhr)r]}r^(h=X8Additional entries can be added to support more modules.r_h>jhGhJhQhuhS}r`(hW]hX]hV]hU]hY]uh\Mch]hh^]rahnX8Additional entries can be added to support more modules.rbrc}rd(h=j_h>j]ubaubhr)re}rf(h=XZSee :command:`buildbot_cvs_mail.py --help`` for more information on the available options.rgh>jhGhJhQhuhS}rh(hW]hX]hV]hU]hY]uh\Meh]hh^]ri(hnXSee rjrk}rl(h=XSee h>jeubcdocutils.nodes strong rm)rn}ro(h=X':command:`buildbot_cvs_mail.py --help``hS}rp(hW]hX]rqUcommandrrahV]hU]hY]uh>jeh^]rshnXbuildbot_cvs_mail.py --help`rtru}rv(h=Uh>jnubahQUstrongrwubhnX/ for more information on the available options.rxry}rz(h=X/ for more information on the available options.h>jeubeubj)r{}r|(h=Uh>jhGhJhQjhS}r}(hU]hV]hW]hX]hY]Uentries]r~((UsingleX+Change Sources; SVNCommitEmailMaildirSourceX!chsrc-SVNCommitEmailMaildirSourcerjtr(UsingleX)SVNCommitEmailMaildirSource Change Sourcejjtreuh\Mhh]hh^]ubhN)r}r(h=Uh>jhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mhh]hh^]ubjeubhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZUsvncommitemailmaildirsourceruh\Mih]hhd}rjjsh^]ubshQh_hS}r(hW]rXsvncommitemailmaildirsourcerahX]hV]hU]r(jjUid8rehY]rhauh\Mlh]hhd}r(jjjjuh^]r(hg)r}r(h=XSVNCommitEmailMaildirSourcerh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mlh]hh^]rhnXSVNCommitEmailMaildirSourcerr}r(h=jh>jubaubj)r}r(h=Uh>jhGNhQjhS}r(hU]hV]hW]hX]hY]Uentries]r(jXBbuildbot.changes.mail.SVNCommitEmailMaildirSource (built-in class)h%Utrauh\Nh]hh^]ubcsphinx.addnodes desc r)r}r(h=Uh>jhGNhQUdescrhS}r(UnoindexrUdomainrXpyhU]hV]hW]hX]hY]UobjtyperXclassrUdesctyperjuh\Nh]hh^]r(csphinx.addnodes desc_signature r)r}r(h=X1buildbot.changes.mail.SVNCommitEmailMaildirSourceh>jhGhJhQUdesc_signaturerhS}r(hU]rh%aUmodulerNhV]hW]hX]hY]rh%aUfullnamerh%UclassrXbuildbot.changes.mailUfirstruh\Moh]hh^]r(csphinx.addnodes desc_annotation r)r}r(h=Xclass h>jhGhJhQUdesc_annotationrhS}r(hW]hX]hV]hU]hY]uh\Moh]hh^]rhnXclass rr}r(h=Uh>jubaubcsphinx.addnodes desc_addname r)r}r(h=Xbuildbot.changes.mail.h>jhGhJhQU desc_addnamerhS}r(hW]hX]hV]hU]hY]uh\Moh]hh^]rhnXbuildbot.changes.mail.rr}r(h=Uh>jubaubcsphinx.addnodes desc_name r)r}r(h=XSVNCommitEmailMaildirSourceh>jhGhJhQU desc_namerhS}r(hW]hX]hV]hU]hY]uh\Moh]hh^]rhnXSVNCommitEmailMaildirSourcerr}r(h=Uh>jubaubeubcsphinx.addnodes desc_content r)r}r(h=Uh>jhGhJhQU desc_contentrhS}r(hW]hX]hV]hU]hY]uh\Moh]hh^]ubeubhr)r}r(h=X:bb:chsrc:`SVNCommitEmailMaildirSource` parses message sent out by the :file:`commit-email.pl` script, which is included in the Subversion distribution.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mph]hh^]r(h{)r}r(h=X':bb:chsrc:`SVNCommitEmailMaildirSource`rh>jhGhJhQhhS}r(UreftypeXchsrchhXSVNCommitEmailMaildirSourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mph^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXSVNCommitEmailMaildirSourcerr}r(h=Uh>jubahQhubaubhnX parses message sent out by the rr}r(h=X parses message sent out by the h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXcommit-email.plrr}r(h=Xcommit-email.plh>jubahQhubhnX: script, which is included in the Subversion distribution.rr}r(h=X: script, which is included in the Subversion distribution.h>jubeubhr)r}r(h=XIt does not currently handle branches: all of the Change objects that it creates will be associated with the default (i.e. trunk) branch. ::h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mth]hh^]rhnXIt does not currently handle branches: all of the Change objects that it creates will be associated with the default (i.e. trunk) branch.rr}r(h=XIt does not currently handle branches: all of the Change objects that it creates will be associated with the default (i.e. trunk) branch.h>jubaubjK)r}r(h=Xfrom buildbot.changes.mail import SVNCommitEmailMaildirSource c['change_source'] = SVNCommitEmailMaildirSource("~/maildir-buildbot")h>jhGhJhQjNhS}r(jPjQhU]hV]hW]hX]hY]uh\Mwh]hh^]rhnXfrom buildbot.changes.mail import SVNCommitEmailMaildirSource c['change_source'] = SVNCommitEmailMaildirSource("~/maildir-buildbot")rr}r(h=Uh>jubaubj)r}r(h=Uh>jhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleX.Change Sources; BzrLaunchpadEmailMaildirSourceX$chsrc-BzrLaunchpadEmailMaildirSourcerjtr (UsingleX,BzrLaunchpadEmailMaildirSource Change Sourcejjtr euh\M{h]hh^]ubhN)r }r (h=Uh>jhGhJhQhRhS}r (hU]hV]hW]hX]hY]hZjuh\M{h]hh^]ubjeubhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZUbzrlaunchpademailmaildirsourceruh\M|h]hhd}rjj sh^]ubshQh_hS}r(hW]rXbzrlaunchpademailmaildirsourcerahX]hV]hU]r(jjUid9rehY]rhauh\Mh]hhd}r(jj jjuh^]r(hg)r}r(h=XBzrLaunchpadEmailMaildirSourcerh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnXBzrLaunchpadEmailMaildirSourcerr}r (h=jh>jubaubj)r!}r"(h=Uh>jhGNhQjhS}r#(hU]hV]hW]hX]hY]Uentries]r$(jXEbuildbot.changes.mail.BzrLaunchpadEmailMaildirSource (built-in class)hUtr%auh\Nh]hh^]ubj)r&}r'(h=Uh>jhGNhQjhS}r((jjXpyhU]hV]hW]hX]hY]jXclassr)jj)uh\Nh]hh^]r*(j)r+}r,(h=X4buildbot.changes.mail.BzrLaunchpadEmailMaildirSourceh>j&hGhJhQjhS}r-(hU]r.hajNhV]hW]hX]hY]r/hajhjXbuildbot.changes.mailjuh\Mh]hh^]r0(j)r1}r2(h=Xclass h>j+hGhJhQjhS}r3(hW]hX]hV]hU]hY]uh\Mh]hh^]r4hnXclass r5r6}r7(h=Uh>j1ubaubj)r8}r9(h=Xbuildbot.changes.mail.h>j+hGhJhQjhS}r:(hW]hX]hV]hU]hY]uh\Mh]hh^]r;hnXbuildbot.changes.mail.r<r=}r>(h=Uh>j8ubaubj)r?}r@(h=XBzrLaunchpadEmailMaildirSourceh>j+hGhJhQjhS}rA(hW]hX]hV]hU]hY]uh\Mh]hh^]rBhnXBzrLaunchpadEmailMaildirSourcerCrD}rE(h=Uh>j?ubaubeubj)rF}rG(h=Uh>j&hGhJhQjhS}rH(hW]hX]hV]hU]hY]uh\Mh]hh^]ubeubhr)rI}rJ(h=X:bb:chsrc:`BzrLaunchpadEmailMaildirSource` parses the mails that are sent to addresses that subscribe to branch revision notifications for a bzr branch hosted on Launchpad.h>jhGhJhQhuhS}rK(hW]hX]hV]hU]hY]uh\Mh]hh^]rL(h{)rM}rN(h=X*:bb:chsrc:`BzrLaunchpadEmailMaildirSource`rOh>jIhGhJhQhhS}rP(UreftypeXchsrchhXBzrLaunchpadEmailMaildirSourceU refdomainXbbrQhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rRh)rS}rT(h=jOhS}rU(hW]hX]rV(hjQXbb-chsrcrWehV]hU]hY]uh>jMh^]rXhnXBzrLaunchpadEmailMaildirSourcerYrZ}r[(h=Uh>jSubahQhubaubhnX parses the mails that are sent to addresses that subscribe to branch revision notifications for a bzr branch hosted on Launchpad.r\r]}r^(h=X parses the mails that are sent to addresses that subscribe to branch revision notifications for a bzr branch hosted on Launchpad.h>jIubeubhr)r_}r`(h=XfThe branch name defaults to :samp:`lp:{Launchpad path}`. For example ``lp:~maria-captains/maria/5.1``.h>jhGhJhQhuhS}ra(hW]hX]hV]hU]hY]uh\Mh]hh^]rb(hnXThe branch name defaults to rcrd}re(h=XThe branch name defaults to h>j_ubh)rf}rg(h=UhS}rh(hU]hV]hW]hX]riXsamprjaUrolejjhY]uh>j_h^]rk(hnXlp:rlrm}rn(h=Xlp:h>jfubh)ro}rp(h=XLaunchpad pathhS}rq(hW]hX]hV]hU]hY]uh>jfh^]rrhnXLaunchpad pathrsrt}ru(h=Uh>joubahQhubehQhubhnX. For example rvrw}rx(h=X. For example h>j_ubh)ry}rz(h=X ``lp:~maria-captains/maria/5.1``hS}r{(hW]hX]hV]hU]hY]uh>j_h^]r|hnXlp:~maria-captains/maria/5.1r}r~}r(h=Uh>jyubahQhubhnX.r}r(h=X.h>j_ubeubhr)r}r(h=XeIf only a single branch is used, the default branch name can be changed by setting ``defaultBranch``.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXSIf only a single branch is used, the default branch name can be changed by setting rr}r(h=XSIf only a single branch is used, the default branch name can be changed by setting h>jubh)r}r(h=X``defaultBranch``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX defaultBranchrr}r(h=Uh>jubahQhubhnX.r}r(h=X.h>jubeubhr)r}r(h=XFor 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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnX=For multiple branches, pass a dictionary as the value of the rr}r(h=X=For multiple branches, pass a dictionary as the value of the h>jubh)r}r(h=X ``branchMap``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX branchMaprr}r(h=Uh>jubahQhubhnXc option to map specific repository paths to specific branch names (see example below). The leading rr}r(h=Xc option to map specific repository paths to specific branch names (see example below). The leading h>jubh)r}r(h=X``lp:``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXlp:rr}r(h=Uh>jubahQhubhnX prefix of the path is optional.rr}r(h=X prefix of the path is optional.h>jubeubhr)r}r(h=XThe ``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).h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXThe rr}r(h=XThe h>jubh)r}r(h=X ``prefix``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXprefixrr}r(h=Uh>jubahQhubhnX; option is not supported (it is silently ignored). Use the rr}r(h=X; option is not supported (it is silently ignored). Use the h>jubh)r}r(h=X ``branchMap``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX branchMaprr}r(h=Uh>jubahQhubhnX and rr}r(h=X and h>jubh)r}r(h=X``defaultBranch``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX defaultBranchrr}r(h=Uh>jubahQhubhnXu instead to assign changes to branches (and just do not subscribe the buildbot to branches that are not of interest).rr}r(h=Xu instead to assign changes to branches (and just do not subscribe the buildbot to branches that are not of interest).h>jubeubhr)r}r(h=X-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. ::h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXThe 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 rr}r(h=XThe 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 h>jubcdocutils.nodes title_reference r)r}r(h=X`append_revisions_only`hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXappend_revisions_onlyrr}r(h=Uh>jubahQUtitle_referencerubhnXr option for public shared repositories to avoid new pushes of merges changing the meaning of old revision numbers.rr}r(h=Xr option for public shared repositories to avoid new pushes of merges changing the meaning of old revision numbers.h>jubeubjK)r}r(h=Xfrom 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)h>jhGhJhQjNhS}r(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rhnXfrom 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)rr}r(h=Uh>jubaubj)r}r(h=Uh>jhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleXChange Sources; PBChangeSourceXchsrc-PBChangeSourcerjtr(UsingleXPBChangeSource Change Sourcejjtreuh\Mh]hh^]ubhN)r}r(h=Uh>jhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mh]hh^]ubjeubhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZUpbchangesourceruh\Mh]hhd}rjjsh^]ubshQh_hS}r(hW]rXpbchangesourcerahX]hV]hU]r(jjUid10rehY]rhauh\Mh]hhd}r(jjjjuh^]r (hg)r }r (h=XPBChangeSourcer h>jhGhJhQhkhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r hnXPBChangeSourcer r }r (h=j h>j ubaubj)r }r (h=Uh>jhGNhQjhS}r (hU]hV]hW]hX]hY]Uentries]r (jX3buildbot.changes.pb.PBChangeSource (built-in class)h'Utr auh\Nh]hh^]ubj)r }r (h=Uh>jhGNhQjhS}r (jjXpyhU]hV]hW]hX]hY]jXclassr jj uh\Nh]hh^]r (j)r }r (h=X"buildbot.changes.pb.PBChangeSourceh>j hGhJhQjhS}r (hU]r h'ajNhV]hW]hX]hY]r h'ajh'jXbuildbot.changes.pbjuh\Mh]hh^]r (j)r }r (h=Xclass h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r hnXclass r r }r (h=Uh>j ubaubj)r }r! (h=Xbuildbot.changes.pb.h>j hGhJhQjhS}r" (hW]hX]hV]hU]hY]uh\Mh]hh^]r# hnXbuildbot.changes.pb.r$ r% }r& (h=Uh>j ubaubj)r' }r( (h=XPBChangeSourceh>j hGhJhQjhS}r) (hW]hX]hV]hU]hY]uh\Mh]hh^]r* hnXPBChangeSourcer+ r, }r- (h=Uh>j' ubaubeubj)r. }r/ (h=Uh>j hGhJhQjhS}r0 (hW]hX]hV]hU]hY]uh\Mh]hh^]ubeubhr)r1 }r2 (h=X:bb:chsrc:`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 :file:`.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 :bb:chsrc:`PBChangeSource` with the same name as a slave.h>jhGhJhQhuhS}r3 (hW]hX]hV]hU]hY]uh\Mh]hh^]r4 (h{)r5 }r6 (h=X:bb:chsrc:`PBChangeSource`r7 h>j1 hGhJhQhhS}r8 (UreftypeXchsrchhXPBChangeSourceU refdomainXbbr9 hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r: h)r; }r< (h=j7 hS}r= (hW]hX]r> (hj9 Xbb-chsrcr? ehV]hU]hY]uh>j5 h^]r@ hnXPBChangeSourcerA rB }rC (h=Uh>j; ubahQhubaubhnXO actually listens on a TCP port for clients to connect and push change notices rD rE }rF (h=XO actually listens on a TCP port for clients to connect and push change notices h>j1 ubh)rG }rH (h=X*into*hS}rI (hW]hX]hV]hU]hY]uh>j1 h^]rJ hnXintorK rL }rM (h=Uh>jG ubahQhubhnX/ the Buildmaster. This is used by the built-in rN rO }rP (h=X/ the Buildmaster. This is used by the built-in h>j1 ubh)rQ }rR (h=X``buildbot sendchange``hS}rS (hW]hX]hV]hU]hY]uh>j1 h^]rT hnXbuildbot sendchangerU rV }rW (h=Uh>jQ ubahQhubhnX 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 rX rY }rZ (h=X 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 h>j1 ubj)r[ }r\ (h=X`push`hS}r] (hW]hX]hV]hU]hY]uh>j1 h^]r^ hnXpushr_ r` }ra (h=Uh>j[ ubahQjubhnXf model instead of some kind of subscription scheme, for example a script which is run out of an email rb rc }rd (h=Xf model instead of some kind of subscription scheme, for example a script which is run out of an email h>j1 ubh)re }rf (h=UhS}rg (hU]hV]hW]hX]rh Xfileri aUroleji hY]uh>j1 h^]rj hnX.forwardrk rl }rm (h=X.forwardh>je ubahQhubhnX 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 rn ro }rp (h=X 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 h>j1 ubh{)rq }rr (h=X:bb:chsrc:`PBChangeSource`rs h>j1 hGhJhQhhS}rt (UreftypeXchsrchhXPBChangeSourceU refdomainXbbru hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rv h)rw }rx (h=js hS}ry (hW]hX]rz (hju Xbb-chsrcr{ ehV]hU]hY]uh>jq h^]r| hnXPBChangeSourcer} r~ }r (h=Uh>jw ubahQhubaubhnX with the same name as a slave.r r }r (h=X with the same name as a slave.h>j1 ubeubhr)r }r (h=XIf you have a publicly accessible slave port, and are using :bb:chsrc:`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.h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (hnX<If you have a publicly accessible slave port, and are using r r }r (h=X<If you have a publicly accessible slave port, and are using h>j ubh{)r }r (h=X:bb:chsrc:`PBChangeSource`r h>j hGhJhQhhS}r (UreftypeXchsrchhXPBChangeSourceU refdomainXbbr hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r h)r }r (h=j hS}r (hW]hX]r (hj Xbb-chsrcr ehV]hU]hY]uh>j h^]r hnXPBChangeSourcer r }r (h=Uh>j ubahQhubaubhnX, r r }r (h=X, h>j ubh)r }r (h=XI*you must establish a secure username and password for the change source*hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXGyou must establish a secure username and password for the change sourcer r }r (h=Uh>j ubahQhubhnX. 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.r r }r (h=X. 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.h>j ubeubhr)r }r (h=XGThe :bb:chsrc:`PBChangeSource` is created with the following arguments.r h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (hnXThe r r }r (h=XThe h>j ubh{)r }r (h=X:bb:chsrc:`PBChangeSource`r h>j hGhJhQhhS}r (UreftypeXchsrchhXPBChangeSourceU refdomainXbbr hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r h)r }r (h=j hS}r (hW]hX]r (hj Xbb-chsrcr ehV]hU]hY]uh>j h^]r hnXPBChangeSourcer r }r (h=Uh>j ubahQhubaubhnX) is created with the following arguments.r r }r (h=X) is created with the following arguments.h>j ubeubj{)r }r (h=Uh>jhGhJhQj~hS}r (hW]hX]hV]hU]hY]uh\Nh]hh^]r (j)r }r (h=Xz``port`` which port to listen on. If ``None`` (which is the default), it shares the port used for buildslave connections. h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r (j)r }r (h=X``port``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXportr r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j h^]r hr)r }r (h=Xpwhich port to listen on. If ``None`` (which is the default), it shares the port used for buildslave connections.h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r (hnXwhich port to listen on. If r r }r (h=Xwhich port to listen on. If h>j ubh)r }r (h=X``None``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXNoner r }r (h=Uh>j ubahQhubhnXL (which is the default), it shares the port used for buildslave connections.r r }r (h=XL (which is the default), it shares the port used for buildslave connections.h>j ubeubahQj(ubeubj)r }r (h=X^``user`` The user account that the client program must use to connect. Defaults to ``change`` h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (j)r }r (h=X``user``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXuserr r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j h^]r hr)r }r (h=XTThe user account that the client program must use to connect. Defaults to ``change``h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r (hnXJThe user account that the client program must use to connect. Defaults to r r }r (h=XJThe user account that the client program must use to connect. Defaults to h>j ubh)r }r (h=X ``change``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXchanger r }r (h=Uh>j ubahQhubeubahQj(ubeubj)r }r (h=X|``passwd`` The password for the connection - defaults to ``changepw``. Do not use this default on a publicly exposed port! h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (j)r }r (h=X ``passwd``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXpasswdr r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j h^]r hr)r }r (h=XpThe password for the connection - defaults to ``changepw``. Do not use this default on a publicly exposed port!h>j hGhJhQhuhS}r! (hW]hX]hV]hU]hY]uh\Mh^]r" (hnX.The password for the connection - defaults to r# r$ }r% (h=X.The password for the connection - defaults to h>j ubh)r& }r' (h=X ``changepw``hS}r( (hW]hX]hV]hU]hY]uh>j h^]r) hnXchangepwr* r+ }r, (h=Uh>j& ubahQhubhnX6. Do not use this default on a publicly exposed port!r- r. }r/ (h=X6. Do not use this default on a publicly exposed port!h>j ubeubahQj(ubeubj)r0 }r1 (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>j hGhJhQjhS}r2 (hW]hX]hV]hU]hY]uh\Mh]hh^]r3 (j)r4 }r5 (h=X ``prefix``r6 h>j0 hGhJhQjhS}r7 (hW]hX]hV]hU]hY]uh\Mh^]r8 h)r9 }r: (h=j6 hS}r; (hW]hX]hV]hU]hY]uh>j4 h^]r< hnXprefixr= r> }r? (h=Uh>j9 ubahQhubaubj)r@ }rA (h=UhS}rB (hW]hX]hV]hU]hY]uh>j0 h^]rC (hr)rD }rE (h=XCThe 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.h>j@ hGhJhQhuhS}rF (hW]hX]hV]hU]hY]uh\Mh^]rG (hnX`The prefix to be found and stripped from filenames delivered over the connection, defaulting to rH rI }rJ (h=X`The prefix to be found and stripped from filenames delivered over the connection, defaulting to h>jD ubh)rK }rL (h=X``None``hS}rM (hW]hX]hV]hU]hY]uh>jD h^]rN hnXNonerO rP }rQ (h=Uh>jK ubahQhubhnX. 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.rR rS }rT (h=X. 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.h>jD ubeubhr)rU }rV (h=XThis 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>j@ hGhJhQhuhS}rW (hW]hX]hV]hU]hY]uh\Mh^]rX (hnXThis 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 rY rZ }r[ (h=XThis 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 h>jU ubh)r\ }r] (h=X ``trunk/``hS}r^ (hW]hX]hV]hU]hY]uh>jU h^]r_ hnXtrunk/r` ra }rb (h=Uh>j\ ubahQhubhnX or rc rd }re (h=X or h>jU ubh)rf }rg (h=X``project/branches/foobranch/``hS}rh (hW]hX]hV]hU]hY]uh>jU h^]ri hnXproject/branches/foobranch/rj rk }rl (h=Uh>jf ubahQhubhnX] to only follow one branch and to get correct tree-relative filenames. Without a prefix, the rm rn }ro (h=X] to only follow one branch and to get correct tree-relative filenames. Without a prefix, the h>jU ubh{)rp }rq (h=X:bb:chsrc:`PBChangeSource`rr h>jU hGhJhQhhS}rs (UreftypeXchsrchhXPBChangeSourceU refdomainXbbrt hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]ru h)rv }rw (h=jr hS}rx (hW]hX]ry (hjt Xbb-chsrcrz ehV]hU]hY]uh>jp h^]r{ hnXPBChangeSourcer| r} }r~ (h=Uh>jv ubahQhubaubhnX3 will probably deliver Changes with filenames like r r }r (h=X3 will probably deliver Changes with filenames like h>jU ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>jU h^]r hnX trunk/foo.cr r }r (h=X trunk/foo.ch>j ubahQhubhnX instead of just r r }r (h=X instead of just h>jU ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>jU h^]r hnXfoo.cr r }r (h=Xfoo.ch>j ubahQhubhnXI. Of course this also depends upon the tool sending the Changes in (like r r }r (h=XI. Of course this also depends upon the tool sending the Changes in (like h>jU ubh{)r }r (h=X.:bb:cmdline:`buildbot sendchange `r h>jU hGhJhQhhS}r (UreftypeXcmdlinehhX sendchangeU refdomainXbbr hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r h)r }r (h=j hS}r (hW]hX]r (hj X bb-cmdliner ehV]hU]hY]uh>j h^]r hnXbuildbot sendchanger r }r (h=Uh>j ubahQhubaubhnXl) and what filenames it is delivering: that tool may be filtering and stripping prefixes at the sending end.r r }r (h=Xl) and what filenames it is delivering: that tool may be filtering and stripping prefixes at the sending end.h>jU ubeubehQj(ubeubeubhr)r }r (h=X For example::r h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r hnX For example:r r }r (h=X For example:h>j ubaubjK)r }r (h=Xnfrom buildbot.changes import pb c['change_source'] = pb.PBChangeSource(port=9999, user='laura', passwd='fpga')h>jhGhJhQjNhS}r (jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]r hnXnfrom buildbot.changes import pb c['change_source'] = pb.PBChangeSource(port=9999, user='laura', passwd='fpga')r r }r (h=Uh>j ubaubhr)r }r (h=XTThe following hooks are useful for sending changes to a :bb:chsrc:`PBChangeSource`\:r h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (hnX8The following hooks are useful for sending changes to a r r }r (h=X8The following hooks are useful for sending changes to a h>j ubh{)r }r (h=X:bb:chsrc:`PBChangeSource`r h>j hGhJhQhhS}r (UreftypeXchsrchhXPBChangeSourceU refdomainXbbr hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r h)r }r (h=j hS}r (hW]hX]r (hj Xbb-chsrcr ehV]hU]hY]uh>j h^]r hnXPBChangeSourcer r }r (h=Uh>j ubahQhubaubhnX:r }r (h=X\:h>j ubeubhN)r }r (h=X.. _Mercurial-Hook:h>jhGhJhQhRhS}r (hU]hV]hW]hX]hY]hZUmercurial-hookr uh\Mh]hh^]ubh?)r }r (h=Uh>jhGhJhL}r hj shQh_hS}r (hW]hX]hV]hU]r (j Uid11r ehY]r (hheuh\Mh]hhd}r j j sh^]r (hg)r }r (h=XMercurial Hookr h>j hGhJhQhkhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r hnXMercurial Hookr r }r (h=j h>j ubaubhr)r }r (h=XSince Mercurial is written in Python, the hook script can invoke Buildbot's :meth:`sendchange` function directly, rather than having to spawn an external process. This function delivers the same sort of changes as :command:`buildbot sendchange` and the various hook scripts in :file:`contrib/`, so you'll need to add a :bb:chsrc:`PBChangeSource` to your buildmaster to receive these changes.h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (hnXLSince Mercurial is written in Python, the hook script can invoke Buildbot's r r }r (h=XLSince Mercurial is written in Python, the hook script can invoke Buildbot's h>j ubh{)r }r (h=X:meth:`sendchange`r h>j hGhJhQhhS}r (UreftypeXmethhhX sendchangeU refdomainXpyr hU]hV]U refexplicithW]hX]hY]hhhNhNuh\Mh^]r h)r }r (h=j hS}r (hW]hX]r (hj Xpy-methr ehV]hU]hY]uh>j h^]r hnX sendchanger r }r (h=Uh>j ubahQhubaubhnXx function directly, rather than having to spawn an external process. This function delivers the same sort of changes as r r }r (h=Xx function directly, rather than having to spawn an external process. This function delivers the same sort of changes as h>j ubjm)r }r (h=X:command:`buildbot sendchange`hS}r (hW]hX]r jrahV]hU]hY]uh>j h^]r hnXbuildbot sendchanger r }r (h=Uh>j ubahQjwubhnX! and the various hook scripts in r r }r (h=X! and the various hook scripts in h>j ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>j h^]r hnXcontrib/r r }r (h=Xcontrib/h>j ubahQhubhnX, so you'll need to add a r r }r (h=X, so you'll need to add a h>j ubh{)r }r (h=X:bb:chsrc:`PBChangeSource`r h>j hGhJhQhhS}r (UreftypeXchsrchhXPBChangeSourceU refdomainXbbr hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r h)r }r (h=j hS}r! (hW]hX]r" (hj Xbb-chsrcr# ehV]hU]hY]uh>j h^]r$ hnXPBChangeSourcer% r& }r' (h=Uh>j ubahQhubaubhnX. to your buildmaster to receive these changes.r( r) }r* (h=X. to your buildmaster to receive these changes.h>j ubeubhr)r+ }r, (h=XTo set this up, first choose a Mercurial repository that represents your central `official` source tree. This will be the same repository that your buildslaves will eventually pull from. Install Buildbot on the machine that hosts this repository, using the same version of Python as Mercurial is using (so that the Mercurial hook can import code from buildbot). Then add the following to the :file:`.hg/hgrc` file in that repository, replacing the buildmaster hostname/portnumber as appropriate for your buildbot:h>j hGhJhQhuhS}r- (hW]hX]hV]hU]hY]uh\Mh]hh^]r. (hnXQTo set this up, first choose a Mercurial repository that represents your central r/ r0 }r1 (h=XQTo set this up, first choose a Mercurial repository that represents your central h>j+ ubj)r2 }r3 (h=X `official`hS}r4 (hW]hX]hV]hU]hY]uh>j+ h^]r5 hnXofficialr6 r7 }r8 (h=Uh>j2 ubahQjubhnX- source tree. This will be the same repository that your buildslaves will eventually pull from. Install Buildbot on the machine that hosts this repository, using the same version of Python as Mercurial is using (so that the Mercurial hook can import code from buildbot). Then add the following to the r9 r: }r; (h=X- source tree. This will be the same repository that your buildslaves will eventually pull from. Install Buildbot on the machine that hosts this repository, using the same version of Python as Mercurial is using (so that the Mercurial hook can import code from buildbot). Then add the following to the h>j+ ubh)r< }r= (h=UhS}r> (hU]hV]hW]hX]r? Xfiler@ aUrolej@ hY]uh>j+ h^]rA hnX.hg/hgrcrB rC }rD (h=X.hg/hgrch>j< ubahQhubhnXi file in that repository, replacing the buildmaster hostname/portnumber as appropriate for your buildbot:rE rF }rG (h=Xi file in that repository, replacing the buildmaster hostname/portnumber as appropriate for your buildbot:h>j+ ubeubjK)rH }rI (h=X[hooks] changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook [hgbuildbot] master = buildmaster.example.org:9987 # .. other hgbuildbot parameters ..h>j hGhJhQjNhS}rJ (UlinenosrK UlanguagerL XinijPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rM hnX[hooks] changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook [hgbuildbot] master = buildmaster.example.org:9987 # .. other hgbuildbot parameters ..rN rO }rP (h=Uh>jH ubaubhr)rQ }rR (h=XThe ``master`` configuration key allows to have more than one buildmaster specification. The buildmasters have to be separated by a whitspace or comma (see also 'hg help config'):h>j hGhJhQhuhS}rS (hW]hX]hV]hU]hY]uh\Mh]hh^]rT (hnXThe rU rV }rW (h=XThe h>jQ ubh)rX }rY (h=X ``master``hS}rZ (hW]hX]hV]hU]hY]uh>jQ h^]r[ hnXmasterr\ r] }r^ (h=Uh>jX ubahQhubhnX configuration key allows to have more than one buildmaster specification. The buildmasters have to be separated by a whitspace or comma (see also 'hg help config'):r_ r` }ra (h=X configuration key allows to have more than one buildmaster specification. The buildmasters have to be separated by a whitspace or comma (see also 'hg help config'):h>jQ ubeubjK)rb }rc (h=XKmaster = buildmaster.example.org:9987 buildmaster2.example.org:9989h>j hGhJhQjNhS}rd (jK jL XinijPjQhU]hV]hW]hX]hY]uh\Mh]hh^]re hnXKmaster = buildmaster.example.org:9987 buildmaster2.example.org:9989rf rg }rh (h=Uh>jb ubaubj!)ri }rj (h=XMercurial lets you define multiple ``changegroup`` hooks by giving them distinct names, like ``changegroup.foo`` and ``changegroup.bar``, which is why we use ``changegroup.buildbot`` in this example. There is nothing magical about the `buildbot` suffix in the hook name. The ``[hgbuildbot]`` section *is* special, however, as it is the only section that the buildbot hook pays attention to.)h>j hGhJhQj$hS}rk (hW]hX]hV]hU]hY]uh\Nh]hh^]rl hr)rm }rn (h=XMercurial lets you define multiple ``changegroup`` hooks by giving them distinct names, like ``changegroup.foo`` and ``changegroup.bar``, which is why we use ``changegroup.buildbot`` in this example. There is nothing magical about the `buildbot` suffix in the hook name. The ``[hgbuildbot]`` section *is* special, however, as it is the only section that the buildbot hook pays attention to.)h>ji hGhJhQhuhS}ro (hW]hX]hV]hU]hY]uh\M h^]rp (hnX#Mercurial lets you define multiple rq rr }rs (h=X#Mercurial lets you define multiple h>jm ubh)rt }ru (h=X``changegroup``hS}rv (hW]hX]hV]hU]hY]uh>jm h^]rw hnX changegrouprx ry }rz (h=Uh>jt ubahQhubhnX+ hooks by giving them distinct names, like r{ r| }r} (h=X+ hooks by giving them distinct names, like h>jm ubh)r~ }r (h=X``changegroup.foo``hS}r (hW]hX]hV]hU]hY]uh>jm h^]r hnXchangegroup.foor r }r (h=Uh>j~ ubahQhubhnX and r r }r (h=X and h>jm ubh)r }r (h=X``changegroup.bar``hS}r (hW]hX]hV]hU]hY]uh>jm h^]r hnXchangegroup.barr r }r (h=Uh>j ubahQhubhnX, which is why we use r r }r (h=X, which is why we use h>jm ubh)r }r (h=X``changegroup.buildbot``hS}r (hW]hX]hV]hU]hY]uh>jm h^]r hnXchangegroup.buildbotr r }r (h=Uh>j ubahQhubhnX5 in this example. There is nothing magical about the r r }r (h=X5 in this example. There is nothing magical about the h>jm ubj)r }r (h=X `buildbot`hS}r (hW]hX]hV]hU]hY]uh>jm h^]r hnXbuildbotr r }r (h=Uh>j ubahQjubhnX suffix in the hook name. The r r }r (h=X suffix in the hook name. The h>jm ubh)r }r (h=X``[hgbuildbot]``hS}r (hW]hX]hV]hU]hY]uh>jm h^]r hnX [hgbuildbot]r r }r (h=Uh>j ubahQhubhnX section r r }r (h=X section h>jm ubh)r }r (h=X*is*hS}r (hW]hX]hV]hU]hY]uh>jm h^]r hnXisr r }r (h=Uh>j ubahQhubhnXW special, however, as it is the only section that the buildbot hook pays attention to.)r r }r (h=XW special, however, as it is the only section that the buildbot hook pays attention to.)h>jm ubeubaubhr)r }r (h=XAlso note that this runs as a ``changegroup`` hook, rather than as an ``incoming`` hook. The ``changegroup`` hook is run with multiple revisions at a time (say, if multiple revisions are being pushed to this repository in a single :command:`hg push` command), whereas the ``incoming`` hook is run with just one revision at a time. The ``hgbuildbot.hook`` function will only work with the ``changegroup`` hook.h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (hnXAlso note that this runs as a r r }r (h=XAlso note that this runs as a h>j ubh)r }r (h=X``changegroup``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnX changegroupr r }r (h=Uh>j ubahQhubhnX hook, rather than as an r r }r (h=X hook, rather than as an h>j ubh)r }r (h=X ``incoming``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXincomingr r }r (h=Uh>j ubahQhubhnX hook. The r r }r (h=X hook. The h>j ubh)r }r (h=X``changegroup``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnX changegroupr r }r (h=Uh>j ubahQhubhnX{ hook is run with multiple revisions at a time (say, if multiple revisions are being pushed to this repository in a single r r }r (h=X{ hook is run with multiple revisions at a time (say, if multiple revisions are being pushed to this repository in a single h>j ubjm)r }r (h=X:command:`hg push`hS}r (hW]hX]r jrahV]hU]hY]uh>j h^]r hnXhg pushr r }r (h=Uh>j ubahQjwubhnX command), whereas the r r }r (h=X command), whereas the h>j ubh)r }r (h=X ``incoming``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXincomingr r }r (h=Uh>j ubahQhubhnX3 hook is run with just one revision at a time. The r r }r (h=X3 hook is run with just one revision at a time. The h>j ubh)r }r (h=X``hgbuildbot.hook``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXhgbuildbot.hookr r }r (h=Uh>j ubahQhubhnX" function will only work with the r r }r (h=X" function will only work with the h>j ubh)r }r (h=X``changegroup``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnX changegroupr r }r (h=Uh>j ubahQhubhnX hook.r r }r (h=X hook.h>j ubeubhr)r }r (h=XwChanges' attribute ``properties`` has an entry ``is_merge`` which is set to true when the change was caused by a merge.h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (hnXChanges' attribute r r }r (h=XChanges' attribute h>j ubh)r }r (h=X``properties``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnX propertiesr r }r (h=Uh>j ubahQhubhnX has an entry r r }r (h=X has an entry h>j ubh)r }r (h=X ``is_merge``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXis_merger r }r (h=Uh>j ubahQhubhnX< which is set to true when the change was caused by a merge.r r! }r" (h=X< which is set to true when the change was caused by a merge.h>j ubeubh?)r# }r$ (h=Uh>j hGhJhQh_hS}r% (hW]hX]hV]hU]r& Uauthenticationr' ahY]r( hauh\Mh]hh^]r) (hg)r* }r+ (h=XAuthenticationr, h>j# hGhJhQhkhS}r- (hW]hX]hV]hU]hY]uh\Mh]hh^]r. hnXAuthenticationr/ r0 }r1 (h=j, h>j* ubaubhr)r2 }r3 (h=XRIf the buildmaster :bb:chsrc:`PBChangeSource` is configured to require sendchange credentials then you can set these with the ``auth`` parameter. When this parameter is not set it defaults to ``change:changepw``, which are the defaults for the ``user`` and ``password`` values of a ``PBChangeSource`` which doesn't require authentication.h>j# hGhJhQhuhS}r4 (hW]hX]hV]hU]hY]uh\M h]hh^]r5 (hnXIf the buildmaster r6 r7 }r8 (h=XIf the buildmaster h>j2 ubh{)r9 }r: (h=X:bb:chsrc:`PBChangeSource`r; h>j2 hGhJhQhhS}r< (UreftypeXchsrchhXPBChangeSourceU refdomainXbbr= hU]hV]U refexplicithW]hX]hY]hhuh\M h^]r> h)r? }r@ (h=j; hS}rA (hW]hX]rB (hj= Xbb-chsrcrC ehV]hU]hY]uh>j9 h^]rD hnXPBChangeSourcerE rF }rG (h=Uh>j? ubahQhubaubhnXQ is configured to require sendchange credentials then you can set these with the rH rI }rJ (h=XQ is configured to require sendchange credentials then you can set these with the h>j2 ubh)rK }rL (h=X``auth``hS}rM (hW]hX]hV]hU]hY]uh>j2 h^]rN hnXauthrO rP }rQ (h=Uh>jK ubahQhubhnX: parameter. When this parameter is not set it defaults to rR rS }rT (h=X: parameter. When this parameter is not set it defaults to h>j2 ubh)rU }rV (h=X``change:changepw``hS}rW (hW]hX]hV]hU]hY]uh>j2 h^]rX hnXchange:changepwrY rZ }r[ (h=Uh>jU ubahQhubhnX!, which are the defaults for the r\ r] }r^ (h=X!, which are the defaults for the h>j2 ubh)r_ }r` (h=X``user``hS}ra (hW]hX]hV]hU]hY]uh>j2 h^]rb hnXuserrc rd }re (h=Uh>j_ ubahQhubhnX and rf rg }rh (h=X and h>j2 ubh)ri }rj (h=X ``password``hS}rk (hW]hX]hV]hU]hY]uh>j2 h^]rl hnXpasswordrm rn }ro (h=Uh>ji ubahQhubhnX values of a rp rq }rr (h=X values of a h>j2 ubh)rs }rt (h=X``PBChangeSource``hS}ru (hW]hX]hV]hU]hY]uh>j2 h^]rv hnXPBChangeSourcerw rx }ry (h=Uh>js ubahQhubhnX& which doesn't require authentication.rz r{ }r| (h=X& which doesn't require authentication.h>j2 ubeubjK)r} }r~ (h=X0[hgbuildbot] auth = clientname:supersecret # ...h>j# hGhJhQjNhS}r (jK jL XinijPjQhU]hV]hW]hX]hY]uh\M'h]hh^]r hnX0[hgbuildbot] auth = clientname:supersecret # ...r r }r (h=Uh>j} ubaubhr)r }r (h=X9You can set this parameter in either the global :file:`/etc/mercurial/hgrc`, your personal :file:`~/.hgrc` file or the repository local :file:`.hg/hgrc` file. But since this value is stored in plain text, you must make sure that it can only be read by those users that need to know the authentication credentials.h>j# hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\M-h]hh^]r (hnX0You can set this parameter in either the global r r }r (h=X0You can set this parameter in either the global h>j ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>j h^]r hnX/etc/mercurial/hgrcr r }r (h=X/etc/mercurial/hgrch>j ubahQhubhnX, your personal r r }r (h=X, your personal h>j ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>j h^]r hnX~/.hgrcr r }r (h=X~/.hgrch>j ubahQhubhnX file or the repository local r r }r (h=X file or the repository local h>j ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>j h^]r hnX.hg/hgrcr r }r (h=X.hg/hgrch>j ubahQhubhnX file. But since this value is stored in plain text, you must make sure that it can only be read by those users that need to know the authentication credentials.r r }r (h=X file. But since this value is stored in plain text, you must make sure that it can only be read by those users that need to know the authentication credentials.h>j ubeubeubh?)r }r (h=Uh>j hGhJhQh_hS}r (hW]hX]hV]hU]r U branch-typer ahY]r h auh\M4h]hh^]r (hg)r }r (h=X Branch Typer h>j hGhJhQhkhS}r (hW]hX]hV]hU]hY]uh\M4h]hh^]r hnX Branch Typer r }r (h=j h>j ubaubhr)r }r (h=XThe ``[hgbuildbot]`` section has two other parameters that you might specify, both of which control the name of the branch that is attached to the changes coming from this hook.h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\M6h]hh^]r (hnXThe r r }r (h=XThe h>j ubh)r }r (h=X``[hgbuildbot]``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnX [hgbuildbot]r r }r (h=Uh>j ubahQhubhnX section has two other parameters that you might specify, both of which control the name of the branch that is attached to the changes coming from this hook.r r }r (h=X section has two other parameters that you might specify, both of which control the name of the branch that is attached to the changes coming from this hook.h>j ubeubhr)r }r (h=XOne common branch naming policy for Mercurial repositories is to use Mercurial's built-in branches (the kind created with :command:`hg branch` and listed with :command:`hg branches`). This feature associates persistent names with particular lines of descent within a single repository. (note that the buildbot ``source.Mercurial`` checkout step does not yet support this kind of branch). To have the commit hook deliver this sort of branch name with the Change object, use ``branchtype = inrepo``, this is the default behavior:h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\M:h]hh^]r (hnXzOne common branch naming policy for Mercurial repositories is to use Mercurial's built-in branches (the kind created with r r }r (h=XzOne common branch naming policy for Mercurial repositories is to use Mercurial's built-in branches (the kind created with h>j ubjm)r }r (h=X:command:`hg branch`hS}r (hW]hX]r jrahV]hU]hY]uh>j h^]r hnX hg branchr r }r (h=Uh>j ubahQjwubhnX and listed with r r }r (h=X and listed with h>j ubjm)r }r (h=X:command:`hg branches`hS}r (hW]hX]r jrahV]hU]hY]uh>j h^]r hnX hg branchesr r }r (h=Uh>j ubahQjwubhnX). This feature associates persistent names with particular lines of descent within a single repository. (note that the buildbot r r }r (h=X). This feature associates persistent names with particular lines of descent within a single repository. (note that the buildbot h>j ubh)r }r (h=X``source.Mercurial``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXsource.Mercurialr r }r (h=Uh>j ubahQhubhnX checkout step does not yet support this kind of branch). To have the commit hook deliver this sort of branch name with the Change object, use r r }r (h=X checkout step does not yet support this kind of branch). To have the commit hook deliver this sort of branch name with the Change object, use h>j ubh)r }r (h=X``branchtype = inrepo``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXbranchtype = inrepor r }r (h=Uh>j ubahQhubhnX, this is the default behavior:r r }r (h=X, this is the default behavior:h>j ubeubjK)r }r (h=X&[hgbuildbot] branchtype = inrepo # ...h>j hGhJhQjNhS}r (jK jL XinijPjQhU]hV]hW]hX]hY]uh\MCh]hh^]r hnX&[hgbuildbot] branchtype = inrepo # ...r r }r (h=Uh>j ubaubhr)r }r (h=XAnother approach is for each branch to go into a separate repository, and all the branches for a single project share a common parent directory. For example, you might have :file:`/var/repos/{PROJECT}/trunk/` and :file:`/var/repos/{PROJECT}/release`. To use this style, use the ``branchtype = dirname`` setting, which simply uses the last component of the repository's enclosing directory as the branch name:h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\MIh]hh^]r (hnXAnother approach is for each branch to go into a separate repository, and all the branches for a single project share a common parent directory. For example, you might have r r }r (h=XAnother approach is for each branch to go into a separate repository, and all the branches for a single project share a common parent directory. For example, you might have h>j ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>j h^]r (hnX /var/repos/r r }r (h=X /var/repos/h>j ubh)r }r (h=XPROJECThS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXPROJECTr r }r (h=Uh>j ubahQhubhnX/trunk/r r }r (h=X/trunk/h>j ubehQhubhnX and r! r" }r# (h=X and h>j ubh)r$ }r% (h=UhS}r& (hU]hV]hW]hX]r' Xfiler( aUrolej( hY]uh>j h^]r) (hnX /var/repos/r* r+ }r, (h=X /var/repos/h>j$ ubh)r- }r. (h=XPROJECThS}r/ (hW]hX]hV]hU]hY]uh>j$ h^]r0 hnXPROJECTr1 r2 }r3 (h=Uh>j- ubahQhubhnX/releaser4 r5 }r6 (h=X/releaseh>j$ ubehQhubhnX. To use this style, use the r7 r8 }r9 (h=X. To use this style, use the h>j ubh)r: }r; (h=X``branchtype = dirname``hS}r< (hW]hX]hV]hU]hY]uh>j h^]r= hnXbranchtype = dirnamer> r? }r@ (h=Uh>j: ubahQhubhnXj setting, which simply uses the last component of the repository's enclosing directory as the branch name:rA rB }rC (h=Xj setting, which simply uses the last component of the repository's enclosing directory as the branch name:h>j ubeubjK)rD }rE (h=X'[hgbuildbot] branchtype = dirname # ...h>j hGhJhQjNhS}rF (jK jL XinijPjQhU]hV]hW]hX]hY]uh\MPh]hh^]rG hnX'[hgbuildbot] branchtype = dirname # ...rH rI }rJ (h=Uh>jD ubaubhr)rK }rL (h=XFinally, if you want to simply specify the branchname directly, for all changes, use ``branch = BRANCHNAME``. This overrides ``branchtype``:h>j hGhJhQhuhS}rM (hW]hX]hV]hU]hY]uh\MVh]hh^]rN (hnXUFinally, if you want to simply specify the branchname directly, for all changes, use rO rP }rQ (h=XUFinally, if you want to simply specify the branchname directly, for all changes, use h>jK ubh)rR }rS (h=X``branch = BRANCHNAME``hS}rT (hW]hX]hV]hU]hY]uh>jK h^]rU hnXbranch = BRANCHNAMErV rW }rX (h=Uh>jR ubahQhubhnX. This overrides rY rZ }r[ (h=X. This overrides h>jK ubh)r\ }r] (h=X``branchtype``hS}r^ (hW]hX]hV]hU]hY]uh>jK h^]r_ hnX branchtyper` ra }rb (h=Uh>j\ ubahQhubhnX:rc }rd (h=X:h>jK ubeubjK)re }rf (h=X![hgbuildbot] branch = trunk # ...h>j hGhJhQjNhS}rg (jK jL XinijPjQhU]hV]hW]hX]hY]uh\MZh]hh^]rh hnX![hgbuildbot] branch = trunk # ...ri rj }rk (h=Uh>je ubaubhr)rl }rm (h=XIf you use ``branch=`` like this, you'll need to put a separate :file:`.hgrc` in each repository. If you use ``branchtype=``, you may be able to use the same :file:`.hgrc` for all your repositories, stored in :file:`~/.hgrc` or :file:`/etc/mercurial/hgrc`.h>j hGhJhQhuhS}rn (hW]hX]hV]hU]hY]uh\M`h]hh^]ro (hnX If you use rp rq }rr (h=X If you use h>jl ubh)rs }rt (h=X ``branch=``hS}ru (hW]hX]hV]hU]hY]uh>jl h^]rv hnXbranch=rw rx }ry (h=Uh>js ubahQhubhnX* like this, you'll need to put a separate rz r{ }r| (h=X* like this, you'll need to put a separate h>jl ubh)r} }r~ (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>jl h^]r hnX.hgrcr r }r (h=X.hgrch>j} ubahQhubhnX in each repository. If you use r r }r (h=X in each repository. If you use h>jl ubh)r }r (h=X``branchtype=``hS}r (hW]hX]hV]hU]hY]uh>jl h^]r hnX branchtype=r r }r (h=Uh>j ubahQhubhnX", you may be able to use the same r r }r (h=X", you may be able to use the same h>jl ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>jl h^]r hnX.hgrcr r }r (h=X.hgrch>j ubahQhubhnX& for all your repositories, stored in r r }r (h=X& for all your repositories, stored in h>jl ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>jl h^]r hnX~/.hgrcr r }r (h=X~/.hgrch>j ubahQhubhnX or r r }r (h=X or h>jl ubh)r }r (h=UhS}r (hU]hV]hW]hX]r Xfiler aUrolej hY]uh>jl h^]r hnX/etc/mercurial/hgrcr r }r (h=X/etc/mercurial/hgrch>j ubahQhubhnX.r }r (h=X.h>jl ubeubeubh?)r }r (h=Uh>j hGhJhQh_hS}r (hW]hX]hV]hU]r U compatibilityr ahY]r h+auh\Mfh]hh^]r (hg)r }r (h=X Compatibilityr h>j hGhJhQhkhS}r (hW]hX]hV]hU]hY]uh\Mfh]hh^]r hnX Compatibilityr r }r (h=j h>j ubaubhr)r }r (h=XAs twisted needs to hook some signals, and some web servers strictly forbid that, the parameter ``fork`` in the ``[hgbuildbot]`` section will instruct Mercurial to fork before sending the change request. Then as the created process will be of short life, it is considered as safe to disable the signal restriction in the Apache setting like that ``WSGIRestrictSignal Off``. Refer to the documentation of your web server for other way to do the same.h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mhh]hh^]r (hnX`As twisted needs to hook some signals, and some web servers strictly forbid that, the parameter r r }r (h=X`As twisted needs to hook some signals, and some web servers strictly forbid that, the parameter h>j ubh)r }r (h=X``fork``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXforkr r }r (h=Uh>j ubahQhubhnX in the r r }r (h=X in the h>j ubh)r }r (h=X``[hgbuildbot]``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnX [hgbuildbot]r r }r (h=Uh>j ubahQhubhnX section will instruct Mercurial to fork before sending the change request. Then as the created process will be of short life, it is considered as safe to disable the signal restriction in the Apache setting like that r r }r (h=X section will instruct Mercurial to fork before sending the change request. Then as the created process will be of short life, it is considered as safe to disable the signal restriction in the Apache setting like that h>j ubh)r }r (h=X``WSGIRestrictSignal Off``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXWSGIRestrictSignal Offr r }r (h=Uh>j ubahQhubhnXM. Refer to the documentation of your web server for other way to do the same.r r }r (h=XM. Refer to the documentation of your web server for other way to do the same.h>j ubeubeubh?)r }r (h=Uh>j hGhJhQh_hS}r (hW]hX]hV]hU]r Uresulting-changesr ahY]r h*auh\Mqh]hh^]r (hg)r }r (h=XResulting Changesr h>j hGhJhQhkhS}r (hW]hX]hV]hU]hY]uh\Mqh]hh^]r hnXResulting Changesr r }r (h=j h>j ubaubhr)r }r (h=XThe ``category`` parameter sets the category for any changes generated from the hook. Likewise, the ``project`` parameter sets the project.h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Msh]hh^]r (hnXThe r r }r (h=XThe h>j ubh)r}r(h=X ``category``hS}r(hW]hX]hV]hU]hY]uh>j h^]rhnXcategoryrr}r(h=Uh>jubahQhubhnXU parameter sets the category for any changes generated from the hook. Likewise, the rr}r (h=XU parameter sets the category for any changes generated from the hook. Likewise, the h>j ubh)r }r (h=X ``project``hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXprojectrr}r(h=Uh>j ubahQhubhnX parameter sets the project.rr}r(h=X parameter sets the project.h>j ubeubhr)r}r(h=XChanges' ``repository`` attributes are formed from the Mercurial repo path by stripping ``strip`` slashes on the left, then prepending the ``baseurl``. For example, assume the following parameters:h>j hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mvh]hh^]r(hnX Changes' rr}r(h=X Changes' h>jubh)r}r(h=X``repository``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX repositoryrr }r!(h=Uh>jubahQhubhnXA attributes are formed from the Mercurial repo path by stripping r"r#}r$(h=XA attributes are formed from the Mercurial repo path by stripping h>jubh)r%}r&(h=X ``strip``hS}r'(hW]hX]hV]hU]hY]uh>jh^]r(hnXstripr)r*}r+(h=Uh>j%ubahQhubhnX* slashes on the left, then prepending the r,r-}r.(h=X* slashes on the left, then prepending the h>jubh)r/}r0(h=X ``baseurl``hS}r1(hW]hX]hV]hU]hY]uh>jh^]r2hnXbaseurlr3r4}r5(h=Uh>j/ubahQhubhnX0. For example, assume the following parameters:r6r7}r8(h=X0. For example, assume the following parameters:h>jubeubjK)r9}r:(h=XA[hgbuildbot] baseurl = http://hg.myorg.com/repos/ strip = 3 # ...h>j hGhJhQjNhS}r;(jK jL XinijPjQhU]hV]hW]hX]hY]uh\Mzh]hh^]r<hnXA[hgbuildbot] baseurl = http://hg.myorg.com/repos/ strip = 3 # ...r=r>}r?(h=Uh>j9ubaubhr)r@}rA(h=XThen a repopath of ``/var/repos/myproject/release`` would have its left 3 slashes stripped, leaving ``myproject/release``, after which the base URL would be prepended, to create ``http://hg.myorg.com/repos/myproject/release``.h>j hGhJhQhuhS}rB(hW]hX]hV]hU]hY]uh\Mh]hh^]rC(hnXThen a repopath of rDrE}rF(h=XThen a repopath of h>j@ubh)rG}rH(h=X ``/var/repos/myproject/release``hS}rI(hW]hX]hV]hU]hY]uh>j@h^]rJhnX/var/repos/myproject/releaserKrL}rM(h=Uh>jGubahQhubhnX1 would have its left 3 slashes stripped, leaving rNrO}rP(h=X1 would have its left 3 slashes stripped, leaving h>j@ubh)rQ}rR(h=X``myproject/release``hS}rS(hW]hX]hV]hU]hY]uh>j@h^]rThnXmyproject/releaserUrV}rW(h=Uh>jQubahQhubhnX9, after which the base URL would be prepended, to create rXrY}rZ(h=X9, after which the base URL would be prepended, to create h>j@ubh)r[}r\(h=X/``http://hg.myorg.com/repos/myproject/release``hS}r](hW]hX]hV]hU]hY]uh>j@h^]r^hnX+http://hg.myorg.com/repos/myproject/releaser_r`}ra(h=Uh>j[ubahQhubhnX.rb}rc(h=X.h>j@ubeubhr)rd}re(h=X}The ``hgbuildbot`` ``baseurl`` value defaults to the value of the same parameter in the ``web`` section of the configuration.h>j hGhJhQhuhS}rf(hW]hX]hV]hU]hY]uh\Mh]hh^]rg(hnXThe rhri}rj(h=XThe h>jdubh)rk}rl(h=X``hgbuildbot``hS}rm(hW]hX]hV]hU]hY]uh>jdh^]rnhnX hgbuildbotrorp}rq(h=Uh>jkubahQhubhnX rr}rs(h=X h>jdubh)rt}ru(h=X ``baseurl``hS}rv(hW]hX]hV]hU]hY]uh>jdh^]rwhnXbaseurlrxry}rz(h=Uh>jtubahQhubhnX: value defaults to the value of the same parameter in the r{r|}r}(h=X: value defaults to the value of the same parameter in the h>jdubh)r~}r(h=X``web``hS}r(hW]hX]hV]hU]hY]uh>jdh^]rhnXwebrr}r(h=Uh>j~ubahQhubhnX section of the configuration.rr}r(h=X section of the configuration.h>jdubeubj!)r}r(h=Xolder versions of Buildbot created repository strings that did not contain an entire URL. To continue this pattern, set the ``hgbuildbot`` ``baseurl`` parameter to an empty string: .. code-block:: ini [hgbuildbot] baseurl = http://hg.myorg.com/repos/h>j hGNhQj$hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]r(hr)r}r(h=Xolder versions of Buildbot created repository strings that did not contain an entire URL. To continue this pattern, set the ``hgbuildbot`` ``baseurl`` parameter to an empty string:h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnX}older versions of Buildbot created repository strings that did not contain an entire URL. To continue this pattern, set the rr}r(h=X}older versions of Buildbot created repository strings that did not contain an entire URL. To continue this pattern, set the h>jubh)r}r(h=X``hgbuildbot``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX hgbuildbotrr}r(h=Uh>jubahQhubhnX r}r(h=X h>jubh)r}r(h=X ``baseurl``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbaseurlrr}r(h=Uh>jubahQhubhnX parameter to an empty string:rr}r(h=X parameter to an empty string:h>jubeubjK)r}r(h=X1[hgbuildbot] baseurl = http://hg.myorg.com/repos/h>jhGhJhQjNhS}r(jK jL XinijPjQhU]hV]hW]hX]hY]uh\Mh^]rhnX1[hgbuildbot] baseurl = http://hg.myorg.com/repos/rr}r(h=Uh>jubaubeubhN)r}r(h=X .. _Bzr-Hook:h>j hGhJhQhRhS}r(hU]hV]hW]hX]hY]hZUbzr-hookruh\Mh]hh^]ubeubeubh?)r}r(h=Uh>jhGhJhL}rhjshQh_hS}r(hW]hX]hV]hU]r(jUid12rehY]r(hheuh\Mh]hhd}rjjsh^]r(hg)r}r(h=XBzr Hookrh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnXBzr Hookrr}r(h=jh>jubaubhr)r}r(h=XWBzr is also written in Python, and the Bzr hook depends on Twisted to send the changes.rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnXWBzr is also written in Python, and the Bzr hook depends on Twisted to send the changes.rr}r(h=jh>jubaubhr)r}r(h=X To install, put :file:`contrib/bzr_buildbot.py` in one of your plugins locations a bzr plugins directory (e.g., :file:`~/.bazaar/plugins`). Then, in one of your bazaar conf files (e.g., :file:`~/.bazaar/locations.conf`), set the location you want to connect with buildbot with these keys:h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXTo install, put rr}r(h=XTo install, put h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXcontrib/bzr_buildbot.pyrr}r(h=Xcontrib/bzr_buildbot.pyh>jubahQhubhnXA in one of your plugins locations a bzr plugins directory (e.g., rr}r(h=XA in one of your plugins locations a bzr plugins directory (e.g., h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnX~/.bazaar/pluginsrr}r(h=X~/.bazaar/pluginsh>jubahQhubhnX1). Then, in one of your bazaar conf files (e.g., rr}r(h=X1). Then, in one of your bazaar conf files (e.g., h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnX~/.bazaar/locations.confrr}r(h=X~/.bazaar/locations.confh>jubahQhubhnXF), set the location you want to connect with buildbot with these keys:rr}r(h=XF), set the location you want to connect with buildbot with these keys:h>jubeubcdocutils.nodes block_quote r)r}r(h=Uh>jhGNhQU block_quoterhS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]rj)r}r(h=UhS}r(jX*hU]hV]hW]hX]hY]uh>jh^]r(j)r}r(h=X``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. hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X``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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(h)r}r(h=X``buildbot_on``hS}r (hW]hX]hV]hU]hY]uh>jh^]r hnX buildbot_onr r }r (h=Uh>jubahQhubhnX 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.rr}r(h=X 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.h>jubeubahQjubj)r}r(h=X``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). hS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X``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).h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(h)r}r(h=X``buildbot_server``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbuildbot_serverrr}r(h=Uh>jubahQhubhnX (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).r r!}r"(h=X (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).h>jubeubahQjubj)r#}r$(h=X``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) hS}r%(hW]hX]hV]hU]hY]uh>jh^]r&hr)r'}r((h=X``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)h>j#hGhJhQhuhS}r)(hW]hX]hV]hU]hY]uh\Mh^]r*(h)r+}r,(h=X``buildbot_port``hS}r-(hW]hX]hV]hU]hY]uh>j'h^]r.hnX buildbot_portr/r0}r1(h=Uh>j+ubahQhubhnX (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)r2r3}r4(h=X (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)h>j'ubeubahQjubj)r5}r6(h=X``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". hS}r7(hW]hX]hV]hU]hY]uh>jh^]r8hr)r9}r:(h=X``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".h>j5hGhJhQhuhS}r;(hW]hX]hV]hU]hY]uh\Mh^]r<(h)r=}r>(h=X``buildbot_pqm``hS}r?(hW]hX]hV]hU]hY]uh>j9h^]r@hnX buildbot_pqmrArB}rC(h=Uh>j=ubahQhubhnX (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 rDrE}rF(h=X (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 h>j9ubcdocutils.nodes reference rG)rH}rI(h=Xhttps://launchpad.net/pqmrJhS}rK(UrefurijJhU]hV]hW]hX]hY]uh>j9h^]rLhnXhttps://launchpad.net/pqmrMrN}rO(h=Uh>jHubahQU referencerPubhnXa) environment, the user that commits is the Patch Queue Manager, and the user that committed the rQrR}rS(h=Xa) environment, the user that commits is the Patch Queue Manager, and the user that committed the h>j9ubh)rT}rU(h=X*parent*hS}rV(hW]hX]hV]hU]hY]uh>j9h^]rWhnXparentrXrY}rZ(h=Uh>jTubahQhubhnX 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".r[r\}r](h=X 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".h>j9ubeubahQjubj)r^}r_(h=Xe``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. hS}r`(hW]hX]hV]hU]hY]uh>jh^]rahr)rb}rc(h=Xd``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.h>j^hGhJhQhuhS}rd(hW]hX]hV]hU]hY]uh\Mh^]re(h)rf}rg(h=X``buildbot_dry_run``hS}rh(hW]hX]hV]hU]hY]uh>jbh^]rihnXbuildbot_dry_runrjrk}rl(h=Uh>jfubahQhubhnXP (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.rmrn}ro(h=XP (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.h>jbubeubahQjubj)rp}rq(h=Xk``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. hS}rr(hW]hX]hV]hU]hY]uh>jh^]rshr)rt}ru(h=Xj``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.h>jphGhJhQhuhS}rv(hW]hX]hV]hU]hY]uh\Mh^]rw(h)rx}ry(h=X``buildbot_send_branch_name``hS}rz(hW]hX]hV]hU]hY]uh>jth^]r{hnXbuildbot_send_branch_namer|r}}r~(h=Uh>jxubahQhubhnXq (optional, defaults to not sending the branch name) If your buildbot's bzr source build step uses a repourl, do rr}r(h=Xq (optional, defaults to not sending the branch name) If your buildbot's bzr source build step uses a repourl, do h>jtubh)r}r(h=X*not*hS}r(hW]hX]hV]hU]hY]uh>jth^]rhnXnotrr}r(h=Uh>jubahQhubhnX 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.rr}r(h=X 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.h>jtubeubahQjubehQj'ubaubj!)r}r(h=X}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.h>jhGhJhQj$hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]rhr)r}r(h=X}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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnXGThe bzr smart server (as of version 2.2.2) doesn't know how to resolve rr}r(h=XGThe bzr smart server (as of version 2.2.2) doesn't know how to resolve h>jubh)r}r(h=X ``bzr://``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbzr://rr}r(h=Uh>jubahQhubhnX* urls into absolute paths so any paths in rr}r(h=X* urls into absolute paths so any paths in h>jubh)r}r(h=X``locations.conf``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXlocations.confrr}r(h=Uh>jubahQhubhnX 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.rr}r(h=X 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.h>jubeubaubhr)r}r(h=XVHere's a simple example that you might have in your :file:`~/.bazaar/locations.conf`\.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnX4Here's a simple example that you might have in your rr}r(h=X4Here's a simple example that you might have in your h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnX~/.bazaar/locations.confrr}r(h=X~/.bazaar/locations.confh>jubahQhubhnX.r}r(h=X\.h>jubeubjK)r}r(h=XX[chroot-*:///var/local/myrepo/mybranch] buildbot_on = change buildbot_server = localhosth>jhGhJhQjNhS}r(jK jL XinijPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rhnXX[chroot-*:///var/local/myrepo/mybranch] buildbot_on = change buildbot_server = localhostrr}r(h=Uh>jubaubj)r}r(h=Uh>jhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleXChange Sources; P4SourceXchsrc-P4Sourcerjtr(UsingleXP4Source Change Sourcejjtreuh\Mh]hh^]ubhN)r}r(h=Uh>jhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mh]hh^]ubhN)r}r(h=X .. _P4Source:h>jhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZUp4sourceruh\Mh]hhd}rjjsh^]ubeubeubh?)r}r(h=UhBKh>hEhGhJhL}rh/jshQh_hS}r(hW]rXp4sourcerahX]hV]hU]r(jjUid13rehY]rh/auh\Mh]hhd}r(jjjjuh^]r(hg)r}r(h=XP4Sourcerh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnXP4Sourcerr}r(h=jh>jubaubhr)r}r(h=XThe :bb:chsrc:`P4Source` periodically polls a `Perforce `_ depot for changes. It accepts the following arguments:h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`P4Source`rh>jhGhJhQhhS}r(UreftypeXchsrchhXP4SourceU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXP4Sourcerr}r(h=Uh>jubahQhubaubhnX periodically polls a rr}r(h=X periodically polls a h>jubjG)r}r(h=X&`Perforce `_hS}r(UnameXPerforceUrefurirXhttp://www.perforce.com/rhU]hV]hW]hX]hY]uh>jh^]rhnXPerforcerr}r(h=Uh>jubahQjPubhN)r}r (h=X hBKh>jhQhRhS}r (UrefurijhU]r Uperforcer ahV]hW]hX]hY]r h&auh^]ubhnX7 depot for changes. It accepts the following arguments:rr}r(h=X7 depot for changes. It accepts the following arguments:h>jubeubj{)r}r(h=Uh>jhGhJhQj~hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]r(j)r}r(h=XF``p4base`` The base depot path to watch, without the trailing '/...'. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(j)r}r(h=X ``p4base``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r (hW]hX]hV]hU]hY]uh>jh^]r!hnXp4baser"r#}r$(h=Uh>jubahQhubaubj)r%}r&(h=UhS}r'(hW]hX]hV]hU]hY]uh>jh^]r(hr)r)}r*(h=X:The base depot path to watch, without the trailing '/...'.r+h>j%hGhJhQhuhS}r,(hW]hX]hV]hU]hY]uh\Mh^]r-hnX:The base depot path to watch, without the trailing '/...'.r.r/}r0(h=j+h>j)ubaubahQj(ubeubj)r1}r2(h=XI``p4port`` The Perforce server to connect to (as :samp:`{host}:{port}`). h>jhGhJhQjhS}r3(hW]hX]hV]hU]hY]uh\Mh]hh^]r4(j)r5}r6(h=X ``p4port``r7h>j1hGhJhQjhS}r8(hW]hX]hV]hU]hY]uh\Mh^]r9h)r:}r;(h=j7hS}r<(hW]hX]hV]hU]hY]uh>j5h^]r=hnXp4portr>r?}r@(h=Uh>j:ubahQhubaubj)rA}rB(h=UhS}rC(hW]hX]hV]hU]hY]uh>j1h^]rDhr)rE}rF(h=X=The Perforce server to connect to (as :samp:`{host}:{port}`).h>jAhGhJhQhuhS}rG(hW]hX]hV]hU]hY]uh\Mh^]rH(hnX&The Perforce server to connect to (as rIrJ}rK(h=X&The Perforce server to connect to (as h>jEubh)rL}rM(h=UhS}rN(hU]hV]hW]hX]rOXsamprPaUrolejPhY]uh>jEh^]rQ(h)rR}rS(h=XhosthS}rT(hW]hX]hV]hU]hY]uh>jLh^]rUhnXhostrVrW}rX(h=Uh>jRubahQhubhnX:rY}rZ(h=X:h>jLubh)r[}r\(h=XporthS}r](hW]hX]hV]hU]hY]uh>jLh^]r^hnXportr_r`}ra(h=Uh>j[ubahQhubehQhubhnX).rbrc}rd(h=X).h>jEubeubahQj(ubeubj)re}rf(h=X``p4user`` The Perforce user. h>jhGhJhQjhS}rg(hW]hX]hV]hU]hY]uh\Mh]hh^]rh(j)ri}rj(h=X ``p4user``rkh>jehGhJhQjhS}rl(hW]hX]hV]hU]hY]uh\Mh^]rmh)rn}ro(h=jkhS}rp(hW]hX]hV]hU]hY]uh>jih^]rqhnXp4userrrrs}rt(h=Uh>jnubahQhubaubj)ru}rv(h=UhS}rw(hW]hX]hV]hU]hY]uh>jeh^]rxhr)ry}rz(h=XThe Perforce user.r{h>juhGhJhQhuhS}r|(hW]hX]hV]hU]hY]uh\Mh^]r}hnXThe Perforce user.r~r}r(h=j{h>jyubaubahQj(ubeubj)r}r(h=X$``p4passwd`` The Perforce password. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``p4passwd``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXp4passwdrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XThe Perforce password.rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnXThe Perforce password.rr}r(h=jh>jubaubahQj(ubeubj)r}r(h=X``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`. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``p4bin``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXp4binrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XAn 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`.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnXAn 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 rr}r(h=XAn 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 h>jubj)r}r(h=X`p4`hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXp4rr}r(h=Uh>jubahQjubhnX.r}r(h=X.h>jubeubahQj(ubeubj)r}r(h=X``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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``split_file``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX split_filerr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XA 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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnX5A function that maps a pathname, without the leading rr}r(h=X5A function that maps a pathname, without the leading h>jubh)r}r(h=X ``p4base``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXp4baserr}r(h=Uh>jubahQhubhnX:, to a (branch, filename) tuple. The default just returns rr}r(h=X:, to a (branch, filename) tuple. The default just returns h>jubh)r}r(h=X``(None, branchfile)``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX(None, branchfile)rr}r(h=Uh>jubahQhubhnXv, which effectively disables branch support. You should supply a function which understands your repository structure.rr}r(h=Xv, which effectively disables branch support. You should supply a function which understands your repository structure.h>jubeubahQj(ubeubj)r}r(h=XN``pollInterval`` How often to poll, in seconds. Defaults to 600 (10 minutes). h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``pollInterval``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX pollIntervalrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X<How often to poll, in seconds. Defaults to 600 (10 minutes).rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnX<How often to poll, in seconds. Defaults to 600 (10 minutes).r r }r (h=jh>jubaubahQj(ubeubj)r }r (h=X``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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``histmax``rh>j hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXhistmaxrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>j h^]rhr)r }r!(h=XThe 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.r"h>jhGhJhQhuhS}r#(hW]hX]hV]hU]hY]uh\Mh^]r$hnXThe 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.r%r&}r'(h=j"h>j ubaubahQj(ubeubj)r(}r)(h=X``encoding`` The character encoding of ``p4``\'s output. This defaults to "utf8", but if your commit messages are in another encoding, specify that here. h>jhGhJhQjhS}r*(hW]hX]hV]hU]hY]uh\Mh]hh^]r+(j)r,}r-(h=X ``encoding``r.h>j(hGhJhQjhS}r/(hW]hX]hV]hU]hY]uh\Mh^]r0h)r1}r2(h=j.hS}r3(hW]hX]hV]hU]hY]uh>j,h^]r4hnXencodingr5r6}r7(h=Uh>j1ubahQhubaubj)r8}r9(h=UhS}r:(hW]hX]hV]hU]hY]uh>j(h^]r;hr)r<}r=(h=XThe character encoding of ``p4``\'s output. This defaults to "utf8", but if your commit messages are in another encoding, specify that here.h>j8hGhJhQhuhS}r>(hW]hX]hV]hU]hY]uh\Mh^]r?(hnXThe character encoding of r@rA}rB(h=XThe character encoding of h>j<ubh)rC}rD(h=X``p4``hS}rE(hW]hX]hV]hU]hY]uh>j<h^]rFhnXp4rGrH}rI(h=Uh>jCubahQhubhnXl's output. This defaults to "utf8", but if your commit messages are in another encoding, specify that here.rJrK}rL(h=Xm\'s output. This defaults to "utf8", but if your commit messages are in another encoding, specify that here.h>j<ubeubahQj(ubeubeubh?)rM}rN(h=Uh>jhGhJhQh_hS}rO(hW]hX]hV]hU]rPUexamplerQahY]rRh5auh\Mh]hh^]rS(hg)rT}rU(h=XExamplerVh>jMhGhJhQhkhS}rW(hW]hX]hV]hU]hY]uh\Mh]hh^]rXhnXExamplerYrZ}r[(h=jVh>jTubaubhr)r\}r](h=XThis configuration uses the :envvar:`P4PORT`, :envvar:`P4USER`, and :envvar:`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. ::h>jMhGhJhQhuhS}r^(hW]hX]hV]hU]hY]uh\Mh]hh^]r_(hnXThis configuration uses the r`ra}rb(h=XThis configuration uses the h>j\ubj)rc}rd(h=UhS}re(hU]hV]hW]hX]hY]j]rf((jXP4PORTrgUindex-1rhUtri(jXenvironment variable; P4PORTjhUtrjeuh>j\h^]hQjubhN)rk}rl(h=UhS}rm(hW]hX]hV]hU]rnjhahY]uh>j\h^]hQhRubh{)ro}rp(h=X:envvar:`P4PORT`rqh>j\hGhJhQhhS}rr(UreftypeXenvvarhhjgU refdomainXstdrshU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rth)ru}rv(h=jqhS}rw(hW]hX]rx(hjsX std-envvarryehV]hU]hY]uh>joh^]rzhnXP4PORTr{r|}r}(h=Uh>juubahQhubaubhnX, r~r}r(h=X, h>j\ubj)r}r(h=UhS}r(hU]hV]hW]hX]hY]j]r((jXP4USERrUindex-2rUtr(jXenvironment variable; P4USERjUtreuh>j\h^]hQjubhN)r}r(h=UhS}r(hW]hX]hV]hU]rjahY]uh>j\h^]hQhRubh{)r}r(h=X:envvar:`P4USER`rh>j\hGhJhQhhS}r(UreftypeXenvvarhhjU refdomainXstdrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjX std-envvarrehV]hU]hY]uh>jh^]rhnXP4USERrr}r(h=Uh>jubahQhubaubhnX, and rr}r(h=X, and h>j\ubj)r}r(h=UhS}r(hU]hV]hW]hX]hY]j]r((jXP4PASSWDrUindex-3rUtr(jXenvironment variable; P4PASSWDjUtreuh>j\h^]hQjubhN)r}r(h=UhS}r(hW]hX]hV]hU]rjahY]uh>j\h^]hQhRubh{)r}r(h=X:envvar:`P4PASSWD`rh>j\hGhJhQhhS}r(UreftypeXenvvarhhjU refdomainXstdrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjX std-envvarrehV]hU]hY]uh>jh^]rhnXP4PASSWDrr}r(h=Uh>jubahQhubaubhnX 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.rr}r(h=X 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.h>j\ubeubjK)r}r(h=Xfrom buildbot.changes import p4poller s = p4poller.P4Source(p4base='//depot/project/', split_file=lambda branchfile: branchfile.split('/',1), ) c['change_source'] = sh>jMhGhJhQjNhS}r(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rhnXfrom buildbot.changes import p4poller s = p4poller.P4Source(p4base='//depot/project/', split_file=lambda branchfile: branchfile.split('/',1), ) c['change_source'] = srr}r(h=Uh>jubaubj)r}r(h=Uh>jMhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleXChange Sources; BonsaiPollerXchsrc-BonsaiPollerrjtr(UsingleXBonsaiPoller Change Sourcejjtreuh\Mh]hh^]ubhN)r}r(h=Uh>jMhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mh]hh^]ubhN)r}r(h=X.. _BonsaiPoller:h>jMhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZU bonsaipollerruh\Mh]hhd}rjjsh^]ubeubeubh?)r}r(h=UhBKh>hEhGhJhL}rh!jshQh_hS}r(hW]rX bonsaipollerrahX]hV]hU]r(jjUid14rehY]rh!auh\Mh]hhd}r(jjjjuh^]r(hg)r}r(h=X BonsaiPollerrh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnX BonsaiPollerrr}r(h=jh>jubaubhr)r}r(h=XThe :bb:chsrc:`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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`BonsaiPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX BonsaiPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX BonsaiPollerrr}r(h=Uh>jubahQhubaubhnX 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 rr}r(h=X 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 h>jubjG)r}r(h=Xhttp://bonsai.mozilla.orgrhS}r(UrefurijhU]hV]hW]hX]hY]uh>jh^]rhnXhttp://bonsai.mozilla.orgrr}r(h=Uh>jubahQjPubhnX. 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.rr}r (h=X. 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.h>jubeubhr)r }r (h=X9:bb:chsrc:`BonsaiPoller` accepts the following arguments:r h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r(h{)r}r(h=X:bb:chsrc:`BonsaiPoller`rh>j hGhJhQhhS}r(UreftypeXchsrchhX BonsaiPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX BonsaiPollerrr}r(h=Uh>jubahQhubaubhnX! accepts the following arguments:rr}r (h=X! accepts the following arguments:h>j ubeubj{)r!}r"(h=Uh>jhGhJhQj~hS}r#(hW]hX]hV]hU]hY]uh\Nh]hh^]r$(j)r%}r&(h=XU``bonsaiURL`` The base URL of the Bonsai server, e.g., ``http://bonsai.mozilla.org`` h>j!hGhJhQjhS}r'(hW]hX]hV]hU]hY]uh\M!h^]r((j)r)}r*(h=X ``bonsaiURL``r+h>j%hGhJhQjhS}r,(hW]hX]hV]hU]hY]uh\M!h^]r-h)r.}r/(h=j+hS}r0(hW]hX]hV]hU]hY]uh>j)h^]r1hnX bonsaiURLr2r3}r4(h=Uh>j.ubahQhubaubj)r5}r6(h=UhS}r7(hW]hX]hV]hU]hY]uh>j%h^]r8hr)r9}r:(h=XFThe base URL of the Bonsai server, e.g., ``http://bonsai.mozilla.org``h>j5hGhJhQhuhS}r;(hW]hX]hV]hU]hY]uh\M!h^]r<(hnX)The base URL of the Bonsai server, e.g., r=r>}r?(h=X)The base URL of the Bonsai server, e.g., h>j9ubh)r@}rA(h=X``http://bonsai.mozilla.org``hS}rB(hW]hX]hV]hU]hY]uh>j9h^]rChnXhttp://bonsai.mozilla.orgrDrE}rF(h=Uh>j@ubahQhubeubahQj(ubeubj)rG}rH(h=XH``module`` The module to look for changes in. Commonly this is ``all``. h>j!hGhJhQjhS}rI(hW]hX]hV]hU]hY]uh\M$h]hh^]rJ(j)rK}rL(h=X ``module``rMh>jGhGhJhQjhS}rN(hW]hX]hV]hU]hY]uh\M$h^]rOh)rP}rQ(h=jMhS}rR(hW]hX]hV]hU]hY]uh>jKh^]rShnXmodulerTrU}rV(h=Uh>jPubahQhubaubj)rW}rX(h=UhS}rY(hW]hX]hV]hU]hY]uh>jGh^]rZhr)r[}r\(h=X<The module to look for changes in. Commonly this is ``all``.h>jWhGhJhQhuhS}r](hW]hX]hV]hU]hY]uh\M$h^]r^(hnX4The module to look for changes in. Commonly this is r_r`}ra(h=X4The module to look for changes in. Commonly this is h>j[ubh)rb}rc(h=X``all``hS}rd(hW]hX]hV]hU]hY]uh>j[h^]rehnXallrfrg}rh(h=Uh>jbubahQhubhnX.ri}rj(h=X.h>j[ubeubahQj(ubeubj)rk}rl(h=Xy``branch`` The branch to look for changes in. This will appear in the ``branch`` field of the resulting change objects. h>j!hGhJhQjhS}rm(hW]hX]hV]hU]hY]uh\M(h]hh^]rn(j)ro}rp(h=X ``branch``rqh>jkhGhJhQjhS}rr(hW]hX]hV]hU]hY]uh\M(h^]rsh)rt}ru(h=jqhS}rv(hW]hX]hV]hU]hY]uh>joh^]rwhnXbranchrxry}rz(h=Uh>jtubahQhubaubj)r{}r|(h=UhS}r}(hW]hX]hV]hU]hY]uh>jkh^]r~hr)r}r(h=XmThe branch to look for changes in. This will appear in the ``branch`` field of the resulting change objects.h>j{hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M'h^]r(hnX<The branch to look for changes in. This will appear in the rr}r(h=X<The branch to look for changes in. This will appear in the h>jubh)r}r(h=X ``branch``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbranchrr}r(h=Uh>jubahQhubhnX' field of the resulting change objects.rr}r(h=X' field of the resulting change objects.h>jubeubahQj(ubeubj)r}r(h=XE``tree`` The tree to look for changes in. Commonly this is ``all``. h>j!hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M+h]hh^]r(j)r}r(h=X``tree``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M+h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXtreerr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X;The tree to look for changes in. Commonly this is ``all``.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M+h^]r(hnX3The tree to look for changes in. Commonly this is rr}r(h=X3The tree to look for changes in. Commonly this is h>jubh)r}r(h=X``all``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXallrr}r(h=Uh>jubahQhubhnX.r}r(h=X.h>jubeubahQj(ubeubj)r}r(h=XK``cvsroot`` The CVS root of the repository. Usually this is ``/cvsroot``. h>j!hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M.h]hh^]r(j)r}r(h=X ``cvsroot``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M.h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXcvsrootrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X>The CVS root of the repository. Usually this is ``/cvsroot``.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M.h^]r(hnX1The CVS root of the repository. Usually this is rr}r(h=X1The CVS root of the repository. Usually this is h>jubh)r}r(h=X ``/cvsroot``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX/cvsrootrr}r(h=Uh>jubahQhubhnX.r}r(h=X.h>jubeubahQj(ubeubj)r}r(h=XD``pollInterval`` The time (in seconds) between queries for changes. h>j!hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M1h]hh^]r(j)r}r(h=X``pollInterval``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M1h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX pollIntervalrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X2The time (in seconds) between queries for changes.rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M1h^]rhnX2The time (in seconds) between queries for changes.rr}r(h=jh>jubaubahQj(ubeubj)r}r(h=X]``project`` The project name to attach to all change objects produced by this change source. h>j!hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M5h]hh^]r(j)r}r(h=X ``project``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M5h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXprojectrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r (h=XPThe project name to attach to all change objects produced by this change source.r h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\M4h^]r hnXPThe project name to attach to all change objects produced by this change source.r r}r(h=j h>jubaubahQj(ubeubeubj)r}r(h=Uh>jhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleXChange Sources; SVNPollerXchsrc-SVNPollerrjtr(UsingleXSVNPoller Change Sourcejjtreuh\M8h]hh^]ubhN)r}r(h=Uh>jhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\M8h]hh^]ubhN)r}r(h=X.. _SVNPoller:h>jhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZU svnpollerruh\M9h]hhd}rjjsh^]ubeubh?)r}r (h=UhBKh>hEhGhJhL}r!h jshQh_hS}r"(hW]r#X svnpollerr$ahX]hV]hU]r%(jjUid15r&ehY]r'h auh\M<h]hhd}r((jjjjuh^]r)(hg)r*}r+(h=X SVNPollerr,h>jhGhJhQhkhS}r-(hW]hX]hV]hU]hY]uh\M<h]hh^]r.hnX SVNPollerr/r0}r1(h=j,h>j*ubaubj)r2}r3(h=Uh>jhGNhQjhS}r4(hU]hV]hW]hX]hY]Uentries]r5(jX5buildbot.changes.svnpoller.SVNPoller (built-in class)hUtr6auh\Nh]hh^]ubj)r7}r8(h=Uh>jhGNhQjhS}r9(jjXpyhU]hV]hW]hX]hY]jXclassr:jj:uh\Nh]hh^]r;(j)r<}r=(h=X$buildbot.changes.svnpoller.SVNPollerh>j7hGhJhQjhS}r>(hU]r?hajNhV]hW]hX]hY]r@hajhjXbuildbot.changes.svnpollerjuh\M?h]hh^]rA(j)rB}rC(h=Xclass h>j<hGhJhQjhS}rD(hW]hX]hV]hU]hY]uh\M?h]hh^]rEhnXclass rFrG}rH(h=Uh>jBubaubj)rI}rJ(h=Xbuildbot.changes.svnpoller.h>j<hGhJhQjhS}rK(hW]hX]hV]hU]hY]uh\M?h]hh^]rLhnXbuildbot.changes.svnpoller.rMrN}rO(h=Uh>jIubaubj)rP}rQ(h=X SVNPollerh>j<hGhJhQjhS}rR(hW]hX]hV]hU]hY]uh\M?h]hh^]rShnX SVNPollerrTrU}rV(h=Uh>jPubaubeubj)rW}rX(h=Uh>j7hGhJhQjhS}rY(hW]hX]hV]hU]hY]uh\M?h]hh^]ubeubhr)rZ}r[(h=XThe :bb:chsrc:`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.h>jhGhJhQhuhS}r\(hW]hX]hV]hU]hY]uh\M@h]hh^]r](hnXThe r^r_}r`(h=XThe h>jZubh{)ra}rb(h=X:bb:chsrc:`SVNPoller`rch>jZhGhJhQhhS}rd(UreftypeXchsrchhX SVNPollerU refdomainXbbrehU]hV]U refexplicithW]hX]hY]hhuh\M@h^]rfh)rg}rh(h=jchS}ri(hW]hX]rj(hjeXbb-chsrcrkehV]hU]hY]uh>jah^]rlhnX SVNPollerrmrn}ro(h=Uh>jgubahQhubaubhnX. is a ChangeSource which periodically polls a rprq}rr(h=X. is a ChangeSource which periodically polls a h>jZubjG)rs}rt(h=X-`Subversion `_hS}ru(UnameX SubversionjXhttp://subversion.tigris.org/rvhU]hV]hW]hX]hY]uh>jZh^]rwhnX Subversionrxry}rz(h=Uh>jsubahQjPubhN)r{}r|(h=X hBKh>jZhQhRhS}r}(UrefurijvhU]r~U subversionrahV]hW]hX]hY]rhauh^]ubhnX. repository for new revisions, by running the rr}r(h=X. repository for new revisions, by running the h>jZubh)r}r(h=X ``svn log``hS}r(hW]hX]hV]hU]hY]uh>jZh^]rhnXsvn logrr}r(h=Uh>jubahQhubhnXJ command in a subshell. It can watch a single branch or multiple branches.rr}r(h=XJ command in a subshell. It can watch a single branch or multiple branches.h>jZubeubhr)r}r(h=X6:bb:chsrc:`SVNPoller` accepts the following arguments:rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MEh]hh^]r(h{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\MEh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX! accepts the following arguments:rr}r(h=X! accepts the following arguments:h>jubeubj{)r}r(h=Uh>jhGhJhQj~hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]r(j)r}r(h=XN``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 :bb:chsrc:`SVNPoller` will only pay attention to files inside the subdirectory specified by the complete svnurl. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\MRh^]r(j)r}r(h=X ``svnurl``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\MRh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXsvnurlrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]r(hr)r}r(h=XThe 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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MHh^]r(hnX!The base URL path to watch, like rr}r(h=X!The base URL path to watch, like h>jubh)r}r(h=X1``svn://svn.twistedmatrix.com/svn/Twisted/trunk``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX-svn://svn.twistedmatrix.com/svn/Twisted/trunkrr}r(h=Uh>jubahQhubhnX, or rr}r(h=X, or h>jubh)r}r(h=X ``http://divmod.org/svn/Divmo/``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXhttp://divmod.org/svn/Divmo/rr}r(h=Uh>jubahQhubhnX , or even rr}r(h=X , or even h>jubh)r}r(h=X6``file:///home/svn/Repository/ProjectA/branches/1.5/``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX2file:///home/svn/Repository/ProjectA/branches/1.5/rr}r(h=Uh>jubahQhubhnX. 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.rr}r(h=X. 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.h>jubeubhr)r}r(h=XtThe :bb:chsrc:`SVNPoller` will only pay attention to files inside the subdirectory specified by the complete svnurl.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MQh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\MQh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX[ will only pay attention to files inside the subdirectory specified by the complete svnurl.rr}r(h=X[ will only pay attention to files inside the subdirectory specified by the complete svnurl.h>jubeubehQj(ubeubj)r}r(h=X``split_file`` A function to convert pathnames into ``(branch, relative_pathname)`` tuples. Use this to explain your repository's branch-naming policy to :bb:chsrc:`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 :mod:`buildbot.changes.svnpoller` that can be used as a :meth:`split_file` function; see below for details. For directories, the relative pathname returned by :meth:`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 :bb:chsrc:`SVNPoller` can override the :meth:`split_file` method instead of using the ``split_file=`` argument. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mfh]hh^]r(j)r}r(h=X``split_file``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mfh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX split_filerr }r (h=Uh>jubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>jh^]r(hr)r}r(h=XA function to convert pathnames into ``(branch, relative_pathname)`` tuples. Use this to explain your repository's branch-naming policy to :bb:chsrc:`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 :mod:`buildbot.changes.svnpoller` that can be used as a :meth:`split_file` function; see below for details.h>j hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MUh^]r(hnX%A function to convert pathnames into rr}r(h=X%A function to convert pathnames into h>jubh)r}r(h=X``(branch, relative_pathname)``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX(branch, relative_pathname)rr}r(h=Uh>jubahQhubhnXG tuples. Use this to explain your repository's branch-naming policy to rr}r(h=XG tuples. Use this to explain your repository's branch-naming policy to h>jubh{)r }r!(h=X:bb:chsrc:`SVNPoller`r"h>jhGhJhQhhS}r#(UreftypeXchsrchhX SVNPollerU refdomainXbbr$hU]hV]U refexplicithW]hX]hY]hhuh\MUh^]r%h)r&}r'(h=j"hS}r((hW]hX]r)(hj$Xbb-chsrcr*ehV]hU]hY]uh>j h^]r+hnX SVNPollerr,r-}r.(h=Uh>j&ubahQhubaubhnX. 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 r/r0}r1(h=X. 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 h>jubh)r2}r3(h=X``trunk/src/``hS}r4(hW]hX]hV]hU]hY]uh>jh^]r5hnX trunk/src/r6r7}r8(h=Uh>j2ubahQhubhnX, or r9r:}r;(h=X, or h>jubh)r<}r=(h=X``src/``hS}r>(hW]hX]hV]hU]hY]uh>jh^]r?hnXsrc/r@rA}rB(h=Uh>j<ubahQhubhnX'. There are a few utility functions in rCrD}rE(h=X'. There are a few utility functions in h>jubh{)rF}rG(h=X!:mod:`buildbot.changes.svnpoller`rHh>jhGhJhQhhS}rI(UreftypeXmodhhXbuildbot.changes.svnpollerU refdomainXpyrJhU]hV]U refexplicithW]hX]hY]hhhNhNuh\MUh^]rKh)rL}rM(h=jHhS}rN(hW]hX]rO(hjJXpy-modrPehV]hU]hY]uh>jFh^]rQhnXbuildbot.changes.svnpollerrRrS}rT(h=Uh>jLubahQhubaubhnX that can be used as a rUrV}rW(h=X that can be used as a h>jubh{)rX}rY(h=X:meth:`split_file`rZh>jhGhJhQhhS}r[(UreftypeXmethhhX split_fileU refdomainXpyr\hU]hV]U refexplicithW]hX]hY]hhhNhNuh\MUh^]r]h)r^}r_(h=jZhS}r`(hW]hX]ra(hj\Xpy-methrbehV]hU]hY]uh>jXh^]rchnX split_filerdre}rf(h=Uh>j^ubahQhubaubhnX! function; see below for details.rgrh}ri(h=X! function; see below for details.h>jubeubhr)rj}rk(h=XFor directories, the relative pathname returned by :meth:`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/"``.h>j hGhJhQhuhS}rl(hW]hX]hV]hU]hY]uh\M^h^]rm(hnX3For directories, the relative pathname returned by rnro}rp(h=X3For directories, the relative pathname returned by h>jjubh{)rq}rr(h=X:meth:`split_file`rsh>jjhGhJhQhhS}rt(UreftypeXmethhhX split_fileU refdomainXpyruhU]hV]U refexplicithW]hX]hY]hhhNhNuh\M^h^]rvh)rw}rx(h=jshS}ry(hW]hX]rz(hjuXpy-methr{ehV]hU]hY]uh>jqh^]r|hnX split_filer}r~}r(h=Uh>jwubahQhubaubhnXW should end with a right slash but an empty string is also accepted for the root, like rr}r(h=XW should end with a right slash but an empty string is also accepted for the root, like h>jjubh)r}r(h=X``("branches/1.5.x", "")``hS}r(hW]hX]hV]hU]hY]uh>jjh^]rhnX("branches/1.5.x", "")rr}r(h=Uh>jubahQhubhnX being converted from rr}r(h=X being converted from h>jjubh)r}r(h=X``"branches/1.5.x/"``hS}r(hW]hX]hV]hU]hY]uh>jjh^]rhnX"branches/1.5.x/"rr}r(h=Uh>jubahQhubhnX.r}r(h=X.h>jjubeubhr)r}r(h=XcThe default value always returns ``(None, path)``, which indicates that all files are on the trunk.h>j hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mbh^]r(hnX!The default value always returns rr}r(h=X!The default value always returns h>jubh)r}r(h=X``(None, path)``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX (None, path)rr}r(h=Uh>jubahQhubhnX2, which indicates that all files are on the trunk.rr}r(h=X2, which indicates that all files are on the trunk.h>jubeubhr)r}r(h=X}Subclasses of :bb:chsrc:`SVNPoller` can override the :meth:`split_file` method instead of using the ``split_file=`` argument.h>j hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Meh^]r(hnXSubclasses of rr}r(h=XSubclasses of h>jubh{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Meh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX can override the rr}r(h=X can override the h>jubh{)r}r(h=X:meth:`split_file`rh>jhGhJhQhhS}r(UreftypeXmethhhX split_fileU refdomainXpyrhU]hV]U refexplicithW]hX]hY]hhhNhNuh\Meh^]rh)r}r(h=jhS}r(hW]hX]r(hjXpy-methrehV]hU]hY]uh>jh^]rhnX split_filerr}r(h=Uh>jubahQhubaubhnX method instead of using the rr}r(h=X method instead of using the h>jubh)r}r(h=X``split_file=``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX split_file=rr}r(h=Uh>jubahQhubhnX argument.rr}r(h=X argument.h>jubeubehQj(ubeubj)r}r(h=X``project`` Set the name of the project to be used for the :bb:chsrc:`SVNPoller`. This will then be set in any changes generated by the :bb:chsrc:`SVNPoller`, and can be used in a :ref:`Change Filter ` for triggering particular builders. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mlh]hh^]r(j)r}r(h=X ``project``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mlh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXprojectrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XSet the name of the project to be used for the :bb:chsrc:`SVNPoller`. This will then be set in any changes generated by the :bb:chsrc:`SVNPoller`, and can be used in a :ref:`Change Filter ` for triggering particular builders.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mih^]r(hnX/Set the name of the project to be used for the rr}r(h=X/Set the name of the project to be used for the h>jubh{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mih^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX9. This will then be set in any changes generated by the rr}r(h=X9. This will then be set in any changes generated by the h>jubh{)r }r (h=X:bb:chsrc:`SVNPoller`r h>jhGhJhQhhS}r (UreftypeXchsrchhX SVNPollerU refdomainXbbr hU]hV]U refexplicithW]hX]hY]hhuh\Mih^]rh)r}r(h=j hS}r(hW]hX]r(hj Xbb-chsrcrehV]hU]hY]uh>j h^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX, and can be used in a rr}r(h=X, and can be used in a h>jubh{)r}r(h=X%:ref:`Change Filter `rh>jhGhJhQhhS}r(UreftypeXrefhhXchange-filtersU refdomainXstdrhU]hV]U refexplicithW]hX]hY]hhuh\Mih^]r h)r!}r"(h=jhS}r#(hW]hX]r$(hjXstd-refr%ehV]hU]hY]uh>jh^]r&hnX Change Filterr'r(}r)(h=Uh>j!ubahQhubaubhnX$ for triggering particular builders.r*r+}r,(h=X$ for triggering particular builders.h>jubeubahQj(ubeubj)r-}r.(h=X``svnuser`` An optional string parameter. If set, the :option:`--user` argument will be added to all :command:`svn` commands. Use this if you have to authenticate to the svn server before you can do :command:`svn info` or :command:`svn log` commands. h>jhGhJhQjhS}r/(hW]hX]hV]hU]hY]uh\Mrh]hh^]r0(j)r1}r2(h=X ``svnuser``r3h>j-hGhJhQjhS}r4(hW]hX]hV]hU]hY]uh\Mrh^]r5h)r6}r7(h=j3hS}r8(hW]hX]hV]hU]hY]uh>j1h^]r9hnXsvnuserr:r;}r<(h=Uh>j6ubahQhubaubj)r=}r>(h=UhS}r?(hW]hX]hV]hU]hY]uh>j-h^]r@hr)rA}rB(h=XAn optional string parameter. If set, the :option:`--user` argument will be added to all :command:`svn` commands. Use this if you have to authenticate to the svn server before you can do :command:`svn info` or :command:`svn log` commands.h>j=hGhJhQhuhS}rC(hW]hX]hV]hU]hY]uh\Moh^]rD(hnX*An optional string parameter. If set, the rErF}rG(h=X*An optional string parameter. If set, the h>jAubh{)rH}rI(h=X:option:`--user`rJh>jAhGhJhQhhS}rK(UreftypeXoptionhhX--userU refdomainXstdrLU refprogramrMNhU]hV]U refexplicithW]hX]hY]hhuh\Moh^]rNcsphinx.addnodes literal_emphasis rO)rP}rQ(h=jJhS}rR(hW]hX]rS(hjLX std-optionrTehV]hU]hY]uh>jHh^]rUhnX--userrVrW}rX(h=Uh>jPubahQUliteral_emphasisrYubaubhnX argument will be added to all rZr[}r\(h=X argument will be added to all h>jAubjm)r]}r^(h=X:command:`svn`hS}r_(hW]hX]r`jrahV]hU]hY]uh>jAh^]rahnXsvnrbrc}rd(h=Uh>j]ubahQjwubhnXT commands. Use this if you have to authenticate to the svn server before you can do rerf}rg(h=XT commands. Use this if you have to authenticate to the svn server before you can do h>jAubjm)rh}ri(h=X:command:`svn info`hS}rj(hW]hX]rkjrahV]hU]hY]uh>jAh^]rlhnXsvn informrn}ro(h=Uh>jhubahQjwubhnX or rprq}rr(h=X or h>jAubjm)rs}rt(h=X:command:`svn log`hS}ru(hW]hX]rvjrahV]hU]hY]uh>jAh^]rwhnXsvn logrxry}rz(h=Uh>jsubahQjwubhnX commands.r{r|}r}(h=X commands.h>jAubeubahQj(ubeubj)r~}r(h=X}``svnpasswd`` Like ``svnuser``, this will cause a :option:`--password` argument to be passed to all :command:`svn` commands. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mvh]hh^]r(j)r}r(h=X ``svnpasswd``rh>j~hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mvh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX svnpasswdrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>j~h^]rhr)r}r(h=XnLike ``svnuser``, this will cause a :option:`--password` argument to be passed to all :command:`svn` commands.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Muh^]r(hnXLike rr}r(h=XLike h>jubh)r}r(h=X ``svnuser``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXsvnuserrr}r(h=Uh>jubahQhubhnX, this will cause a rr}r(h=X, this will cause a h>jubh{)r}r(h=X:option:`--password`rh>jhGhJhQhhS}r(UreftypeXoptionhhX --passwordU refdomainXstdrjMNhU]hV]U refexplicithW]hX]hY]hhuh\Muh^]rjO)r}r(h=jhS}r(hW]hX]r(hjX std-optionrehV]hU]hY]uh>jh^]rhnX --passwordrr}r(h=Uh>jubahQjYubaubhnX argument to be passed to all rr}r(h=X argument to be passed to all h>jubjm)r}r(h=X:command:`svn`hS}r(hW]hX]rjrahV]hU]hY]uh>jh^]rhnXsvnrr}r(h=Uh>jubahQjwubhnX commands.rr}r(h=X commands.h>jubeubahQj(ubeubj)r}r(h=XJ``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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M}h]hh^]r(j)r}r(h=X``pollInterval``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M}h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX pollIntervalrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X8How 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.rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Myh^]rhnX8How 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.rr}r(h=jh>jubaubahQj(ubeubj)r}r(h=X``histmax`` The maximum number of changes to inspect at a time. Every ``pollInterval`` seconds, the :bb:chsrc:`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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``histmax``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXhistmaxrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XThe maximum number of changes to inspect at a time. Every ``pollInterval`` seconds, the :bb:chsrc:`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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnX:The maximum number of changes to inspect at a time. Every rr}r(h=X:The maximum number of changes to inspect at a time. Every h>jubh)r}r(h=X``pollInterval``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX pollIntervalrr}r(h=Uh>jubahQhubhnX seconds, the rr}r(h=X seconds, the h>jubh{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r (hW]hX]r (hjXbb-chsrcr ehV]hU]hY]uh>jh^]r hnX SVNPollerr r}r(h=Uh>jubahQhubaubhnX asks for the last rr}r(h=X asks for the last h>jubh)r}r(h=X ``histmax``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXhistmaxrr}r(h=Uh>jubahQhubhnX_ changes and looks through them for any revisions it does not already know about. If more than rr}r(h=X_ changes and looks through them for any revisions it does not already know about. If more than h>jubh)r}r(h=X ``histmax``hS}r(hW]hX]hV]hU]hY]uh>jh^]r hnXhistmaxr!r"}r#(h=Uh>jubahQhubhnXm revisions have been committed since the last poll, older changes will be silently ignored. Larger values of r$r%}r&(h=Xm revisions have been committed since the last poll, older changes will be silently ignored. Larger values of h>jubh)r'}r((h=X ``histmax``hS}r)(hW]hX]hV]hU]hY]uh>jh^]r*hnXhistmaxr+r,}r-(h=Uh>j'ubahQhubhnXF will cause more time and memory to be consumed on each poll attempt. r.r/}r0(h=XF will cause more time and memory to be consumed on each poll attempt. h>jubh)r1}r2(h=X ``histmax``hS}r3(hW]hX]hV]hU]hY]uh>jh^]r4hnXhistmaxr5r6}r7(h=Uh>j1ubahQhubhnX defaults to 100.r8r9}r:(h=X defaults to 100.h>jubeubahQj(ubeubj)r;}r<(h=X``svnbin`` This controls the :command:`svn` executable to use. If subversion is installed in a weird place on your system (outside of the buildmaster's :envvar:`PATH`), use this to tell :bb:chsrc:`SVNPoller` where to find it. The default value of `svn` will almost always be sufficient. h>jhGhJhQjhS}r=(hW]hX]hV]hU]hY]uh\Mh]hh^]r>(j)r?}r@(h=X ``svnbin``rAh>j;hGhJhQjhS}rB(hW]hX]hV]hU]hY]uh\Mh^]rCh)rD}rE(h=jAhS}rF(hW]hX]hV]hU]hY]uh>j?h^]rGhnXsvnbinrHrI}rJ(h=Uh>jDubahQhubaubj)rK}rL(h=UhS}rM(hW]hX]hV]hU]hY]uh>j;h^]rNhr)rO}rP(h=XThis controls the :command:`svn` executable to use. If subversion is installed in a weird place on your system (outside of the buildmaster's :envvar:`PATH`), use this to tell :bb:chsrc:`SVNPoller` where to find it. The default value of `svn` will almost always be sufficient.h>jKhGhJhQhuhS}rQ(hW]hX]hV]hU]hY]uh\Mh^]rR(hnXThis controls the rSrT}rU(h=XThis controls the h>jOubjm)rV}rW(h=X:command:`svn`hS}rX(hW]hX]rYjrahV]hU]hY]uh>jOh^]rZhnXsvnr[r\}r](h=Uh>jVubahQjwubhnXm executable to use. If subversion is installed in a weird place on your system (outside of the buildmaster's r^r_}r`(h=Xm executable to use. If subversion is installed in a weird place on your system (outside of the buildmaster's h>jOubj)ra}rb(h=UhS}rc(hU]hV]hW]hX]hY]j]rd((jXPATHreUindex-4rfUtrg(jXenvironment variable; PATHjfUtrheuh>jOh^]hQjubhN)ri}rj(h=UhS}rk(hW]hX]hV]hU]rljfahY]uh>jOh^]hQhRubh{)rm}rn(h=X:envvar:`PATH`roh>jOhGhJhQhhS}rp(UreftypeXenvvarhhjeU refdomainXstdrqhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rrh)rs}rt(h=johS}ru(hW]hX]rv(hjqX std-envvarrwehV]hU]hY]uh>jmh^]rxhnXPATHryrz}r{(h=Uh>jsubahQhubaubhnX), use this to tell r|r}}r~(h=X), use this to tell h>jOubh{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jOhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX( where to find it. The default value of rr}r(h=X( where to find it. The default value of h>jOubj)r}r(h=X`svn`hS}r(hW]hX]hV]hU]hY]uh>jOh^]rhnXsvnrr}r(h=Uh>jubahQjubhnX" will almost always be sufficient.rr}r(h=X" will almost always be sufficient.h>jOubeubahQj(ubeubj)r}r(h=X"``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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``revlinktmpl``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX revlinktmplrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XThis 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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnXThis 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, rr}r(h=XThis 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, h>jubh)r}r(h=X0``'http://myserver/websvn/revision.php?rev=%s'``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX,'http://myserver/websvn/revision.php?rev=%s'rr}r(h=Uh>jubahQhubhnXS could be used to cause revision links to be created to a websvn repository viewer.rr}r(h=XS could be used to cause revision links to be created to a websvn repository viewer.h>jubeubahQj(ubeubj)r}r(h=X``cachepath`` If specified, this is a pathname of a cache file that :bb:chsrc:`SVNPoller` will use to store its state between restarts of the master. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``cachepath``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX cachepathrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XIf specified, this is a pathname of a cache file that :bb:chsrc:`SVNPoller` will use to store its state between restarts of the master.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnX6If specified, this is a pathname of a cache file that rr}r(h=X6If specified, this is a pathname of a cache file that h>jubh{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX< will use to store its state between restarts of the master.rr}r(h=X< will use to store its state between restarts of the master.h>jubeubahQj(ubeubj)r}r(h=XX``extra_args`` If specified, the extra arguments will be added to the svn command args. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``extra_args``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX extra_argsrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XHIf specified, the extra arguments will be added to the svn command args.rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnXHIf specified, the extra arguments will be added to the svn command args.rr}r(h=jh>jubaubahQj(ubeubeubhr)r }r (h=XSeveral 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``::h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (hnXSeveral 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 r r}r(h=XSeveral 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 h>j ubh)r}r(h=X``split_file_alwaystrunk``hS}r(hW]hX]hV]hU]hY]uh>j h^]rhnXsplit_file_alwaystrunkrr}r(h=Uh>jubahQhubhnX:r}r(h=X:h>j ubeubjK)r}r(h=Xfrom 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)h>jhGhJhQjNhS}r(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rhnXfrom 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)rr}r(h=Uh>jubaubhr)r }r!(h=XqFor repositories with the ``/trunk`` and ``/branches/{BRANCH}`` layout, ``split_file_branches`` will do the job::h>jhGhJhQhuhS}r"(hW]hX]hV]hU]hY]uh\Mh]hh^]r#(hnXFor repositories with the r$r%}r&(h=XFor repositories with the h>j ubh)r'}r((h=X ``/trunk``hS}r)(hW]hX]hV]hU]hY]uh>j h^]r*hnX/trunkr+r,}r-(h=Uh>j'ubahQhubhnX and r.r/}r0(h=X and h>j ubh)r1}r2(h=X``/branches/{BRANCH}``hS}r3(hW]hX]hV]hU]hY]uh>j h^]r4hnX/branches/{BRANCH}r5r6}r7(h=Uh>j1ubahQhubhnX layout, r8r9}r:(h=X layout, h>j ubh)r;}r<(h=X``split_file_branches``hS}r=(hW]hX]hV]hU]hY]uh>j h^]r>hnXsplit_file_branchesr?r@}rA(h=Uh>j;ubahQhubhnX will do the job:rBrC}rD(h=X will do the job:h>j ubeubjK)rE}rF(h=Xfrom 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)h>jhGhJhQjNhS}rG(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rHhnXfrom 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)rIrJ}rK(h=Uh>jEubaubhr)rL}rM(h=XWhen using this splitter the poller will set the ``project`` attribute of any changes to the ``project`` attribute of the poller.h>jhGhJhQhuhS}rN(hW]hX]hV]hU]hY]uh\Mh]hh^]rO(hnX1When using this splitter the poller will set the rPrQ}rR(h=X1When using this splitter the poller will set the h>jLubh)rS}rT(h=X ``project``hS}rU(hW]hX]hV]hU]hY]uh>jLh^]rVhnXprojectrWrX}rY(h=Uh>jSubahQhubhnX! attribute of any changes to the rZr[}r\(h=X! attribute of any changes to the h>jLubh)r]}r^(h=X ``project``hS}r_(hW]hX]hV]hU]hY]uh>jLh^]r`hnXprojectrarb}rc(h=Uh>j]ubahQhubhnX attribute of the poller.rdre}rf(h=X attribute of the poller.h>jLubeubhr)rg}rh(h=XFor repositories with the ``{PROJECT}/trunk`` and ``{PROJECT}/branches/{BRANCH}`` layout, ``split_file_projects_branches`` will do the job::h>jhGhJhQhuhS}ri(hW]hX]hV]hU]hY]uh\Mh]hh^]rj(hnXFor repositories with the rkrl}rm(h=XFor repositories with the h>jgubh)rn}ro(h=X``{PROJECT}/trunk``hS}rp(hW]hX]hV]hU]hY]uh>jgh^]rqhnX{PROJECT}/trunkrrrs}rt(h=Uh>jnubahQhubhnX and rurv}rw(h=X and h>jgubh)rx}ry(h=X``{PROJECT}/branches/{BRANCH}``hS}rz(hW]hX]hV]hU]hY]uh>jgh^]r{hnX{PROJECT}/branches/{BRANCH}r|r}}r~(h=Uh>jxubahQhubhnX layout, rr}r(h=X layout, h>jgubh)r}r(h=X ``split_file_projects_branches``hS}r(hW]hX]hV]hU]hY]uh>jgh^]rhnXsplit_file_projects_branchesrr}r(h=Uh>jubahQhubhnX will do the job:rr}r(h=X will do the job:h>jgubeubjK)r}r(h=Xfrom 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)h>jhGhJhQjNhS}r(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rhnXfrom 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)rr}r(h=Uh>jubaubhr)r}r(h=XWhen using this splitter the poller will set the ``project`` attribute of any changes to the project determined by the splitter.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnX1When using this splitter the poller will set the rr}r(h=X1When using this splitter the poller will set the h>jubh)r}r(h=X ``project``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXprojectrr}r(h=Uh>jubahQhubhnXD attribute of any changes to the project determined by the splitter.rr}r(h=XD attribute of any changes to the project determined by the splitter.h>jubeubhr)r}r(h=XThe :bb:chsrc:`SVNPoller` is highly adaptable to various Subversion layouts. See :ref:`Customizing-SVNPoller` for details and some common scenarios.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`SVNPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX SVNPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX SVNPollerrr}r(h=Uh>jubahQhubaubhnX8 is highly adaptable to various Subversion layouts. See rr}r(h=X8 is highly adaptable to various Subversion layouts. See h>jubh{)r}r(h=X:ref:`Customizing-SVNPoller`rh>jhGhJhQhhS}r(UreftypeXrefhhXcustomizing-svnpollerU refdomainXstdrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXstd-refrehV]hU]hY]uh>jh^]rhnXCustomizing-SVNPollerrr}r(h=Uh>jubahQhubaubhnX' for details and some common scenarios.rr}r(h=X' for details and some common scenarios.h>jubeubj)r}r(h=Uh>jhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleXChange Sources; BzrPollerXchsrc-BzrPollerrjtr(UsingleXBzrPoller Change Sourcejjtreuh\Mh]hh^]ubhN)r}r(h=Uh>jhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mh]hh^]ubhN)r}r(h=X.. _Bzr-Poller:h>jhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZU bzr-pollerruh\Mh]hhd}rjjsh^]ubeubh?)r}r(h=Uh>hEhGhJhL}rh"jshQh_hS}r(hW]hX]hV]hU]r(jjUid16rehY]r(h h"euh\Mh]hhd}r(jjjjuh^]r(hg)r}r(h=X Bzr Pollerrh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnX Bzr Pollerrr}r(h=jh>jubaubhr)r}r(h=XIf you cannot insert a Bzr hook in the server, you can use the Bzr Poller. To use, put :file:`contrib/bzr_buildbot.py` somewhere that your buildbot configuration can import it. Even putting it in the same directory as the :file:`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. ::h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXWIf you cannot insert a Bzr hook in the server, you can use the Bzr Poller. To use, put rr}r(h=XWIf you cannot insert a Bzr hook in the server, you can use the Bzr Poller. To use, put h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXcontrib/bzr_buildbot.pyrr}r(h=Xcontrib/bzr_buildbot.pyh>jubahQhubhnXh somewhere that your buildbot configuration can import it. Even putting it in the same directory as the rr}r(h=Xh somewhere that your buildbot configuration can import it. Even putting it in the same directory as the h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnX master.cfgrr }r (h=X master.cfgh>jubahQhubhnX should work. Install the poller in the buildbot configuration as with any other change source. Minimally, provide a URL that you want to poll (r r }r (h=X should work. Install the poller in the buildbot configuration as with any other change source. Minimally, provide a URL that you want to poll (h>jubh)r}r(h=X ``bzr://``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbzr://rr}r(h=Uh>jubahQhubhnX, rr}r(h=X, h>jubh)r}r(h=X``bzr+ssh://``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX bzr+ssh://rr}r(h=Uh>jubahQhubhnX, or rr }r!(h=X, or h>jubh)r"}r#(h=X``lp:``hS}r$(hW]hX]hV]hU]hY]uh>jh^]r%hnXlp:r&r'}r((h=Uh>j"ubahQhubhnX:), making sure the buildbot user has necessary privileges.r)r*}r+(h=X:), making sure the buildbot user has necessary privileges.h>jubeubjK)r,}r-(h=X# 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)h>jhGhJhQjNhS}r.(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]r/hnX# 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)r0r1}r2(h=Uh>j,ubaubhr)r3}r4(h=X!The ``BzrPoller`` parameters are:r5h>jhGhJhQhuhS}r6(hW]hX]hV]hU]hY]uh\Mh]hh^]r7(hnXThe r8r9}r:(h=XThe h>j3ubh)r;}r<(h=X ``BzrPoller``hS}r=(hW]hX]hV]hU]hY]uh>j3h^]r>hnX BzrPollerr?r@}rA(h=Uh>j;ubahQhubhnX parameters are:rBrC}rD(h=X parameters are:h>j3ubeubj{)rE}rF(h=Uh>jhGhJhQj~hS}rG(hW]hX]hV]hU]hY]uh\Nh]hh^]rH(j)rI}rJ(h=X``url`` The URL to poll. h>jEhGhJhQjhS}rK(hW]hX]hV]hU]hY]uh\Mh^]rL(j)rM}rN(h=X``url``rOh>jIhGhJhQjhS}rP(hW]hX]hV]hU]hY]uh\Mh^]rQh)rR}rS(h=jOhS}rT(hW]hX]hV]hU]hY]uh>jMh^]rUhnXurlrVrW}rX(h=Uh>jRubahQhubaubj)rY}rZ(h=UhS}r[(hW]hX]hV]hU]hY]uh>jIh^]r\hr)r]}r^(h=XThe URL to poll.r_h>jYhGhJhQhuhS}r`(hW]hX]hV]hU]hY]uh\Mh^]rahnXThe URL to poll.rbrc}rd(h=j_h>j]ubaubahQj(ubeubj)re}rf(h=XX``poll_interval`` The number of seconds to wait between polls. Defaults to 10 minutes. h>jEhGhJhQjhS}rg(hW]hX]hV]hU]hY]uh\Mh]hh^]rh(j)ri}rj(h=X``poll_interval``rkh>jehGhJhQjhS}rl(hW]hX]hV]hU]hY]uh\Mh^]rmh)rn}ro(h=jkhS}rp(hW]hX]hV]hU]hY]uh>jih^]rqhnX poll_intervalrrrs}rt(h=Uh>jnubahQhubaubj)ru}rv(h=UhS}rw(hW]hX]hV]hU]hY]uh>jeh^]rxhr)ry}rz(h=XEThe number of seconds to wait between polls. Defaults to 10 minutes.r{h>juhGhJhQhuhS}r|(hW]hX]hV]hU]hY]uh\Mh^]r}hnXEThe number of seconds to wait between polls. Defaults to 10 minutes.r~r}r(h=j{h>jyubaubahQj(ubeubj)r}r(h=X``branch_name`` Any value to be used as the branch name. Defaults to None, or specify a string, or specify the constants from :file:`bzr_buildbot.py` ``SHORT`` or ``FULL`` to get the short branch name or full branch address. h>jEhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``branch_name``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX branch_namerr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XAny value to be used as the branch name. Defaults to None, or specify a string, or specify the constants from :file:`bzr_buildbot.py` ``SHORT`` or ``FULL`` to get the short branch name or full branch address.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnXnAny value to be used as the branch name. Defaults to None, or specify a string, or specify the constants from rr}r(h=XnAny value to be used as the branch name. Defaults to None, or specify a string, or specify the constants from h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXfileraUrolejhY]uh>jh^]rhnXbzr_buildbot.pyrr}r(h=Xbzr_buildbot.pyh>jubahQhubhnX r}r(h=X h>jubh)r}r(h=X ``SHORT``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXSHORTrr}r(h=Uh>jubahQhubhnX or rr}r(h=X or h>jubh)r}r(h=X``FULL``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXFULLrr}r(h=Uh>jubahQhubhnX5 to get the short branch name or full branch address.rr}r(h=X5 to get the short branch name or full branch address.h>jubeubahQj(ubeubj)r}r(h=X``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. h>jEhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``blame_merge_author``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXblame_merge_authorrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xnormally, 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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnXnormally, the user that commits the revision is the user that is responsible for the change. When run in a pqm (Patch Queue Manager, see rr}r(h=Xnormally, the user that commits the revision is the user that is responsible for the change. When run in a pqm (Patch Queue Manager, see h>jubjG)r}r(h=Xhttps://launchpad.net/pqmrhS}r(UrefurijhU]hV]hW]hX]hY]uh>jh^]rhnXhttps://launchpad.net/pqmrr}r(h=Uh>jubahQjPubhnXi) environment, the user that commits is the Patch Queue Manager, and the user that committed the merged, rr}r(h=Xi) environment, the user that commits is the Patch Queue Manager, and the user that committed the merged, h>jubh)r}r(h=X*parent*hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXparentrr}r(h=Uh>jubahQhubhnX; revision is responsible for the change. set this value to rr}r(h=X; revision is responsible for the change. set this value to h>jubh)r}r(h=X``True``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXTruerr}r(h=Uh>jubahQhubhnX1 if this is pointed against a PQM-managed branch.rr}r(h=X1 if this is pointed against a PQM-managed branch.h>jubeubahQj(ubeubeubj)r}r(h=Uh>jhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleXChange Sources; GitPollerXchsrc-GitPollerrjtr(UsingleXGitPoller Change Sourcejjtreuh\Mh]hh^]ubhN)r}r(h=Uh>jhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mh]hh^]ubhN)r}r(h=X.. _GitPoller:h>jhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZU gitpollerruh\Mh]hhd}rjjsh^]ubeubh?)r}r(h=UhBKh>hEhGhJhL}rh0jshQh_hS}r(hW]rX gitpollerr ahX]hV]hU]r (jjUid17r ehY]r h0auh\Mh]hhd}r (jjjjuh^]r(hg)r}r(h=X GitPollerrh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnX GitPollerrr}r(h=jh>jubaubhr)r}r(h=XIf you cannot take advantage of post-receive hooks as provided by :file:`contrib/git_buildbot.py` for example, then you can use the :bb:chsrc:`GitPoller`.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXBIf you cannot take advantage of post-receive hooks as provided by rr}r(h=XBIf you cannot take advantage of post-receive hooks as provided by h>jubh)r}r(h=UhS}r (hU]hV]hW]hX]r!Xfiler"aUrolej"hY]uh>jh^]r#hnXcontrib/git_buildbot.pyr$r%}r&(h=Xcontrib/git_buildbot.pyh>jubahQhubhnX# for example, then you can use the r'r(}r)(h=X# for example, then you can use the h>jubh{)r*}r+(h=X:bb:chsrc:`GitPoller`r,h>jhGhJhQhhS}r-(UreftypeXchsrchhX GitPollerU refdomainXbbr.hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r/h)r0}r1(h=j,hS}r2(hW]hX]r3(hj.Xbb-chsrcr4ehV]hU]hY]uh>j*h^]r5hnX GitPollerr6r7}r8(h=Uh>j0ubahQhubaubhnX.r9}r:(h=X.h>jubeubhr)r;}r<(h=XThe :bb:chsrc:`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.h>jhGhJhQhuhS}r=(hW]hX]hV]hU]hY]uh\Mh]hh^]r>(hnXThe r?r@}rA(h=XThe h>j;ubh{)rB}rC(h=X:bb:chsrc:`GitPoller`rDh>j;hGhJhQhhS}rE(UreftypeXchsrchhX GitPollerU refdomainXbbrFhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rGh)rH}rI(h=jDhS}rJ(hW]hX]rK(hjFXbb-chsrcrLehV]hU]hY]uh>jBh^]rMhnX GitPollerrNrO}rP(h=Uh>jHubahQhubaubhnX 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 rQrR}rS(h=X 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 h>j;ubh)rT}rU(h=X ``workdir``hS}rV(hW]hX]hV]hU]hY]uh>j;h^]rWhnXworkdirrXrY}rZ(h=Uh>jTubahQhubhnX property.r[r\}r](h=X property.h>j;ubeubj!)r^}r_(h=XGThere can only be a single `GitPoller` pointed at any given repository.r`h>jhGhJhQj$hS}ra(hW]hX]hV]hU]hY]uh\Nh]hh^]rbhr)rc}rd(h=j`h>j^hGhJhQhuhS}re(hW]hX]hV]hU]hY]uh\Mh^]rf(hnXThere can only be a single rgrh}ri(h=XThere can only be a single h>jcubj)rj}rk(h=X `GitPoller`hS}rl(hW]hX]hV]hU]hY]uh>jch^]rmhnX GitPollerrnro}rp(h=Uh>jjubahQjubhnX! pointed at any given repository.rqrr}rs(h=X! pointed at any given repository.h>jcubeubaubhr)rt}ru(h=XZThe :bb:chsrc:`GitPoller` requires Git-1.7 and later. It accepts the following arguments:h>jhGhJhQhuhS}rv(hW]hX]hV]hU]hY]uh\Mh]hh^]rw(hnXThe rxry}rz(h=XThe h>jtubh{)r{}r|(h=X:bb:chsrc:`GitPoller`r}h>jthGhJhQhhS}r~(UreftypeXchsrchhX GitPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=j}hS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>j{h^]rhnX GitPollerrr}r(h=Uh>jubahQhubaubhnXA requires Git-1.7 and later. It accepts the following arguments:rr}r(h=XA requires Git-1.7 and later. It accepts the following arguments:h>jtubeubj{)r}r(h=Uh>jhGhJhQj~hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]r(j)r}r(h=X``repourl`` the git-url that describes the remote repository, e.g. ``git@example.com:foobaz/myrepo.git`` (see the :command:`git fetch` help for more info on git-url formats) h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M h^]r(j)r}r(h=X ``repourl``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXrepourlrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xthe git-url that describes the remote repository, e.g. ``git@example.com:foobaz/myrepo.git`` (see the :command:`git fetch` help for more info on git-url formats)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnX7the git-url that describes the remote repository, e.g. rr}r(h=X7the git-url that describes the remote repository, e.g. h>jubh)r}r(h=X%``git@example.com:foobaz/myrepo.git``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX!git@example.com:foobaz/myrepo.gitrr}r(h=Uh>jubahQhubhnX (see the rr}r(h=X (see the h>jubjm)r}r(h=X:command:`git fetch`hS}r(hW]hX]rjrahV]hU]hY]uh>jh^]rhnX git fetchrr}r(h=Uh>jubahQjwubhnX' help for more info on git-url formats)rr}r(h=X' help for more info on git-url formats)h>jubeubahQj(ubeubj)r}r(h=XM``branches`` a list of the branches to fetch, will default to ``['master']`` h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M h]hh^]r(j)r}r(h=X ``branches``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbranchesrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X?a list of the branches to fetch, will default to ``['master']``h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M h^]r(hnX1a list of the branches to fetch, will default to rr}r(h=X1a list of the branches to fetch, will default to h>jubh)r}r(h=X``['master']``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX ['master']rr}r(h=Uh>jubahQhubeubahQj(ubeubj)r}r(h=Xn``branch`` accepts a single branch name to fetch. Exists for backwards compatibility with old configurations. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``branch``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXbranchrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xbaccepts a single branch name to fetch. Exists for backwards compatibility with old configurations.rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnXbaccepts a single branch name to fetch. Exists for backwards compatibility with old configurations.rr}r(h=jh>jubaubahQj(ubeubj)r}r(h=XJ``pollInterval`` interval in seconds between polls, default is 10 minutes h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``pollInterval``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r (h=jhS}r (hW]hX]hV]hU]hY]uh>jh^]r hnX pollIntervalr r }r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X8interval in seconds between polls, default is 10 minutesrh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnX8interval in seconds between polls, default is 10 minutesrr}r(h=jh>jubaubahQj(ubeubj)r}r(h=X>``gitbin`` path to the Git binary, defaults to just ``'git'`` h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r (h=X ``gitbin``r!h>jhGhJhQjhS}r"(hW]hX]hV]hU]hY]uh\Mh^]r#h)r$}r%(h=j!hS}r&(hW]hX]hV]hU]hY]uh>jh^]r'hnXgitbinr(r)}r*(h=Uh>j$ubahQhubaubj)r+}r,(h=UhS}r-(hW]hX]hV]hU]hY]uh>jh^]r.hr)r/}r0(h=X2path to the Git binary, defaults to just ``'git'``h>j+hGhJhQhuhS}r1(hW]hX]hV]hU]hY]uh\Mh^]r2(hnX)path to the Git binary, defaults to just r3r4}r5(h=X)path to the Git binary, defaults to just h>j/ubh)r6}r7(h=X ``'git'``hS}r8(hW]hX]hV]hU]hY]uh>j/h^]r9hnX'git'r:r;}r<(h=Uh>j6ubahQhubeubahQj(ubeubj)r=}r>(h=X``category`` Set the category to be used for the changes produced by the :bb:chsrc:`GitPoller`. This will then be set in any changes generated by the :bb:chsrc:`GitPoller`, and can be used in a Change Filter for triggering particular builders. h>jhGhJhQjhS}r?(hW]hX]hV]hU]hY]uh\Mh]hh^]r@(j)rA}rB(h=X ``category``rCh>j=hGhJhQjhS}rD(hW]hX]hV]hU]hY]uh\Mh^]rEh)rF}rG(h=jChS}rH(hW]hX]hV]hU]hY]uh>jAh^]rIhnXcategoryrJrK}rL(h=Uh>jFubahQhubaubj)rM}rN(h=UhS}rO(hW]hX]hV]hU]hY]uh>j=h^]rPhr)rQ}rR(h=XSet the category to be used for the changes produced by the :bb:chsrc:`GitPoller`. This will then be set in any changes generated by the :bb:chsrc:`GitPoller`, and can be used in a Change Filter for triggering particular builders.h>jMhGhJhQhuhS}rS(hW]hX]hV]hU]hY]uh\Mh^]rT(hnX<Set the category to be used for the changes produced by the rUrV}rW(h=X<Set the category to be used for the changes produced by the h>jQubh{)rX}rY(h=X:bb:chsrc:`GitPoller`rZh>jQhGhJhQhhS}r[(UreftypeXchsrchhX GitPollerU refdomainXbbr\hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r]h)r^}r_(h=jZhS}r`(hW]hX]ra(hj\Xbb-chsrcrbehV]hU]hY]uh>jXh^]rchnX GitPollerrdre}rf(h=Uh>j^ubahQhubaubhnX8. This will then be set in any changes generated by the rgrh}ri(h=X8. This will then be set in any changes generated by the h>jQubh{)rj}rk(h=X:bb:chsrc:`GitPoller`rlh>jQhGhJhQhhS}rm(UreftypeXchsrchhX GitPollerU refdomainXbbrnhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]roh)rp}rq(h=jlhS}rr(hW]hX]rs(hjnXbb-chsrcrtehV]hU]hY]uh>jjh^]ruhnX GitPollerrvrw}rx(h=Uh>jpubahQhubaubhnXH, and can be used in a Change Filter for triggering particular builders.ryrz}r{(h=XH, and can be used in a Change Filter for triggering particular builders.h>jQubeubahQj(ubeubj)r|}r}(h=X``project`` Set the name of the project to be used for the :bb:chsrc:`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. h>jhGhJhQjhS}r~(hW]hX]hV]hU]hY]uh\M"h]hh^]r(j)r}r(h=X ``project``rh>j|hGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M"h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXprojectrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>j|h^]rhr)r}r(h=XSet the name of the project to be used for the :bb:chsrc:`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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnX/Set the name of the project to be used for the rr}r(h=X/Set the name of the project to be used for the h>jubh{)r}r(h=X:bb:chsrc:`GitPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhX GitPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnX GitPollerrr}r(h=Uh>jubahQhubaubhnX8. This will then be set in any changes generated by the rr}r(h=X8. This will then be set in any changes generated by the h>jubh)r}r(h=X ``GitPoller``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX GitPollerrr}r(h=Uh>jubahQhubhnXH, and can be used in a Change Filter for triggering particular builders.rr}r(h=XH, and can be used in a Change Filter for triggering particular builders.h>jubeubahQj(ubeubj)r}r(h=X``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) h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M'h]hh^]r(j)r}r(h=X``usetimestamps``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M'h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX usetimestampsrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xparse 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)h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M%h^]r(hnX3parse each revision's commit timestamp (default is rr}r(h=X3parse each revision's commit timestamp (default is h>jubh)r}r(h=X``True``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXTruerr}r(h=Uh>jubahQhubhnXr), or ignore it in favor of the current time (so recently processed commits appear together in the waterfall page)rr}r(h=Xr), or ignore it in favor of the current time (so recently processed commits appear together in the waterfall page)h>jubeubahQj(ubeubj)r}r(h=X``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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M-h]hh^]r(j)r}r(h=X ``encoding``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M-h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXencodingrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XSet 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.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M*h^]r(hnXYSet encoding will be used to parse author's name and commit message. Default encoding is rr}r(h=XYSet encoding will be used to parse author's name and commit message. Default encoding is h>jubh)r}r(h=X ``'utf-8'``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX'utf-8'rr}r(h=Uh>jubahQhubhnXv. This will not be applied to file names since Git will translate non-ascii file names to unreadable escape sequences.rr}r(h=Xv. This will not be applied to file names since Git will translate non-ascii file names to unreadable escape sequences.h>jubeubahQj(ubeubj)r}r(h=X``workdir`` the directory where the poller should keep its local repository. The default is :samp:`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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M3h]hh^]r(j)r}r(h=X ``workdir``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M3h^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]r hnXworkdirr r }r (h=Uh>jubahQhubaubj)r }r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xthe directory where the poller should keep its local repository. The default is :samp:`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.h>j hGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\M0h^]r(hnXPthe directory where the poller should keep its local repository. The default is rr}r(h=XPthe directory where the poller should keep its local repository. The default is h>jubh)r}r(h=UhS}r(hU]hV]hW]hX]rXsampraUrolejhY]uh>jh^]rhnXgitpoller_workrr}r (h=Xgitpoller_workh>jubahQhubhnX. If this is a relative path, it will be interpreted relative to the master's basedir. Multiple Git pollers can share the same directory.r!r"}r#(h=X. If this is a relative path, it will be interpreted relative to the master's basedir. Multiple Git pollers can share the same directory.h>jubeubahQj(ubeubeubhr)r$}r%(h=X9A configuration for the Git poller might look like this::r&h>jhGhJhQhuhS}r'(hW]hX]hV]hU]hY]uh\M5h]hh^]r(hnX8A configuration for the Git poller might look like this:r)r*}r+(h=X8A configuration for the Git poller might look like this:h>j$ubaubjK)r,}r-(h=Xfrom buildbot.changes.gitpoller import GitPoller c['change_source'] = GitPoller(repourl='git@example.com:foobaz/myrepo.git', branches=['master', 'great_new_feature'])h>jhGhJhQjNhS}r.(jPjQhU]hV]hW]hX]hY]uh\M7h]hh^]r/hnXfrom buildbot.changes.gitpoller import GitPoller c['change_source'] = GitPoller(repourl='git@example.com:foobaz/myrepo.git', branches=['master', 'great_new_feature'])r0r1}r2(h=Uh>j,ubaubj)r3}r4(h=Uh>jhGhJhQjhS}r5(hU]hV]hW]hX]hY]Uentries]r6((UsingleXChange Sources; HgPollerXchsrc-HgPollerr7j7tr8(UsingleXHgPoller Change Sourcej7j7tr9euh\M<h]hh^]ubhN)r:}r;(h=Uh>jhGhJhQhRhS}r<(hU]hV]hW]hX]hY]hZj7uh\M<h]hh^]ubhN)r=}r>(h=X .. _HgPoller:h>jhGhJhL}hQhRhS}r?(hU]hV]hW]hX]hY]hZUhgpollerr@uh\M=h]hhd}rAj7j:sh^]ubeubh?)rB}rC(h=UhBKh>hEhGhJhL}rDhj=shQh_hS}rE(hW]rFXhgpollerrGahX]hV]hU]rH(j@j7Uid18rIehY]rJhauh\M@h]hhd}rK(j@j=j7j:uh^]rL(hg)rM}rN(h=XHgPollerrOh>jBhGhJhQhkhS}rP(hW]hX]hV]hU]hY]uh\M@h]hh^]rQhnXHgPollerrRrS}rT(h=jOh>jMubaubhr)rU}rV(h=XIf you cannot take advantage of post-receive hooks as provided by :file:`buildbot/changes/hgbuildbot.py` for example, then you can use the :bb:chsrc:`HgPoller`.h>jBhGhJhQhuhS}rW(hW]hX]hV]hU]hY]uh\MBh]hh^]rX(hnXBIf you cannot take advantage of post-receive hooks as provided by rYrZ}r[(h=XBIf you cannot take advantage of post-receive hooks as provided by h>jUubh)r\}r](h=UhS}r^(hU]hV]hW]hX]r_Xfiler`aUrolej`hY]uh>jUh^]rahnXbuildbot/changes/hgbuildbot.pyrbrc}rd(h=Xbuildbot/changes/hgbuildbot.pyh>j\ubahQhubhnX# for example, then you can use the rerf}rg(h=X# for example, then you can use the h>jUubh{)rh}ri(h=X:bb:chsrc:`HgPoller`rjh>jUhGhJhQhhS}rk(UreftypeXchsrchhXHgPollerU refdomainXbbrlhU]hV]U refexplicithW]hX]hY]hhuh\MBh^]rmh)rn}ro(h=jjhS}rp(hW]hX]rq(hjlXbb-chsrcrrehV]hU]hY]uh>jhh^]rshnXHgPollerrtru}rv(h=Uh>jnubahQhubaubhnX.rw}rx(h=X.h>jUubeubhr)ry}rz(h=XThe :bb:chsrc:`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.h>jBhGhJhQhuhS}r{(hW]hX]hV]hU]hY]uh\MFh]hh^]r|(hnXThe r}r~}r(h=XThe h>jyubh{)r}r(h=X:bb:chsrc:`HgPoller`rh>jyhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\MFh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXHgPollerrr}r(h=Uh>jubahQhubaubhnX 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 rr}r(h=X 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 h>jyubh)r}r(h=X ``workdir``hS}r(hW]hX]hV]hU]hY]uh>jyh^]rhnXworkdirrr}r(h=Uh>jubahQhubhnX property.rr}r(h=X property.h>jyubeubhr)r}r(h=XThe :bb:chsrc:`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).h>jBhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MJh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`HgPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\MJh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXHgPollerrr}r(h=Uh>jubahQhubaubhnX requires a working rr}r(h=X requires a working h>jubh)r}r(h=X``hg``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXhgrr}r(h=Uh>jubahQhubhnXv executable, and at least a read-only access to the repository it polls (possibly through ssh keys or by tweaking the rr}r(h=Xv executable, and at least a read-only access to the repository it polls (possibly through ssh keys or by tweaking the h>jubh)r}r(h=X``hgrc``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXhgrcrr}r(h=Uh>jubahQhubhnX& of the system user buildbot runs as).rr}r(h=X& of the system user buildbot runs as).h>jubeubhr)r}r(h=XThe :bb:chsrc:`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.h>jBhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MNh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`HgPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\MNh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXHgPollerrr}r(h=Uh>jubahQhubaubhnX 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.rr}r(h=X 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.h>jubeubhr)r}r(h=X9The :bb:chsrc:`HgPoller` accepts the following arguments:rh>jBhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MVh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`HgPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\MVh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXHgPollerrr}r(h=Uh>jubahQhubaubhnX! accepts the following arguments:rr}r(h=X! accepts the following arguments:h>jubeubj{)r}r(h=Uh>jBhGhJhQj~hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]r(j)r}r(h=X``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. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M[h^]r(j)r}r(h=X ``repourl``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\M[h^]rh)r }r (h=jhS}r (hW]hX]hV]hU]hY]uh>jh^]r hnXrepourlr r}r(h=Uh>j ubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=Xthe url that describes the remote repository, e.g. ``http://hg.example.com/projects/myrepo``. Any url suitable for ``hg pull`` can be specified.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\MYh^]r(hnX3the url that describes the remote repository, e.g. rr}r(h=X3the url that describes the remote repository, e.g. h>jubh)r}r(h=X)``http://hg.example.com/projects/myrepo``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX%http://hg.example.com/projects/myreporr }r!(h=Uh>jubahQhubhnX. Any url suitable for r"r#}r$(h=X. Any url suitable for h>jubh)r%}r&(h=X ``hg pull``hS}r'(hW]hX]hV]hU]hY]uh>jh^]r(hnXhg pullr)r*}r+(h=Uh>j%ubahQhubhnX can be specified.r,r-}r.(h=X can be specified.h>jubeubahQj(ubeubj)r/}r0(h=XE``branch`` the desired branch to pull, will default to ``'default'`` h>jhGhJhQjhS}r1(hW]hX]hV]hU]hY]uh\M^h]hh^]r2(j)r3}r4(h=X ``branch``r5h>j/hGhJhQjhS}r6(hW]hX]hV]hU]hY]uh\M^h^]r7h)r8}r9(h=j5hS}r:(hW]hX]hV]hU]hY]uh>j3h^]r;hnXbranchr<r=}r>(h=Uh>j8ubahQhubaubj)r?}r@(h=UhS}rA(hW]hX]hV]hU]hY]uh>j/h^]rBhr)rC}rD(h=X9the desired branch to pull, will default to ``'default'``h>j?hGhJhQhuhS}rE(hW]hX]hV]hU]hY]uh\M^h^]rF(hnX,the desired branch to pull, will default to rGrH}rI(h=X,the desired branch to pull, will default to h>jCubh)rJ}rK(h=X ``'default'``hS}rL(hW]hX]hV]hU]hY]uh>jCh^]rMhnX 'default'rNrO}rP(h=Uh>jJubahQhubeubahQj(ubeubj)rQ}rR(h=XE``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 :bb:chsrc:`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. h>jhGhJhQjhS}rS(hW]hX]hV]hU]hY]uh\Mlh]hh^]rT(j)rU}rV(h=X ``workdir``rWh>jQhGhJhQjhS}rX(hW]hX]hV]hU]hY]uh\Mlh^]rYh)rZ}r[(h=jWhS}r\(hW]hX]hV]hU]hY]uh>jUh^]r]hnXworkdirr^r_}r`(h=Uh>jZubahQhubaubj)ra}rb(h=UhS}rc(hW]hX]hV]hU]hY]uh>jQh^]rd(hr)re}rf(h=Xthe directory where the poller should keep its local repository. It is mandatory for now, although later releases may provide a meaningful default.rgh>jahGhJhQhuhS}rh(hW]hX]hV]hU]hY]uh\Mah^]rihnXthe directory where the poller should keep its local repository. It is mandatory for now, although later releases may provide a meaningful default.rjrk}rl(h=jgh>jeubaubhr)rm}rn(h=XIt also serves to identify the poller in the buildmaster internal database. Changing it may result in re-processing all changes so far.roh>jahGhJhQhuhS}rp(hW]hX]hV]hU]hY]uh\Meh^]rqhnXIt also serves to identify the poller in the buildmaster internal database. Changing it may result in re-processing all changes so far.rrrs}rt(h=joh>jmubaubhr)ru}rv(h=XSeveral :bb:chsrc:`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.h>jahGhJhQhuhS}rw(hW]hX]hV]hU]hY]uh\Mhh^]rx(hnXSeveral ryrz}r{(h=XSeveral h>juubh{)r|}r}(h=X:bb:chsrc:`HgPoller`r~h>juhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Mhh^]rh)r}r(h=j~hS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>j|h^]rhnXHgPollerrr}r(h=Uh>jubahQhubaubhnX instances may share the same rr}r(h=X instances may share the same h>juubh)r}r(h=X ``workdir``hS}r(hW]hX]hV]hU]hY]uh>juh^]rhnXworkdirrr}r(h=Uh>jubahQhubhnX for mutualisation of the common history between two different branches, thus easing on local and remote system resources and bandwidth.rr}r(h=X for mutualisation of the common history between two different branches, thus easing on local and remote system resources and bandwidth.h>juubeubhr)r}r(h=XKIf relative, the ``workdir`` will be interpreted from the master directory.h>jahGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mlh^]r(hnXIf relative, the rr}r(h=XIf relative, the h>jubh)r}r(h=X ``workdir``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXworkdirrr}r(h=Uh>jubahQhubhnX/ will be interpreted from the master directory.rr}r(h=X/ will be interpreted from the master directory.h>jubeubehQj(ubeubj)r}r(h=XJ``pollInterval`` interval in seconds between polls, default is 10 minutes h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Moh]hh^]r(j)r}r(h=X``pollInterval``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Moh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX pollIntervalrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X8interval in seconds between polls, default is 10 minutesrh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Moh^]rhnX8interval in seconds between polls, default is 10 minutesrr}r(h=jh>jubaubahQj(ubeubj)r}r(h=XB``hgbin`` path to the Mercurial binary, defaults to just ``'hg'`` h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mrh]hh^]r(j)r}r(h=X ``hgbin``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mrh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXhgbinrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X7path to the Mercurial binary, defaults to just ``'hg'``h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mrh^]r(hnX/path to the Mercurial binary, defaults to just rr}r(h=X/path to the Mercurial binary, defaults to just h>jubh)r}r(h=X``'hg'``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX'hg'rr}r(h=Uh>jubahQhubeubahQj(ubeubj)r}r(h=X``category`` Set the category to be used for the changes produced by the :bb:chsrc:`HgPoller`. This will then be set in any changes generated by the :bb:chsrc:`HgPoller`, and can be used in a Change Filter for triggering particular builders. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mxh]hh^]r(j)r}r(h=X ``category``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mxh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXcategoryrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XSet the category to be used for the changes produced by the :bb:chsrc:`HgPoller`. This will then be set in any changes generated by the :bb:chsrc:`HgPoller`, and can be used in a Change Filter for triggering particular builders.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Muh^]r(hnX<Set the category to be used for the changes produced by the rr}r(h=X<Set the category to be used for the changes produced by the h>jubh{)r}r(h=X:bb:chsrc:`HgPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Muh^]rh)r}r (h=jhS}r (hW]hX]r (hjXbb-chsrcr ehV]hU]hY]uh>jh^]r hnXHgPollerrr}r(h=Uh>jubahQhubaubhnX8. This will then be set in any changes generated by the rr}r(h=X8. This will then be set in any changes generated by the h>jubh{)r}r(h=X:bb:chsrc:`HgPoller`rh>jhGhJhQhhS}r(UreftypeXchsrchhXHgPollerU refdomainXbbrhU]hV]U refexplicithW]hX]hY]hhuh\Muh^]rh)r}r(h=jhS}r(hW]hX]r(hjXbb-chsrcrehV]hU]hY]uh>jh^]rhnXHgPollerr r!}r"(h=Uh>jubahQhubaubhnXH, and can be used in a Change Filter for triggering particular builders.r#r$}r%(h=XH, and can be used in a Change Filter for triggering particular builders.h>jubeubahQj(ubeubj)r&}r'(h=X``project`` Set the name of the project to be used for the :bb:chsrc:`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. h>jhGhJhQjhS}r((hW]hX]hV]hU]hY]uh\M~h]hh^]r)(j)r*}r+(h=X ``project``r,h>j&hGhJhQjhS}r-(hW]hX]hV]hU]hY]uh\M~h^]r.h)r/}r0(h=j,hS}r1(hW]hX]hV]hU]hY]uh>j*h^]r2hnXprojectr3r4}r5(h=Uh>j/ubahQhubaubj)r6}r7(h=UhS}r8(hW]hX]hV]hU]hY]uh>j&h^]r9hr)r:}r;(h=XSet the name of the project to be used for the :bb:chsrc:`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.h>j6hGhJhQhuhS}r<(hW]hX]hV]hU]hY]uh\M{h^]r=(hnX/Set the name of the project to be used for the r>r?}r@(h=X/Set the name of the project to be used for the h>j:ubh{)rA}rB(h=X:bb:chsrc:`HgPoller`rCh>j:hGhJhQhhS}rD(UreftypeXchsrchhXHgPollerU refdomainXbbrEhU]hV]U refexplicithW]hX]hY]hhuh\M{h^]rFh)rG}rH(h=jChS}rI(hW]hX]rJ(hjEXbb-chsrcrKehV]hU]hY]uh>jAh^]rLhnXHgPollerrMrN}rO(h=Uh>jGubahQhubaubhnX8. This will then be set in any changes generated by the rPrQ}rR(h=X8. This will then be set in any changes generated by the h>j:ubh)rS}rT(h=X ``HgPoller``hS}rU(hW]hX]hV]hU]hY]uh>j:h^]rVhnXHgPollerrWrX}rY(h=Uh>jSubahQhubhnXH, and can be used in a Change Filter for triggering particular builders.rZr[}r\(h=XH, and can be used in a Change Filter for triggering particular builders.h>j:ubeubahQj(ubeubj)r]}r^(h=X``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) h>jhGhJhQjhS}r_(hW]hX]hV]hU]hY]uh\Mh]hh^]r`(j)ra}rb(h=X``usetimestamps``rch>j]hGhJhQjhS}rd(hW]hX]hV]hU]hY]uh\Mh^]reh)rf}rg(h=jchS}rh(hW]hX]hV]hU]hY]uh>jah^]rihnX usetimestampsrjrk}rl(h=Uh>jfubahQhubaubj)rm}rn(h=UhS}ro(hW]hX]hV]hU]hY]uh>j]h^]rphr)rq}rr(h=Xparse 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)h>jmhGhJhQhuhS}rs(hW]hX]hV]hU]hY]uh\Mh^]rt(hnX3parse each revision's commit timestamp (default is rurv}rw(h=X3parse each revision's commit timestamp (default is h>jqubh)rx}ry(h=X``True``hS}rz(hW]hX]hV]hU]hY]uh>jqh^]r{hnXTruer|r}}r~(h=Uh>jxubahQhubhnXr), or ignore it in favor of the current time (so recently processed commits appear together in the waterfall page)rr}r(h=Xr), or ignore it in favor of the current time (so recently processed commits appear together in the waterfall page)h>jqubeubahQj(ubeubj)r}r(h=Xs``encoding`` Set encoding will be used to parse author's name and commit message. Default encoding is ``'utf-8'``. h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``encoding``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXencodingrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XeSet encoding will be used to parse author's name and commit message. Default encoding is ``'utf-8'``.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(hnXYSet encoding will be used to parse author's name and commit message. Default encoding is rr}r(h=XYSet encoding will be used to parse author's name and commit message. Default encoding is h>jubh)r}r(h=X ``'utf-8'``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnX'utf-8'rr}r(h=Uh>jubahQhubhnX.r}r(h=X.h>jubeubahQj(ubeubeubhr)r}r(h=X?A configuration for the Mercurial poller might look like this::rh>jBhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnX>A configuration for the Mercurial poller might look like this:rr}r(h=X>A configuration for the Mercurial poller might look like this:h>jubaubjK)r}r(h=Xfrom buildbot.changes.hgpoller import HgPoller c['change_source'] = HgPoller(repourl='http://hg.example.org/projects/myrepo', branch='great_new_feature', workdir='hg-myrepo')h>jBhGhJhQjNhS}r(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]rhnXfrom buildbot.changes.hgpoller import HgPoller c['change_source'] = HgPoller(repourl='http://hg.example.org/projects/myrepo', branch='great_new_feature', workdir='hg-myrepo')rr}r(h=Uh>jubaubj)r}r(h=Uh>jBhGhJhQjhS}r(hU]hV]hW]hX]hY]Uentries]r((UsingleX"Change Sources; GerritChangeSourceXchsrc-GerritChangeSourcerjtr(UsingleX GerritChangeSource Change Sourcejjtreuh\Mh]hh^]ubhN)r}r(h=Uh>jBhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mh]hh^]ubhN)r}r(h=X.. _GerritChangeSource:h>jBhGhJhL}hQhRhS}r(hU]hV]hW]hX]hY]hZUgerritchangesourceruh\Mh]hhd}rjjsh^]ubeubh?)r}r(h=UhBKh>hEhGhJhL}rhjshQh_hS}r(hW]rXgerritchangesourcerahX]hV]hU]r(jjUid19rehY]rhauh\Mh]hhd}r(jjjjuh^]r(hg)r}r(h=XGerritChangeSourcerh>jhGhJhQhkhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnXGerritChangeSourcerr}r(h=jh>jubaubj)r}r(h=Uh>jhGNhQjhS}r(hU]hV]hW]hX]hY]Uentries]r(jXGbuildbot.changes.gerritchangesource.GerritChangeSource (built-in class)hUtrauh\Nh]hh^]ubj)r}r(h=Uh>jhGNhQjhS}r(jjXpyhU]hV]hW]hX]hY]jXclassrjjuh\Nh]hh^]r(j)r}r(h=X6buildbot.changes.gerritchangesource.GerritChangeSourceh>jhGhJhQjhS}r(hU]rhajNhV]hW]hX]hY]rhajhjX#buildbot.changes.gerritchangesourcejuh\Mh]hh^]r(j)r}r(h=Xclass h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnXclass rr}r(h=Uh>jubaubj)r}r(h=X$buildbot.changes.gerritchangesource.h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnX$buildbot.changes.gerritchangesource.rr}r(h=Uh>jubaubj)r}r(h=XGerritChangeSourceh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]rhnXGerritChangeSourcerr}r(h=Uh>jubaubeubj)r}r(h=Uh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]ubeubhr)r}r(h=XThe :bb:chsrc:`GerritChangeSource` class connects to a Gerrit server by its SSH interface and uses its event source mechanism, `gerrit stream-events `_.h>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(hnXThe rr}r(h=XThe h>jubh{)r}r(h=X:bb:chsrc:`GerritChangeSource`rh>jhGhJhQhhS}r (UreftypeXchsrchhXGerritChangeSourceU refdomainXbbr hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r h)r }r (h=jhS}r(hW]hX]r(hj Xbb-chsrcrehV]hU]hY]uh>jh^]rhnXGerritChangeSourcerr}r(h=Uh>j ubahQhubaubhnX] class connects to a Gerrit server by its SSH interface and uses its event source mechanism, rr}r(h=X] class connects to a Gerrit server by its SSH interface and uses its event source mechanism, h>jubjG)r}r(h=Xe`gerrit stream-events `_hS}r(UnameXgerrit stream-eventsjXKhttp://gerrit.googlecode.com/svn/documentation/2.1.6/cmd-stream-events.htmlrhU]hV]hW]hX]hY]uh>jh^]rhnXgerrit stream-eventsrr}r(h=Uh>jubahQjPubhN)r }r!(h=XN hBKh>jhQhRhS}r"(UrefurijhU]r#Ugerrit-stream-eventsr$ahV]hW]hX]hY]r%h#auh^]ubhnX.r&}r'(h=X.h>jubeubhr)r(}r)(h=XQThis class adds a change to the buildbot system for each of the following events:r*h>jhGhJhQhuhS}r+(hW]hX]hV]hU]hY]uh\Mh]hh^]r,hnXQThis class adds a change to the buildbot system for each of the following events:r-r.}r/(h=j*h>j(ubaubj{)r0}r1(h=Uh>jhGhJhQj~hS}r2(hW]hX]hV]hU]hY]uh\Nh]hh^]r3(j)r4}r5(h=XB``patchset-created`` A change is proposed for review. Automatic checks like :file:`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. h>j0hGhJhQjhS}r6(hW]hX]hV]hU]hY]uh\Mh^]r7(j)r8}r9(h=X``patchset-created``r:h>j4hGhJhQjhS}r;(hW]hX]hV]hU]hY]uh\Mh^]r<h)r=}r>(h=j:hS}r?(hW]hX]hV]hU]hY]uh>j8h^]r@hnXpatchset-createdrArB}rC(h=Uh>j=ubahQhubaubj)rD}rE(h=UhS}rF(hW]hX]hV]hU]hY]uh>j4h^]rGhr)rH}rI(h=X,A change is proposed for review. Automatic checks like :file:`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.h>jDhGhJhQhuhS}rJ(hW]hX]hV]hU]hY]uh\Mh^]rK(hnX7A change is proposed for review. Automatic checks like rLrM}rN(h=X7A change is proposed for review. Automatic checks like h>jHubh)rO}rP(h=UhS}rQ(hU]hV]hW]hX]rRXfilerSaUrolejShY]uh>jHh^]rThnX checkpatch.plrUrV}rW(h=X checkpatch.plh>jOubahQhubhnX 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.rXrY}rZ(h=X 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.h>jHubeubahQj(ubeubj)r[}r\(h=X``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. h>j0hGhJhQjhS}r](hW]hX]hV]hU]hY]uh\Mh]hh^]r^(j)r_}r`(h=X``ref-updated``rah>j[hGhJhQjhS}rb(hW]hX]hV]hU]hY]uh\Mh^]rch)rd}re(h=jahS}rf(hW]hX]hV]hU]hY]uh>j_h^]rghnX ref-updatedrhri}rj(h=Uh>jdubahQhubaubj)rk}rl(h=UhS}rm(hW]hX]hV]hU]hY]uh>j[h^]rnhr)ro}rp(h=XA 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.rqh>jkhGhJhQhuhS}rr(hW]hX]hV]hU]hY]uh\Mh^]rshnXA 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.rtru}rv(h=jqh>joubaubahQj(ubeubeubhr)rw}rx(h=X{This class will populate the property list of the triggered build with the info received from Gerrit server in JSON format.ryh>jhGhJhQhuhS}rz(hW]hX]hV]hU]hY]uh\Mh]hh^]r{hnX{This class will populate the property list of the triggered build with the info received from Gerrit server in JSON format.r|r}}r~(h=jyh>jwubaubj)r}r(h=Uh>jhGhJhQjhS}r(hU]hV]hW]hX]hY]j]r(jX#Properties; from GerritChangeSourceUindex-5rUtrajuh\Mh]hh^]ubhN)r}r(h=Uh>jhGhJhQhRhS}r(hU]hV]hW]hX]hY]hZjuh\Mh]hh^]ubhr)r}r(h=X@In case of ``patchset-created`` event, these properties will be:rh>jhGhJhL}hQhuhS}r(hW]hX]hV]hU]rjahY]uh\Mh]hhd}rjjsh^]r(hnX In case of rr}r(h=X In case of h>jubh)r}r(h=X``patchset-created``hS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXpatchset-createdrr}r(h=Uh>jubahQhubhnX! event, these properties will be:rr}r(h=X! event, these properties will be:h>jubeubj{)r}r(h=Uh>jhGhJhQj~hS}r(hW]hX]hV]hU]hY]uh\Nh]hh^]r(j)r}r(h=X,``event.change.branch`` Branch of the Changeh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]r(j)r}r(h=X``event.change.branch``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.change.branchrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XBranch of the Changerh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnXBranch of the Changerr}r(h=jh>jubaubahQj(ubeubj)r}r(h=XW``event.change.id`` Change's ID in the Gerrit system (the ChangeId: in commit comments)h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``event.change.id``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.change.idrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XCChange's ID in the Gerrit system (the ChangeId: in commit comments)rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnXCChange's ID in the Gerrit system (the ChangeId: in commit comments)rr}r(h=jh>jubaubahQj(ubeubj)r}r(h=X8``event.change.number`` Change's number in Gerrit systemh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``event.change.number``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.change.numberrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X Change's number in Gerrit systemrh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnX Change's number in Gerrit systemrr}r(h=jh>jubaubahQj(ubeubj)r}r(h=XK``event.change.owner.email`` Change's owner email (owner is first uploader)h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``event.change.owner.email``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.change.owner.emailrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r (h=X.Change's owner email (owner is first uploader)r h>jhGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r hnX.Change's owner email (owner is first uploader)r r}r(h=j h>jubaubahQj(ubeubj)r}r(h=X/``event.change.owner.name`` Change's owner nameh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``event.change.owner.name``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.change.owner.namerr}r(h=Uh>jubahQhubaubj)r }r!(h=UhS}r"(hW]hX]hV]hU]hY]uh>jh^]r#hr)r$}r%(h=XChange's owner namer&h>j hGhJhQhuhS}r'(hW]hX]hV]hU]hY]uh\Mh^]r(hnXChange's owner namer)r*}r+(h=j&h>j$ubaubahQj(ubeubj)r,}r-(h=X.``event.change.project`` Project of the Changeh>jhGhJhQjhS}r.(hW]hX]hV]hU]hY]uh\Mh]hh^]r/(j)r0}r1(h=X``event.change.project``r2h>j,hGhJhQjhS}r3(hW]hX]hV]hU]hY]uh\Mh^]r4h)r5}r6(h=j2hS}r7(hW]hX]hV]hU]hY]uh>j0h^]r8hnXevent.change.projectr9r:}r;(h=Uh>j5ubahQhubaubj)r<}r=(h=UhS}r>(hW]hX]hV]hU]hY]uh>j,h^]r?hr)r@}rA(h=XProject of the ChangerBh>j<hGhJhQhuhS}rC(hW]hX]hV]hU]hY]uh\Mh^]rDhnXProject of the ChangerErF}rG(h=jBh>j@ubaubahQj(ubeubj)rH}rI(h=X)``event.change.subject`` Change's subjecth>jhGhJhQjhS}rJ(hW]hX]hV]hU]hY]uh\Mh]hh^]rK(j)rL}rM(h=X``event.change.subject``rNh>jHhGhJhQjhS}rO(hW]hX]hV]hU]hY]uh\Mh^]rPh)rQ}rR(h=jNhS}rS(hW]hX]hV]hU]hY]uh>jLh^]rThnXevent.change.subjectrUrV}rW(h=Uh>jQubahQhubaubj)rX}rY(h=UhS}rZ(hW]hX]hV]hU]hY]uh>jHh^]r[hr)r\}r](h=XChange's subjectr^h>jXhGhJhQhuhS}r_(hW]hX]hV]hU]hY]uh\Mh^]r`hnXChange's subjectrarb}rc(h=j^h>j\ubaubahQj(ubeubj)rd}re(h=XD``event.change.url`` URL of the Change in the Gerrit's web interfaceh>jhGhJhQjhS}rf(hW]hX]hV]hU]hY]uh\Mh]hh^]rg(j)rh}ri(h=X``event.change.url``rjh>jdhGhJhQjhS}rk(hW]hX]hV]hU]hY]uh\Mh^]rlh)rm}rn(h=jjhS}ro(hW]hX]hV]hU]hY]uh>jhh^]rphnXevent.change.urlrqrr}rs(h=Uh>jmubahQhubaubj)rt}ru(h=UhS}rv(hW]hX]hV]hU]hY]uh>jdh^]rwhr)rx}ry(h=X/URL of the Change in the Gerrit's web interfacerzh>jthGhJhQhuhS}r{(hW]hX]hV]hU]hY]uh\Mh^]r|hnX/URL of the Change in the Gerrit's web interfacer}r~}r(h=jzh>jxubaubahQj(ubeubj)r}r(h=X3``event.patchSet.number`` Patchset's version numberh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``event.patchSet.number``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.patchSet.numberrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XPatchset's version numberrh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnXPatchset's version numberrr}r(h=jh>jubaubahQj(ubeubj)r}r(h=X9``event.patchSet.ref`` Patchset's Gerrit "virtual branch"h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``event.patchSet.ref``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.patchSet.refrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X"Patchset's Gerrit "virtual branch"rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnX"Patchset's Gerrit "virtual branch"rr}r(h=jh>jubaubahQj(ubeubj)r}r(h=X4``event.patchSet.revision`` Patchset's Git commit IDh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X``event.patchSet.revision``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.patchSet.revisionrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=XPatchset's Git commit IDrh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnXPatchset's Git commit IDrr}r(h=jh>jubaubahQj(ubeubj)r}r(h=XU``event.patchSet.uploader.email`` Patchset uploader's email (owner is first uploader)h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X!``event.patchSet.uploader.email``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.patchSet.uploader.emailrr}r(h=Uh>jubahQhubaubj)r}r(h=UhS}r(hW]hX]hV]hU]hY]uh>jh^]rhr)r}r(h=X3Patchset uploader's email (owner is first uploader)rh>jhGhJhQhuhS}r(hW]hX]hV]hU]hY]uh\Mh^]rhnX3Patchset uploader's email (owner is first uploader)rr}r(h=jh>jubaubahQj(ubeubj)r}r(h=XS``event.patchSet.uploader.name`` Patchset uploader's name (owner is first uploader)h>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh]hh^]r(j)r}r(h=X ``event.patchSet.uploader.name``rh>jhGhJhQjhS}r(hW]hX]hV]hU]hY]uh\Mh^]rh)r}r(h=jhS}r(hW]hX]hV]hU]hY]uh>jh^]rhnXevent.patchSet.uploader.namerr}r(h=Uh>jubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>jh^]r hr)r }r (h=X2Patchset uploader's name (owner is first uploader)r h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r hnX2Patchset uploader's name (owner is first uploader)r r }r (h=j h>j ubaubahQj(ubeubj)r }r (h=X0``event.type`` Event type (``patchset-created``)h>jhGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (j)r }r (h=X``event.type``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnX event.typer r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j h^]r hr)r }r! (h=X!Event type (``patchset-created``)h>j hGhJhQhuhS}r" (hW]hX]hV]hU]hY]uh\Mh^]r# (hnX Event type (r$ r% }r& (h=X Event type (h>j ubh)r' }r( (h=X``patchset-created``hS}r) (hW]hX]hV]hU]hY]uh>j h^]r* hnXpatchset-createdr+ r, }r- (h=Uh>j' ubahQhubhnX)r. }r/ (h=X)h>j ubeubahQj(ubeubj)r0 }r1 (h=X2``event.uploader.email`` Patchset uploader's emailh>jhGhJhQjhS}r2 (hW]hX]hV]hU]hY]uh\Mh]hh^]r3 (j)r4 }r5 (h=X``event.uploader.email``r6 h>j0 hGhJhQjhS}r7 (hW]hX]hV]hU]hY]uh\Mh^]r8 h)r9 }r: (h=j6 hS}r; (hW]hX]hV]hU]hY]uh>j4 h^]r< hnXevent.uploader.emailr= r> }r? (h=Uh>j9 ubahQhubaubj)r@ }rA (h=UhS}rB (hW]hX]hV]hU]hY]uh>j0 h^]rC hr)rD }rE (h=XPatchset uploader's emailrF h>j@ hGhJhQhuhS}rG (hW]hX]hV]hU]hY]uh\Mh^]rH hnXPatchset uploader's emailrI rJ }rK (h=jF h>jD ubaubahQj(ubeubj)rL }rM (h=X1``event.uploader.name`` Patchset uploader's name h>jhGhJhQjhS}rN (hW]hX]hV]hU]hY]uh\Mh]hh^]rO (j)rP }rQ (h=X``event.uploader.name``rR h>jL hGhJhQjhS}rS (hW]hX]hV]hU]hY]uh\Mh^]rT h)rU }rV (h=jR hS}rW (hW]hX]hV]hU]hY]uh>jP h^]rX hnXevent.uploader.namerY rZ }r[ (h=Uh>jU ubahQhubaubj)r\ }r] (h=UhS}r^ (hW]hX]hV]hU]hY]uh>jL h^]r_ hr)r` }ra (h=XPatchset uploader's namerb h>j\ hGhJhQhuhS}rc (hW]hX]hV]hU]hY]uh\Mh^]rd hnXPatchset uploader's namere rf }rg (h=jb h>j` ubaubahQj(ubeubeubhr)rh }ri (h=X;In case of ``ref-updated`` event, these properties will be:rj h>jhGhJhQhuhS}rk (hW]hX]hV]hU]hY]uh\Mh]hh^]rl (hnX In case of rm rn }ro (h=X In case of h>jh ubh)rp }rq (h=X``ref-updated``hS}rr (hW]hX]hV]hU]hY]uh>jh h^]rs hnX ref-updatedrt ru }rv (h=Uh>jp ubahQhubhnX! event, these properties will be:rw rx }ry (h=X! event, these properties will be:h>jh ubeubj{)rz }r{ (h=Uh>jhGhJhQj~hS}r| (hW]hX]hV]hU]hY]uh\Nh]hh^]r} (j)r~ }r (h=X;``event.refUpdate.newRev`` New Git commit ID (after merger)h>jz hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r (j)r }r (h=X``event.refUpdate.newRev``r h>j~ hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXevent.refUpdate.newRevr r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j~ h^]r hr)r }r (h=X New Git commit ID (after merger)r h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r hnX New Git commit ID (after merger)r r }r (h=j h>j ubaubahQj(ubeubj)r }r (h=XA``event.refUpdate.oldRev`` Previous Git commit ID (before merger)h>jz hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (j)r }r (h=X``event.refUpdate.oldRev``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXevent.refUpdate.oldRevr r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j h^]r hr)r }r (h=X&Previous Git commit ID (before merger)r h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r hnX&Previous Git commit ID (before merger)r r }r (h=j h>j ubaubahQj(ubeubj)r }r (h=X4``event.refUpdate.project`` Project that was updatedh>jz hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (j)r }r (h=X``event.refUpdate.project``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXevent.refUpdate.projectr r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j h^]r hr)r }r (h=XProject that was updatedr h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r hnXProject that was updatedr r }r (h=j h>j ubaubahQj(ubeubj)r }r (h=X3``event.refUpdate.refName`` Branch that was updatedh>jz hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (j)r }r (h=X``event.refUpdate.refName``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXevent.refUpdate.refNamer r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r (hW]hX]hV]hU]hY]uh>j h^]r hr)r }r (h=XBranch that was updatedr h>j hGhJhQhuhS}r (hW]hX]hV]hU]hY]uh\Mh^]r hnXBranch that was updatedr r }r (h=j h>j ubaubahQj(ubeubj)r }r (h=X@``event.submitter.email`` Submitter's email (merger responsible)h>jz hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh]hh^]r (j)r }r (h=X``event.submitter.email``r h>j hGhJhQjhS}r (hW]hX]hV]hU]hY]uh\Mh^]r h)r }r (h=j hS}r (hW]hX]hV]hU]hY]uh>j h^]r hnXevent.submitter.emailr r }r (h=Uh>j ubahQhubaubj)r }r (h=UhS}r!(hW]hX]hV]hU]hY]uh>j h^]r!hr)r!}r!(h=X&Submitter's email (merger responsible)r!h>j hGhJhQhuhS}r!(hW]hX]hV]hU]hY]uh\Mh^]r!hnX&Submitter's email (merger responsible)r!r!}r !(h=j!h>j!ubaubahQj(ubeubj)r !}r !(h=X>``event.submitter.name`` Submitter's name (merger responsible)h>jz hGhJhQjhS}r !(hW]hX]hV]hU]hY]uh\Mh]hh^]r !(j)r!}r!(h=X``event.submitter.name``r!h>j !hGhJhQjhS}r!(hW]hX]hV]hU]hY]uh\Mh^]r!h)r!}r!(h=j!hS}r!(hW]hX]hV]hU]hY]uh>j!h^]r!hnXevent.submitter.namer!r!}r!(h=Uh>j!ubahQhubaubj)r!}r!(h=UhS}r!(hW]hX]hV]hU]hY]uh>j !h^]r!hr)r!}r!(h=X%Submitter's name (merger responsible)r !h>j!hGhJhQhuhS}r!!(hW]hX]hV]hU]hY]uh\Mh^]r"!hnX%Submitter's name (merger responsible)r#!r$!}r%!(h=j !h>j!ubaubahQj(ubeubj)r&!}r'!(h=X+``event.type`` Event type (``ref-updated``)h>jz hGhJhQjhS}r(!(hW]hX]hV]hU]hY]uh\Mh]hh^]r)!(j)r*!}r+!(h=X``event.type``r,!h>j&!hGhJhQjhS}r-!(hW]hX]hV]hU]hY]uh\Mh^]r.!h)r/!}r0!(h=j,!hS}r1!(hW]hX]hV]hU]hY]uh>j*!h^]r2!hnX event.typer3!r4!}r5!(h=Uh>j/!ubahQhubaubj)r6!}r7!(h=UhS}r8!(hW]hX]hV]hU]hY]uh>j&!h^]r9!hr)r:!}r;!(h=XEvent type (``ref-updated``)h>j6!hGhJhQhuhS}r!r?!}r@!(h=X Event type (h>j:!ubh)rA!}rB!(h=X``ref-updated``hS}rC!(hW]hX]hV]hU]hY]uh>j:!h^]rD!hnX ref-updatedrE!rF!}rG!(h=Uh>jA!ubahQhubhnX)rH!}rI!(h=X)h>j:!ubeubahQj(ubeubj)rJ!}rK!(h=X@``event.submitter.email`` Submitter's email (merger responsible)h>jz hGhJhQjhS}rL!(hW]hX]hV]hU]hY]uh\Mh]hh^]rM!(j)rN!}rO!(h=X``event.submitter.email``rP!h>jJ!hGhJhQjhS}rQ!(hW]hX]hV]hU]hY]uh\Mh^]rR!h)rS!}rT!(h=jP!hS}rU!(hW]hX]hV]hU]hY]uh>jN!h^]rV!hnXevent.submitter.emailrW!rX!}rY!(h=Uh>jS!ubahQhubaubj)rZ!}r[!(h=UhS}r\!(hW]hX]hV]hU]hY]uh>jJ!h^]r]!hr)r^!}r_!(h=X&Submitter's email (merger responsible)r`!h>jZ!hGhJhQhuhS}ra!(hW]hX]hV]hU]hY]uh\Mh^]rb!hnX&Submitter's email (merger responsible)rc!rd!}re!(h=j`!h>j^!ubaubahQj(ubeubj)rf!}rg!(h=X?``event.submitter.name`` Submitter's name (merger responsible) h>jz hGhJhQjhS}rh!(hW]hX]hV]hU]hY]uh\Mh]hh^]ri!(j)rj!}rk!(h=X``event.submitter.name``rl!h>jf!hGhJhQjhS}rm!(hW]hX]hV]hU]hY]uh\Mh^]rn!h)ro!}rp!(h=jl!hS}rq!(hW]hX]hV]hU]hY]uh>jj!h^]rr!hnXevent.submitter.namers!rt!}ru!(h=Uh>jo!ubahQhubaubj)rv!}rw!(h=UhS}rx!(hW]hX]hV]hU]hY]uh>jf!h^]ry!hr)rz!}r{!(h=X%Submitter's name (merger responsible)r|!h>jv!hGhJhQhuhS}r}!(hW]hX]hV]hU]hY]uh\Mh^]r~!hnX%Submitter's name (merger responsible)r!r!}r!(h=j|!h>jz!ubaubahQj(ubeubeubhr)r!}r!(h=X1A configuration for this source might look like::r!h>jhGhJhQhuhS}r!(hW]hX]hV]hU]hY]uh\Mh]hh^]r!hnX0A configuration for this source might look like:r!r!}r!(h=X0A configuration for this source might look like:h>j!ubaubjK)r!}r!(h=Xfrom buildbot.changes.gerritchangesource import GerritChangeSource c['change_source'] = GerritChangeSource(gerrit_server, gerrit_user)h>jhGhJhQjNhS}r!(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]r!hnXfrom buildbot.changes.gerritchangesource import GerritChangeSource c['change_source'] = GerritChangeSource(gerrit_server, gerrit_user)r!r!}r!(h=Uh>j!ubaubhr)r!}r!(h=Xsee :file:`master/docs/examples/repo_gerrit.cfg` in the Buildbot distribution for a full example setup of :bb:chsrc:`GerritChangeSource`.h>jhGhJhQhuhS}r!(hW]hX]hV]hU]hY]uh\Mh]hh^]r!(hnXsee r!r!}r!(h=Xsee h>j!ubh)r!}r!(h=UhS}r!(hU]hV]hW]hX]r!Xfiler!aUrolej!hY]uh>j!h^]r!hnX$master/docs/examples/repo_gerrit.cfgr!r!}r!(h=X$master/docs/examples/repo_gerrit.cfgh>j!ubahQhubhnX: in the Buildbot distribution for a full example setup of r!r!}r!(h=X: in the Buildbot distribution for a full example setup of h>j!ubh{)r!}r!(h=X:bb:chsrc:`GerritChangeSource`r!h>j!hGhJhQhhS}r!(UreftypeXchsrchhXGerritChangeSourceU refdomainXbbr!hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r!h)r!}r!(h=j!hS}r!(hW]hX]r!(hj!Xbb-chsrcr!ehV]hU]hY]uh>j!h^]r!hnXGerritChangeSourcer!r!}r!(h=Uh>j!ubahQhubaubhnX.r!}r!(h=X.h>j!ubeubj)r!}r!(h=Uh>jhGhJhQjhS}r!(hU]hV]hW]hX]hY]Uentries]r!((UsingleXChange Sources; Change HooksXchsrc-Change Hooksr!j!tr!(UsingleXChange Hooks Change Sourcej!j!tr!euh\Mh]hh^]ubhN)r!}r!(h=Uh>jhGhJhQhRhS}r!(hU]hV]hW]hX]hY]hZj!uh\Mh]hh^]ubhN)r!}r!(h=X$.. _Change-Hooks-HTTP-Notifications:h>jhGhJhL}hQhRhS}r!(hU]hV]hW]hX]hY]hZUchange-hooks-http-notificationsr!uh\Mh]hhd}r!j!j!sh^]ubeubh?)r!}r!(h=Uh>hEhGhJhL}r!h j!shQh_hS}r!(hW]hX]hV]hU]r!(j!j!Uid20r!ehY]r!(hh euh\Mh]hhd}r!(j!j!j!j!uh^]r!(hg)r!}r!(h=X!Change Hooks (HTTP Notifications)r!h>j!hGhJhQhkhS}r!(hW]hX]hV]hU]hY]uh\Mh]hh^]r!hnX!Change Hooks (HTTP Notifications)r!r!}r!(h=j!h>j!ubaubhr)r!}r!(h=XBuildbot 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 :ref:`Change-Hooks` for more information.h>j!hGhJhQhuhS}r!(hW]hX]hV]hU]hY]uh\Mh]hh^]r!(hnXBuildbot 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 r!r!}r!(h=XBuildbot 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 h>j!ubh{)r!}r!(h=X:ref:`Change-Hooks`r!h>j!hGhJhQhhS}r!(UreftypeXrefhhX change-hooksU refdomainXstdr!hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r!h)r!}r!(h=j!hS}r!(hW]hX]r!(hj!Xstd-refr!ehV]hU]hY]uh>j!h^]r!hnX Change-Hooksr!r!}r!(h=Uh>j!ubahQhubaubhnX for more information.r!r!}r!(h=X for more information.h>j!ubeubj)r!}r!(h=Uh>j!hGhJhQjhS}r!(hU]hV]hW]hX]hY]Uentries]r!((UsingleX$Change Sources; GoogleCodeAtomPollerXchsrc-GoogleCodeAtomPollerr!j!tr!(UsingleX"GoogleCodeAtomPoller Change Sourcej!j!tr!euh\Mh]hh^]ubhN)r!}r!(h=Uh>j!hGhJhQhRhS}r!(hU]hV]hW]hX]hY]hZj!uh\Mh]hh^]ubhN)r!}r!(h=X.. _GoogleCodeAtomPoller:h>j!hGhJhL}hQhRhS}r!(hU]hV]hW]hX]hY]hZUgooglecodeatompollerr!uh\Mh]hhd}r!j!j!sh^]ubeubh?)r!}r!(h=UhBKh>hEhGhJhL}r!h j!shQh_hS}r"(hW]r"Xgooglecodeatompollerr"ahX]hV]hU]r"(j!j!Uid21r"ehY]r"h auh\Mh]hhd}r"(j!j!j!j!uh^]r"(hg)r"}r "(h=XGoogleCodeAtomPollerr "h>j!hGhJhQhkhS}r "(hW]hX]hV]hU]hY]uh\Mh]hh^]r "hnXGoogleCodeAtomPollerr "r"}r"(h=j "h>j"ubaubhr)r"}r"(h=XThe :bb:chsrc:`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:h>j!hGhJhQhuhS}r"(hW]hX]hV]hU]hY]uh\Mh]hh^]r"(hnXThe r"r"}r"(h=XThe h>j"ubh{)r"}r"(h=X :bb:chsrc:`GoogleCodeAtomPoller`r"h>j"hGhJhQhhS}r"(UreftypeXchsrchhXGoogleCodeAtomPollerU refdomainXbbr"hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r"h)r"}r"(h=j"hS}r"(hW]hX]r "(hj"Xbb-chsrcr!"ehV]hU]hY]uh>j"h^]r""hnXGoogleCodeAtomPollerr#"r$"}r%"(h=Uh>j"ubahQhubaubhnX 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:r&"r'"}r("(h=X 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:h>j"ubeubj{)r)"}r*"(h=Uh>j!hGhJhQj~hS}r+"(hW]hX]hV]hU]hY]uh\Nh]hh^]r,"(j)r-"}r."(h=XN``feedurl`` The commit Atom feed URL of the GoogleCode repository (MANDATORY) h>j)"hGhJhQjhS}r/"(hW]hX]hV]hU]hY]uh\Mh^]r0"(j)r1"}r2"(h=X ``feedurl``r3"h>j-"hGhJhQjhS}r4"(hW]hX]hV]hU]hY]uh\Mh^]r5"h)r6"}r7"(h=j3"hS}r8"(hW]hX]hV]hU]hY]uh>j1"h^]r9"hnXfeedurlr:"r;"}r<"(h=Uh>j6"ubahQhubaubj)r="}r>"(h=UhS}r?"(hW]hX]hV]hU]hY]uh>j-"h^]r@"hr)rA"}rB"(h=XAThe commit Atom feed URL of the GoogleCode repository (MANDATORY)rC"h>j="hGhJhQhuhS}rD"(hW]hX]hV]hU]hY]uh\Mh^]rE"hnXAThe commit Atom feed URL of the GoogleCode repository (MANDATORY)rF"rG"}rH"(h=jC"h>jA"ubaubahQj(ubeubj)rI"}rJ"(h=X[``pollinterval`` Polling frequency for the feed (in seconds). Default is 1 hour (OPTIONAL) h>j)"hGhJhQjhS}rK"(hW]hX]hV]hU]hY]uh\M h]hh^]rL"(j)rM"}rN"(h=X``pollinterval``rO"h>jI"hGhJhQjhS}rP"(hW]hX]hV]hU]hY]uh\M h^]rQ"h)rR"}rS"(h=jO"hS}rT"(hW]hX]hV]hU]hY]uh>jM"h^]rU"hnX pollintervalrV"rW"}rX"(h=Uh>jR"ubahQhubaubj)rY"}rZ"(h=UhS}r["(hW]hX]hV]hU]hY]uh>jI"h^]r\"hr)r]"}r^"(h=XIPolling frequency for the feed (in seconds). Default is 1 hour (OPTIONAL)r_"h>jY"hGhJhQhuhS}r`"(hW]hX]hV]hU]hY]uh\M h^]ra"hnXIPolling frequency for the feed (in seconds). Default is 1 hour (OPTIONAL)rb"rc"}rd"(h=j_"h>j]"ubaubahQj(ubeubeubhr)re"}rf"(h=XqAs an example, to poll the Ostinato project's commit feed every 3 hours, the configuration would look like this::h>j!hGhJhQhuhS}rg"(hW]hX]hV]hU]hY]uh\M h]hh^]rh"hnXpAs an example, to poll the Ostinato project's commit feed every 3 hours, the configuration would look like this:ri"rj"}rk"(h=XpAs an example, to poll the Ostinato project's commit feed every 3 hours, the configuration would look like this:h>je"ubaubjK)rl"}rm"(h=Xfrom googlecode_atom import GoogleCodeAtomPoller c['change_source'] = GoogleCodeAtomPoller( feedurl="http://code.google.com/feeds/p/ostinato/hgchanges/basic", pollinterval=10800)h>j!hGhJhQjNhS}rn"(jPjQhU]hV]hW]hX]hY]uh\Mh]hh^]ro"hnXfrom googlecode_atom import GoogleCodeAtomPoller c['change_source'] = GoogleCodeAtomPoller( feedurl="http://code.google.com/feeds/p/ostinato/hgchanges/basic", pollinterval=10800)rp"rq"}rr"(h=Uh>jl"ubaubhr)rs"}rt"(h=X(note that you will need to download ``googlecode_atom.py`` from the Buildbot source and install it somewhere on your PYTHONPATH first)h>j!hGhJhQhuhS}ru"(hW]hX]hV]hU]hY]uh\Mh]hh^]rv"(hnX%(note that you will need to download rw"rx"}ry"(h=X%(note that you will need to download h>js"ubh)rz"}r{"(h=X``googlecode_atom.py``hS}r|"(hW]hX]hV]hU]hY]uh>js"h^]r}"hnXgooglecode_atom.pyr~"r"}r"(h=Uh>jz"ubahQhubhnXL from the Buildbot source and install it somewhere on your PYTHONPATH first)r"r"}r"(h=XL from the Buildbot source and install it somewhere on your PYTHONPATH first)h>js"ubeubeubeubhGhJhL}r"hjshQh_hS}r"(hW]hX]hV]hU]r"(jUid3r"ehY]r"(h-heuh\Kh]hhd}r"jjsh^]r"(hg)r"}r"(h=XMail-parsing ChangeSourcesr"h>hChGhJhQhkhS}r"(hW]hX]hV]hU]hY]uh\Kh]hh^]r"hnXMail-parsing ChangeSourcesr"r"}r"(h=j"h>j"ubaubhr)r"}r"(h=XMany projects publish information about changes to their source tree by sending an email message out to a mailing list, frequently named :samp:`{PROJECT}-commits` or :samp:`{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.h>hChGhJhQhuhS}r"(hW]hX]hV]hU]hY]uh\Kh]hh^]r"(hnXMany projects publish information about changes to their source tree by sending an email message out to a mailing list, frequently named r"r"}r"(h=XMany projects publish information about changes to their source tree by sending an email message out to a mailing list, frequently named h>j"ubh)r"}r"(h=UhS}r"(hU]hV]hW]hX]r"Xsampr"aUrolej"hY]uh>j"h^]r"(h)r"}r"(h=XPROJECThS}r"(hW]hX]hV]hU]hY]uh>j"h^]r"hnXPROJECTr"r"}r"(h=Uh>j"ubahQhubhnX-commitsr"r"}r"(h=X-commitsh>j"ubehQhubhnX or r"r"}r"(h=X or h>j"ubh)r"}r"(h=UhS}r"(hU]hV]hW]hX]r"Xsampr"aUrolej"hY]uh>j"h^]r"(h)r"}r"(h=XPROJECThS}r"(hW]hX]hV]hU]hY]uh>j"h^]r"hnXPROJECTr"r"}r"(h=Uh>j"ubahQhubhnX-changesr"r"}r"(h=X-changesh>j"ubehQhubhnX. 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.r"r"}r"(h=X. 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.h>j"ubeubhr)r"}r"(h=XThe 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 :ref:`Schedulers`) just like any other ChangeSource.h>hChGhJhQhuhS}r"(hW]hX]hV]hU]hY]uh\Kh]hh^]r"(hnX)The Buildbot can also be subscribed to a r"r"}r"(h=X)The Buildbot can also be subscribed to a h>j"ubj)r"}r"(h=X `-commits`hS}r"(hW]hX]hV]hU]hY]uh>j"h^]r"hnX-commitsr"r"}r"(h=Uh>j"ubahQjubhnXv 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 r"r"}r"(h=Xv 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 h>j"ubh{)r"}r"(h=X:ref:`Schedulers`r"h>j"hGhJhQhhS}r"(UreftypeXrefhhX schedulersU refdomainXstdr"hU]hV]U refexplicithW]hX]hY]hhuh\Kh^]r"h)r"}r"(h=j"hS}r"(hW]hX]r"(hj"Xstd-refr"ehV]hU]hY]uh>j"h^]r"hnX Schedulersr"r"}r"(h=Uh>j"ubahQhubaubhnX#) just like any other ChangeSource.r"r"}r"(h=X#) just like any other ChangeSource.h>j"ubeubhr)r"}r"(h=XThere 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.h>hChGhJhQhuhS}r"(hW]hX]hV]hU]hY]uh\Kh]hh^]r"(hnXThere 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 r"r"}r"(h=XThere 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 h>j"ubj)r"}r"(h=X `maildir`hS}r"(hW]hX]hV]hU]hY]uh>j"h^]r"hnXmaildirr"r"}r"(h=Uh>j"ubahQjubhnXP. 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.r"r"}r"(h=XP. 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.h>j"ubeubhr)r"}r"(h=XyOnce you've chosen a maildir location and a parsing function, create the change source and put it in ``change_source`` ::h>hChGhJhQhuhS}r"(hW]hX]hV]hU]hY]uh\Kh]hh^]r"(hnXeOnce you've chosen a maildir location and a parsing function, create the change source and put it in r"r"}r"(h=XeOnce you've chosen a maildir location and a parsing function, create the change source and put it in h>j"ubh)r"}r"(h=X``change_source``hS}r"(hW]hX]hV]hU]hY]uh>j"h^]r"hnX change_sourcer"r#}r#(h=Uh>j"ubahQhubeubjK)r#}r#(h=Xfrom buildbot.changes.mail import CVSMaildirSource c['change_source'] = CVSMaildirSource("~/maildir-buildbot", prefix="/trunk/")h>hChGhJhQjNhS}r#(jPjQhU]hV]hW]hX]hY]uh\Kh]hh^]r#hnXfrom buildbot.changes.mail import CVSMaildirSource c['change_source'] = CVSMaildirSource("~/maildir-buildbot", prefix="/trunk/")r#r#}r#(h=Uh>j#ubaubhN)r #}r #(h=X .. _Subscribing-the-Buildmaster:h>hChGhJhQhRhS}r #(hU]hV]hW]hX]hY]hZUsubscribing-the-buildmasterr #uh\Kh]hh^]ubh?)r #}r#(h=Uh>hChGhJhL}r#hj #shQh_hS}r#(hW]hX]hV]hU]r#(j #Uid4r#ehY]r#(h.heuh\Kh]hhd}r#j #j #sh^]r#(hg)r#}r#(h=XSubscribing the Buildmasterr#h>j #hGhJhQhkhS}r#(hW]hX]hV]hU]hY]uh\Kh]hh^]r#hnXSubscribing the Buildmasterr#r#}r#(h=j#h>j#ubaubhr)r#}r#(h=X@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).h>j #hGhJhQhuhS}r #(hW]hX]hV]hU]hY]uh\Kh]hh^]r!#(hnXThe 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 r"#r##}r$#(h=XThe 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 h>j#ubj)r%#}r&#(h=X`buildmaster@example.org`hS}r'#(hW]hX]hV]hU]hY]uh>j#h^]r(#hnXbuildmaster@example.orgr)#r*#}r+#(h=Uh>j%#ubahQjubhnXt). Then just arrange for this account's email to be delivered to a suitable maildir (described in the next section).r,#r-#}r.#(h=Xt). Then just arrange for this account's email to be delivered to a suitable maildir (described in the next section).h>j#ubeubhr)r/#}r0#(h=XIf 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 :file:`.qmail` files for the two destinations (:file:`.qmail-foo` and :file:`.qmail-bar`, with :file:`.qmail` controlling the base address and :file:`.qmail-default` controlling all other extensions). Other MTAs have similar mechanisms.h>j #hGhJhQhuhS}r1#(hW]hX]hV]hU]hY]uh\Kh]hh^]r2#(hnX/If the buildbot does not have its own account, r3#r4#}r5#(h=X/If the buildbot does not have its own account, h>j/#ubj)r6#}r7#(h=X`extension addresses`hS}r8#(hW]hX]hV]hU]hY]uh>j/#h^]r9#hnXextension addressesr:#r;#}r<#(h=Uh>j6#ubahQjubhnX 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. r=#r>#}r?#(h=X 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. h>j/#ubj)r@#}rA#(h=X`foo@example.org`hS}rB#(hW]hX]hV]hU]hY]uh>j/#h^]rC#hnXfoo@example.orgrD#rE#}rF#(h=Uh>j@#ubahQjubhnXs account has control over every email address at example.org which begins with "foo", such that email addressed to rG#rH#}rI#(h=Xs account has control over every email address at example.org which begins with "foo", such that email addressed to h>j/#ubj)rJ#}rK#(h=X`account-foo@example.org`hS}rL#(hW]hX]hV]hU]hY]uh>j/#h^]rM#hnXaccount-foo@example.orgrN#rO#}rP#(h=Uh>jJ#ubahQjubhnX2 can be delivered to a different destination than rQ#rR#}rS#(h=X2 can be delivered to a different destination than h>j/#ubj)rT#}rU#(h=X`account-bar@example.org`hS}rV#(hW]hX]hV]hU]hY]uh>j/#h^]rW#hnXaccount-bar@example.orgrX#rY#}rZ#(h=Uh>jT#ubahQjubhnX$. qmail does this by using separate r[#r\#}r]#(h=X$. qmail does this by using separate h>j/#ubh)r^#}r_#(h=UhS}r`#(hU]hV]hW]hX]ra#Xfilerb#aUrolejb#hY]uh>j/#h^]rc#hnX.qmailrd#re#}rf#(h=X.qmailh>j^#ubahQhubhnX! files for the two destinations (rg#rh#}ri#(h=X! files for the two destinations (h>j/#ubh)rj#}rk#(h=UhS}rl#(hU]hV]hW]hX]rm#Xfilern#aUrolejn#hY]uh>j/#h^]ro#hnX .qmail-foorp#rq#}rr#(h=X .qmail-fooh>jj#ubahQhubhnX and rs#rt#}ru#(h=X and h>j/#ubh)rv#}rw#(h=UhS}rx#(hU]hV]hW]hX]ry#Xfilerz#aUrolejz#hY]uh>j/#h^]r{#hnX .qmail-barr|#r}#}r~#(h=X .qmail-barh>jv#ubahQhubhnX, with r#r#}r#(h=X, with h>j/#ubh)r#}r#(h=UhS}r#(hU]hV]hW]hX]r#Xfiler#aUrolej#hY]uh>j/#h^]r#hnX.qmailr#r#}r#(h=X.qmailh>j#ubahQhubhnX" controlling the base address and r#r#}r#(h=X" controlling the base address and h>j/#ubh)r#}r#(h=UhS}r#(hU]hV]hW]hX]r#Xfiler#aUrolej#hY]uh>j/#h^]r#hnX.qmail-defaultr#r#}r#(h=X.qmail-defaulth>j#ubahQhubhnXG controlling all other extensions). Other MTAs have similar mechanisms.r#r#}r#(h=XG controlling all other extensions). Other MTAs have similar mechanisms.h>j/#ubeubhr)r#}r#(h=XThus you can assign an extension address like `foo-buildmaster@example.org` to the buildmaster, and retain `foo@example.org` for your own use.h>j #hGhJhQhuhS}r#(hW]hX]hV]hU]hY]uh\Kh]hh^]r#(hnX.Thus you can assign an extension address like r#r#}r#(h=X.Thus you can assign an extension address like h>j#ubj)r#}r#(h=X`foo-buildmaster@example.org`hS}r#(hW]hX]hV]hU]hY]uh>j#h^]r#hnXfoo-buildmaster@example.orgr#r#}r#(h=Uh>j#ubahQjubhnX to the buildmaster, and retain r#r#}r#(h=X to the buildmaster, and retain h>j#ubj)r#}r#(h=X`foo@example.org`hS}r#(hW]hX]hV]hU]hY]uh>j#h^]r#hnXfoo@example.orgr#r#}r#(h=Uh>j#ubahQjubhnX for your own use.r#r#}r#(h=X for your own use.h>j#ubeubhN)r#}r#(h=X.. _Using-Maildirs:h>j #hGhJhQhRhS}r#(hU]hV]hW]hX]hY]hZUusing-maildirsr#uh\Kh]hh^]ubeubh?)r#}r#(h=Uh>hChGhJhL}r#h)j#shQh_hS}r#(hW]hX]hV]hU]r#(j#Uid5r#ehY]r#(hh)euh\Kh]hhd}r#j#j#sh^]r#(hg)r#}r#(h=XUsing Maildirsr#h>j#hGhJhQhkhS}r#(hW]hX]hV]hU]hY]uh\Kh]hh^]r#hnXUsing Maildirsr#r#}r#(h=j#h>j#ubaubhr)r#}r#(h=XUA `maildir` is a simple directory structure originally developed for qmail that allows safe atomic update without locking. Create a base directory with three subdirectories: :file:`new`, :file:`tmp`, and :file:`cur`. When messages arrive, they are put into a uniquely-named file (using pids, timestamps, and random numbers) in :file:`tmp`. When the file is complete, it is atomically renamed into :file:`new`. Eventually the buildmaster notices the file in :file:`new`, reads and parses the contents, then moves it into :file:`cur`. A cronjob can be used to delete files in :file:`cur` at leisure.h>j#hGhJhQhuhS}r#(hW]hX]hV]hU]hY]uh\Kh]hh^]r#(hnXA r#r#}r#(h=XA h>j#ubj)r#}r#(h=X `maildir`hS}r#(hW]hX]hV]hU]hY]uh>j#h^]r#hnXmaildirr#r#}r#(h=Uh>j#ubahQjubhnX is a simple directory structure originally developed for qmail that allows safe atomic update without locking. Create a base directory with three subdirectories: r#r#}r#(h=X is a simple directory structure originally developed for qmail that allows safe atomic update without locking. Create a base directory with three subdirectories: h>j#ubh)r#}r#(h=UhS}r#(hU]hV]hW]hX]r#Xfiler#aUrolej#hY]uh>j#h^]r#hnXnewr#r#}r#(h=Xnewh>j#ubahQhubhnX, r#r#}r#(h=X, h>j#ubh)r#}r#(h=UhS}r#(hU]hV]hW]hX]r#Xfiler#aUrolej#hY]uh>j#h^]r#hnXtmpr#r#}r#(h=Xtmph>j#ubahQhubhnX, and r#r#}r#(h=X, and h>j#ubh)r#}r#(h=UhS}r#(hU]hV]hW]hX]r#Xfiler#aUrolej#hY]uh>j#h^]r#hnXcurr#r#}r#(h=Xcurh>j#ubahQhubhnXp. When messages arrive, they are put into a uniquely-named file (using pids, timestamps, and random numbers) in r#r#}r#(h=Xp. When messages arrive, they are put into a uniquely-named file (using pids, timestamps, and random numbers) in h>j#ubh)r#}r$(h=UhS}r$(hU]hV]hW]hX]r$Xfiler$aUrolej$hY]uh>j#h^]r$hnXtmpr$r$}r$(h=Xtmph>j#ubahQhubhnX;. When the file is complete, it is atomically renamed into r$r $}r $(h=X;. When the file is complete, it is atomically renamed into h>j#ubh)r $}r $(h=UhS}r $(hU]hV]hW]hX]r$Xfiler$aUrolej$hY]uh>j#h^]r$hnXnewr$r$}r$(h=Xnewh>j $ubahQhubhnX1. Eventually the buildmaster notices the file in r$r$}r$(h=X1. Eventually the buildmaster notices the file in h>j#ubh)r$}r$(h=UhS}r$(hU]hV]hW]hX]r$Xfiler$aUrolej$hY]uh>j#h^]r$hnXnewr$r$}r$(h=Xnewh>j$ubahQhubhnX4, reads and parses the contents, then moves it into r $r!$}r"$(h=X4, reads and parses the contents, then moves it into h>j#ubh)r#$}r$$(h=UhS}r%$(hU]hV]hW]hX]r&$Xfiler'$aUrolej'$hY]uh>j#h^]r($hnXcurr)$r*$}r+$(h=Xcurh>j#$ubahQhubhnX+. A cronjob can be used to delete files in r,$r-$}r.$(h=X+. A cronjob can be used to delete files in h>j#ubh)r/$}r0$(h=UhS}r1$(hU]hV]hW]hX]r2$Xfiler3$aUrolej3$hY]uh>j#h^]r4$hnXcurr5$r6$}r7$(h=Xcurh>j/$ubahQhubhnX at leisure.r8$r9$}r:$(h=X at leisure.h>j#ubeubhr)r;$}r<$(h=XMaildirs are frequently created with the :command:`maildirmake` tool, but a simple :command:`mkdir -p ~/MAILDIR/\{cur,new,tmp\}` is pretty much equivalent.h>j#hGhJhQhuhS}r=$(hW]hX]hV]hU]hY]uh\Kh]hh^]r>$(hnX)Maildirs are frequently created with the r?$r@$}rA$(h=X)Maildirs are frequently created with the h>j;$ubjm)rB$}rC$(h=X:command:`maildirmake`hS}rD$(hW]hX]rE$jrahV]hU]hY]uh>j;$h^]rF$hnX maildirmakerG$rH$}rI$(h=Uh>jB$ubahQjwubhnX tool, but a simple rJ$rK$}rL$(h=X tool, but a simple h>j;$ubjm)rM$}rN$(h=X-:command:`mkdir -p ~/MAILDIR/\{cur,new,tmp\}`hS}rO$(hW]hX]rP$jrahV]hU]hY]uh>j;$h^]rQ$hnX mkdir -p ~/MAILDIR/{cur,new,tmp}rR$rS$}rT$(h=Uh>jM$ubahQjwubhnX is pretty much equivalent.rU$rV$}rW$(h=X is pretty much equivalent.h>j;$ubeubhr)rX$}rY$(h=X,Many modern MTAs can deliver directly to maildirs. The usual :file:`.forward` or :file:`.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).h>j#hGhJhQhuhS}rZ$(hW]hX]hV]hU]hY]uh\Kh]hh^]r[$(hnX=Many modern MTAs can deliver directly to maildirs. The usual r\$r]$}r^$(h=X=Many modern MTAs can deliver directly to maildirs. The usual h>jX$ubh)r_$}r`$(h=UhS}ra$(hU]hV]hW]hX]rb$Xfilerc$aUrolejc$hY]uh>jX$h^]rd$hnX.forwardre$rf$}rg$(h=X.forwardh>j_$ubahQhubhnX or rh$ri$}rj$(h=X or h>jX$ubh)rk$}rl$(h=UhS}rm$(hU]hV]hW]hX]rn$Xfilero$aUrolejo$hY]uh>jX$h^]rp$hnX .procmailrcrq$rr$}rs$(h=X .procmailrch>jk$ubahQhubhnXO syntax is to name the base directory with a trailing slash, so something like rt$ru$}rv$(h=XO syntax is to name the base directory with a trailing slash, so something like h>jX$ubh)rw$}rx$(h=X``~/MAILDIR/``hS}ry$(hW]hX]hV]hU]hY]uh>jX$h^]rz$hnX ~/MAILDIR/r{$r|$}r}$(h=Uh>jw$ubahQhubhnXj. qmail and postfix are maildir-capable MTAs, and procmail is a maildir-capable MDA (Mail Delivery Agent).r~$r$}r$(h=Xk\. qmail and postfix are maildir-capable MTAs, and procmail is a maildir-capable MDA (Mail Delivery Agent).h>jX$ubeubhr)r$}r$(h=XFHere is an example procmail config, located in :file:`~/.procmailrc`::r$h>j#hGhJhQhuhS}r$(hW]hX]hV]hU]hY]uh\Kh]hh^]r$(hnX/Here is an example procmail config, located in r$r$}r$(h=X/Here is an example procmail config, located in h>j$ubh)r$}r$(h=UhS}r$(hU]hV]hW]hX]r$Xfiler$aUrolej$hY]uh>j$h^]r$hnX ~/.procmailrcr$r$}r$(h=X ~/.procmailrch>j$ubahQhubhnX:r$}r$(h=X:h>j$ubeubjK)r$}r$(h=X# .procmailrc # routes incoming mail to appropriate mailboxes PATH=/usr/bin:/usr/local/bin MAILDIR=$HOME/Mail LOGFILE=.procmail_log SHELL=/bin/sh :0 * newh>j#hGhJhQjNhS}r$(jPjQhU]hV]hW]hX]hY]uh\Kh]hh^]r$hnX# .procmailrc # routes incoming mail to appropriate mailboxes PATH=/usr/bin:/usr/local/bin MAILDIR=$HOME/Mail LOGFILE=.procmail_log SHELL=/bin/sh :0 * newr$r$}r$(h=Uh>j$ubaubhr)r$}r$(h=XuIf procmail is not setup on a system wide basis, then the following one-line :file:`.forward` file will invoke it. ::h>j#hGhJhQhuhS}r$(hW]hX]hV]hU]hY]uh\Kh]hh^]r$(hnXMIf procmail is not setup on a system wide basis, then the following one-line r$r$}r$(h=XMIf procmail is not setup on a system wide basis, then the following one-line h>j$ubh)r$}r$(h=UhS}r$(hU]hV]hW]hX]r$Xfiler$aUrolej$hY]uh>j$h^]r$hnX.forwardr$r$}r$(h=X.forwardh>j$ubahQhubhnX file will invoke it.r$r$}r$(h=X file will invoke it.h>j$ubeubjK)r$}r$(h=X!/usr/bin/procmailh>j#hGhJhQjNhS}r$(jPjQhU]hV]hW]hX]hY]uh\Kh]hh^]r$hnX!/usr/bin/procmailr$r$}r$(h=Uh>j$ubaubhr)r$}r$(h=XFor MTAs which cannot put files into maildirs directly, the `safecat` tool can be executed from a :file:`.forward` file to accomplish the same thing.h>j#hGhJhQhuhS}r$(hW]hX]hV]hU]hY]uh\Kh]hh^]r$(hnX<For MTAs which cannot put files into maildirs directly, the r$r$}r$(h=X<For MTAs which cannot put files into maildirs directly, the h>j$ubj)r$}r$(h=X `safecat`hS}r$(hW]hX]hV]hU]hY]uh>j$h^]r$hnXsafecatr$r$}r$(h=Uh>j$ubahQjubhnX tool can be executed from a r$r$}r$(h=X tool can be executed from a h>j$ubh)r$}r$(h=UhS}r$(hU]hV]hW]hX]r$Xfiler$aUrolej$hY]uh>j$h^]r$hnX.forwardr$r$}r$(h=X.forwardh>j$ubahQhubhnX# file to accomplish the same thing.r$r$}r$(h=X# file to accomplish the same thing.h>j$ubeubhr)r$}r$(h=XThe Buildmaster uses the linux DNotify facility to receive immediate notification when the maildir's :file:`new` directory has changed. When this facility is not available, it polls the directory for new messages, every 10 seconds by default.h>j#hGhJhQhuhS}r$(hW]hX]hV]hU]hY]uh\Mh]hh^]r$(hnXeThe Buildmaster uses the linux DNotify facility to receive immediate notification when the maildir's r$r$}r$(h=XeThe Buildmaster uses the linux DNotify facility to receive immediate notification when the maildir's h>j$ubh)r$}r$(h=UhS}r$(hU]hV]hW]hX]r$Xfiler$aUrolej$hY]uh>j$h^]r$hnXnewr$r$}r$(h=Xnewh>j$ubahQhubhnX directory has changed. When this facility is not available, it polls the directory for new messages, every 10 seconds by default.r$r$}r$(h=X directory has changed. When this facility is not available, it polls the directory for new messages, every 10 seconds by default.h>j$ubeubhN)r$}r$(h=X".. _Parsing-Email-Change-Messages:h>j#hGhJhQhRhS}r$(hU]hV]hW]hX]hY]hZUparsing-email-change-messagesr$uh\Mh]hh^]ubeubh?)r$}r$(h=Uh>hChGhJhL}r$hj$shQh_hS}r$(hW]hX]hV]hU]r$(j$Uid6r$ehY]r$(h heuh\Mh]hhd}r$j$j$sh^]r$(hg)r$}r$(h=XParsing Email Change Messagesr$h>j$hGhJhQhkhS}r$(hW]hX]hV]hU]hY]uh\Mh]hh^]r$hnXParsing Email Change Messagesr$r$}r$(h=j$h>j$ubaubhr)r$}r$(h=XThe second component to setting up an email-based :class:`ChangeSource` is to parse the actual notices. This is highly dependent upon the VC system and commit script in use.h>j$hGhJhQhuhS}r$(hW]hX]hV]hU]hY]uh\M h]hh^]r$(hnX2The second component to setting up an email-based r$r$}r%(h=X2The second component to setting up an email-based h>j$ubh{)r%}r%(h=X:class:`ChangeSource`r%h>j$hGhJhQhhS}r%(UreftypeXclasshhX ChangeSourceU refdomainXpyr%hU]hV]U refexplicithW]hX]hY]hhhNhNuh\M h^]r%h)r%}r%(h=j%hS}r %(hW]hX]r %(hj%Xpy-classr %ehV]hU]hY]uh>j%h^]r %hnX ChangeSourcer %r%}r%(h=Uh>j%ubahQhubaubhnXf is to parse the actual notices. This is highly dependent upon the VC system and commit script in use.r%r%}r%(h=Xf is to parse the actual notices. This is highly dependent upon the VC system and commit script in use.h>j$ubeubhr)r%}r%(h=XnA couple of common tools used to create these change emails, along with the buildbot tools to parse them, are:r%h>j$hGhJhQhuhS}r%(hW]hX]hV]hU]hY]uh\Mh]hh^]r%hnXnA couple of common tools used to create these change emails, along with the buildbot tools to parse them, are:r%r%}r%(h=j%h>j%ubaubj{)r%}r%(h=Uh>j$hGNhQj~hS}r%(hW]hX]hV]hU]hY]uh\Nh]hh^]r%(j)r%}r %(h=X?CVS Buildbot CVS MailNotifier :bb:chsrc:`CVSMaildirSource` h>j%hGhJhQjhS}r!%(hW]hX]hV]hU]hY]uh\Mh^]r"%(j)r#%}r$%(h=XCVSr%%h>j%hGhJhQjhS}r&%(hW]hX]hV]hU]hY]uh\Mh^]r'%hnXCVSr(%r)%}r*%(h=j%%h>j#%ubaubj)r+%}r,%(h=UhS}r-%(hW]hX]hV]hU]hY]uh>j%h^]r.%j{)r/%}r0%(h=UhS}r1%(hW]hX]hV]hU]hY]uh>j+%h^]r2%j)r3%}r4%(h=X7Buildbot CVS MailNotifier :bb:chsrc:`CVSMaildirSource` h>j/%hGhJhQjhS}r5%(hW]hX]hV]hU]hY]uh\Mh^]r6%(j)r7%}r8%(h=XBuildbot CVS MailNotifierr9%h>j3%hGhJhQjhS}r:%(hW]hX]hV]hU]hY]uh\Mh^]r;%hnXBuildbot CVS MailNotifierr<%r=%}r>%(h=j9%h>j7%ubaubj)r?%}r@%(h=UhS}rA%(hW]hX]hV]hU]hY]uh>j3%h^]rB%hr)rC%}rD%(h=X:bb:chsrc:`CVSMaildirSource`rE%h>j?%hGhJhQhuhS}rF%(hW]hX]hV]hU]hY]uh\Mh^]rG%h{)rH%}rI%(h=jE%h>jC%hGhJhQhhS}rJ%(UreftypeXchsrchhXCVSMaildirSourceU refdomainXbbrK%hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]rL%h)rM%}rN%(h=jE%hS}rO%(hW]hX]rP%(hjK%Xbb-chsrcrQ%ehV]hU]hY]uh>jH%h^]rR%hnXCVSMaildirSourcerS%rT%}rU%(h=Uh>jM%ubahQhubaubaubahQj(ubeubahQj~ubahQj(ubeubj)rV%}rW%(h=XSVN svnmailer http://opensource.perlig.de/en/svnmailer/ :file:`commit-email.pl` :bb:chsrc:`SVNCommitEmailMaildirSource` h>j%hGhJhQjhS}rX%(hW]hX]hV]hU]hY]uh\Mh]hh^]rY%(j)rZ%}r[%(h=XSVNr\%h>jV%hGhJhQjhS}r]%(hW]hX]hV]hU]hY]uh\Mh^]r^%hnXSVNr_%r`%}ra%(h=j\%h>jZ%ubaubj)rb%}rc%(h=UhS}rd%(hW]hX]hV]hU]hY]uh>jV%h^]re%j{)rf%}rg%(h=UhS}rh%(hW]hX]hV]hU]hY]uh>jb%h^]ri%(j)rj%}rk%(h=X4svnmailer http://opensource.perlig.de/en/svnmailer/ h>jf%hGhJhQjhS}rl%(hW]hX]hV]hU]hY]uh\Mh^]rm%(j)rn%}ro%(h=X svnmailerrp%h>jj%hGhJhQjhS}rq%(hW]hX]hV]hU]hY]uh\Mh^]rr%hnX svnmailerrs%rt%}ru%(h=jp%h>jn%ubaubj)rv%}rw%(h=UhS}rx%(hW]hX]hV]hU]hY]uh>jj%h^]ry%hr)rz%}r{%(h=X)http://opensource.perlig.de/en/svnmailer/r|%h>jv%hGhJhQhuhS}r}%(hW]hX]hV]hU]hY]uh\Mh^]r~%jG)r%}r%(h=j|%hS}r%(Urefurij|%hU]hV]hW]hX]hY]uh>jz%h^]r%hnX)http://opensource.perlig.de/en/svnmailer/r%r%}r%(h=Uh>j%ubahQjPubaubahQj(ubeubj)r%}r%(h=X@:file:`commit-email.pl` :bb:chsrc:`SVNCommitEmailMaildirSource` h>jf%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\Mh^]r%(j)r%}r%(h=X:file:`commit-email.pl`h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\Mh^]r%h)r%}r%(h=UhS}r%(hU]hV]hW]hX]r%Xfiler%aUrolej%hY]uh>j%h^]r%hnXcommit-email.plr%r%}r%(h=Xcommit-email.plh>j%ubahQhubaubj)r%}r%(h=UhS}r%(hW]hX]hV]hU]hY]uh>j%h^]r%hr)r%}r%(h=X':bb:chsrc:`SVNCommitEmailMaildirSource`r%h>j%hGhJhQhuhS}r%(hW]hX]hV]hU]hY]uh\Mh^]r%h{)r%}r%(h=j%h>j%hGhJhQhhS}r%(UreftypeXchsrchhXSVNCommitEmailMaildirSourceU refdomainXbbr%hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r%h)r%}r%(h=j%hS}r%(hW]hX]r%(hj%Xbb-chsrcr%ehV]hU]hY]uh>j%h^]r%hnXSVNCommitEmailMaildirSourcer%r%}r%(h=Uh>j%ubahQhubaubaubahQj(ubeubehQj~ubahQj(ubeubj)r%}r%(h=X=Bzr Launchpad :bb:chsrc:`BzrLaunchpadEmailMaildirSource` h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\Mh]hh^]r%(j)r%}r%(h=XBzrr%h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\Mh^]r%hnXBzrr%r%}r%(h=j%h>j%ubaubj)r%}r%(h=UhS}r%(hW]hX]hV]hU]hY]uh>j%h^]r%j{)r%}r%(h=UhS}r%(hW]hX]hV]hU]hY]uh>j%h^]r%j)r%}r%(h=X5Launchpad :bb:chsrc:`BzrLaunchpadEmailMaildirSource` h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\Mh^]r%(j)r%}r%(h=X Launchpadr%h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\Mh^]r%hnX Launchpadr%r%}r%(h=j%h>j%ubaubj)r%}r%(h=UhS}r%(hW]hX]hV]hU]hY]uh>j%h^]r%hr)r%}r%(h=X*:bb:chsrc:`BzrLaunchpadEmailMaildirSource`r%h>j%hGhJhQhuhS}r%(hW]hX]hV]hU]hY]uh\Mh^]r%h{)r%}r%(h=j%h>j%hGhJhQhhS}r%(UreftypeXchsrchhXBzrLaunchpadEmailMaildirSourceU refdomainXbbr%hU]hV]U refexplicithW]hX]hY]hhuh\Mh^]r%h)r%}r%(h=j%hS}r%(hW]hX]r%(hj%Xbb-chsrcr%ehV]hU]hY]uh>j%h^]r%hnXBzrLaunchpadEmailMaildirSourcer%r%}r%(h=Uh>j%ubahQhubaubaubahQj(ubeubahQj~ubahQj(ubeubj)r%}r%(h=X^Mercurial NotifyExtension http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtension h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\M"h]hh^]r%(j)r%}r%(h=X Mercurialr%h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\M"h^]r%hnX Mercurialr%r%}r%(h=j%h>j%ubaubj)r%}r%(h=UhS}r%(hW]hX]hV]hU]hY]uh>j%h^]r%j{)r%}r%(h=UhS}r%(hW]hX]hV]hU]hY]uh>j%h^]r%j)r%}r%(h=XPNotifyExtension http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtension h>j%hGhJhQjhS}r%(hW]hX]hV]hU]hY]uh\M"h^]r%(j)r%}r%(h=XNotifyExtensionr%h>j%hGhJhQjhS}r&(hW]hX]hV]hU]hY]uh\M"h^]r&hnXNotifyExtensionr&r&}r&(h=j%h>j%ubaubj)r&}r&(h=UhS}r&(hW]hX]hV]hU]hY]uh>j%h^]r&hr)r &}r &(h=X?http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtensionr &h>j&hGhJhQhuhS}r &(hW]hX]hV]hU]hY]uh\M"h^]r &jG)r&}r&(h=j &hS}r&(Urefurij &hU]hV]hW]hX]hY]uh>j &h^]r&hnX?http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtensionr&r&}r&(h=Uh>j&ubahQjPubaubahQj(ubeubahQj~ubahQj(ubeubj)r&}r&(h=XsGit post-receive-email http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;hb=HEAD h>j%hGhJhQjhS}r&(hW]hX]hV]hU]hY]uh\M'h]hh^]r&(j)r&}r&(h=XGitr&h>j&hGhJhQjhS}r&(hW]hX]hV]hU]hY]uh\M'h^]r&hnXGitr&r&}r &(h=j&h>j&ubaubj)r!&}r"&(h=UhS}r#&(hW]hX]hV]hU]hY]uh>j&h^]r$&j{)r%&}r&&(h=UhS}r'&(hW]hX]hV]hU]hY]uh>j!&h^]r(&j)r)&}r*&(h=Xkpost-receive-email http://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;hb=HEAD h>j%&hGhJhQjhS}r+&(hW]hX]hV]hU]hY]uh\M'h^]r,&(j)r-&}r.&(h=Xpost-receive-emailr/&h>j)&hGhJhQjhS}r0&(hW]hX]hV]hU]hY]uh\M'h^]r1&hnXpost-receive-emailr2&r3&}r4&(h=j/&h>j-&ubaubj)r5&}r6&(h=UhS}r7&(hW]hX]hV]hU]hY]uh>j)&h^]r8&hr)r9&}r:&(h=XVhttp://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;hb=HEADr;&h>j5&hGhJhQhuhS}r<&(hW]hX]hV]hU]hY]uh\M&h^]r=&jG)r>&}r?&(h=j;&hS}r@&(Urefurij;&hU]hV]hW]hX]hY]uh>j9&h^]rA&hnXVhttp://git.kernel.org/?p=git/git.git;a=blob;f=contrib/hooks/post-receive-email;hb=HEADrB&rC&}rD&(h=Uh>j>&ubahQjPubaubahQj(ubeubahQj~ubahQj(ubeubeubhr)rE&}rF&(h=XNThe following sections describe the parsers available for each of these tools.rG&h>j$hGhJhQhuhS}rH&(hW]hX]hV]hU]hY]uh\M)h]hh^]rI&hnXNThe following sections describe the parsers available for each of these tools.rJ&rK&}rL&(h=jG&h>jE&ubaubhr)rM&}rN&(h=XMMost 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.h>j$hGhJhQhuhS}rO&(hW]hX]hV]hU]hY]uh\M,h]hh^]rP&(hnXMost of these parsers accept a rQ&rR&}rS&(h=XMost of these parsers accept a h>jM&ubh)rT&}rU&(h=X ``prefix=``hS}rV&(hW]hX]hV]hU]hY]uh>jM&h^]rW&hnXprefix=rX&rY&}rZ&(h=Uh>jT&ubahQhubhnX 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 r[&r\&}r]&(h=X 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 h>jM&ubh)r^&}r_&(h=X*does*hS}r`&(hW]hX]hV]hU]hY]uh>jM&h^]ra&hnXdoesrb&rc&}rd&(h=Uh>j^&ubahQhubhnX 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.re&rf&}rg&(h=X 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.h>jM&ubeubj)rh&}ri&(h=Uh>j$hGhJhQjhS}rj&(hU]hV]hW]hX]hY]Uentries]rk&((UsingleX Change Sources; CVSMaildirSourceXchsrc-CVSMaildirSourcerl&jl&trm&(UsingleXCVSMaildirSource Change Sourcejl&jl&trn&euh\M7h]hh^]ubhN)ro&}rp&(h=Uh>j$hGhJhQhRhS}rq&(hU]hV]hW]hX]hY]hZjl&uh\M7h]hh^]ubhN)rr&}rs&(h=X.. _CVSMaildirSource:h>j$hGhJhL}hQhRhS}rt&(hU]hV]hW]hX]hY]hZUcvsmaildirsourceru&uh\M8h]hhd}rv&jl&jo&sh^]ubeubh@jjeubhGhJhL}rw&h,jr&shQh_hS}rx&(hW]ry&Xcvsmaildirsourcerz&ahX]hV]hU]r{&(ju&jl&Uid7r|&ehY]r}&h,auh\M;h]hhd}r~&(jl&jo&ju&jr&uh^]r&(hg)r&}r&(h=XCVSMaildirSourcer&h>h@hGhJhQhkhS}r&(hW]hX]hV]hU]hY]uh\M;h]hh^]r&hnXCVSMaildirSourcer&r&}r&(h=j&h>j&ubaubj)r&}r&(h=Uh>h@hGNhQjhS}r&(hU]hV]hW]hX]hY]Uentries]r&(jX7buildbot.changes.mail.CVSMaildirSource (built-in class)h4Utr&auh\Nh]hh^]ubj)r&}r&(h=Uh>h@hGNhQjhS}r&(jjXpyhU]hV]hW]hX]hY]jXclassr&jj&uh\Nh]hh^]r&(j)r&}r&(h=X&buildbot.changes.mail.CVSMaildirSourceh>j&hGhJhQjhS}r&(hU]r&h4ajNhV]hW]hX]hY]r&h4ajh4jXbuildbot.changes.mailjuh\M>h]hh^]r&(j)r&}r&(h=Xclass h>j&hGhJhQjhS}r&(hW]hX]hV]hU]hY]uh\M>h]hh^]r&hnXclass r&r&}r&(h=Uh>j&ubaubj)r&}r&(h=Xbuildbot.changes.mail.h>j&hGhJhQjhS}r&(hW]hX]hV]hU]hY]uh\M>h]hh^]r&hnXbuildbot.changes.mail.r&r&}r&(h=Uh>j&ubaubj)r&}r&(h=XCVSMaildirSourceh>j&hGhJhQjhS}r&(hW]hX]hV]hU]hY]uh\M>h]hh^]r&hnXCVSMaildirSourcer&r&}r&(h=Uh>j&ubaubeubj)r&}r&(h=Uh>j&hGhJhQjhS}r&(hW]hX]hV]hU]hY]uh\M>h]hh^]ubeubhr)r&}r&(h=X[This parser works with the :file:`buildbot_cvs_maildir.py` script in the contrib directory.h>h@hGhJhQhuhS}r&(hW]hX]hV]hU]hY]uh\M?h]hh^]r&(hnXThis parser works with the r&r&}r&(h=XThis parser works with the h>j&ubh)r&}r&(h=UhS}r&(hU]hV]hW]hX]r&Xfiler&aUrolej&hY]uh>j&h^]r&hnXbuildbot_cvs_maildir.pyr&r&}r&(h=Xbuildbot_cvs_maildir.pyh>j&ubahQhubhnX! script in the contrib directory.r&r&}r&(h=X! script in the contrib directory.h>j&ubeubhr)r&}r&(h=XThe script sends an email containing all the files submitted in one directory. It is invoked by using the :file:`CVSROOT/loginfo` facility.h>h@hGhJhQhuhS}r&(hW]hX]hV]hU]hY]uh\MBh]hh^]r&(hnXjThe script sends an email containing all the files submitted in one directory. It is invoked by using the r&r&}r&(h=XjThe script sends an email containing all the files submitted in one directory. It is invoked by using the h>j&ubh)r&}r&(h=UhS}r&(hU]hV]hW]hX]r&Xfiler&aUrolej&hY]uh>j&h^]r&hnXCVSROOT/loginfor&r&}r&(h=XCVSROOT/loginfoh>j&ubahQhubhnX facility.r&r&}r&(h=X facility.h>j&ubeubhr)r&}r&(h=XThe Buildbot's :bb:chsrc:`CVSMaildirSource` knows how to parse these messages and turn them into Change objects. It takes the directory name of the maildir root. For example::h>h@hGhJhQhuhS}r&(hW]hX]hV]hU]hY]uh\MEh]hh^]r&(hnXThe Buildbot's r&r&}r&(h=XThe Buildbot's h>j&ubh{)r&}r&(h=X:bb:chsrc:`CVSMaildirSource`r&h>j&hGhJhQhhS}r&(UreftypeXchsrchhXCVSMaildirSourceU refdomainXbbr&hU]hV]U refexplicithW]hX]hY]hhuh\MEh^]r&h)r&}r&(h=j&hS}r&(hW]hX]r&(hj&Xbb-chsrcr&ehV]hU]hY]uh>j&h^]r&hnXCVSMaildirSourcer&r&}r&(h=Uh>j&ubahQhubaubhnX knows how to parse these messages and turn them into Change objects. It takes the directory name of the maildir root. For example:r&r&}r&(h=X knows how to parse these messages and turn them into Change objects. It takes the directory name of the maildir root. For example:h>j&ubeubjK)r&}r&(h=Xofrom buildbot.changes.mail import CVSMaildirSource c['change_source'] = CVSMaildirSource("/home/buildbot/Mail")h>h@hGhJhQjNhS}r&(jPjQhU]hV]hW]hX]hY]uh\MIh]hh^]r&hnXofrom buildbot.changes.mail import CVSMaildirSource c['change_source'] = CVSMaildirSource("/home/buildbot/Mail")r&r&}r&(h=Uh>j&ubaubjeubhGhJhQUsystem_messager&hS}r&(hW]UlevelKhU]hV]r&j|&aUsourcehJhX]hY]UlineM;UtypeUINFOr&uh\M;h]hh^]r&hr)r&}r&(h=UhS}r&(hW]hX]hV]hU]hY]uh>h;h^]r&hnX3Duplicate implicit target name: "cvsmaildirsource".r&r'}r'(h=Uh>j&ubahQhuubaubh:)r'}r'(h=Uh>jhGhJhQj&hS}r'(hW]UlevelKhU]hV]r'jaUsourcehJhX]hY]UlineMlUtypej&uh\Mlh]hh^]r'hr)r'}r'(h=UhS}r '(hW]hX]hV]hU]hY]uh>j'h^]r 'hnX>Duplicate implicit target name: "svncommitemailmaildirsource".r 'r '}r '(h=Uh>j'ubahQhuubaubh:)r'}r'(h=Uh>jhGhJhQj&hS}r'(hW]UlevelKhU]hV]r'jaUsourcehJhX]hY]UlineMUtypej&uh\Mh]hh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnXADuplicate implicit target name: "bzrlaunchpademailmaildirsource".r'r'}r'(h=Uh>j'ubahQhuubaubh:)r'}r'(h=Uh>jhGhJhQj&hS}r'(hW]UlevelKhU]hV]r'jaUsourcehJhX]hY]UlineMUtypej&uh\Mh]hh^]r'hr)r'}r '(h=UhS}r!'(hW]hX]hV]hU]hY]uh>j'h^]r"'hnX1Duplicate implicit target name: "pbchangesource".r#'r$'}r%'(h=Uh>j'ubahQhuubaubh:)r&'}r''(h=Uh>jhGhJhQj&hS}r('(hW]UlevelKhU]hV]r)'jaUsourcehJhX]hY]UlineMUtypej&uh\Mh]hh^]r*'hr)r+'}r,'(h=UhS}r-'(hW]hX]hV]hU]hY]uh>j&'h^]r.'hnX+Duplicate implicit target name: "p4source".r/'r0'}r1'(h=Uh>j+'ubahQhuubaubh:)r2'}r3'(h=Uh>jhGhJhQj&hS}r4'(hW]UlevelKhU]hV]r5'jaUsourcehJhX]hY]UlineMUtypej&uh\Mh]hh^]r6'hr)r7'}r8'(h=UhS}r9'(hW]hX]hV]hU]hY]uh>j2'h^]r:'hnX/Duplicate implicit target name: "bonsaipoller".r;'r<'}r='(h=Uh>j7'ubahQhuubaubh:)r>'}r?'(h=Uh>jhGhJhQj&hS}r@'(hW]UlevelKhU]hV]rA'j&aUsourcehJhX]hY]UlineM<Utypej&uh\M<h]hh^]rB'hr)rC'}rD'(h=UhS}rE'(hW]hX]hV]hU]hY]uh>j>'h^]rF'hnX,Duplicate implicit target name: "svnpoller".rG'rH'}rI'(h=Uh>jC'ubahQhuubaubh:)rJ'}rK'(h=Uh>jhGhJhQj&hS}rL'(hW]UlevelKhU]hV]rM'j aUsourcehJhX]hY]UlineMUtypej&uh\Mh]hh^]rN'hr)rO'}rP'(h=UhS}rQ'(hW]hX]hV]hU]hY]uh>jJ'h^]rR'hnX,Duplicate implicit target name: "gitpoller".rS'rT'}rU'(h=Uh>jO'ubahQhuubaubh:)rV'}rW'(h=Uh>jBhGhJhQj&hS}rX'(hW]UlevelKhU]hV]rY'jIaUsourcehJhX]hY]UlineM@Utypej&uh\M@h]hh^]rZ'hr)r['}r\'(h=UhS}r]'(hW]hX]hV]hU]hY]uh>jV'h^]r^'hnX+Duplicate implicit target name: "hgpoller".r_'r`'}ra'(h=Uh>j['ubahQhuubaubh:)rb'}rc'(h=Uh>jhGhJhQj&hS}rd'(hW]UlevelKhU]hV]re'jaUsourcehJhX]hY]UlineMUtypej&uh\Mh]hh^]rf'hr)rg'}rh'(h=UhS}ri'(hW]hX]hV]hU]hY]uh>jb'h^]rj'hnX5Duplicate implicit target name: "gerritchangesource".rk'rl'}rm'(h=Uh>jg'ubahQhuubaubh:)rn'}ro'(h=Uh>j!hGhJhQj&hS}rp'(hW]UlevelKhU]hV]rq'j"aUsourcehJhX]hY]UlineMUtypej&uh\Mh]hh^]rr'hr)rs'}rt'(h=UhS}ru'(hW]hX]hV]hU]hY]uh>jn'h^]rv'hnX7Duplicate implicit target name: "googlecodeatompoller".rw'rx'}ry'(h=Uh>js'ubahQhuubaubeUcurrent_sourcerz'NU decorationr{'NUautofootnote_startr|'KUnameidsr}'}r~'(hjhjhhh j!h jh j$h j!h jhj hj hj@hj!hjhjhj' hjhjhj #hjhhhj%hjhj#hhhj$hjh j h!jh"jh#j$h$jih%h%h&j h'h'h(j+h)j#h*j h+j h,ju&h-j"h.j#h/jh0jh1j h2hbh3h[h4h4h5jQuh^]r'(hOhEeh=UU transformerr'NU footnote_refsr'}r'Urefnamesr'}r'Usymbol_footnotesr']r'Uautofootnote_refsr']r'Usymbol_footnote_refsr']r'U citationsr']r'h]hU current_liner'NUtransform_messagesr']r'(h:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineKUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX4Hyperlink target "change-sources" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineKUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX>Hyperlink target "choosing-a-change-source" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineKoUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX-Hyperlink target "index-0" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineKqUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX7Hyperlink target "cfg-change_source" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineKUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX@Hyperlink target "mail-parsing-changesources" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineKUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnXAHyperlink target "subscribing-the-buildmaster" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineKUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX4Hyperlink target "using-maildirs" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnXCHyperlink target "parsing-email-change-messages" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM7Utypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX<Hyperlink target "chsrc-CVSMaildirSource" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r'(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM8Utypej&uh^]r'hr)r'}r'(h=UhS}r'(hW]hX]hV]hU]hY]uh>j'h^]r'hnX6Hyperlink target "cvsmaildirsource" is not referenced.r'r'}r'(h=Uh>j'ubahQhuubahQj&ubh:)r'}r'(h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMhUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j'h^]r(hnXGHyperlink target "chsrc-SVNCommitEmailMaildirSource" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r (}r ((h=UhS}r ((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMiUtypej&uh^]r (hr)r (}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j (h^]r(hnXAHyperlink target "svncommitemailmaildirsource" is not referenced.r(r(}r((h=Uh>j (ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM{Utypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnXJHyperlink target "chsrc-BzrLaunchpadEmailMaildirSource" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r ((h=UhS}r!((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM|Utypej&uh^]r"(hr)r#(}r$((h=UhS}r%((hW]hX]hV]hU]hY]uh>j(h^]r&(hnXDHyperlink target "bzrlaunchpademailmaildirsource" is not referenced.r'(r((}r)((h=Uh>j#(ubahQhuubahQj&ubh:)r*(}r+((h=UhS}r,((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r-(hr)r.(}r/((h=UhS}r0((hW]hX]hV]hU]hY]uh>j*(h^]r1(hnX:Hyperlink target "chsrc-PBChangeSource" is not referenced.r2(r3(}r4((h=Uh>j.(ubahQhuubahQj&ubh:)r5(}r6((h=UhS}r7((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r8(hr)r9(}r:((h=UhS}r;((hW]hX]hV]hU]hY]uh>j5(h^]r<(hnX4Hyperlink target "pbchangesource" is not referenced.r=(r>(}r?((h=Uh>j9(ubahQhuubahQj&ubh:)r@(}rA((h=UhS}rB((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]rC(hr)rD(}rE((h=UhS}rF((hW]hX]hV]hU]hY]uh>j@(h^]rG(hnX4Hyperlink target "mercurial-hook" is not referenced.rH(rI(}rJ((h=Uh>jD(ubahQhuubahQj&ubh:)rK(}rL((h=UhS}rM((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]rN(hr)rO(}rP((h=UhS}rQ((hW]hX]hV]hU]hY]uh>jK(h^]rR(hnX.Hyperlink target "bzr-hook" is not referenced.rS(rT(}rU((h=Uh>jO(ubahQhuubahQj&ubh:)rV(}rW((h=UhS}rX((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]rY(hr)rZ(}r[((h=UhS}r\((hW]hX]hV]hU]hY]uh>jV(h^]r](hnX4Hyperlink target "chsrc-P4Source" is not referenced.r^(r_(}r`((h=Uh>jZ(ubahQhuubahQj&ubh:)ra(}rb((h=UhS}rc((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]rd(hr)re(}rf((h=UhS}rg((hW]hX]hV]hU]hY]uh>ja(h^]rh(hnX.Hyperlink target "p4source" is not referenced.ri(rj(}rk((h=Uh>je(ubahQhuubahQj&ubh:)rl(}rm((h=UhS}rn((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]ro(hr)rp(}rq((h=UhS}rr((hW]hX]hV]hU]hY]uh>jl(h^]rs(hnX-Hyperlink target "index-1" is not referenced.rt(ru(}rv((h=Uh>jp(ubahQhuubahQj&ubh:)rw(}rx((h=UhS}ry((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]rz(hr)r{(}r|((h=UhS}r}((hW]hX]hV]hU]hY]uh>jw(h^]r~(hnX-Hyperlink target "index-2" is not referenced.r(r(}r((h=Uh>j{(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX-Hyperlink target "index-3" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX8Hyperlink target "chsrc-BonsaiPoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX2Hyperlink target "bonsaipoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM8Utypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX5Hyperlink target "chsrc-SVNPoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM9Utypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX/Hyperlink target "svnpoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX-Hyperlink target "index-4" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX5Hyperlink target "chsrc-BzrPoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX0Hyperlink target "bzr-poller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX5Hyperlink target "chsrc-GitPoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX/Hyperlink target "gitpoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM<Utypej&uh^]r(hr)r(}r((h=UhS}r((hW]hX]hV]hU]hY]uh>j(h^]r(hnX4Hyperlink target "chsrc-HgPoller" is not referenced.r(r(}r((h=Uh>j(ubahQhuubahQj&ubh:)r(}r((h=UhS}r((hW]UlevelKhU]hV]UsourcehJhX]hY]UlineM=Utypej&uh^]r(hr)r(}r)(h=UhS}r)(hW]hX]hV]hU]hY]uh>j(h^]r)hnX.Hyperlink target "hgpoller" is not referenced.r)r)}r)(h=Uh>j(ubahQhuubahQj&ubh:)r)}r)(h=UhS}r)(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r )hr)r )}r )(h=UhS}r )(hW]hX]hV]hU]hY]uh>j)h^]r )hnX>Hyperlink target "chsrc-GerritChangeSource" is not referenced.r)r)}r)(h=Uh>j )ubahQhuubahQj&ubh:)r)}r)(h=UhS}r)(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r)hr)r)}r)(h=UhS}r)(hW]hX]hV]hU]hY]uh>j)h^]r)hnX8Hyperlink target "gerritchangesource" is not referenced.r)r)}r)(h=Uh>j)ubahQhuubahQj&ubh:)r)}r)(h=UhS}r)(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r)hr)r )}r!)(h=UhS}r")(hW]hX]hV]hU]hY]uh>j)h^]r#)hnX-Hyperlink target "index-5" is not referenced.r$)r%)}r&)(h=Uh>j )ubahQhuubahQj&ubh:)r')}r()(h=UhS}r))(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r*)hr)r+)}r,)(h=UhS}r-)(hW]hX]hV]hU]hY]uh>j')h^]r.)hnX8Hyperlink target "chsrc-Change Hooks" is not referenced.r/)r0)}r1)(h=Uh>j+)ubahQhuubahQj&ubh:)r2)}r3)(h=UhS}r4)(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r5)hr)r6)}r7)(h=UhS}r8)(hW]hX]hV]hU]hY]uh>j2)h^]r9)hnXEHyperlink target "change-hooks-http-notifications" is not referenced.r:)r;)}r<)(h=Uh>j6)ubahQhuubahQj&ubh:)r=)}r>)(h=UhS}r?)(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]r@)hr)rA)}rB)(h=UhS}rC)(hW]hX]hV]hU]hY]uh>j=)h^]rD)hnX@Hyperlink target "chsrc-GoogleCodeAtomPoller" is not referenced.rE)rF)}rG)(h=Uh>jA)ubahQhuubahQj&ubh:)rH)}rI)(h=UhS}rJ)(hW]UlevelKhU]hV]UsourcehJhX]hY]UlineMUtypej&uh^]rK)hr)rL)}rM)(h=UhS}rN)(hW]hX]hV]hU]hY]uh>jH)h^]rO)hnX:Hyperlink target "googlecodeatompoller" is not referenced.rP)rQ)}rR)(h=Uh>jL)ubahQhuubahQj&ubeUreporterrS)NUid_startrT)KU autofootnotesrU)]rV)U citation_refsrW)}rX)Uindirect_targetsrY)]rZ)Usettingsr[)(cdocutils.frontend Values r\)or])}r^)(Ufootnote_backlinksr_)KUrecord_dependenciesr`)NU rfc_base_urlra)Uhttp://tools.ietf.org/html/rb)U tracebackrc)Upep_referencesrd)NUstrip_commentsre)NU toc_backlinksrf)Uentryrg)U language_coderh)Uenri)U datestamprj)NU report_levelrk)KU _destinationrl)NU halt_levelrm)KU strip_classesrn)NhkNUerror_encoding_error_handlerro)Ubackslashreplacerp)Udebugrq)NUembed_stylesheetrr)Uoutput_encoding_error_handlerrs)Ustrictrt)U sectnum_xformru)KUdump_transformsrv)NU docinfo_xformrw)KUwarning_streamrx)NUpep_file_url_templatery)Upep-%04drz)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.8/master/docs/manual/cfg-changesources.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)jt)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)(jjjjj#j#hj+j!j!j j j!j!jjj!j!jjjjjjj!j!jjj j jjj!j!jj{jjjjjjjijejl&h@j$j$j|&h@j#j #j#j#j+j&j"hCjjhbhEjjjjj' j# jjjjj #j #jjjjjjj%j&jjjjhj<jhjkj$j$jhCj$j jjjj jjj@jBjjh%jj j h'j jIjBjjj jjjjjjjj j j jju&h@jjj j jjjjjfjijQjMj&jh[hEj"j!jjhjh4j&j j j7jBuUsubstitution_namesr)}r)hQh]hS}r)(hW]hU]hV]UsourcehJhX]hY]uU footnotesr)]r)Urefidsr)}r)(j]r)j aj]r)jaj!]r)j!aj!]r)j!aj]r)jaj]r)jaj]r)jaj]r)jaj]r)jaj@]r)j=aj]r)jaj]r)jaj]r)jajl&]r)jo&aj]r)jaj]r)jaj #]r)j #aj]r)jaj!]r)j!aj]r)jaj%]r)j"aj]r)jaj]r)jaj$]r)j$aj]r)jaj]r)jaj]r)jaj ]r)j aj]r)jaj]r)jaj#]r)j#aju&]r)jr&aj]r)jah[]r)hOaj!]r)j!aj7]r)j:auub.PKJtD1226buildbot-v0.8.8/.doctrees/manual/customization.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xbuild-priority-functionsqXbuilder priority functionsqNXadding-logobserversqX#using logfiles in custom buildstepsq NXcapturing logfilesq NXwriting buildstep constructorsq NX customizationq Xfactory workdir functionsq NXupdating statusqNXusing propertiesqNXcustomizing-svnpollerqXmerge-request-functionsqX(project/branchname/filepath repositoriesqNXwriting new status pluginsqNXadding logobserversqNXmerge request functionsqNXa somewhat whimsical exampleqNXcustomizing svnpollerqNXrunning commandsqNX(branchname/project/filepath repositoriesqNXframboozle_regqX%programmatic configuration generationqNX.writing a new latent buildslave implementationqNXcustom build classesqNX divmod.orgqXwriting-change-sourcesqXbuild 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"buildbot.changes.base.ChangeSourceq(Xbuildstep urlsq)NXreading logfilesq*NXwriting change sourcesq+NuUsubstitution_defsq,}q-Uparse_messagesq.]q/cdocutils.nodes system_message q0)q1}q2(U rawsourceq3UUparentq4cdocutils.nodes section q5)q6}q7(h3UU referencedq8Kh4hUsourceq9cdocutils.nodes reprunicode q:XU/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/customization.rstq;q<}q=bUexpect_referenced_by_nameq>}q?h cdocutils.nodes target q@)qA}qB(h3X.. _Customization:h4hh9h}qhhshChQhE}q(hI]hJ]hH]hG]q(hUid2qehK]q(hheuhNK'hOhhX}qhhshP]q(h[)q}q(h3XMerge Request Functionsqh4hh9h}hChjhE}q(hI]hJ]hH]hG]qhahK]uhNK+hOhhX}qhhshP]q(hbXThe logic Buildbot uses to decide which build request can be merged can be customized by providing a Python function (a callable) instead of qօq}q(h3XThe logic Buildbot uses to decide which build request can be merged can be customized by providing a Python function (a callable) instead of h4hubh)q}q(h3X``True``hE}q(hI]hJ]hH]hG]hK]uh4hhP]qhbXTrueq݅q}q(h3Uh4hubahChubhbX or qq}q(h3X or h4hubh)q}q(h3X ``False``hE}q(hI]hJ]hH]hG]hK]uh4hhP]qhbXFalseq煁q}q(h3Uh4hubahChubhbX described in qꅁq}q(h3X described in h4hubcsphinx.addnodes pending_xref q)q}q(h3X:ref:`Merging-Build-Requests`qh4hh9h(hbX"In many cases, the details of the r?r@}rA(h3X"In many cases, the details of the h4j;ubh)rB}rC(h3X:class:`SourceStamp`rDh4j;h9hhOhhP]rhbXdef mergeRequests(builder, req1, req2): if req1.source.canBeMergedWith(req2.source) and req1.reason == req2.reason: return True return False c['mergeRequests'] = mergeRequestsrr}r(h3Uh4jubaubhf)r}r(h3XIf 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::h4hh9h}rh"jshChQhE}r(hI]hJ]hH]hG]r(jUid3rehK]r(hh"euhNKYhOhhX}rjjshP]r(h[)r}r(h3XBuilder Priority Functionsrh4jh9h}hChjhE}r(hI]hJ]hH]hG]rjahK]uhNK]hOhhX}rjjshP]r(hbXThe rr}r(h3XThe h4jubh)r}r(h3X:bb:cfg:`prioritizeBuilders`rh4jh9h(hXBuilds; priorityUindex-2r?Utr@ah̉uhNKthOhhP]ubh@)rA}rB(h3Uh4jh9h}hChDhE}rF(hG]hH]hI]hJ]hK]hLUbuild-priority-functionsrGuhNKvhOhhX}rHj?jAshP]ubeubh5)rI}rJ(h3Uh4h6h9h}rKhjDshChQhE}rL(hI]hJ]hH]hG]rM(jGj?Uid4rNehK]rO(h heuhNKyhOhhX}rP(jGjDj?jAuhP]rQ(h[)rR}rS(h3XBuild Priority FunctionsrTh4jIh9hWhen a builder has multiple pending build requests, it uses a r^r_}r`(h3X>When a builder has multiple pending build requests, it uses a h4jZubh)ra}rb(h3X ``nextBuild``hE}rc(hI]hJ]hH]hG]hK]uh4jZhP]rdhbX nextBuildrerf}rg(h3Uh4jaubahChubhbXc function to decide which build it should start first. This function is given two parameters: the rhri}rj(h3Xc function to decide which build it should start first. This function is given two parameters: the h4jZubh)rk}rl(h3X:class:`Builder`rmh4jZh9h}rhjshChQhE}r(hI]hJ]hH]hG]r(jUid5rehK]r(hheuhNKhOhhX}rjjshP]r(h[)r}r(h3XCustomizing SVNPollerrh4jh9h(h3X ``branches``hE}r?(hI]hJ]hH]hG]hK]uh4j6hP]r@hbXbranchesrArB}rC(h3Uh4j=ubahChubhbX, rDrE}rF(h3X, h4j6ubh)rG}rH(h3X``tags``hE}rI(hI]hJ]hH]hG]hK]uh4j6hP]rJhbXtagsrKrL}rM(h3Uh4jGubahChubhbX, and rNrO}rP(h3X, and h4j6ubh)rQ}rR(h3X ``trunk``hE}rS(hI]hJ]hH]hG]hK]uh4j6hP]rThbXtrunkrUrV}rW(h3Uh4jQubahChubhbX subdirectories:rXrY}rZ(h3X subdirectories:h4j6ubeubh)r[}r\(h3Xjamanda/trunk /branches/3_2 /3_3 /tags/3_2_1 /3_2_2 /3_3_0h4j'h9hhbX SVNPollerr?r@}rA(h3Uh4j9ubahChubaubhbX's rBrC}rD(h3X\'s h4jubh)rE}rF(h3X ``svnurl=``hE}rG(hI]hJ]hH]hG]hK]uh4jhP]rHhbXsvnurl=rIrJ}rK(h3Uh4jEubahChubhbXC argument. It is expected to return a dictionary with at least the rLrM}rN(h3XC argument. It is expected to return a dictionary with at least the h4jubh)rO}rP(h3X``path``hE}rQ(hI]hJ]hH]hG]hK]uh4jhP]rRhbXpathrSrT}rU(h3Uh4jOubahChubhbX& key. The splitter may optionally set rVrW}rX(h3X& key. The splitter may optionally set h4jubh)rY}rZ(h3X ``branch``hE}r[(hI]hJ]hH]hG]hK]uh4jhP]r\hbXbranchr]r^}r_(h3Uh4jYubahChubhbX, r`ra}rb(h3X, h4jubh)rc}rd(h3X ``project``hE}re(hI]hJ]hH]hG]hK]uh4jhP]rfhbXprojectrgrh}ri(h3Uh4jcubahChubhbX and rjrk}rl(h3X and h4jubh)rm}rn(h3X``repository``hE}ro(hI]hJ]hH]hG]hK]uh4jhP]rphbX repositoryrqrr}rs(h3Uh4jmubahChubhbX7. For backwards compatibility it may return a tuple of rtru}rv(h3X7. For backwards compatibility it may return a tuple of h4jubh)rw}rx(h3X``(branchname, path)``hE}ry(hI]hJ]hH]hG]hK]uh4jhP]rzhbX(branchname, path)r{r|}r}(h3Uh4jwubahChubhbX. It may also return r~r}r(h3X. It may also return h4jubh)r}r(h3X``None``hE}r(hI]hJ]hH]hG]hK]uh4jhP]rhbXNonerr}r(h3Uh4jubahChubhbX- to indicate that the file is of no interest.rr}r(h3X- to indicate that the file is of no interest.h4jubeubcdocutils.nodes note r)r}r(h3X2the 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.h4j'h9h 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 Noneh4j'h9h 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(h3Uh4jubaubhf)r}r(h3XIn 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::h4j'h9hr?}r@(h3XeNote here that we are monitoring at the root of the repository, and that within that repository is a h4j:ubh)rA}rB(h3X ``amanda``hE}rC(hI]hJ]hH]hG]hK]uh4j:hP]rDhbXamandarErF}rG(h3Uh4jAubahChubhbX subdirectory which in turn has rHrI}rJ(h3X subdirectory which in turn has h4j:ubh)rK}rL(h3X ``trunk``hE}rM(hI]hJ]hH]hG]hK]uh4j:hP]rNhbXtrunkrOrP}rQ(h3Uh4jKubahChubhbX and rRrS}rT(h3X and h4j:ubh)rU}rV(h3X ``branches``hE}rW(hI]hJ]hH]hG]hK]uh4j:hP]rXhbXbranchesrYrZ}r[(h3Uh4jUubahChubhbX . It is that r\r]}r^(h3X . It is that h4j:ubh)r_}r`(h3X ``amanda``hE}ra(hI]hJ]hH]hG]hK]uh4j:hP]rbhbXamandarcrd}re(h3Uh4j_ubahChubhbX% subdirectory whose name becomes the rfrg}rh(h3X% subdirectory whose name becomes the h4j:ubh)ri}rj(h3X ``project``hE}rk(hI]hJ]hH]hG]hK]uh4j:hP]rlhbXprojectrmrn}ro(h3Uh4jiubahChubhbX field of the Change.rprq}rr(h3X field of the Change.h4j:ubeubeubh5)rs}rt(h3Uh4jh9h`_ 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.h4jsh9h`_hE}r(UnameX Divmod.orgUrefurirXhttp://Divmod.orgrhG]hH]hI]hJ]hK]uh4jhP]rhbX Divmod.orgrr}r(h3Uh4jubahCU referencerubh@)r}r(h3X h8Kh4jhChDhE}r(UrefurijhG]rU divmod-orgrahH]hI]hJ]hK]rhauhP]ubhbX hosts a project named rr}r(h3X hosts a project named h4jubcdocutils.nodes title_reference r)r}r(h3X`Nevow`hE}r(hI]hJ]hH]hG]hK]uh4jhP]rhbXNevowrr}r(h3Uh4jubahCUtitle_referencerubhbX as well as one named rr}r(h3X as well as one named h4jubj)r}r(h3X `Quotient`hE}r(hI]hJ]hH]hG]hK]uh4jhP]rhbXQuotientrr}r(h3Uh4jubahCjubhbX9. In a checked-out Nevow tree there is a directory named rr}r(h3X9. In a checked-out Nevow tree there is a directory named h4jubj)r}r(h3X `formless`hE}r(hI]hJ]hH]hG]hK]uh4jhP]rhbXformlessrr}r(h3Uh4jubahCjubhbX* that contains a Python source file named rr}r(h3X* that contains a Python source file named h4jubh)r}r(h3UhE}r(hG]hH]hI]hJ]rXfileraUrolejhK]uh4jhP]rhbX webform.pyrr}r(h3X webform.pyh4jubahChubhbX=. This repository is accessible via webdav (and thus uses an rr}r(h3X=. This repository is accessible via webdav (and thus uses an h4jubj)r}r(h3X`http:`hE}r(hI]hJ]hH]hG]hK]uh4jhP]rhbXhttp:rr}r(h3Uh4jubahCjubhbXe scheme) through the divmod.org hostname. There are many branches in this repository, and they use a rr}r(h3Xe scheme) through the divmod.org hostname. There are many branches in this repository, and they use a h4jubh)r}r(h3X``({BRANCHNAME})/({PROJECT})``hE}r(hI]hJ]hH]hG]hK]uh4jhP]rhbX({BRANCHNAME})/({PROJECT})rr}r(h3Uh4jubahChubhbX naming policy.rr}r(h3X naming policy.h4jubeubhf)r}r(h3XThe 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``.h4jsh9h(h3Uh4j8ubahChubhbX layout described earlier:r?r@}rA(h3X layout described earlier:h4jubeubh)rB}rC(h3X{from buildbot.changes.svnpoller import SVNPoller c['change_source'] = SVNPoller("http://divmod.org/svn/Divmod/trunk/Nevow")h4jsh9h}r?(h3XGThe following definition for :meth:`my_file_splitter` will do the job::r@h4jsh9hubh)rF}rG(h3X:meth:`my_file_splitter`rHh4j>h9hubeubh)rX}rY(h3Xdef 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))h4jsh9h}rshjmshChQhE}rt(hI]hJ]hH]hG]ru(jpUid6rvehK]rw(h+heuhNMehOhhX}rxjpjmshP]ry(h[)rz}r{(h3XWriting Change Sourcesr|h4jqh9h}r?(h3X, implementing the h4j'ubh)r@}rA(h3X:meth:`describe`rBh4j'h9h r? }r@ (h3Uh4j: ubahChubhbXI seconds. This method should return a Deferred to signal its completion.rA rB }rC (h3XI seconds. This method should return a Deferred to signal its completion.h4jubeubhf)rD }rE (h3X[Aside from the service methods, the other concerns in the previous section apply here, too.rF h4jh9h}r2 h%j, shChQhE}r3 (hI]hJ]hH]hG]r4 (j/ Uid7r5 ehK]r6 (h h%euhNMhOhhX}r7 j/ j, shP]r8 (h[)r9 }r: (h3XFactory Workdir Functionsr; h4j0 h9h r? }r@ (h3j; h4j9 ubaubhf)rA }rB (h3XIt 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.h4j0 h9h /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88h4j0 h9h /mybuilder/a78890ba Repo2 => /mybuilder/0823ba88r~ r }r (h3Uh4jz ubaubhf)r }r (h3XYou 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.h4j0 h9h}r3 h$j- shChQhE}r4 (hI]hJ]hH]hG]r5 (j0 Uid8r6 ehK]r7 (h h$euhNMhOhhX}r8 j0 j- shP]r9 (h[)r: }r; (h3XWriting BuildStep Constructorsr< h4j1 h9h hbXWriting BuildStep Constructorsr? r@ }rA (h3j< h4j: ubaubhf)rB }rC (h3X)Build steps act as their own factories, so their constructors are a bit more complex than necessary. In the configuration file, a :class:`~buildbot.process.buildstep.BuildStep` object is instantiated, but because steps store state locally while executing, this object cannot be used during builds.h4j1 h9h }r? (h3X:, just ask it to close the log when the command completes:h4j ubeubh)r@ }rA (h3XClog = self.addLog('output') cmd.useLog(log, closeWhenFinished=True)h4j h9h}hCU todo_noderf hE}rg (hI]hJ]rh Uadmonition-todori ahH]hG]rj ja ahK]uhNMThOhhX}rk ja j^ shP]rl (h[)rm }rn (h3XTodoro hE}rp (hI]hJ]hH]hG]hK]uh4jc hP]rq hbXTodorr rs }rt (h3jo h4jm ubahCh_ubhf)ru }rv (h3X7What *is* the best way to do this? From the docstring:rw h4jc h9h }r? (h3Xstdouth4j7 ubahChubhbX and r@ rA }rB (h3X and h4j ubh)rC }rD (h3UhE}rE (hG]hH]hI]hJ]rF XfilerG aUrolejG hK]uh4j hP]rH hbXstderrrI rJ }rK (h3Xstderrh4jC ubahChubhbX. messages. When the command finishes, a final rL rM }rN (h3X. messages. When the command finishes, a final h4j ubj)rO }rP (h3X`header`hE}rQ (hI]hJ]hH]hG]hK]uh4j hP]rR hbXheaderrS rT }rU (h3Uh4jO ubahCjubhbX1 line is added with the exit code of the process.rV rW }rX (h3X1 line is added with the exit code of the process.h4j ubeubhf)rY }rZ (h3XStatus display plugins can format these different channels in different ways. For example, the web page shows LogFiles 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.h4j h9h contains a mapping (implemented in a Python dictionary) from r r }r (h3X> contains a mapping (implemented in a Python dictionary) from h4jn ubh)r }r (h3X:class:`LogFile`r h4jn h9hwarnings.logh4j h9hwarnings.logr r }r(h3Uh4jubaubhf)r}r(h3XIn a custom BuildStep, you could instead create a ``warnings`` :class:`LogFile` that contained the same text. To do this, you would add code to your :meth:`createSummary` method that pulls lines from the main output log and creates a new :class:`LogFile` with the results::h4j h9h}r?(h3Uh4j7ubahChubaubhbXD method that pulls lines from the main output log and creates a new r@rA}rB(h3XD method that pulls lines from the main output log and creates a new h4jubh)rC}rD(h3X:class:`LogFile`rEh4jh9h(h3j9hE}r?(hI]hJ]r@(hj;Xpy-classrAehH]hG]hK]uh4j7hP]rBhbXLogFilerCrD}rE(h3Uh4j=ubahChubaubhbX' and attach it to the build by calling rFrG}rH(h3X' and attach it to the build by calling h4jubh)rI}rJ(h3X:meth:`addLog`rKh4jh9h}r?(h3Uh4j7ubahChubaubhbXs 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@rA}rB(h3X\s 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 h4jubh)rC}rD(h3X:class:`BuildStep`rEh4jh9h:meth:`~buildbot.process.buildstep.BuildStep.addCompleteLog()`rh4jh9h(h3Uh4j h9h}r?hj9shChQhE}r@(hI]hJ]hH]hG]rA(j<Uid9rBehK]rC(hheuhNMhOhhX}rDj<j9shP]rE(h[)rF}rG(h3XAdding LogObserversrHh4j=h9hMost 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. You can get a better measure of progress by counting the number of source files compiled or test cases run than by merely tracking the number of bytes that have been written to stdout. This improves the accuracy and the smoothness of the ETA display.h4j=h9h(h3X``sys.maxint``hE}r?(hI]hJ]hH]hG]hK]uh4jhP]r@hbX sys.maxintrArB}rC(h3Uh4j=ubahChubhbX for effective infinity.)rDrE}rF(h3X for effective infinity.)h4jubeubhf)rG}rH(h3XFor 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:h4j=h9hahK]r?hauhNM3hOhhP]r@(h[)rA}rB(h3XUsing PropertiesrCh4j:h9h}hChQhE}r(hI]hJ]hH]hG]r(Ubuildstep-urlsrjehK]rh)auhNMJhOhhX}rjjshP]r(h[)r}r(h3XBuildStep URLsrh4jh9h(hI]hJ]r?(hj:Xpy-methr@ehH]hG]hK]uh4j6hP]rAhbXaddURLrBrC}rD(h3Uh4j<ubahChubaubhbXO method with the name of the link and the target URL. Multiple URLs can be set.rErF}rG(h3XO method with the name of the link and the target URL. Multiple URLs can be set.h4jubeubhf)rH}rI(h3XIn this example, we assume that the ``make test`` command causes a collection of HTML files to be created and put somewhere on the coverage.example.org web server, in a filename that incorporates the build number. ::h4jh9h}hCjf hE}r(hI]hJ]rUadmonition-todorahH]hG]rjahK]uhNMhOhhX}rjjshP]r(h[)r}r(h3XTodorhE}r(hI]hJ]hH]hG]hK]uh4jhP]rhbXTodorr}r(h3jh4jubahCh_ubhf)r}r(h3X7Step Progress BuildStepFailed Running Multiple Commandsrh4jh9hhbXOSo that's the code that we want to wind up using. How do we actually deploy it?r?r@}rA(h3j<h4j:ubaubhf)rB}rC(h3X'You have a couple of different options.rDh4jh9h(hhhG]hH]hI]hJ]hK]uhNMhOhhP]r?hbXkfrom framboozle import Framboozle f = BuildFactory() f.addStep(SVN(svnurl="stuff")) f.addStep(Framboozle())r@rA}rB(h3Uh4j<ubaubhf)rC}rD(h3Xor::rEh4jh9h>> 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']h4jh9h>> 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(h3Uh4jubaubhf)r}r(h3XIn 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.h4jh9h(h3Uh4jh9hhjhhhj+hj{hjBhhhjhjhj hjwhjhhhjP hj hjhjph jNh!j h"jh#h#h$j0 h%j/ h&jh'jh(h(h)jh*jh+jvuhP]r (hAh6eh3UU transformerrNU footnote_refsr}rXframboozle_regr]rjasUrefnamesr}rj]rjasUsymbol_footnotesr]rUautofootnote_refsr]rjaUsymbol_footnote_refsr]rU citationsr]rhOhU current_linerNUtransform_messagesr]r (h0)r!}r"(h3UhE}r#(hI]UlevelKhG]hH]UsourcehhbX-Hyperlink target "index-0" is not referenced.r?r@}rA(h3Uh4j;ubahChjubahCjubh0)rB}rC(h3UhE}rD(hI]UlevelKhG]hH]UsourcehHyperlink target "build-priority-functions" is not referenced.rkrl}rm(h3Uh4jgubahChjubahCjubh0)rn}ro(h3UhE}rp(hI]UlevelKhG]hH]Usourceh]Ufile_insertion_enabledr?U raw_enabledr@KU dump_settingsrANubUsymbol_footnote_startrBKUidsrC}rD(jGjIjjjjj j j j jjj{jwjjhMh6jjjjj0 j1 j j j+j'hhjvjqj5 j0 jNjIjjhhjjhVh6jjjjjrjujjhhjjj?jIja jc jjj j jjjVjYjjjjhhj<j=jpjqjjj>j:j6 j1 h#jjP jL j/ j0 j j jK jG jwjsh(jjBj=uUsubstitution_namesrE}rFhChOhE}rG(hI]hG]hH]Usourceh((UsingleXBuildmaster Config; buildersX cfg-buildersq?h?tq@(UsingleXbuilders (Buildmaster Config)h?h?tqAeuh2Kh3hh]ubcdocutils.nodes target qB)qC}qD(h Uh!hh"h%h'UtargetqEh)}qF(h-]h.]h/]h0]h1]UrefidqGh?uh2Kh3hh]ubhB)qH}qI(h X.. _Builder-Configuration:h!hh"h%Uexpect_referenced_by_nameqJ}h'hEh)}qK(h-]h.]h/]h0]h1]hGhuh2Kh3hUexpect_referenced_by_idqL}qMh?hCsh]ubcdocutils.nodes section qN)qO}qP(h Uh!hh"h%hJ}qQh hHsh'UsectionqRh)}qS(h/]h0]h.]h-]qT(hh?heh1]qU(hh euh2Kh3hhL}qV(hhHh?hCuh]qW(cdocutils.nodes title qX)qY}qZ(h XBuilder Configurationq[h!hOh"h%h'Utitleq\h)}q](h/]h0]h.]h-]h1]uh2Kh3hh]q^h5XBuilder Configurationq_q`}qa(h h[h!hYubaubcdocutils.nodes paragraph qb)qc}qd(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!hOh"h%h'U paragraphqeh)}qf(h/]h0]h.]h-]h1]uh2K h3hh]qg(h5XThe qhqi}qj(h XThe h!hcubcsphinx.addnodes pending_xref qk)ql}qm(h X:bb:cfg:`builders`qnh!hch"h%h'U pending_xrefqoh)}qp(UreftypeXcfgUrefwarnqqU reftargetqrXbuildersU refdomainXbbqsh-]h.]U refexplicith/]h0]h1]UrefdocqtXmanual/cfg-buildersquuh2K h]qvcdocutils.nodes literal qw)qx}qy(h hnh)}qz(h/]h0]q{(Uxrefq|hsXbb-cfgq}eh.]h-]h1]uh!hlh]q~h5Xbuildersqq}q(h Uh!hxubah'Uliteralqubaubh5X 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!hcubhk)q}q(h X%:ref:`the Concepts chapter `qh!hch"h%h'hoh)}q(UreftypeXrefhqhrXbuilderU refdomainXstdqh-]h.]U refexplicith/]h0]h1]hthuuh2K h]qcdocutils.nodes emphasis q)q}q(h hh)}q(h/]h0]q(h|hXstd-refqeh.]h-]h1]uh!hh]qh5Xthe Concepts chapterqq}q(h Uh!hubah'Uemphasisqubaubh5X<. The class definition for the builder configuration is in qq}q(h X<. The class definition for the builder configuration is in h!hcubhw)q}q(h Uh)}q(h-]h.]h/]h0]qXfileqaUrolehh1]uh!hch]qh5Xbuildbot.configqq}q(h Xbuildbot.configh!hubah'hubh5X1. In the configuration file, its use looks like:qq}q(h X1. In the configuration file, its use looks like:h!hcubeubcdocutils.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!hOh"h%h'U literal_blockqh)}q(h+h,h-]h.]h/]h0]h1]uh2Kh3hh]qh5Xfrom buildbot.config import BuilderConfig c['builders'] = [ BuilderConfig(name='quick', slavenames=['bot1', 'bot2'], factory=f_quick), BuilderConfig(name='thorough', slavename='bot1', factory=f_thorough), ]qq}q(h Uh!hubaubhb)q}q(h X8``BuilderConfig`` takes the following keyword arguments:qh!hOh"h%h'heh)}q(h/]h0]h.]h-]h1]uh2Kh3hh]q(hw)q}q(h X``BuilderConfig``h)}q(h/]h0]h.]h-]h1]uh!hh]qh5X BuilderConfigqq}q(h Uh!hubah'hubh5X' takes the following keyword arguments:qq}q(h X' takes the following keyword arguments:h!hubeubcdocutils.nodes definition_list q)q}q(h Uh!hOh"h%h'Udefinition_listqh)}q(h/]h0]h.]h-]h1]uh2Nh3hh]qcdocutils.nodes definition_list_item q)q}q(h XM``name`` This specifies the Builder's name, which is used in status reports. h!hh"h%h'Udefinition_list_itemqh)}q(h/]h0]h.]h-]h1]uh2Kh]q(cdocutils.nodes term q)q}q(h X``name``qh!hh"h%h'Utermqh)}q(h/]h0]h.]h-]h1]uh2Kh]qhw)q}q(h hh)}q(h/]h0]h.]h-]h1]uh!hh]qh5XnameqՅq}q(h Uh!hubah'hubaubcdocutils.nodes definition q)q}q(h Uh)}q(h/]h0]h.]h-]h1]uh!hh]qhb)q}q(h XCThis specifies the Builder's name, which is used in status reports.qh!hh"h%h'heh)}q(h/]h0]h.]h-]h1]uh2Kh]qh5XCThis specifies the Builder's name, which is used in status reports.q⅁q}q(h hh!hubaubah'U definitionqubeubaubhb)q}q(h X ``slavename``qh!hOh"h%h'heh)}q(h/]h0]h.]h-]h1]uh2Kh3hh]qhw)q}q(h hh)}q(h/]h0]h.]h-]h1]uh!hh]qh5X slavenameqq}q(h Uh!hubah'hubaubh)q}q(h Uh!hOh"h%h'hh)}q(h/]h0]h.]h-]h1]uh2Nh3hh]q(h)q}q(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!hh"h%h'hh)}q(h/]h0]h.]h-]h1]uh2K"h]q(h)q}q(h X``slavenames``qh!hh"h%h'hh)}q(h/]h0]h.]h-]h1]uh2K"h]qhw)q}r(h hh)}r(h/]h0]h.]h-]h1]uh!hh]rh5X slavenamesrr}r(h Uh!hubah'hubaubh)r}r(h Uh)}r(h/]h0]h.]h-]h1]uh!hh]r hb)r }r (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!jh"h%h'heh)}r (h/]h0]h.]h-]h1]uh2Kh]r (h5X~These arguments specify the buildslave or buildslaves that will be used by this Builder. All slaves names must appear in the rr}r(h X~These arguments specify the buildslave or buildslaves that will be used by this Builder. All slaves names must appear in the h!j ubhk)r}r(h X:bb:cfg:`slaves`rh!j h"h%h'hoh)}r(UreftypeXcfghqhrXslavesU refdomainXbbrh-]h.]U refexplicith/]h0]h1]hthuuh2Kh]rhw)r}r(h jh)}r(h/]h0]r(h|jXbb-cfgreh.]h-]h1]uh!jh]rh5Xslavesrr}r(h Uh!jubah'hubaubh5XR configuration parameter. Each buildslave can accommodate multiple builders. The r r!}r"(h XR configuration parameter. Each buildslave can accommodate multiple builders. The h!j ubhw)r#}r$(h X``slavenames``h)}r%(h/]h0]h.]h-]h1]uh!j h]r&h5X slavenamesr'r(}r)(h Uh!j#ubah'hubh5X) parameter can be a list of names, while r*r+}r,(h X) parameter can be a list of names, while h!j ubhw)r-}r.(h X ``slavename``h)}r/(h/]h0]h.]h-]h1]uh!j h]r0h5X slavenamer1r2}r3(h Uh!j-ubah'hubh5X can specify only one slave.r4r5}r6(h X can specify only one slave.h!j ubeubah'hubeubh)r7}r8(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!hh"h%h'hh)}r9(h/]h0]h.]h-]h1]uh2K'h3hh]r:(h)r;}r<(h X ``factory``r=h!j7h"h%h'hh)}r>(h/]h0]h.]h-]h1]uh2K'h]r?hw)r@}rA(h j=h)}rB(h/]h0]h.]h-]h1]uh!j;h]rCh5XfactoryrDrE}rF(h Uh!j@ubah'hubaubh)rG}rH(h Uh)}rI(h/]h0]h.]h-]h1]uh!j7h]rJhb)rK}rL(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!jGh"h%h'heh)}rM(h/]h0]h.]h-]h1]uh2K%h]rN(h5X This is a rOrP}rQ(h X This is a h!jKubhk)rR}rS(h X.:class:`buildbot.process.factory.BuildFactory`rTh!jKh"h%h'hoh)}rU(UreftypeXclasshqhrX%buildbot.process.factory.BuildFactoryU refdomainXpyrVh-]h.]U refexplicith/]h0]h1]hthuUpy:classrWNU py:modulerXNuh2K%h]rYhw)rZ}r[(h jTh)}r\(h/]h0]r](h|jVXpy-classr^eh.]h-]h1]uh!jRh]r_h5X%buildbot.process.factory.BuildFactoryr`ra}rb(h Uh!jZubah'hubaubh5X instance which controls how the build is performed by defining the steps in the build. Full details appear in their own section, rcrd}re(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!jKubhk)rf}rg(h X:ref:`Build-Factories`rhh!jKh"h%h'hoh)}ri(UreftypeXrefhqhrXbuild-factoriesU refdomainXstdrjh-]h.]U refexplicith/]h0]h1]hthuuh2K%h]rkh)rl}rm(h jhh)}rn(h/]h0]ro(h|jjXstd-refrpeh.]h-]h1]uh!jfh]rqh5XBuild-Factoriesrrrs}rt(h Uh!jlubah'hubaubh5X.ru}rv(h X.h!jKubeubah'hubeubeubhb)rw}rx(h X9Other optional keys may be set on each ``BuilderConfig``:ryh!hOh"h%h'heh)}rz(h/]h0]h.]h-]h1]uh2K)h3hh]r{(h5X'Other optional keys may be set on each r|r}}r~(h X'Other optional keys may be set on each h!jwubhw)r}r(h X``BuilderConfig``h)}r(h/]h0]h.]h-]h1]uh!jwh]rh5X BuilderConfigrr}r(h Uh!jubah'hubh5X:r}r(h X:h!jwubeubh)r}r(h Uh!hOh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2Nh3hh]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'hh)}r(h/]h0]h.]h-]h1]uh2K/h]r(h)r}r(h X ``builddir``rh!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2K/h]rhw)r}r(h jh)}r(h/]h0]h.]h-]h1]uh!jh]rh5Xbuilddirrr}r(h Uh!jubah'hubaubh)r}r(h Uh)}r(h/]h0]h.]h-]h1]uh!jh]rhb)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'heh)}r(h/]h0]h.]h-]h1]uh2K,h]rh5X&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'hubeubh)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'hh)}r(h/]h0]h.]h-]h1]uh2K8h3hh]r(h)r}r(h X``slavebuilddir``rh!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2K8h]rhw)r}r(h jh)}r(h/]h0]h.]h-]h1]uh!jh]rh5X slavebuilddirrr}r(h Uh!jubah'hubaubh)r}r(h Uh)}r(h/]h0]h.]h-]h1]uh!jh]rhb)r}r(h XSpecifies 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'heh)}r(h/]h0]h.]h-]h1]uh2K2h]r(h5XSpecifies 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 rr}r(h XSpecifies 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 h!jubhw)r}r(h X ``builddir``h)}r(h/]h0]h.]h-]h1]uh!jh]rh5Xbuilddirrr}r(h Uh!jubah'hubh5XC. If a slave is connected to multiple builders that share the same rr}r(h XC. If a slave is connected to multiple builders that share the same h!jubhw)r}r(h X``slavebuilddir``h)}r(h/]h0]h.]h-]h1]uh!jh]rh5X slavebuilddirrr}r(h Uh!jubah'hubh5X, 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.rr}r(h X, 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!jubeubah'hubeubh)r}r(h XJ``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. h!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2KCh3hh]r(h)r}r(h X ``category``rh!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2KCh]rhw)r}r(h jh)}r(h/]h0]h.]h-]h1]uh!jh]rh5Xcategoryrr}r(h Uh!jubah'hubaubh)r}r(h Uh)}r(h/]h0]h.]h-]h1]uh!jh]rhb)r}r(h X<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.rh!jh"h%h'heh)}r(h/]h0]h.]h-]h1]uh2K;h]rh5X<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.rr}r(h jh!jubaubah'hubeubh)r}r(h X``nextSlave`` If 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:`BuildSlave` objects. The function should return one of the :class:`BuildSlave` objects, or ``None`` if none of the available slaves should be used. The function can optionally return a Deferred, which should fire with the same results. h!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2KLh3hh]r(h)r}r(h X ``nextSlave``rh!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2KLh]rhw)r}r(h jh)}r(h/]h0]h.]h-]h1]uh!jh]rh5X nextSlaverr}r(h Uh!jubah'hubaubh)r}r(h Uh)}r(h/]h0]h.]h-]h1]uh!jh]rhb)r}r(h XIf 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:`BuildSlave` objects. The function should return one of the :class:`BuildSlave` objects, or ``None`` if none of the available slaves should be used. The function can optionally return a Deferred, which should fire with the same results.h!jh"h%h'heh)}r (h/]h0]h.]h-]h1]uh2KFh]r (h5XIf provided, this is a function that controls which slave will be assigned future jobs. The function is passed two arguments, the r r }r (h XIf provided, this is a function that controls which slave will be assigned future jobs. The function is passed two arguments, the h!jubhk)r}r(h X:class:`Builder`rh!jh"h%h'hoh)}r(UreftypeXclasshqhrXBuilderU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KFh]rhw)r}r(h jh)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!jh]rh5XBuilderrr}r(h Uh!jubah'hubaubh5X4 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!jubhk)r }r!(h X:class:`BuildSlave`r"h!jh"h%h'hoh)}r#(UreftypeXclasshqhrX BuildSlaveU refdomainXpyr$h-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KFh]r%hw)r&}r'(h j"h)}r((h/]h0]r)(h|j$Xpy-classr*eh.]h-]h1]uh!j h]r+h5X BuildSlaver,r-}r.(h Uh!j&ubah'hubaubh5X0 objects. The function should return one of the r/r0}r1(h X0 objects. The function should return one of the h!jubhk)r2}r3(h X:class:`BuildSlave`r4h!jh"h%h'hoh)}r5(UreftypeXclasshqhrX BuildSlaveU refdomainXpyr6h-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KFh]r7hw)r8}r9(h j4h)}r:(h/]h0]r;(h|j6Xpy-classr<eh.]h-]h1]uh!j2h]r=h5X BuildSlaver>r?}r@(h Uh!j8ubah'hubaubh5X objects, or rArB}rC(h X objects, or h!jubhw)rD}rE(h X``None``h)}rF(h/]h0]h.]h-]h1]uh!jh]rGh5XNonerHrI}rJ(h Uh!jDubah'hubh5X if none of the available slaves should be used. The function can optionally return a Deferred, which should fire with the same results.rKrL}rM(h X if none of the available slaves should be used. The function can optionally return a Deferred, which should fire with the same results.h!jubeubah'hubeubh)rN}rO(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'hh)}rP(h/]h0]h.]h-]h1]uh2KUh3hh]rQ(h)rR}rS(h X ``nextBuild``rTh!jNh"h%h'hh)}rU(h/]h0]h.]h-]h1]uh2KUh]rVhw)rW}rX(h jTh)}rY(h/]h0]h.]h-]h1]uh!jRh]rZh5X nextBuildr[r\}r](h Uh!jWubah'hubaubh)r^}r_(h Uh)}r`(h/]h0]h.]h-]h1]uh!jNh]rahb)rb}rc(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!j^h"h%h'heh)}rd(h/]h0]h.]h-]h1]uh2KOh]re(h5XIf provided, this is a function that controls which build request will be handled next. The function is passed two arguments, the rfrg}rh(h XIf provided, this is a function that controls which build request will be handled next. The function is passed two arguments, the h!jbubhk)ri}rj(h X:class:`Builder`rkh!jbh"h%h'hoh)}rl(UreftypeXclasshqhrXBuilderU refdomainXpyrmh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KOh]rnhw)ro}rp(h jkh)}rq(h/]h0]rr(h|jmXpy-classrseh.]h-]h1]uh!jih]rth5XBuilderrurv}rw(h Uh!joubah'hubaubh5X4 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!jbubhk)r{}r|(h X:class:`BuildRequest`r}h!jbh"h%h'hoh)}r~(UreftypeXclasshqhrX BuildRequestU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KOh]rhw)r}r(h j}h)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!j{h]rh5X BuildRequestrr}r(h Uh!jubah'hubaubh5XB 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!jbubhk)r}r(h X:class:`BuildRequest`rh!jbh"h%h'hoh)}r(UreftypeXclasshqhrX BuildRequestU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KOh]rhw)r}r(h jh)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!jh]rh5X BuildRequestrr}r(h Uh!jubah'hubaubh5X objects, or rr}r(h X objects, or h!jbubhw)r}r(h X``None``h)}r(h/]h0]h.]h-]h1]uh!jbh]rh5XNonerr}r(h Uh!jubah'hubh5X 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!jbubeubah'hubeubh)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'hh)}r(h/]h0]h.]h-]h1]uh2K]h3hh]r(h)r}r(h X``canStartBuild``rh!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2K]h]rhw)r}r(h jh)}r(h/]h0]h.]h-]h1]uh!jh]rh5X canStartBuildrr}r(h Uh!jubah'hubaubh)r}r(h Uh)}r(h/]h0]h.]h-]h1]uh!jh]rhb)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!jh"h%h'heh)}r(h/]h0]h.]h-]h1]uh2KXh]r(h5XIf 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 rr}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!jubhk)r}r(h X:class:`Builder`rh!jh"h%h'hoh)}r(UreftypeXclasshqhrXBuilderU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KXh]rhw)r}r(h jh)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!jh]rh5XBuilderrr}r(h Uh!jubah'hubaubh5X, a rr}r(h X, a h!jubhk)r}r(h X:class:`BuildSlave`rh!jh"h%h'hoh)}r(UreftypeXclasshqhrX BuildSlaveU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KXh]rhw)r}r(h jh)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!jh]rh5X BuildSlaverr}r(h Uh!jubah'hubaubh5X, and a rr}r(h X, and a h!jubhk)r}r(h X:class:`BuildRequest`rh!jh"h%h'hoh)}r(UreftypeXclasshqhrX BuildRequestU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2KXh]rhw)r}r(h jh)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!jh]rh5X BuildRequestrr}r(h Uh!jubah'hubaubh5X. The function should return rr}r(h X. The function should return h!jubhw)r}r(h X``True``h)}r(h/]h0]h.]h-]h1]uh!jh]rh5XTruerr}r(h Uh!jubah'hubh5X& if the combination is acceptable, or rr}r(h X& if the combination is acceptable, or h!jubhw)r}r(h X ``False``h)}r(h/]h0]h.]h-]h1]uh!jh]rh5XFalserr }r (h Uh!jubah'hubh5Xc otherwise. This function can optionally return a Deferred which should fire with the same results.r r }r (h Xc otherwise. This function can optionally return a Deferred which should fire with the same results.h!jubeubah'hubeubh)r}r(h Xe``locks`` This argument specifies a list of locks that apply to this builder; see :ref:`Interlocks`. h!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2Kah3hh]r(h)r}r(h X ``locks``rh!jh"h%h'hh)}r(h/]h0]h.]h-]h1]uh2Kah]rhw)r}r(h jh)}r(h/]h0]h.]h-]h1]uh!jh]rh5Xlocksrr}r(h Uh!jubah'hubaubh)r}r(h Uh)}r (h/]h0]h.]h-]h1]uh!jh]r!hb)r"}r#(h XZThis argument specifies a list of locks that apply to this builder; see :ref:`Interlocks`.h!jh"h%h'heh)}r$(h/]h0]h.]h-]h1]uh2K`h]r%(h5XHThis argument specifies a list of locks that apply to this builder; see r&r'}r((h XHThis argument specifies a list of locks that apply to this builder; see h!j"ubhk)r)}r*(h X:ref:`Interlocks`r+h!j"h"h%h'hoh)}r,(UreftypeXrefhqhrX interlocksU refdomainXstdr-h-]h.]U refexplicith/]h0]h1]hthuuh2K`h]r.h)r/}r0(h j+h)}r1(h/]h0]r2(h|j-Xstd-refr3eh.]h-]h1]uh!j)h]r4h5X Interlocksr5r6}r7(h Uh!j/ubah'hubaubh5X.r8}r9(h X.h!j"ubeubah'hubeubh)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'}), ] h!jh"h%h'hh)}r<(h/]h0]h.]h-]h1]uh2Kwh3hh]r=(h)r>}r?(h X``env``r@h!j:h"h%h'hh)}rA(h/]h0]h.]h-]h1]uh2Kwh]rBhw)rC}rD(h j@h)}rE(h/]h0]h.]h-]h1]uh!j>h]rFh5XenvrGrH}rI(h Uh!jCubah'hubaubh)rJ}rK(h Uh)}rL(h/]h0]h.]h-]h1]uh!j:h]rM(hb)rN}rO(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!jJh"h%h'heh)}rP(h/]h0]h.]h-]h1]uh2Kdh]rQ(h5XjA Builder may be given a dictionary of environment variables in this parameter. The variables are used in rRrS}rT(h XjA Builder may be given a dictionary of environment variables in this parameter. The variables are used in h!jNubhk)rU}rV(h X:bb:step:`ShellCommand`rWh!jNh"h%h'hoh)}rX(UreftypeXstephqhrX ShellCommandU refdomainXbbrYh-]h.]U refexplicith/]h0]h1]hthuuh2Kdh]rZhw)r[}r\(h jWh)}r](h/]h0]r^(h|jYXbb-stepr_eh.]h-]h1]uh!jUh]r`h5X ShellCommandrarb}rc(h Uh!j[ubah'hubaubh5X steps in builds created by this builder. The environment variables will override anything in the buildslave's environment. Variables passed directly to a rdre}rf(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!jNubhk)rg}rh(h X:class:`ShellCommand`rih!jNh"h%h'hoh)}rj(UreftypeXclasshqhrX ShellCommandU refdomainXpyrkh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2Kdh]rlhw)rm}rn(h jih)}ro(h/]h0]rp(h|jkXpy-classrqeh.]h-]h1]uh!jgh]rrh5X ShellCommandrsrt}ru(h Uh!jmubah'hubaubh5X@ will override variables of the same name passed to the Builder.rvrw}rx(h X@ will override variables of the same name passed to the Builder.h!jNubeubhb)ry}rz(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!jJh"h%h'heh)}r{(h/]h0]h.]h-]h1]uh2Kjh]r|(h5X`For example, if you have a pool of identical slaves it is often easier to manage variables like r}r~}r(h X`For example, if you have a pool of identical slaves it is often easier to manage variables like h!jyubh9)r}r(h Uh)}r(h-]h.]h/]h0]h1]Uentriesr]r((UsinglerXPATHrUindex-0rUtr(jXenvironment variable; PATHjUtreuh!jyh]h'hr?}r@(h Uh!j:ubah'hubaubh)rA}rB(h Uh)}rC(h/]h0]h.]h-]h1]uh!j1h]rDhb)rE}rF(h XlA builder may be given an arbitrary description, which will show up in the web status on the builder's page.rGh!jAh"h%h'heh)}rH(h/]h0]h.]h-]h1]uh2Kh]rIh5XlA builder may be given an arbitrary description, which will show up in the web status on the builder's page.rJrK}rL(h jGh!jEubaubah'hubeubeubh9)rM}rN(h Uh!hOh"h%h'h`.h!jZh"h%h'heh)}rt(h/]h0]h.]h-]h1]uh2Kh3hh]ru(h5XPRequests are only candidated for a merge if both requests have exactly the same rvrw}rx(h XPRequests are only candidated for a merge if both requests have exactly the same h!jrubhk)ry}rz(h X:ref:`codebases`r{h!jrh"h%h'hoh)}r|(UreftypeXrefhqhrX attr-codebaseU refdomainXstdr}h-]h.]U refexplicith/]h0]h1]hthuuh2Kh]r~h)r}r(h j{h)}r(h/]h0]r(h|j}Xstd-refreh.]h-]h1]uh!jyh]rh5X codebasesrr}r(h Uh!jubah'hubaubh5X.r}r(h X.h!jrubeubhb)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!jZh"h%h'heh)}r(h/]h0]h.]h-]h1]uh2Kh3hh]r(h5X4This behavior can be controlled globally, using the rr}r(h X4This behavior can be controlled globally, using the h!jubhk)r}r(h X:bb:cfg:`mergeRequests`rh!jh"h%h'hoh)}r(UreftypeXcfghqhrX mergeRequestsU refdomainXbbrh-]h.]U refexplicith/]h0]h1]hthuuh2Kh]rhw)r}r(h jh)}r(h/]h0]r(h|jXbb-cfgreh.]h-]h1]uh!jh]rh5X mergeRequestsrr}r(h Uh!jubah'hubaubh5X parameter, and on a per-rr}r(h X parameter, and on a per-h!jubhk)r}r(h X:class:`Builder`rh!jh"h%h'hoh)}r(UreftypeXclasshqhrXBuilderU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2Kh]rhw)r}r(h jh)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!jh]rh5XBuilderrr}r(h Uh!jubah'hubaubh5X basis, using the rr}r(h X basis, using the h!jubhw)r}r(h X``mergeRequests``h)}r(h/]h0]h.]h-]h1]uh!jh]rh5X mergeRequestsrr}r(h Uh!jubah'hubh5X argument to the rr}r(h X argument to the h!jubhk)r}r(h X:class:`Builder`rh!jh"h%h'hoh)}r(UreftypeXclasshqhrXBuilderU refdomainXpyrh-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2Kh]rhw)r}r(h jh)}r(h/]h0]r(h|jXpy-classreh.]h-]h1]uh!jh]rh5XBuilderrr}r(h Uh!jubah'hubaubh5X configuration. If rr}r(h X configuration. If h!jubhw)r}r(h X``mergeRequests``h)}r(h/]h0]h.]h-]h1]uh!jh]rh5X mergeRequestsrr}r(h Uh!jubah'hubh5X< is given, it completely overrides the global configuration.rr}r(h X< is given, it completely overrides the global configuration.h!jubeubhb)r}r(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!jZh"h%h'heh)}r(h/]h0]h.]h-]h1]uh2Kh3hh]r(h5X/For either configuration parameter, a value of rr}r(h X/For either configuration parameter, a value of h!jubhw)r}r(h X``True``h)}r(h/]h0]h.]h-]h1]uh!jh]rh5XTruerr}r(h Uh!jubah'hubh5X} (the default) causes buildbot to merge BuildRequests that have "compatible" source stamps. Source stamps are compatible if:rr}r(h X} (the default) causes buildbot to merge BuildRequests that have "compatible" source stamps. Source stamps are compatible if:h!jubeubcdocutils.nodes bullet_list r)r}r(h Uh!jZh"h%h'U bullet_listrh)}r(UbulletrX*h-]h.]h/]h0]h1]uh2Kh3hh]r(cdocutils.nodes list_item r)r}r(h XItheir codebase, branch, project, and repository attributes match exactly;rh!jh"h%h'U list_itemrh)}r(h/]h0]h.]h-]h1]uh2Nh3hh]rhb)r}r(h jh!jh"h%h'heh)}r(h/]h0]h.]h-]h1]uh2Kh]rh5XItheir codebase, branch, project, and repository attributes match exactly;rr}r(h jh!jubaubaubj)r}r(h XBneither source stamp has a patch (e.g., from a try scheduler); andrh!jh"h%h'jh)}r(h/]h0]h.]h-]h1]uh2Nh3hh]rhb)r}r(h jh!jh"h%h'heh)}r(h/]h0]h.]h-]h1]uh2Kh]r h5XBneither source stamp has a patch (e.g., from a try scheduler); andr r }r (h jh!jubaubaubj)r }r(h Xeither both source stamps are associated with changes, or neither ar associated with changes but they have matching revisions. h!jh"h%h'jh)}r(h/]h0]h.]h-]h1]uh2Nh3hh]rhb)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'heh)}r(h/]h0]h.]h-]h1]uh2Kh]rh5X~either both source stamps are associated with changes, or neither ar associated with changes but they have matching revisions.rr}r(h jh!jubaubaubeubhb)r}r(h XYThis algorithm is implemented by the :class:`SourceStamp` method :func:`canBeMergedWith`.rh!jZh"h%h'heh)}r(h/]h0]h.]h-]h1]uh2Kh3hh]r(h5X%This algorithm is implemented by the rr}r (h X%This algorithm is implemented by the h!jubhk)r!}r"(h X:class:`SourceStamp`r#h!jh"h%h'hoh)}r$(UreftypeXclasshqhrX SourceStampU refdomainXpyr%h-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2Kh]r&hw)r'}r((h j#h)}r)(h/]h0]r*(h|j%Xpy-classr+eh.]h-]h1]uh!j!h]r,h5X SourceStampr-r.}r/(h Uh!j'ubah'hubaubh5X method r0r1}r2(h X method h!jubhk)r3}r4(h X:func:`canBeMergedWith`r5h!jh"h%h'hoh)}r6(UreftypeXfunchqhrXcanBeMergedWithU refdomainXpyr7h-]h.]U refexplicith/]h0]h1]hthujWNjXNuh2Kh]r8hw)r9}r:(h j5h)}r;(h/]h0]r<(h|j7Xpy-funcr=eh.]h-]h1]uh!j3h]r>h5XcanBeMergedWithr?r@}rA(h Uh!j9ubah'hubaubh5X.rB}rC(h X.h!jubeubhb)rD}rE(h XRA configuration value of ``False`` indicates that requests should never be merged.h!jZh"h%h'heh)}rF(h/]h0]h.]h-]h1]uh2Kh3hh]rG(h5XA configuration value of rHrI}rJ(h XA configuration value of h!jDubhw)rK}rL(h X ``False``h)}rM(h/]h0]h.]h-]h1]uh!jDh]rNh5XFalserOrP}rQ(h Uh!jKubah'hubh5X0 indicates that requests should never be merged.rRrS}rT(h X0 indicates that requests should never be merged.h!jDubeubhb)rU}rV(h XThe configuration value can also be a callable, specifying a custom merging function. See :ref:`Merge-Request-Functions` for details.h!jZh"h%h'heh)}rW(h/]h0]h.]h-]h1]uh2Kh3hh]rX(h5X[The configuration value can also be a callable, specifying a custom merging function. See rYrZ}r[(h X[The configuration value can also be a callable, specifying a custom merging function. See h!jUubhk)r\}r](h X:ref:`Merge-Request-Functions`r^h!jUh"h%h'hoh)}r_(UreftypeXrefhqhrXmerge-request-functionsU refdomainXstdr`h-]h.]U refexplicith/]h0]h1]hthuuh2Kh]rah)rb}rc(h j^h)}rd(h/]h0]re(h|j`Xstd-refrfeh.]h-]h1]uh!j\h]rgh5XMerge-Request-Functionsrhri}rj(h Uh!jbubah'hubaubh5X for details.rkrl}rm(h X for details.h!jUubeubh9)rn}ro(h Uh!jZh"h%h'h}r?(h Uh!j9ubah'heubah'jubj)r@}rA(h Uh)}rB(h/]UlevelKh-]h.]Usourceh%h0]h1]UlineKUtypejuh]rChb)rD}rE(h Uh)}rF(h/]h0]h.]h-]h1]uh!j@h]rGh5X-Hyperlink target "index-4" is not referenced.rHrI}rJ(h Uh!jDubah'heubah'jubj)rK}rL(h Uh)}rM(h/]UlevelKh-]h.]Usourceh%h0]h1]UlineKUtypejuh]rNhb)rO}rP(h Uh)}rQ(h/]h0]h.]h-]h1]uh!jKh]rRh5X9Hyperlink target "prioritizing-builds" is not referenced.rSrT}rU(h Uh!jOubah'heubah'jubeUreporterrVNUid_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_classesrqNh\NUerror_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_sourcerUT/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-builders.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]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(h?hOhjZhjZhj{hhOjrj{hj{jjjjjjjQjZhhOuUsubstitution_namesr}rh'h3h)}r(h/]h-]h.]Usourceh%h0]h1]uU footnotesr]rUrefidsr}r(h?]rhCah]rjVajr]rjtah]rjwaj]rjaj]rjajQ]rjSah]rhHauub.PKJtDbNKDXDX:buildbot-v0.8.8/.doctrees/manual/cfg-statustargets.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xurl-decorating optionsqNX change-hooksqX%buildbot.status.web.baseweb.WebStatusqXdisplay-specific optionsq NXstatus targetsq NU1Xgoogle code hookq NX pyopensslq Xirc botq NX change hooksqNXauthenticationqNU2Xlogging configurationqNXhttpstatuspushqNX pblistenerqNXstatus-targetsqX authorizationqX webstatusqNX"webstatus configuration parametersqNXmailnotifier argumentsqNXchangecommentlinkqNXbuildbot.status.words.IRCqX github hookqNXgerritstatuspushqNX,http-based authentication by frontend serverqNX&buildbot.status.status_push.StatusPushqXhttp connectionqNX configurationqNXprojectsq NXbuildbot web resourcesq!NX!buildbot.status.mail.MailNotifierq"X poller hookq#NX.buildbot.status.status_gerrit.GerritStatusPushq$X documentationq%X repositoriesq&NX!buildbot.status.client.PBListenerq'X statuspushq(NX mailnotifierq)NXrevlinkq*NuUsubstitution_defsq+}q,Uparse_messagesq-]q.cdocutils.nodes system_message q/)q0}q1(U rawsourceq2UUparentq3cdocutils.nodes section q4)q5}q6(h2UU referencedq7Kh3h4)q8}q9(h2Uh3h4)q:}q;(h2Uh3h4)q<}q=(h2Uh3hUsourceq>cdocutils.nodes reprunicode q?XY/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-statustargets.rstq@qA}qBbUexpect_referenced_by_nameqC}qDhcdocutils.nodes target qE)qF}qG(h2X.. _Status-Targets:h3hh>hAhC}UtagnameqHUtargetqIU attributesqJ}qK(UidsqL]UbackrefsqM]UdupnamesqN]UclassesqO]UnamesqP]UrefidqQUstatus-targetsqRuUlineqSKUdocumentqThUexpect_referenced_by_idqU}qVX cfg-statusqWhE)qX}qY(h2Uh3hh>hAhHhIhJ}qZ(hL]hM]hN]hO]hP]hQhWuhSKhThUchildrenq[]ubsh[]ubshHUsectionq\hJ}q](hN]hO]hM]hL]q^(hRhWUid1q_ehP]q`(h heuhSKhThhU}qa(hWhXhRhFuh[]qb(cdocutils.nodes title qc)qd}qe(h2XStatus Targetsqfh3hhAhHUtitleqghJ}qh(hN]hO]hM]hL]hP]uhSKhThh[]qicdocutils.nodes Text qjXStatus Targetsqkql}qm(h2hfh3hdubaubcdocutils.nodes paragraph qn)qo}qp(h2XThe 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::h3hhAhHU paragraphqqhJ}qr(hN]hO]hM]hL]hP]uhSKhThh[]qs(hjXoThe Buildmaster has a variety of ways to present build status to various users. Each such delivery method is a qtqu}qv(h2XoThe Buildmaster has a variety of ways to present build status to various users. Each such delivery method is a h3houbcdocutils.nodes title_reference qw)qx}qy(h2X`Status Target`hJ}qz(hN]hO]hM]hL]hP]uh3hoh[]q{hjX Status Targetq|q}}q~(h2Uh3hxubahHUtitle_referencequbhjX object in the configuration's qq}q(h2X object in the configuration's h3houbcsphinx.addnodes pending_xref q)q}q(h2X:bb:cfg:`status`qh3hoh>hAhHU pending_xrefqhJ}q(UreftypeXcfgUrefwarnqU reftargetqXstatusU refdomainXbbqhL]hM]U refexplicithN]hO]hP]UrefdocqXmanual/cfg-statustargetsquhSKh[]qcdocutils.nodes literal q)q}q(h2hhJ}q(hN]hO]q(UxrefqhXbb-cfgqehM]hL]hP]uh3hh[]qhjXstatusqq}q(h2Uh3hubahHUliteralqubaubhjXH list. To add status targets, you just append more objects to this list:qq}q(h2XH list. To add status targets, you just append more objects to this list:h3houbeubcdocutils.nodes literal_block q)q}q(h2Xzc['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"}]))h3hhAhHU literal_blockqhJ}q(U xml:spaceqUpreserveqhL]hM]hN]hO]hP]uhSK hThh[]qhjXzc['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"}]))qq}q(h2Uh3hubaubhn)q}q(h2XMost 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.h3hhAhHhqhJ}q(hN]hO]hM]hL]hP]uhSKhThh[]q(hjX$Most status delivery objects take a qq}q(h2X$Most status delivery objects take a h3hubh)q}q(h2X``categories=``hJ}q(hN]hO]hM]hL]hP]uh3hh[]qhjX categories=qq}q(h2Uh3hubahHhubhjX' argument, which can contain a list of qq}q(h2X' argument, which can contain a list of h3hubhw)q}q(h2X `category`hJ}q(hN]hO]hM]hL]hP]uh3hh[]qhjXcategoryqq}q(h2Uh3hubahHhubhjXd names: in this case, it will only show status for Builders that are in one of the named categories.qq}q(h2Xd names: in this case, it will only show status for Builders that are in one of the named categories.h3hubeubcdocutils.nodes note q)q}q(h2X8Implementation 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.h3hhAhHUnoteqhJ}q(hN]hO]hM]hL]hP]uhSNhThh[]q(hn)q}q(h2XImplementation Noteqh3hh>hAhHhqhJ}q(hN]hO]hM]hL]hP]uhSK"h[]qhjXImplementation Noteqυq}q(h2hh3hubaubhn)q}q(h2X#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.h3hh>hAhHhqhJ}q(hN]hO]hM]hL]hP]uhSK$h[]q(hjX"Each of these objects should be a qօq}q(h2X"Each of these objects should be a h3hubh)q}q(h2X:class:`service.MultiService`qh3hh>hAhHhhJ}q(UreftypeXclasshhXservice.MultiServiceU refdomainXpyqhL]hM]U refexplicithN]hO]hP]hhUpy:classqNU py:moduleqNuhSK$h[]qh)q}q(h2hhJ}q(hN]hO]q(hhXpy-classqehM]hL]hP]uh3hh[]qhjXservice.MultiServiceq煁q}q(h2Uh3hubahHhubaubhjXg which will be attached to the BuildMaster object when the configuration is processed. They should use qꅁq}q(h2Xg which will be attached to the BuildMaster object when the configuration is processed. They should use h3hubh)q}q(h2X``self.parent.getStatus()``hJ}q(hN]hO]hM]hL]hP]uh3hh[]qhjXself.parent.getStatus()qq}q(h2Uh3hubahHhubhjX to get access to the top-level qq}q(h2X to get access to the top-level h3hubh)q}q(h2X:class:`IStatus`qh3hh>hAhHhhJ}q(UreftypeXclasshhXIStatusU refdomainXpyqhL]hM]U refexplicithN]hO]hP]hhhNhNuhSK$h[]qh)q}q(h2hhJ}q(hN]hO]r(hhXpy-classrehM]hL]hP]uh3hh[]rhjXIStatusrr}r(h2Uh3hubahHhubaubhjX object, either inside rr}r(h2X object, either inside h3hubh)r }r (h2X:meth:`startService`r h3hh>hAhHhhJ}r (UreftypeXmethhhX startServiceU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSK$h[]rh)r}r(h2j hJ}r(hN]hO]r(hj Xpy-methrehM]hL]hP]uh3j h[]rhjX startServicerr}r(h2Uh3jubahHhubaubhjX or later. They may call rr}r(h2X or later. They may call h3hubh)r}r(h2X:meth:`status.subscribe()`rh3hh>hAhHhhJ}r(UreftypeXmethhhXstatus.subscribeU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSK$h[]r h)r!}r"(h2jhJ}r#(hN]hO]r$(hjXpy-methr%ehM]hL]hP]uh3jh[]r&hjXstatus.subscriber'r(}r)(h2Uh3j!ubahHhubaubhjX in r*r+}r,(h2X in h3hubh)r-}r.(h2X:meth:`startService`r/h3hh>hAhHhhJ}r0(UreftypeXmethhhX startServiceU refdomainXpyr1hL]hM]U refexplicithN]hO]hP]hhhNhNuhSK$h[]r2h)r3}r4(h2j/hJ}r5(hN]hO]r6(hj1Xpy-methr7ehM]hL]hP]uh3j-h[]r8hjX startServicer9r:}r;(h2Uh3j3ubahHhubaubhjXL to receive notifications of builder events, in which case they must define r<r=}r>(h2XL to receive notifications of builder events, in which case they must define h3hubh)r?}r@(h2X:meth:`builderAdded`rAh3hh>hAhHhhJ}rB(UreftypeXmethhhX builderAddedU refdomainXpyrChL]hM]U refexplicithN]hO]hP]hhhNhNuhSK$h[]rDh)rE}rF(h2jAhJ}rG(hN]hO]rH(hjCXpy-methrIehM]hL]hP]uh3j?h[]rJhjX builderAddedrKrL}rM(h2Uh3jEubahHhubaubhjX, and related methods. See the docstrings in rNrO}rP(h2X, and related methods. See the docstrings in h3hubh)rQ}rR(h2UhJ}rS(hL]hM]hN]hO]rTXfilerUaUrolejUhP]uh3hh[]rVhjXbuildbot/interfaces.pyrWrX}rY(h2Xbuildbot/interfaces.pyh3jQubahHhubhjX for full details.rZr[}r\(h2X for full details.h3hubeubeubhn)r]}r^(h2XThe remainder of this section describes each built-in status target. A full list of status targets is available in the :bb:index:`status`.h3hhAhHhqhJ}r_(hN]hO]hM]hL]hP]uhSK,hThh[]r`(hjXxThe remainder of this section describes each built-in status target. A full list of status targets is available in the rarb}rc(h2XxThe remainder of this section describes each built-in status target. A full list of status targets is available in the h3j]ubh)rd}re(h2X:bb:index:`status`rfh3j]h>hAhHhhJ}rg(UreftypeXindexhhXstatusU refdomainXbbrhhL]hM]U refexplicithN]hO]hP]hhuhSK,h[]rih)rj}rk(h2jfhJ}rl(hN]hO]rm(hjhXbb-indexrnehM]hL]hP]uh3jdh[]rohjXstatusrprq}rr(h2Uh3jjubahHhubaubhjX.rs}rt(h2X.h3j]ubeubcsphinx.addnodes index ru)rv}rw(h2Uh3hhAhHUindexrxhJ}ry(hL]hM]hN]hO]hP]Uentries]rz((UsingleXStatus Targets; WebStatusXstatus-WebStatusr{j{tr|(UsingleXWebStatus Status Targetj{j{tr}euhSK0hThh[]ubhE)r~}r(h2Uh3hhAhHhIhJ}r(hL]hM]hN]hO]hP]hQj{uhSK0hThh[]ubh:h4)r}r(h2Uh3hhAhC}hHh\hJ}r(hN]hO]hM]hL]r(U mailnotifierrUindex-0rehP]rh)auhSM2hThhU}rjhE)r}r(h2Uh3h4)r}r(h2Uh3h4)r}r(h2Uh3h:h>hAhC}rhhE)r}r(h2X.. _Change-Hooks:h3h4)r}r(h2Uh3h8h>hAhHh\hJ}r(hN]hO]hM]hL]rUdisplay-specific-optionsrahP]rh auhSMhThh[]r(hc)r}r(h2XDisplay-Specific Optionsrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXDisplay-Specific Optionsrr}r(h2jh3jubaubhn)r}r(h2XtThe ``order_console_by_time`` option affects the rendering of the console; see the description of the console above.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X``order_console_by_time``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXorder_console_by_timerr}r(h2Uh3jubahHhubhjXW option affects the rendering of the console; see the description of the console above.rr}r(h2XW option affects the rendering of the console; see the description of the console above.h3jubeubhn)r}r(h2XThe ``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``.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X ``numbuilds``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX numbuildsrr}r(h2Uh3jubahHhubhjX| option determines the number of builds that most status displays will show. It can usually be overriden in the URL, e.g., rr}r(h2X| option determines the number of builds that most status displays will show. It can usually be overriden in the URL, e.g., h3jubh)r}r(h2X``?numbuilds=13``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX ?numbuilds=13rr}r(h2Uh3jubahHhubhjX.r}r(h2X.h3jubeubhn)r}r(h2XThe ``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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X``num_events``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX num_eventsrr}r(h2Uh3jubahHhubhjXQ option gives the default number of events that the waterfall will display. The rr}r(h2XQ option gives the default number of events that the waterfall will display. The h3jubh)r}r(h2X``num_events_max``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXnum_events_maxrr}r(h2Uh3jubahHhubhjXU gives the maximum number of events displayed, even if the web browser requests more.rr}r(h2XU gives the maximum number of events displayed, even if the web browser requests more.h3jubeubjeubh>hAhHhIhJ}r(hL]hM]hN]hO]hP]hQU change-hooksruhSMhThh[]ubshHh\hJ}r(hN]hO]hM]hL]r(jUid5rehP]r(hheuhSMhThhU}rjjsh[]r(hc)r}r(h2X Change Hooksrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX Change Hooksrr}r(h2jh3jubaubhn)r}r(h2XThe ``/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 reasonsh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X``/change_hook``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX /change_hookrr}r(h2Uh3jubahHhubhjX 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(h2X 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 h3jubcdocutils.nodes reference r)r }r (h2UhJ}r (Ureftitler X master/buildbot/status/web/hooksr UrefurirXQhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/status/web/hookshL]hM]hN]hO]hP]uh3jh[]rh)r}r(h2j hJ}r(hN]hO]hM]hL]hP]uh3j h[]rhjX master/buildbot/status/web/hooksrr}r(h2Uh3jubahHhubahHU referencerubhjX. The format of the url is rr}r(h2X. The format of the url is h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r (hjX /change_hook/r!r"}r#(h2X /change_hook/h3jubcdocutils.nodes emphasis r$)r%}r&(h2XDIALECThJ}r'(hN]hO]hM]hL]hP]uh3jh[]r(hjXDIALECTr)r*}r+(h2Uh3j%ubahHUemphasisr,ubehHhubhjX 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 reasonsr-r.}r/(h2X 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 reasonsh3jubeubhn)r0}r1(h2XTAn example WebStatus configuration line which enables change_hook and two DIALECTS::r2h3jh>hAhHhqhJ}r3(hN]hO]hM]hL]hP]uhSMhThh[]r4hjXSAn example WebStatus configuration line which enables change_hook and two DIALECTS:r5r6}r7(h2XSAn example WebStatus configuration line which enables change_hook and two DIALECTS:h3j0ubaubh)r8}r9(h2Xc['status'].append(html.WebStatus(http_port=8010,allowForce=True, change_hook_dialects={ 'base': True, 'somehook': {'option1':True, 'option2':False}}))h3jh>hAhHhhJ}r:(hhhL]hM]hN]hO]hP]uhSMhThh[]r;hjXc['status'].append(html.WebStatus(http_port=8010,allowForce=True, change_hook_dialects={ 'base': True, 'somehook': {'option1':True, 'option2':False}}))r<r=}r>(h2Uh3j8ubaubhn)r?}r@(h2XWithin 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.h3jh>hAhHhqhJ}rA(hN]hO]hM]hL]hP]uhSMhThh[]rB(hjX$Within the WebStatus arguments, the rCrD}rE(h2X$Within the WebStatus arguments, the h3j?ubh)rF}rG(h2X``change_hook``hJ}rH(hN]hO]hM]hL]hP]uh3j?h[]rIhjX change_hookrJrK}rL(h2Uh3jFubahHhubhjX% key enables/disables the module and rMrN}rO(h2X% key enables/disables the module and h3j?ubh)rP}rQ(h2X``change_hook_dialects``hJ}rR(hN]hO]hM]hL]hP]uh3j?h[]rShjXchange_hook_dialectsrTrU}rV(h2Uh3jPubahHhubhjX whitelists DIALECTs where the keys are the module names and the values are optional arguments which will be passed to the hooks.rWrX}rY(h2X whitelists DIALECTs where the keys are the module names and the values are optional arguments which will be passed to the hooks.h3j?ubeubhn)rZ}r[(h2XThe :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.h3jh>hAhHhqhJ}r\(hN]hO]hM]hL]hP]uhSMhThh[]r](hjXThe r^r_}r`(h2XThe h3jZubh)ra}rb(h2UhJ}rc(hL]hM]hN]hO]rdXfilereaUrolejehP]uh3jZh[]rfhjXpost_build_request.pyrgrh}ri(h2Xpost_build_request.pyh3jaubahHhubhjX script in rjrk}rl(h2X script in h3jZubh)rm}rn(h2UhJ}ro(hL]hM]hN]hO]rpXfilerqaUrolejqhP]uh3jZh[]rrhjXmaster/contribrsrt}ru(h2Xmaster/contribh3jmubahHhubhjX? allows for the submission of an arbitrary change request. Run rvrw}rx(h2X? allows for the submission of an arbitrary change request. Run h3jZubcdocutils.nodes strong ry)rz}r{(h2X':command:`post_build_request.py --help`hJ}r|(hN]hO]r}Ucommandr~ahM]hL]hP]uh3jZh[]rhjXpost_build_request.py --helprr}r(h2Uh3jzubahHUstrongrubhjX for more information. The rr}r(h2X for more information. The h3jZubh)r}r(h2X``base``hJ}r(hN]hO]hM]hL]hP]uh3jZh[]rhjXbaserr}r(h2Uh3jubahHhubhjX* dialect must be enabled for this to work.rr}r(h2X* dialect must be enabled for this to work.h3jZubeubh4)r}r(h2Uh3jh>hAhHh\hJ}r(hN]hO]hM]hL]rU github-hookrahP]rhauhSMhThh[]r(hc)r}r(h2X GitHub hookrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX GitHub hookrr}r(h2jh3jubaubhn)r}r(h2X2The GitHub hook is simple and takes no options. ::rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX/The GitHub hook is simple and takes no options.rr}r(h2X/The GitHub hook is simple and takes no options.h3jubaubh)r}r(h2Xbc['status'].append(html.WebStatus(.. change_hook_dialects={ 'github' : True }))h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXbc['status'].append(html.WebStatus(.. change_hook_dialects={ 'github' : True }))rr}r(h2Uh3jubaubhn)r}r(h2XWith 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXmWith this set up, add a Post-Receive URL for the project in the GitHub administrative interface, pointing to rr}r(h2XmWith this set up, add a Post-Receive URL for the project in the GitHub administrative interface, pointing to h3jubh)r}r(h2X``/change_hook/github``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/change_hook/githubrr}r(h2Uh3jubahHhubhjXJ relative to the root of the web status. For example, if the grid URL is rr}r(h2XJ relative to the root of the web status. For example, if the grid URL is h3jubh)r}r(h2X)``http://builds.mycompany.com/bbot/grid``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX%http://builds.mycompany.com/bbot/gridrr}r(h2Uh3jubahHhubhjX, then point GitHub to rr}r(h2X, then point GitHub to h3jubh)r}r(h2X7``http://builds.mycompany.com/bbot/change_hook/github``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX3http://builds.mycompany.com/bbot/change_hook/githubrr}r(h2Uh3jubahHhubhjX<. To specify a project associated to the repository, append rr}r(h2X<. To specify a project associated to the repository, append h3jubh)r}r(h2X``?project=name``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX ?project=namerr}r(h2Uh3jubahHhubhjX to the URL.rr}r(h2X to the URL.h3jubeubhn)r}r(h2XNote 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXcNote that there is a standalone HTTP server available for receiving GitHub notifications, as well: rr}r(h2XcNote that there is a standalone HTTP server available for receiving GitHub notifications, as well: h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjXcontrib/github_buildbot.pyrr}r(h2Xcontrib/github_buildbot.pyh3jubahHhubhjXc. This script may be useful in cases where you cannot expose the WebStatus for public consumption.rr}r(h2Xc. This script may be useful in cases where you cannot expose the WebStatus for public consumption.h3jubeubcdocutils.nodes warning r)r}r(h2XThe 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.h3jh>hAhHUwarningrhJ}r(hN]hO]hM]hL]hP]uhSNhThh[]rhn)r}r(h2XThe 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.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjXThe 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(h2jh3jubaubaubhn)r}r(h2XXTo protect URL against unauthorized access you should use ``change_hook_auth`` option ::rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjX:To protect URL against unauthorized access you should use rr}r(h2X:To protect URL against unauthorized access you should use h3jubh)r}r(h2X``change_hook_auth``hJ}r (hN]hO]hM]hL]hP]uh3jh[]r hjXchange_hook_authr r }r (h2Uh3jubahHhubhjX optionrr}r(h2X optionh3jubeubh)r}r(h2Xtc['status'].append(html.WebStatus(.. change_hook_auth=["file:changehook.passwd"]))h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXtc['status'].append(html.WebStatus(.. change_hook_auth=["file:changehook.passwd"]))rr}r(h2Uh3jubaubhn)r}r(h2X*And create a file ``changehook.passwd`` ::rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXAnd create a file rr}r(h2XAnd create a file h3jubh)r }r!(h2X``changehook.passwd``hJ}r"(hN]hO]hM]hL]hP]uh3jh[]r#hjXchangehook.passwdr$r%}r&(h2Uh3j ubahHhubeubh)r'}r((h2X user:passwordh3jh>hAhHhhJ}r)(hhhL]hM]hN]hO]hP]uhSMhThh[]r*hjX user:passwordr+r,}r-(h2Uh3j'ubaubhn)r.}r/(h2XThen, 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``.r0h3jh>hAhHhqhJ}r1(hN]hO]hM]hL]hP]uhSMhThh[]r2(hjX(Then, create a GitHub service hook (see r3r4}r5(h2X(Then, create a GitHub service hook (see h3j.ubj)r6}r7(h2X3https://help.github.com/articles/post-receive-hooksr8hJ}r9(Urefurij8hL]hM]hN]hO]hP]uh3j.h[]r:hjX3https://help.github.com/articles/post-receive-hooksr;r<}r=(h2Uh3j6ubahHjubhjX) with a WebHook URL like r>r?}r@(h2X) with a WebHook URL like h3j.ubh)rA}rB(h2XE``http://user:password@builds.mycompany.com/bbot/change_hook/github``hJ}rC(hN]hO]hM]hL]hP]uh3j.h[]rDhjXAhttp://user:password@builds.mycompany.com/bbot/change_hook/githubrErF}rG(h2Uh3jAubahHhubhjX.rH}rI(h2X.h3j.ubeubhn)rJ}rK(h2XSee the `documentation `_ for twisted cred for more option to pass to ``change_hook_auth``.rLh3jh>hAhHhqhJ}rM(hN]hO]hM]hL]hP]uhSMhThh[]rN(hjXSee the rOrP}rQ(h2XSee the h3jJubj)rR}rS(h2XS`documentation `_hJ}rT(Unameh%jX@https://twistedmatrix.com/documents/current/core/howto/cred.htmlrUhL]hM]hN]hO]hP]uh3jJh[]rVhjX documentationrWrX}rY(h2Uh3jRubahHjubhE)rZ}r[(h2XC h7Kh3jJhHhIhJ}r\(UrefurijUhL]r]U documentationr^ahM]hN]hO]hP]r_h%auh[]ubhjX- for twisted cred for more option to pass to r`ra}rb(h2X- for twisted cred for more option to pass to h3jJubh)rc}rd(h2X``change_hook_auth``hJ}re(hN]hO]hM]hL]hP]uh3jJh[]rfhjXchange_hook_authrgrh}ri(h2Uh3jcubahHhubhjX.rj}rk(h2X.h3jJubeubhn)rl}rm(h2XJNote that not using ``change_hook_auth`` can expose you to security risks.rnh3jh>hAhHhqhJ}ro(hN]hO]hM]hL]hP]uhSMhThh[]rp(hjXNote that not using rqrr}rs(h2XNote that not using h3jlubh)rt}ru(h2X``change_hook_auth``hJ}rv(hN]hO]hM]hL]hP]uh3jlh[]rwhjXchange_hook_authrxry}rz(h2Uh3jtubahHhubhjX" can expose you to security risks.r{r|}r}(h2X" can expose you to security risks.h3jlubeubeubh4)r~}r(h2Uh3jh>hAhHh\hJ}r(hN]hO]hM]hL]rUgoogle-code-hookrahP]rh auhSMhThh[]r(hc)r}r(h2XGoogle Code hookrh3j~h>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXGoogle Code hookrr}r(h2jh3jubaubhn)r}r(h2XThe 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::h3j~h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXThe 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:rr}r(h2XThe 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:h3jubaubh)r}r(h2Xzc['status'].append(html.WebStatus( …, change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX'}} ))h3j~h>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXzc['status'].append(html.WebStatus( …, change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX'}} ))rr}r(h2Uh3jubaubhn)r}r(h2XThis 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.h3j~h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXkThis will add a "Post-Commit URL" for the project in the Google Code administrative interface, pointing to rr}r(h2XkThis will add a "Post-Commit URL" for the project in the Google Code administrative interface, pointing to h3jubh)r}r(h2X``/change_hook/googlecode``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/change_hook/googlecoderr}r(h2Uh3jubahHhubhjX( relative to the root of the web status.rr}r(h2X( relative to the root of the web status.h3jubeubhn)r}r(h2XAlternatively, you can use the :ref:`GoogleCodeAtomPoller` :class:`ChangeSource` that periodically poll the Google Code commit feed for changes.h3j~h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXAlternatively, you can use the rr}r(h2XAlternatively, you can use the h3jubh)r}r(h2X:ref:`GoogleCodeAtomPoller`rh3jh>hAhHhhJ}r(UreftypeXrefhhXgooglecodeatompollerU refdomainXstdrhL]hM]U refexplicithN]hO]hP]hhuhSMh[]rj$)r}r(h2jhJ}r(hN]hO]r(hjXstd-refrehM]hL]hP]uh3jh[]rhjXGoogleCodeAtomPollerrr}r(h2Uh3jubahHj,ubaubhjX r}r(h2X h3jubh)r}r(h2X:class:`ChangeSource`rh3jh>hAhHhhJ}r(UreftypeXclasshhX ChangeSourceU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjX ChangeSourcerr}r(h2Uh3jubahHhubaubhjX@ that periodically poll the Google Code commit feed for changes.rr}r(h2X@ that periodically poll the Google Code commit feed for changes.h3jubeubh)r}r(h2XGoogle 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'}}h3j~h>hAhHhhJ}r(hN]hO]hM]hL]hP]uhSNhThh[]r(hn)r}r(h2XGoogle 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::h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(hjX`Google Code doesn't send the branch on which the changes were made. So, the hook always returns rr}r(h2X`Google Code doesn't send the branch on which the changes were made. So, the hook always returns h3jubh)r}r(h2X ``'default'``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX 'default'rr}r(h2Uh3jubahHhubhjX- as the branch, you can override it with the rr}r(h2X- as the branch, you can override it with the h3jubh)r}r(h2X ``'branch'``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX'branch'rr}r(h2Uh3jubahHhubhjX option:rr}r(h2X option:h3jubeubh)r}r(h2X[change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX', 'branch': 'master'}}h3jhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMh[]rhjX[change_hook_dialects={'googlecode': {'secret_key': 'FSP3p-Ghdn4T0oqX', 'branch': 'master'}}rr}r(h2Uh3jubaubeubeubjeubh>hAhHh\hJ}r(hN]hO]hM]hL]rU poller-hookrahP]rh#auhSMhThh[]r(hc)r}r(h2X Poller hookrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX Poller hookrr}r(h2jh3jubaubhn)r }r (h2X The poller hook allows you to use GET requests to trigger polling. One advantage of this is your buildbot instance can (at start up) poll 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.r h3jh>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSM hThh[]r hjX The poller hook allows you to use GET requests to trigger polling. One advantage of this is your buildbot instance can (at start up) poll 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(h2j h3j ubaubhn)r}r(h2X0Suppose you have a poller configured like this::rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX/Suppose you have a poller configured like this:rr}r(h2X/Suppose you have a poller configured like this:h3jubaubh)r}r(h2Xc['change_source'] = SVNPoller( svnurl="https://amanda.svn.sourceforge.net/svnroot/amanda/amanda", split_file=split_file_branches)h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXc['change_source'] = SVNPoller( svnurl="https://amanda.svn.sourceforge.net/svnroot/amanda/amanda", split_file=split_file_branches)rr}r(h2Uh3jubaubhn)r }r!(h2X6And you configure your WebStatus to enable this hook::r"h3jh>hAhHhqhJ}r#(hN]hO]hM]hL]hP]uhSMhThh[]r$hjX5And you configure your WebStatus to enable this hook:r%r&}r'(h2X5And you configure your WebStatus to enable this hook:h3j ubaubh)r(}r)(h2XXc['status'].append(html.WebStatus( …, change_hook_dialects={'poller': True} ))h3jh>hAhHhhJ}r*(hhhL]hM]hN]hO]hP]uhSMhThh[]r+hjXXc['status'].append(html.WebStatus( …, change_hook_dialects={'poller': True} ))r,r-}r.(h2Uh3j(ubaubhn)r/}r0(h2XThen 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::h3jh>hAhHhqhJ}r1(hN]hO]hM]hL]hP]uhSMhThh[]r2(hjXLThen you will be able to trigger a poll of the SVN repository by poking the r3r4}r5(h2XLThen you will be able to trigger a poll of the SVN repository by poking the h3j/ubh)r6}r7(h2X``/change_hook/poller``hJ}r8(hN]hO]hM]hL]hP]uh3j/h[]r9hjX/change_hook/pollerr:r;}r<(h2Uh3j6ubahHhubhjX" URL from a commit hook like this:r=r>}r?(h2X" URL from a commit hook like this:h3j/ubeubh)r@}rA(h2Xwcurl http://yourbuildbot/change_hook/poller?poller=https%3A%2F%2Famanda.svn.sourceforge.net%2Fsvnroot%2Famanda%2Famandah3jh>hAhHhhJ}rB(hhhL]hM]hN]hO]hP]uhSMhThh[]rChjXwcurl http://yourbuildbot/change_hook/poller?poller=https%3A%2F%2Famanda.svn.sourceforge.net%2Fsvnroot%2Famanda%2FamandarDrE}rF(h2Uh3j@ubaubhn)rG}rH(h2XgIf no ``poller`` argument is provided then the hook will trigger polling of all polling change sources.h3jh>hAhHhqhJ}rI(hN]hO]hM]hL]hP]uhSM!hThh[]rJ(hjXIf no rKrL}rM(h2XIf no h3jGubh)rN}rO(h2X ``poller``hJ}rP(hN]hO]hM]hL]hP]uh3jGh[]rQhjXpollerrRrS}rT(h2Uh3jNubahHhubhjXW argument is provided then the hook will trigger polling of all polling change sources.rUrV}rW(h2XW argument is provided then the hook will trigger polling of all polling change sources.h3jGubeubhn)rX}rY(h2XWYou can restrict which pollers the webhook has access to using the ``allowed`` option::h3jh>hAhHhqhJ}rZ(hN]hO]hM]hL]hP]uhSM$hThh[]r[(hjXCYou can restrict which pollers the webhook has access to using the r\r]}r^(h2XCYou can restrict which pollers the webhook has access to using the h3jXubh)r_}r`(h2X ``allowed``hJ}ra(hN]hO]hM]hL]hP]uh3jXh[]rbhjXallowedrcrd}re(h2Uh3j_ubahHhubhjX option:rfrg}rh(h2X option:h3jXubeubh)ri}rj(h2Xc['status'].append(html.WebStatus( …, change_hook_dialects={'poller': {'allowed': ['https://amanda.svn.sourceforge.net/svnroot/amanda/amanda']}} ))h3jh>hAhHhhJ}rk(hhhL]hM]hN]hO]hP]uhSM'hThh[]rlhjXc['status'].append(html.WebStatus( …, change_hook_dialects={'poller': {'allowed': ['https://amanda.svn.sourceforge.net/svnroot/amanda/amanda']}} ))rmrn}ro(h2Uh3jiubaubju)rp}rq(h2Uh3jh>hAhHjxhJ}rr(hL]hM]hN]hO]hP]Uentries]rs((UsingleXStatus Targets; MailNotifierXstatus-MailNotifierrtjttru(UsingleXMailNotifier Status TargetjtjttrveuhSM.hThh[]ubhE)rw}rx(h2Uh3jh>hAhHhIhJ}ry(hN]hO]hM]hL]rzjtahP]uhSM.hThh[]ubju)r{}r|(h2Uh3jh>hAhHjxhJ}r}(hL]hM]hN]hO]hP]Uentriesr~]r(UsinglerXemail; MailNotifierjUtraUinlineruhSM/hThh[]ubjeubh>hAhHhIhJ}r(hL]hM]hN]hO]hP]hQjuhSM0hThh[]ubsh[]r(hc)r}r(h2X MailNotifierrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSM2hThh[]rhjX MailNotifierrr}r(h2jh3jubaubju)r}r(h2Uh3jh>NhHjxhJ}r(hL]hM]hN]hO]hP]Uentries]r(jX2buildbot.status.mail.MailNotifier (built-in class)h"UtrauhSNhThh[]ubcsphinx.addnodes desc r)r}r(h2Uh3jh>NhHUdescrhJ}r(UnoindexrUdomainrXpyhL]hM]hN]hO]hP]UobjtyperXclassrUdesctyperjuhSNhThh[]r(csphinx.addnodes desc_signature r)r}r(h2X!buildbot.status.mail.MailNotifierh3jh>hAhHUdesc_signaturerhJ}r(hL]rh"aUmodulerNhM]hN]hO]hP]rh"aUfullnamerh"UclassrXbuildbot.status.mailUfirstruhSM5hThh[]r(csphinx.addnodes desc_annotation r)r}r(h2Xclass h3jh>hAhHUdesc_annotationrhJ}r(hN]hO]hM]hL]hP]uhSM5hThh[]rhjXclass rr}r(h2Uh3jubaubcsphinx.addnodes desc_addname r)r}r(h2Xbuildbot.status.mail.h3jh>hAhHU desc_addnamerhJ}r(hN]hO]hM]hL]hP]uhSM5hThh[]rhjXbuildbot.status.mail.rr}r(h2Uh3jubaubcsphinx.addnodes desc_name r)r}r(h2X MailNotifierh3jh>hAhHU desc_namerhJ}r(hN]hO]hM]hL]hP]uhSM5hThh[]rhjX MailNotifierrr}r(h2Uh3jubaubeubcsphinx.addnodes desc_content r)r}r(h2Uh3jh>hAhHU desc_contentrhJ}r(hN]hO]hM]hL]hP]uhSM5hThh[]ubeubhn)r}r(h2X 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM6hThh[]r(hjXThe 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(h2XThe 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 h3jubhw)r}r(h2X`builds`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbuildsrr}r(h2Uh3jubahHhubhjX or similar) about every build.rr}r(h2X or similar) about every build.h3jubeubhn)r}r(h2XThe :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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM;hThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X:class:`MailNotifier`rh3jh>hAhHhhJ}r(UreftypeXclasshhX MailNotifierU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSM;h[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjX MailNotifierrr}r(h2Uh3jubahHhubaubhjX 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.rr}r(h2X 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.h3jubeubhn)r}r(h2XIf 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMDhThh[]r(hjXdIf a proper lookup function is configured, the message will be sent to the "interested users" list (rr}r(h2XdIf a proper lookup function is configured, the message will be sent to the "interested users" list (h3jubh)r}r(h2X:ref:`Doing-Things-With-Users`rh3jh>hAhHhhJ}r(UreftypeXrefhhXdoing-things-with-usersU refdomainXstdrhL]hM]U refexplicithN]hO]hP]hhuhSMDh[]rj$)r}r(h2jhJ}r(hN]hO]r(hjXstd-refrehM]hL]hP]uh3jh[]rhjXDoing-Things-With-Usersrr}r(h2Uh3jubahHj,ubaubhjX), 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 (h2X), 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 h3jubh)r }r (h2X ``lookup``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXlookuprr}r(h2Uh3j ubahHhubhjX' argument, below, for more information.rr}r(h2X' argument, below, for more information.h3jubeubhn)r}r(h2XYou 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`).h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMKhThh[]r(hjXCYou can add additional, statically-configured, recipients with the rr}r(h2XCYou can add additional, statically-configured, recipients with the h3jubh)r}r(h2X``extraRecipients``hJ}r(hN]hO]hM]hL]hP]uh3jh[]r hjXextraRecipientsr!r"}r#(h2Uh3jubahHhubhjX= argument. You can also add interested users by setting the r$r%}r&(h2X= argument. You can also add interested users by setting the h3jubh)r'}r((h2X ``owners``hJ}r)(hN]hO]hM]hL]hP]uh3jh[]r*hjXownersr+r,}r-(h2Uh3j'ubahHhubhjXA build property to a list of users in the scheduler constructor (r.r/}r0(h2XA build property to a list of users in the scheduler constructor (h3jubh)r1}r2(h2X:ref:`Configuring-Schedulers`r3h3jh>hAhHhhJ}r4(UreftypeXrefhhXconfiguring-schedulersU refdomainXstdr5hL]hM]U refexplicithN]hO]hP]hhuhSMKh[]r6j$)r7}r8(h2j3hJ}r9(hN]hO]r:(hj5Xstd-refr;ehM]hL]hP]uh3j1h[]r<hjXConfiguring-Schedulersr=r>}r?(h2Uh3j7ubahHj,ubaubhjX).r@rA}rB(h2X).h3jubeubhn)rC}rD(h2XEach :class:`MailNotifier` sends mail to a single set of recipients. To send different kinds of mail to different recipients, use multiple :class:`MailNotifier`\s.h3jh>hAhHhqhJ}rE(hN]hO]hM]hL]hP]uhSMPhThh[]rF(hjXEach rGrH}rI(h2XEach h3jCubh)rJ}rK(h2X:class:`MailNotifier`rLh3jCh>hAhHhhJ}rM(UreftypeXclasshhX MailNotifierU refdomainXpyrNhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMPh[]rOh)rP}rQ(h2jLhJ}rR(hN]hO]rS(hjNXpy-classrTehM]hL]hP]uh3jJh[]rUhjX MailNotifierrVrW}rX(h2Uh3jPubahHhubaubhjXq sends mail to a single set of recipients. To send different kinds of mail to different recipients, use multiple rYrZ}r[(h2Xq sends mail to a single set of recipients. To send different kinds of mail to different recipients, use multiple h3jCubh)r\}r](h2X:class:`MailNotifier`r^h3jCh>hAhHhhJ}r_(UreftypeXclasshhX MailNotifierU refdomainXpyr`hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMPh[]rah)rb}rc(h2j^hJ}rd(hN]hO]re(hj`Xpy-classrfehM]hL]hP]uh3j\h[]rghjX MailNotifierrhri}rj(h2Uh3jbubahHhubaubhjXs.rkrl}rm(h2X\s.h3jCubeubhn)rn}ro(h2XThe 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. ::h3jh>hAhHhqhJ}rp(hN]hO]hM]hL]hP]uhSMThThh[]rq(hjXrThe following simple example will send an email upon the completion of each build, to just those developers whose rrrs}rt(h2XrThe following simple example will send an email upon the completion of each build, to just those developers whose h3jnubh)ru}rv(h2X:class:`Change`rwh3jnh>hAhHhhJ}rx(UreftypeXclasshhXChangeU refdomainXpyryhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMTh[]rzh)r{}r|(h2jwhJ}r}(hN]hO]r~(hjyXpy-classrehM]hL]hP]uh3juh[]rhjXChangerr}r(h2Uh3j{ubahHhubaubhjXFs were included in the build. The email contains a description of the rr}r(h2XG\s were included in the build. The email contains a description of the h3jnubh)r}r(h2X:class:`Build`rh3jnh>hAhHhhJ}r(UreftypeXclasshhXBuildU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMTh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXBuildrr}r(h2Uh3jubahHhubaubhjX?, its results, and URLs where more information can be obtained.rr}r(h2X?, its results, and URLs where more information can be obtained.h3jnubeubh)r}r(h2Xfrom buildbot.status.mail import MailNotifier mn = MailNotifier(fromaddr="buildbot@example.org", lookup="example.org") c['status'].append(mn)h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMYhThh[]rhjXfrom buildbot.status.mail import MailNotifier mn = MailNotifier(fromaddr="buildbot@example.org", lookup="example.org") c['status'].append(mn)rr}r(h2Uh3jubaubhn)r}r(h2X-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::h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM]hThh[]r(hjXTo 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(h2XTo 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 h3jubh)r}r(h2X ``lookup=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXlookup=rr}r(h2Uh3jubahHhubhjXD argument, explained below), instead it only ever sends mail to the rr}r(h2XD argument, explained below), instead it only ever sends mail to the h3jubhw)r}r(h2X`extra recipients`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXextra recipientsrr}r(h2Uh3jubahHhubhjX named in the arguments:rr}r(h2X named in the arguments:h3jubeubh)r}r(h2Xmn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, extraRecipients=['listaddr@example.org'])h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMchThh[]rhjXmn = MailNotifier(fromaddr="buildbot@example.org", sendToInterestedUsers=False, extraRecipients=['listaddr@example.org'])rr}r(h2Uh3jubaubhn)r}r(h2XIf your SMTP host requires authentication before it allows you to send emails, this can also be done by specifying ``smtpUser`` and ``smptPassword``::h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMghThh[]r(hjXsIf your SMTP host requires authentication before it allows you to send emails, this can also be done by specifying rr}r(h2XsIf your SMTP host requires authentication before it allows you to send emails, this can also be done by specifying h3jubh)r}r(h2X ``smtpUser``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXsmtpUserrr}r(h2Uh3jubahHhubhjX and rr}r(h2X and h3jubh)r}r(h2X``smptPassword``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX smptPasswordrr}r(h2Uh3jubahHhubhjX:r}r(h2X:h3jubeubh)r}r(h2Xmn = MailNotifier(fromaddr="myuser@gmail.com", sendToInterestedUsers=False, extraRecipients=["listaddr@example.org"], relayhost="smtp.gmail.com", smtpPort=587, smtpUser="myuser@gmail.com", smtpPassword="mypassword")h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMjhThh[]rhjXmn = MailNotifier(fromaddr="myuser@gmail.com", sendToInterestedUsers=False, extraRecipients=["listaddr@example.org"], relayhost="smtp.gmail.com", smtpPort=587, smtpUser="myuser@gmail.com", smtpPassword="mypassword")rr}r(h2Uh3jubaubhn)r}r(h2XYIf you want to require Transport Layer Security (TLS), then you can also set ``useTls``::h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMphThh[]r(hjXMIf you want to require Transport Layer Security (TLS), then you can also set rr}r(h2XMIf you want to require Transport Layer Security (TLS), then you can also set h3jubh)r}r(h2X ``useTls``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXuseTlsrr}r(h2Uh3jubahHhubhjX:r}r(h2X:h3jubeubh)r}r(h2X,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")h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMshThh[]rhjX,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")rr}r(h2Uh3jubaubh)r}r(h2XIf 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.h3jh>hAhHhhJ}r(hN]hO]hM]hL]hP]uhSNhThh[]rhn)r}r(h2XIf 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMyh[]r(hjX If you see rr}r(h2X If you see h3jubh)r}r(h2X&``twisted.mail.smtp.TLSRequiredError``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX"twisted.mail.smtp.TLSRequiredErrorr r }r (h2Uh3jubahHhubhjX8 exceptions in the log while using TLS, this can be due r r }r(h2X8 exceptions in the log while using TLS, this can be due h3jubj$)r}r(h2X*either*hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXeitherrr}r(h2Uh3jubahHj,ubhjX2 to the server not supporting TLS or to a missing rr}r(h2X2 to the server not supporting TLS or to a missing h3jubj)r}r(h2X `PyOpenSSL`_UresolvedrKh3jhHjhJ}r(UnameX PyOpenSSLjX!http://pyopenssl.sourceforge.net/rhL]hM]hN]hO]hP]uh[]rhjX PyOpenSSLrr }r!(h2Uh3jubaubhjX# package on the buildmaster system.r"r#}r$(h2X# package on the buildmaster system.h3jubeubaubhn)r%}r&(h2X 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.h3jh>hAhHhqhJ}r'(hN]hO]hM]hL]hP]uhSM}hThh[]r((hjXIn 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+(h2XIn 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 h3j%ubh)r,}r-(h2X``messageFormatter``hJ}r.(hN]hO]hM]hL]hP]uh3j%h[]r/hjXmessageFormatterr0r1}r2(h2Uh3j,ubahHhubhjXL (a function) which allows for the creation of messages with unique content.r3r4}r5(h2XL (a function) which allows for the creation of messages with unique content.h3j%ubeubhn)r6}r7(h2XOFor example, if only short emails are desired (e.g., for delivery to phones) ::r8h3jh>hAhHhqhJ}r9(hN]hO]hM]hL]hP]uhSMhThh[]r:hjXLFor example, if only short emails are desired (e.g., for delivery to phones)r;r<}r=(h2XLFor example, if only short emails are desired (e.g., for delivery to phones)h3j6ubaubh)r>}r?(h2Xfrom 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)h3jh>hAhHhhJ}r@(hhhL]hM]hN]hO]hP]uhSMhThh[]rAhjXfrom 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)rBrC}rD(h2Uh3j>ubaubhn)rE}rF(h2XAnother 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::h3jh>hAhHhqhJ}rG(hN]hO]hM]hL]hP]uhSMhThh[]rHhjXAnother 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:rIrJ}rK(h2XAnother 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:h3jEubaubh)rL}rM(h2Xfrom 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'
'.join([uniline for uniline in 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)h3jh>hAhHhhJ}rN(hhhL]hM]hN]hO]hP]uhSMhThh[]rOhjXfrom 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'
'.join([uniline for uniline in 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)rPrQ}rR(h2Uh3jLubaubh4)rS}rT(h2Uh3jh>hAhHh\hJ}rU(hN]hO]hM]hL]rVUmailnotifier-argumentsrWahP]rXhauhSMhThh[]rY(hc)rZ}r[(h2XMailNotifier argumentsr\h3jSh>hAhHhghJ}r](hN]hO]hM]hL]hP]uhSMhThh[]r^hjXMailNotifier argumentsr_r`}ra(h2j\h3jZubaubcdocutils.nodes definition_list rb)rc}rd(h2Uh3jSh>hAhHUdefinition_listrehJ}rf(hN]hO]hM]hL]hP]uhSNhThh[]rg(cdocutils.nodes definition_list_item rh)ri}rj(h2X@``fromaddr`` The email address to be used in the 'From' header. h3jch>hAhHUdefinition_list_itemrkhJ}rl(hN]hO]hM]hL]hP]uhSMh[]rm(cdocutils.nodes term rn)ro}rp(h2X ``fromaddr``rqh3jih>hAhHUtermrrhJ}rs(hN]hO]hM]hL]hP]uhSMh[]rth)ru}rv(h2jqhJ}rw(hN]hO]hM]hL]hP]uh3joh[]rxhjXfromaddrryrz}r{(h2Uh3juubahHhubaubcdocutils.nodes definition r|)r}}r~(h2UhJ}r(hN]hO]hM]hL]hP]uh3jih[]rhn)r}r(h2X2The email address to be used in the 'From' header.rh3j}h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjX2The email address to be used in the 'From' header.rr}r(h2jh3jubaubahHU definitionrubeubjh)r}r(h2X``sendToInterestedUsers`` (boolean). If ``True`` (the default), send mail to all of the Interested Users. If ``False``, only send mail to the ``extraRecipients`` list. h3jch>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(jn)r}r(h2X``sendToInterestedUsers``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXsendToInterestedUsersrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X(boolean). If ``True`` (the default), send mail to all of the Interested Users. If ``False``, only send mail to the ``extraRecipients`` list.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(hjX(boolean). If rr}r(h2X(boolean). If h3jubh)r}r(h2X``True``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXTruerr}r(h2Uh3jubahHhubhjX= (the default), send mail to all of the Interested Users. If rr}r(h2X= (the default), send mail to all of the Interested Users. If h3jubh)r}r(h2X ``False``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXFalserr}r(h2Uh3jubahHhubhjX, only send mail to the rr}r(h2X, only send mail to the h3jubh)r}r(h2X``extraRecipients``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXextraRecipientsrr}r(h2Uh3jubahHhubhjX list.rr}r(h2X list.h3jubeubahHjubeubjh)r}r(h2XX``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. h3jch>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(jn)r}r(h2X``extraRecipients``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXextraRecipientsrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XC(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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(hjX(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 rr}r(h2X(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 h3jubh)r}r(h2X:class:`Change`rh3jh>hAhHhhJ}r(UreftypeXclasshhXChangeU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXChangerr}r(h2Uh3jubahHhubaubhjXs 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.rr}r(h2X\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.h3jubeubahHjubeubjh)r}r(h2X``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. h3jch>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM hThh[]r(jn)r}r(h2X ``subject``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXsubjectrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X(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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM h[]r(hjXB(string). A string to be used as the subject line of the message. rr }r (h2XB(string). A string to be used as the subject line of the message. h3jubh)r }r (h2X``%(builder)s``hJ}r (hN]hO]hM]hL]hP]uh3jh[]rhjX %(builder)srr}r(h2Uh3j ubahHhubhjXJ will be replaced with the name of the builder which provoked the message.rr}r(h2XJ will be replaced with the name of the builder which provoked the message.h3jubeubahHjubeubjh)r}r(h2X``mode`` (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. ``all`` Always send mail about builds. Defaults to (``failing``, ``passing``, ``warnings``). h3jch>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM%hThh[]r(jn)r}r(h2X``mode``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM%h[]rh)r}r(h2jhJ}r (hN]hO]hM]hL]hP]uh3jh[]r!hjXmoder"r#}r$(h2Uh3jubahHhubaubj|)r%}r&(h2UhJ}r'(hN]hO]hM]hL]hP]uh3jh[]r((hn)r)}r*(h2X$(list of strings). A combination of:r+h3j%h>hAhHhqhJ}r,(hN]hO]hM]hL]hP]uhSMh[]r-hjX$(list of strings). A combination of:r.r/}r0(h2j+h3j)ubaubjb)r1}r2(h2UhJ}r3(hN]hO]hM]hL]hP]uh3j%h[]r4(jh)r5}r6(h2X7``change`` Send mail about builds which change status. h3j1h>hAhHjkhJ}r7(hN]hO]hM]hL]hP]uhSMh[]r8(jn)r9}r:(h2X ``change``r;h3j5h>hAhHjrhJ}r<(hN]hO]hM]hL]hP]uhSMh[]r=h)r>}r?(h2j;hJ}r@(hN]hO]hM]hL]hP]uh3j9h[]rAhjXchangerBrC}rD(h2Uh3j>ubahHhubaubj|)rE}rF(h2UhJ}rG(hN]hO]hM]hL]hP]uh3j5h[]rHhn)rI}rJ(h2X+Send mail about builds which change status.rKh3jEh>hAhHhqhJ}rL(hN]hO]hM]hL]hP]uhSMh[]rMhjX+Send mail about builds which change status.rNrO}rP(h2jKh3jIubaubahHjubeubjh)rQ}rR(h2X/``failing`` Send mail about builds which fail. h3j1h>hAhHjkhJ}rS(hN]hO]hM]hL]hP]uhSMh[]rT(jn)rU}rV(h2X ``failing``rWh3jQh>hAhHjrhJ}rX(hN]hO]hM]hL]hP]uhSMh[]rYh)rZ}r[(h2jWhJ}r\(hN]hO]hM]hL]hP]uh3jUh[]r]hjXfailingr^r_}r`(h2Uh3jZubahHhubaubj|)ra}rb(h2UhJ}rc(hN]hO]hM]hL]hP]uh3jQh[]rdhn)re}rf(h2X"Send mail about builds which fail.rgh3jah>hAhHhqhJ}rh(hN]hO]hM]hL]hP]uhSMh[]rihjX"Send mail about builds which fail.rjrk}rl(h2jgh3jeubaubahHjubeubjh)rm}rn(h2X2``passing`` Send mail about builds which succeed. h3j1h>hAhHjkhJ}ro(hN]hO]hM]hL]hP]uhSMh[]rp(jn)rq}rr(h2X ``passing``rsh3jmh>hAhHjrhJ}rt(hN]hO]hM]hL]hP]uhSMh[]ruh)rv}rw(h2jshJ}rx(hN]hO]hM]hL]hP]uh3jqh[]ryhjXpassingrzr{}r|(h2Uh3jvubahHhubaubj|)r}}r~(h2UhJ}r(hN]hO]hM]hL]hP]uh3jmh[]rhn)r}r(h2X%Send mail about builds which succeed.rh3j}h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjX%Send mail about builds which succeed.rr}r(h2jh3jubaubahHjubeubjh)r}r(h2XU``problem`` Send mail about a build which failed when the previous build has passed. h3j1h>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(jn)r}r(h2X ``problem``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXproblemrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XHSend mail about a build which failed when the previous build has passed.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjXHSend mail about a build which failed when the previous build has passed.rr}r(h2jh3jubaubahHjubeubjh)r}r(h2X=``warnings`` Send mail about builds which generate warnings. h3j1h>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(jn)r}r(h2X ``warnings``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXwarningsrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X/Send mail about builds which generate warnings.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjX/Send mail about builds which generate warnings.rr}r(h2jh3jubaubahHjubeubjh)r}r(h2X@``exception`` Send mail about builds which generate exceptions. h3j1h>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM h[]r(jn)r}r(h2X ``exception``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX exceptionrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X1Send mail about builds which generate exceptions.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM h[]rhjX1Send mail about builds which generate exceptions.rr}r(h2jh3jubaubahHjubeubjh)r}r(h2X'``all`` Always send mail about builds. h3j1h>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM#h[]r(jn)r}r(h2X``all``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM#h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXallrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XAlways send mail about builds.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM#h[]rhjXAlways send mail about builds.rr}r(h2jh3jubaubahHjubeubehHjeubhn)r}r(h2X5Defaults to (``failing``, ``passing``, ``warnings``).h3j%h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM%h[]r(hjX Defaults to (rr}r(h2X Defaults to (h3jubh)r}r(h2X ``failing``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXfailingrr}r(h2Uh3jubahHhubhjX, rr}r (h2X, h3jubh)r }r (h2X ``passing``hJ}r (hN]hO]hM]hL]hP]uh3jh[]r hjXpassingrr}r(h2Uh3j ubahHhubhjX, rr}r(h2X, h3jubh)r}r(h2X ``warnings``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXwarningsrr}r(h2Uh3jubahHhubhjX).rr}r(h2X).h3jubeubehHjubeubjh)r}r(h2X``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. h3jch>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSM*hThh[]r!(jn)r"}r#(h2X ``builders``r$h3jh>hAhHjrhJ}r%(hN]hO]hM]hL]hP]uhSM*h[]r&h)r'}r((h2j$hJ}r)(hN]hO]hM]hL]hP]uh3j"h[]r*hjXbuildersr+r,}r-(h2Uh3j'ubahHhubaubj|)r.}r/(h2UhJ}r0(hN]hO]hM]hL]hP]uh3jh[]r1hn)r2}r3(h2X(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.h3j.h>hAhHhqhJ}r4(hN]hO]hM]hL]hP]uhSM(h[]r5(hjXV(list of strings). A list of builder names for which mail should be sent. Defaults to r6r7}r8(h2XV(list of strings). A list of builder names for which mail should be sent. Defaults to h3j2ubh)r9}r:(h2X``None``hJ}r;(hN]hO]hM]hL]hP]uh3j2h[]r<hjXNoner=r>}r?(h2Uh3j9ubahHhubhjXM (send mail for all builds). Use either builders or categories, but not both.r@rA}rB(h2XM (send mail for all builds). Use either builders or categories, but not both.h3j2ubeubahHjubeubjh)rC}rD(h2X``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. h3jch>hAhHjkhJ}rE(hN]hO]hM]hL]hP]uhSM/hThh[]rF(jn)rG}rH(h2X``categories``rIh3jCh>hAhHjrhJ}rJ(hN]hO]hM]hL]hP]uhSM/h[]rKh)rL}rM(h2jIhJ}rN(hN]hO]hM]hL]hP]uh3jGh[]rOhjX categoriesrPrQ}rR(h2Uh3jLubahHhubaubj|)rS}rT(h2UhJ}rU(hN]hO]hM]hL]hP]uh3jCh[]rVhn)rW}rX(h2X(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.h3jSh>hAhHhqhJ}rY(hN]hO]hM]hL]hP]uhSM-h[]rZ(hjXY(list of strings). A list of category names to serve status information for. Defaults to r[r\}r](h2XY(list of strings). A list of category names to serve status information for. Defaults to h3jWubh)r^}r_(h2X``None``hJ}r`(hN]hO]hM]hL]hP]uh3jWh[]rahjXNonerbrc}rd(h2Uh3j^ubahHhubhjXC (all categories). Use either builders or categories, but not both.rerf}rg(h2XC (all categories). Use either builders or categories, but not both.h3jWubeubahHjubeubjh)rh}ri(h2X``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``. h3jch>hAhHjkhJ}rj(hN]hO]hM]hL]hP]uhSM4hThh[]rk(jn)rl}rm(h2X ``addLogs``rnh3jhh>hAhHjrhJ}ro(hN]hO]hM]hL]hP]uhSM4h[]rph)rq}rr(h2jnhJ}rs(hN]hO]hM]hL]hP]uh3jlh[]rthjXaddLogsrurv}rw(h2Uh3jqubahHhubaubj|)rx}ry(h2UhJ}rz(hN]hO]hM]hL]hP]uh3jhh[]r{hn)r|}r}(h2X(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``.h3jxh>hAhHhqhJ}r~(hN]hO]hM]hL]hP]uhSM2h[]r(hjX(boolean). If rr}r(h2X(boolean). If h3j|ubh)r}r(h2X``True``hJ}r(hN]hO]hM]hL]hP]uh3j|h[]rhjXTruerr}r(h2Uh3jubahHhubhjX, 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 rr}r(h2X, 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 h3j|ubh)r}r(h2X ``False``hJ}r(hN]hO]hM]hL]hP]uh3j|h[]rhjXFalserr}r(h2Uh3jubahHhubhjX.r}r(h2X.h3j|ubeubahHjubeubjh)r}r(h2X``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``. h3jch>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM9hThh[]r(jn)r}r(h2X ``addPatch``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM9h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXaddPatchrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X(boolean). If ``True``, include the patch content if a patch was present. Patches are usually used on a :class:`Try` server. Defaults to ``True``.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM7h[]r(hjX(boolean). If rr}r(h2X(boolean). If h3jubh)r}r(h2X``True``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXTruerr}r(h2Uh3jubahHhubhjXR, include the patch content if a patch was present. Patches are usually used on a rr}r(h2XR, include the patch content if a patch was present. Patches are usually used on a h3jubh)r}r(h2X :class:`Try`rh3jh>hAhHhhJ}r(UreftypeXclasshhXTryU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSM7h[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXTryrr}r(h2Uh3jubahHhubaubhjX server. Defaults to rr}r(h2X server. Defaults to h3jubh)r}r(h2X``True``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXTruerr}r(h2Uh3jubahHhubhjX.r}r(h2X.h3jubeubahHjubeubjh)r}r(h2X``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``. h3jch>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM>hThh[]r(jn)r}r(h2X``buildSetSummary``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM>h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbuildSetSummaryrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X(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``.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM<h[]r(hjX(boolean). If rr}r(h2X(boolean). If h3jubh)r}r(h2X``True``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXTruerr}r(h2Uh3jubahHhubhjX, send a single summary email consisting of the concatenation of all build completion messages rather than a completion message for each build. Defaults to rr}r(h2X, send a single summary email consisting of the concatenation of all build completion messages rather than a completion message for each build. Defaults to h3jubh)r}r(h2X ``False``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXFalserr }r (h2Uh3jubahHhubhjX.r }r (h2X.h3jubeubahHjubeubjh)r }r (h2Xo``relayhost`` (string). The host to which the outbound SMTP connection should be made. Defaults to 'localhost' h3jch>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMBhThh[]r (jn)r }r (h2X ``relayhost``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMBh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX relayhostr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X`(string). The host to which the outbound SMTP connection should be made. Defaults to 'localhost'r h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMAh[]r hjX`(string). The host to which the outbound SMTP connection should be made. Defaults to 'localhost'r r }r (h2j h3j ubaubahHjubeubjh)r }r! (h2X]``smtpPort`` (int). The port that will be used on outbound SMTP connections. Defaults to 25. h3jch>hAhHjkhJ}r" (hN]hO]hM]hL]hP]uhSMFhThh[]r# (jn)r$ }r% (h2X ``smtpPort``r& h3j h>hAhHjrhJ}r' (hN]hO]hM]hL]hP]uhSMFh[]r( h)r) }r* (h2j& hJ}r+ (hN]hO]hM]hL]hP]uh3j$ h[]r, hjXsmtpPortr- r. }r/ (h2Uh3j) ubahHhubaubj|)r0 }r1 (h2UhJ}r2 (hN]hO]hM]hL]hP]uh3j h[]r3 hn)r4 }r5 (h2XO(int). The port that will be used on outbound SMTP connections. Defaults to 25.r6 h3j0 h>hAhHhqhJ}r7 (hN]hO]hM]hL]hP]uhSMEh[]r8 hjXO(int). The port that will be used on outbound SMTP connections. Defaults to 25.r9 r: }r; (h2j6 h3j4 ubaubahHjubeubjh)r< }r= (h2X``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. h3jch>hAhHjkhJ}r> (hN]hO]hM]hL]hP]uhSMLhThh[]r? (jn)r@ }rA (h2X ``useTls``rB h3j< h>hAhHjrhJ}rC (hN]hO]hM]hL]hP]uhSMLh[]rD h)rE }rF (h2jB hJ}rG (hN]hO]hM]hL]hP]uh3j@ h[]rH hjXuseTlsrI rJ }rK (h2Uh3jE ubahHhubaubj|)rL }rM (h2UhJ}rN (hN]hO]hM]hL]hP]uh3j< h[]rO hn)rP }rQ (h2X(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.h3jL h>hAhHhqhJ}rR (hN]hO]hM]hL]hP]uhSMIh[]rS (hjX!(boolean). When this argument is rT rU }rV (h2X!(boolean). When this argument is h3jP ubh)rW }rX (h2X``True``hJ}rY (hN]hO]hM]hL]hP]uh3jP h[]rZ hjXTruer[ r\ }r] (h2Uh3jW ubahHhubhjX (default is r^ r_ }r` (h2X (default is h3jP ubh)ra }rb (h2X ``False``hJ}rc (hN]hO]hM]hL]hP]uh3jP h[]rd hjXFalsere rf }rg (h2Uh3ja ubahHhubhjX) rh ri }rj (h2X) h3jP ubh)rk }rl (h2X``MailNotifier``hJ}rm (hN]hO]hM]hL]hP]uh3jP h[]rn hjX MailNotifierro rp }rq (h2Uh3jk ubahHhubhjX3 sends emails using TLS and authenticates with the rr rs }rt (h2X3 sends emails using TLS and authenticates with the h3jP ubh)ru }rv (h2X ``relayhost``hJ}rw (hN]hO]hM]hL]hP]uh3jP h[]rx hjX relayhostry rz }r{ (h2Uh3ju ubahHhubhjX. When using TLS the arguments r| r} }r~ (h2X. When using TLS the arguments h3jP ubh)r }r (h2X ``smtpUser``hJ}r (hN]hO]hM]hL]hP]uh3jP h[]r hjXsmtpUserr r }r (h2Uh3j ubahHhubhjX and r r }r (h2X and h3jP ubh)r }r (h2X``smtpPassword``hJ}r (hN]hO]hM]hL]hP]uh3jP h[]r hjX smtpPasswordr r }r (h2Uh3j ubahHhubhjX must also be specified.r r }r (h2X must also be specified.h3jP ubeubahHjubeubjh)r }r (h2XX``smtpUser`` (string). The user name to use when authenticating with the ``relayhost``. h3jch>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMPhThh[]r (jn)r }r (h2X ``smtpUser``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMPh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXsmtpUserr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2XJ(string). The user name to use when authenticating with the ``relayhost``.h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMOh[]r (hjX<(string). The user name to use when authenticating with the r r }r (h2X<(string). The user name to use when authenticating with the h3j ubh)r }r (h2X ``relayhost``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX relayhostr r }r (h2Uh3j ubahHhubhjX.r }r (h2X.h3j ubeubahHjubeubjh)r }r (h2Xf``smtpPassword`` (string). The password that will be used when authenticating with the ``relayhost``. h3jch>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMThThh[]r (jn)r }r (h2X``smtpPassword``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMTh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX smtpPasswordr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2XT(string). The password that will be used when authenticating with the ``relayhost``.h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMSh[]r (hjXF(string). The password that will be used when authenticating with the r r }r (h2XF(string). The password that will be used when authenticating with the h3j ubh)r }r (h2X ``relayhost``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX relayhostr r }r (h2Uh3j ubahHhubhjX.r }r (h2X.h3j ubeubahHjubeubjh)r }r (h2X``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. h3jch>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMmhThh[]r (jn)r }r (h2X ``lookup``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMmh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXlookupr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r (hn)r }r (h2X(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.h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMWh[]r (hjX(implementor of r r }r (h2X(implementor of h3j ubh)r }r (h2X:class:`IEmailLookup`r h3j h>hAhHhhJ}r (UreftypeXclasshhX IEmailLookupU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMWh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-classr ehM]hL]hP]uh3j h[]r hjX IEmailLookupr r }r (h2Uh3j ubahHhubaubhjX). Object which provides r r }r (h2X). Object which provides h3j ubh)r }r (h2X:class:`IEmailLookup`r h3j h>hAhHhhJ}r (UreftypeXclasshhX IEmailLookupU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMWh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-classr ehM]hL]hP]uh3j h[]r hjX IEmailLookupr r }r (h2Uh3j ubahHhubaubhjXi, which is responsible for mapping User names (which come from the VC system) into valid email addresses.r r }r (h2Xi, which is responsible for mapping User names (which come from the VC system) into valid email addresses.h3j ubeubhn)r }r (h2XUIf 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.h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSM[h[]r (hjX%If the argument is not provided, the r r }r (h2X%If the argument is not provided, the h3j ubh)r! }r" (h2X``MailNotifier``hJ}r# (hN]hO]hM]hL]hP]uh3j h[]r$ hjX MailNotifierr% r& }r' (h2Uh3j! ubahHhubhjX will attempt to build the r( r) }r* (h2X will attempt to build the h3j ubh)r+ }r, (h2X``sendToInterestedUsers``hJ}r- (hN]hO]hM]hL]hP]uh3j h[]r. hjXsendToInterestedUsersr/ r0 }r1 (h2Uh3j+ ubahHhubhjX; from the authors of the Changes that led to the Build via r2 r3 }r4 (h2X; from the authors of the Changes that led to the Build via h3j ubh)r5 }r6 (h2X:ref:`User-Objects`r7 h3j h>hAhHhhJ}r8 (UreftypeXrefhhX user-objectsU refdomainXstdr9 hL]hM]U refexplicithN]hO]hP]hhuhSM[h[]r: j$)r; }r< (h2j7 hJ}r= (hN]hO]r> (hj9 Xstd-refr? ehM]hL]hP]uh3j5 h[]r@ hjX User-ObjectsrA rB }rC (h2Uh3j; ubahHj,ubaubhjX. 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, rD rE }rF (h2X. 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, h3j ubh)rG }rH (h2X ``owners``hJ}rI (hN]hO]hM]hL]hP]uh3j h[]rJ hjXownersrK rL }rM (h2Uh3jG ubahHhubhjX 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.rN rO }rP (h2X 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.h3j ubeubhn)rQ }rR (h2XjMost 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.h3j h>hAhHhqhJ}rS (hN]hO]hM]hL]hP]uhSMeh[]rT (hjXMost 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 rU rV }rW (h2XMost 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 h3jQ ubh)rX }rY (h2X``Domain(str)``hJ}rZ (hN]hO]hM]hL]hP]uh3jQ h[]r[ hjX Domain(str)r\ r] }r^ (h2Uh3jX ubahHhubhjX. For example, r_ r` }ra (h2X. For example, h3jQ ubh)rb }rc (h2X``lookup='twistedmatrix.com'``hJ}rd (hN]hO]hM]hL]hP]uh3jQ h[]re hjXlookup='twistedmatrix.com'rf rg }rh (h2Uh3jb ubahHhubhjXs will allow mail to be sent to all developers whose SVN usernames match their twistedmatrix.com account names. See ri rj }rk (h2Xs will allow mail to be sent to all developers whose SVN usernames match their twistedmatrix.com account names. See h3jQ ubh)rl }rm (h2UhJ}rn (hL]hM]hN]hO]ro Xfilerp aUrolejp hP]uh3jQ h[]rq hjXbuildbot/status/mail.pyrr rs }rt (h2Xbuildbot/status/mail.pyh3jl ubahHhubhjX for more details.ru rv }rw (h2X for more details.h3jQ ubeubhn)rx }ry (h2X{Regardless of the setting of ``lookup``, ``MailNotifier`` will also send mail to addresses in the ``extraRecipients`` list.h3j h>hAhHhqhJ}rz (hN]hO]hM]hL]hP]uhSMlh[]r{ (hjXRegardless of the setting of r| r} }r~ (h2XRegardless of the setting of h3jx ubh)r }r (h2X ``lookup``hJ}r (hN]hO]hM]hL]hP]uh3jx h[]r hjXlookupr r }r (h2Uh3j ubahHhubhjX, r r }r (h2X, h3jx ubh)r }r (h2X``MailNotifier``hJ}r (hN]hO]hM]hL]hP]uh3jx h[]r hjX MailNotifierr r }r (h2Uh3j ubahHhubhjX) will also send mail to addresses in the r r }r (h2X) will also send mail to addresses in the h3jx ubh)r }r (h2X``extraRecipients``hJ}r (hN]hO]hM]hL]hP]uh3jx h[]r hjXextraRecipientsr r }r (h2Uh3j ubahHhubhjX list.r r }r (h2X list.h3jx ubeubehHjubeubjh)r }r (h2XT``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. h3jch>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMwhThh[]r (jn)r }r (h2X``messageFormatter``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMwh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXmessageFormatterr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X>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.h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMph[]r (hjXRThis is a optional function that can be used to generate a custom mail message. A r r }r (h2XRThis is a optional function that can be used to generate a custom mail message. A h3j ubh)r }r (h2X:func:`messageFormatter`r h3j h>hAhHhhJ}r (UreftypeXfunchhXmessageFormatterU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMph[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-funcr ehM]hL]hP]uh3j h[]r hjXmessageFormatterr r }r (h2Uh3j ubahHhubaubhjX function takes the mail mode (r r }r (h2X function takes the mail mode (h3j ubh)r }r (h2X``mode``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXmoder r }r (h2Uh3j ubahHhubhjX), builder name (r r }r (h2X), builder name (h3j ubh)r }r (h2X``name``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXnamer r }r (h2Uh3j ubahHhubhjX), the build status (r r }r (h2X), the build status (h3j ubh)r }r (h2X ``build``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXbuildr r }r (h2Uh3j ubahHhubhjX), the result code (r r }r (h2X), the result code (h3j ubh)r }r (h2X ``results``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXresultsr r }r (h2Uh3j ubahHhubhjX), and the BuildMaster status (r r }r (h2X), and the BuildMaster status (h3j ubh)r }r (h2X``master_status``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX master_statusr r }r (h2Uh3j ubahHhubhjX!). It returns a dictionary. The r r }r (h2X!). It returns a dictionary. The h3j ubh)r }r (h2X``body``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXbodyr r }r (h2Uh3j ubahHhubhjXB key gives a string that is the complete text of the message. The r r }r (h2XB key gives a string that is the complete text of the message. The h3j ubh)r }r (h2X``type``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXtyper r }r (h2Uh3j ubahHhubhjXs key is the message type ('plain' or 'html'). The 'html' type should be used when generating an HTML message. The r r }r (h2Xs key is the message type ('plain' or 'html'). The 'html' type should be used when generating an HTML message. The h3j ubh)r }r (h2X ``subject``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXsubjectr r }r (h2Uh3j ubahHhubhjX6 key is optional, but gives the subject for the email.r r }r (h2X6 key is optional, but gives the subject for the email.h3j ubeubahHjubeubjh)r }r (h2X``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. h3jch>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSM{hThh[]r (jn)r }r (h2X``extraHeaders``r h3j h>hAhHjrhJ}r! (hN]hO]hM]hL]hP]uhSM{h[]r" h)r# }r$ (h2j hJ}r% (hN]hO]hM]hL]hP]uh3j h[]r& hjX extraHeadersr' r( }r) (h2Uh3j# ubahHhubaubj|)r* }r+ (h2UhJ}r, (hN]hO]hM]hL]hP]uh3j h[]r- hn)r. }r/ (h2X(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.h3j* h>hAhHhqhJ}r0 (hN]hO]hM]hL]hP]uhSMzh[]r1 (hjX(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 r2 r3 }r4 (h2X(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 h3j. ubhw)r5 }r6 (h2X `Interpolate`hJ}r7 (hN]hO]hM]hL]hP]uh3j. h[]r8 hjX Interpolater9 r: }r; (h2Uh3j5 ubahHhubhjX instance.r< r= }r> (h2X instance.h3j. ubeubahHjubeubjh)r? }r@ (h2Xx``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. h3jch>hAhHjkhJ}rA (hN]hO]hM]hL]hP]uhSMhThh[]rB (jn)rC }rD (h2X``previousBuildGetter``rE h3j? h>hAhHjrhJ}rF (hN]hO]hM]hL]hP]uhSMh[]rG h)rH }rI (h2jE hJ}rJ (hN]hO]hM]hL]hP]uh3jC h[]rK hjXpreviousBuildGetterrL rM }rN (h2Uh3jH ubahHhubaubj|)rO }rP (h2UhJ}rQ (hN]hO]hM]hL]hP]uh3j? h[]rR hn)rS }rT (h2X_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.h3jO h>hAhHhqhJ}rU (hN]hO]hM]hL]hP]uhSM~h[]rV (hjXKAn optional function to calculate the previous build to the one at hand. A rW rX }rY (h2XKAn optional function to calculate the previous build to the one at hand. A h3jS ubh)rZ }r[ (h2X:func:`previousBuildGetter`r\ h3jS h>hAhHhhJ}r] (UreftypeXfunchhXpreviousBuildGetterU refdomainXpyr^ hL]hM]U refexplicithN]hO]hP]hhhNhNuhSM~h[]r_ h)r` }ra (h2j\ hJ}rb (hN]hO]rc (hj^ Xpy-funcrd ehM]hL]hP]uh3jZ h[]re hjXpreviousBuildGetterrf rg }rh (h2Uh3j` ubahHhubaubhjX takes a ri rj }rk (h2X takes a h3jS ubh)rl }rm (h2X:class:`BuildStatus`rn h3jS h>hAhHhhJ}ro (UreftypeXclasshhX BuildStatusU refdomainXpyrp hL]hM]U refexplicithN]hO]hP]hhhNhNuhSM~h[]rq h)rr }rs (h2jn hJ}rt (hN]hO]ru (hjp Xpy-classrv ehM]hL]hP]uh3jl h[]rw hjX BuildStatusrx ry }rz (h2Uh3jr ubahHhubaubhjX and returns a r{ r| }r} (h2X and returns a h3jS ubh)r~ }r (h2X:class:`BuildStatus`r h3jS h>hAhHhhJ}r (UreftypeXclasshhX BuildStatusU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSM~h[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-classr ehM]hL]hP]uh3j~ h[]r hjX BuildStatusr r }r (h2Uh3j ubahHhubaubhjX. 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.r r }r (h2X. 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.h3jS ubeubahHjubeubeubhn)r }r (h2XAs 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:h3jSh>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (hjXAs a help to those writing r r }r (h2XAs a help to those writing h3j ubh)r }r (h2X:func:`messageFormatter`r h3j h>hAhHhhJ}r (UreftypeXfunchhXmessageFormatterU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-funcr ehM]hL]hP]uh3j h[]r hjXmessageFormatterr r }r (h2Uh3j ubahHhubaubhjXw functions, the following table describes how to get some useful pieces of information from the various status objects:r r }r (h2Xw functions, the following table describes how to get some useful pieces of information from the various status objects:h3j ubeubjb)r }r (h2Uh3jSh>hAhHjehJ}r (hN]hO]hM]hL]hP]uhSNhThh[]r (jh)r }r (h2X7Name of the builder that generated this event ``name`` h3j h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (jn)r }r (h2X-Name of the builder that generated this eventr h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX-Name of the builder that generated this eventr r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X``name``r h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXnamer r }r (h2Uh3j ubahHhubaubahHjubeubjh)r }r (h2X:Title of the buildmaster :meth:`master_status.getTitle()` h3j h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (jn)r }r (h2XTitle of the buildmasterr h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjXTitle of the buildmasterr r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X :meth:`master_status.getTitle()`r h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j h3j h>hAhHhhJ}r (UreftypeXmethhhXmaster_status.getTitleU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-methr ehM]hL]hP]uh3j h[]r hjXmaster_status.getTitler r }r (h2Uh3j ubahHhubaubaubahHjubeubjh)r }r (h2XMailNotifier mode ``mode`` (a combination of ``change``, ``failing``, ``passing``, ``problem``, ``warnings``, ``exception``, ``all``) h3j h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (jn)r }r (h2XMailNotifier moder h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjXMailNotifier moder r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r jb)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r jh)r }r (h2Xt``mode`` (a combination of ``change``, ``failing``, ``passing``, ``problem``, ``warnings``, ``exception``, ``all``) h3j h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (jn)r }r (h2X[``mode`` (a combination of ``change``, ``failing``, ``passing``, ``problem``, ``warnings``,h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (h)r }r (h2X``mode``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXmoder r }r (h2Uh3j ubahHhubhjX (a combination of r r }r (h2X (a combination of h3j ubh)r }r (h2X ``change``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXchanger r }r (h2Uh3j ubahHhubhjX, r r }r (h2X, h3j ubh)r }r (h2X ``failing``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXfailingr r! }r" (h2Uh3j ubahHhubhjX, r# r$ }r% (h2X, h3j ubh)r& }r' (h2X ``passing``hJ}r( (hN]hO]hM]hL]hP]uh3j h[]r) hjXpassingr* r+ }r, (h2Uh3j& ubahHhubhjX, r- r. }r/ (h2X, h3j ubh)r0 }r1 (h2X ``problem``hJ}r2 (hN]hO]hM]hL]hP]uh3j h[]r3 hjXproblemr4 r5 }r6 (h2Uh3j0 ubahHhubhjX, r7 r8 }r9 (h2X, h3j ubh)r: }r; (h2X ``warnings``hJ}r< (hN]hO]hM]hL]hP]uh3j h[]r= hjXwarningsr> r? }r@ (h2Uh3j: ubahHhubhjX,rA }rB (h2X,h3j ubeubj|)rC }rD (h2UhJ}rE (hN]hO]hM]hL]hP]uh3j h[]rF hn)rG }rH (h2X``exception``, ``all``)h3jC h>hAhHhqhJ}rI (hN]hO]hM]hL]hP]uhSMh[]rJ (h)rK }rL (h2X ``exception``hJ}rM (hN]hO]hM]hL]hP]uh3jG h[]rN hjX exceptionrO rP }rQ (h2Uh3jK ubahHhubhjX, rR rS }rT (h2X, h3jG ubh)rU }rV (h2X``all``hJ}rW (hN]hO]hM]hL]hP]uh3jG h[]rX hjXallrY rZ }r[ (h2Uh3jU ubahHhubhjX)r\ }r] (h2X)h3jG ubeubahHjubeubahHjeubahHjubeubeubhn)r^ }r_ (h2XBuilder result as a string ::r` h3jSh>hAhHhqhJ}ra (hN]hO]hM]hL]hP]uhSMhThh[]rb hjXBuilder result as a stringrc rd }re (h2XBuilder result as a stringh3j^ ubaubh)rf }rg (h2Xfrom buildbot.status.builder import Results result_str = Results[results] # one of 'success', 'warnings', 'failure', 'skipped', or 'exception'h3jSh>hAhHhhJ}rh (hhhL]hM]hN]hO]hP]uhSMhThh[]ri hjXfrom buildbot.status.builder import Results result_str = Results[results] # one of 'success', 'warnings', 'failure', 'skipped', or 'exception'rj rk }rl (h2Uh3jf ubaubjb)rm }rn (h2Uh3jSh>hAhHjehJ}ro (hN]hO]hM]hL]hP]uhSNhThh[]rp (jh)rq }rr (h2X:URL to build page ``master_status.getURLForThing(build)`` h3jm h>hAhHjkhJ}rs (hN]hO]hM]hL]hP]uhSMh[]rt (jn)ru }rv (h2XURL to build pagerw h3jq h>hAhHjrhJ}rx (hN]hO]hM]hL]hP]uhSMh[]ry hjXURL to build pagerz r{ }r| (h2jw h3ju ubaubj|)r} }r~ (h2UhJ}r (hN]hO]hM]hL]hP]uh3jq h[]r hn)r }r (h2X'``master_status.getURLForThing(build)``r h3j} h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX#master_status.getURLForThing(build)r r }r (h2Uh3j ubahHhubaubahHjubeubjh)r }r (h2X>URL to buildbot main page. ``master_status.getBuildbotURL()`` h3jm h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (jn)r }r (h2XURL to buildbot main page.r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjXURL to buildbot main page.r r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X"``master_status.getBuildbotURL()``r h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXmaster_status.getBuildbotURL()r r }r (h2Uh3j ubahHhubaubahHjubeubjh)r }r (h2XBuild text ``build.getText()`` h3jm h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (jn)r }r (h2X Build textr h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX Build textr r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X``build.getText()``r h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXbuild.getText()r r }r (h2Uh3j ubahHhubaubahHjubeubjh)r }r (h2X_Mapping of property names to values ``build.getProperties()`` (a :class:`Properties` instance) h3jm h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (jn)r }r (h2X#Mapping of property names to valuesr h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX#Mapping of property names to valuesr r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X:``build.getProperties()`` (a :class:`Properties` instance)h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (h)r }r (h2X``build.getProperties()``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXbuild.getProperties()r r }r (h2Uh3j ubahHhubhjX (a r r }r (h2X (a h3j ubh)r }r (h2X:class:`Properties`r h3j h>hAhHhhJ}r (UreftypeXclasshhX PropertiesU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-classr ehM]hL]hP]uh3j h[]r hjX Propertiesr r }r (h2Uh3j ubahHhubaubhjX instance)r r }r (h2X instance)h3j ubeubahHjubeubjh)r }r (h2X$Slave name ``build.getSlavename()`` h3jm h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (jn)r }r (h2X Slave namer h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX Slave namer r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X``build.getSlavename()``r h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXbuild.getSlavename()r r }r (h2Uh3j ubahHhubaubahHjubeubjh)r }r (h2X9Build reason (from a forced build) ``build.getReason()`` h3jm h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (jn)r }r (h2X"Build reason (from a forced build)r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX"Build reason (from a forced build)r r }r (h2j h3j ubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r! }r" (h2X``build.getReason()``r# h3j h>hAhHhqhJ}r$ (hN]hO]hM]hL]hP]uhSMh[]r% h)r& }r' (h2j# hJ}r( (hN]hO]hM]hL]hP]uh3j! h[]r) hjXbuild.getReason()r* r+ }r, (h2Uh3j& ubahHhubaubahHjubeubjh)r- }r. (h2X:List of responsible users ``build.getResponsibleUsers()`` h3jm h>hAhHjkhJ}r/ (hN]hO]hM]hL]hP]uhSMhThh[]r0 (jn)r1 }r2 (h2XList of responsible usersr3 h3j- h>hAhHjrhJ}r4 (hN]hO]hM]hL]hP]uhSMh[]r5 hjXList of responsible usersr6 r7 }r8 (h2j3 h3j1 ubaubj|)r9 }r: (h2UhJ}r; (hN]hO]hM]hL]hP]uh3j- h[]r< hn)r= }r> (h2X``build.getResponsibleUsers()``r? h3j9 h>hAhHhqhJ}r@ (hN]hO]hM]hL]hP]uhSMh[]rA h)rB }rC (h2j? hJ}rD (hN]hO]hM]hL]hP]uh3j= h[]rE hjXbuild.getResponsibleUsers()rF rG }rH (h2Uh3jB ubahHhubaubahHjubeubeubhn)rI }rJ (h2X5Source information (only valid if ss is not ``None``)rK h3jSh>hAhHhqhJ}rL (hN]hO]hM]hL]hP]uhSMhThh[]rM (hjX,Source information (only valid if ss is not rN rO }rP (h2X,Source information (only valid if ss is not h3jI ubh)rQ }rR (h2X``None``hJ}rS (hN]hO]hM]hL]hP]uh3jI h[]rT hjXNonerU rV }rW (h2Uh3jQ ubahHhubhjX)rX }rY (h2X)h3jI ubeubcdocutils.nodes block_quote rZ )r[ }r\ (h2Uh3jSh>hAhHU block_quoter] hJ}r^ (hN]hO]hM]hL]hP]uhSNhThh[]r_ (hn)r` }ra (h2X#A build has a set of sourcestamps::rb h3j[ h>hAhHhqhJ}rc (hN]hO]hM]hL]hP]uhSMh[]rd hjX"A build has a set of sourcestamps:re rf }rg (h2X"A build has a set of sourcestamps:h3j` ubaubh)rh }ri (h2Xfor ss in build.getSourceStamp(): branch = ss.branch revision = ss.revision patch = ss.patch changes = ss.changes # listh3j[ hHhhJ}rj (hhhL]hM]hN]hO]hP]uhSMh[]rk hjXfor ss in build.getSourceStamp(): branch = ss.branch revision = ss.revision patch = ss.patch changes = ss.changes # listrl rm }rn (h2Uh3jh ubaubhn)ro }rp (h2X5A change object has the following useful information:rq h3j[ h>hAhHhqhJ}rr (hN]hO]hM]hL]hP]uhSMh[]rs hjX5A change object has the following useful information:rt ru }rv (h2jq h3jo ubaubjb)rw }rx (h2UhJ}ry (hN]hO]hM]hL]hP]uh3j[ h[]rz (jh)r{ }r| (h2X#``who`` (str) who made this change h3jw h>hAhHjkhJ}r} (hN]hO]hM]hL]hP]uhSMh[]r~ (jn)r }r (h2X``who``r h3j{ h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXwhor r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j{ h[]r hn)r }r (h2X(str) who made this changer h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX(str) who made this changer r }r (h2j h3j ubaubahHjubeubjh)r }r (h2X3``revision`` (str) what VC revision is this change h3jw h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (jn)r }r (h2X ``revision``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXrevisionr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X%(str) what VC revision is this changer h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX%(str) what VC revision is this changer r }r (h2j h3j ubaubahHjubeubjh)r }r (h2X6``branch`` (str) on what branch did this change occur h3jw h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (jn)r }r (h2X ``branch``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXbranchr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X*(str) on what branch did this change occurr h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX*(str) on what branch did this change occurr r }r (h2j h3j ubaubahHjubeubjh)r }r (h2X*``when`` (str) when did this change occur h3jw h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (jn)r }r (h2X``when``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXwhenr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r (h2X (str) when did this change occurr h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMh[]r hjX (str) when did this change occurr r }r (h2j h3j ubaubahHjubeubjh)r }r (h2X@``files`` (list of str) what files were affected in this change h3jw h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (jn)r }r (h2X ``files``r h3j h>hAhHjrhJ}r (hN]hO]hM]hL]hP]uhSMh[]r h)r }r (h2j hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXfilesr r }r (h2Uh3j ubahHhubaubj|)r }r (h2UhJ}r (hN]hO]hM]hL]hP]uh3j h[]r hn)r }r(h2X5(list of str) what files were affected in this changerh3j h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjX5(list of str) what files were affected in this changerr}r(h2jh3j ubaubahHjubeubjh)r}r(h2X3``comments`` (str) comments reguarding the change. h3jw h>hAhHjkhJ}r (hN]hO]hM]hL]hP]uhSMh[]r (jn)r }r (h2X ``comments``r h3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2j hJ}r(hN]hO]hM]hL]hP]uh3j h[]rhjXcommentsrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X%(str) comments reguarding the change.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjX%(str) comments reguarding the change.r r!}r"(h2jh3jubaubahHjubeubehHjeubhn)r#}r$(h2XThe ``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.h3j[ h>hAhHhqhJ}r%(hN]hO]hM]hL]hP]uhSMh[]r&(hjXThe r'r(}r)(h2XThe h3j#ubh)r*}r+(h2X ``Change``hJ}r,(hN]hO]hM]hL]hP]uh3j#h[]r-hjXChanger.r/}r0(h2Uh3j*ubahHhubhjX methods r1r2}r3(h2X methods h3j#ubh)r4}r5(h2X:meth:`asText`r6h3j#h>hAhHhhJ}r7(UreftypeXmethhhXasTextU refdomainXpyr8hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r9h)r:}r;(h2j6hJ}r<(hN]hO]r=(hj8Xpy-methr>ehM]hL]hP]uh3j4h[]r?hjXasTextr@rA}rB(h2Uh3j:ubahHhubaubhjX and rCrD}rE(h2X and h3j#ubh)rF}rG(h2X:meth:`asDict`rHh3j#h>hAhHhhJ}rI(UreftypeXmethhhXasDictU refdomainXpyrJhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rKh)rL}rM(h2jHhJ}rN(hN]hO]rO(hjJXpy-methrPehM]hL]hP]uh3jFh[]rQhjXasDictrRrS}rT(h2Uh3jLubahHhubaubhjX/ can be used to format the information above. rUrV}rW(h2X/ can be used to format the information above. h3j#ubh)rX}rY(h2X:meth:`asText`rZh3j#h>hAhHhhJ}r[(UreftypeXmethhhXasTextU refdomainXpyr\hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r]h)r^}r_(h2jZhJ}r`(hN]hO]ra(hj\Xpy-methrbehM]hL]hP]uh3jXh[]rchjXasTextrdre}rf(h2Uh3j^ubahHhubaubhjX returns a list of strings and rgrh}ri(h2X returns a list of strings and h3j#ubh)rj}rk(h2X:meth:`asDict`rlh3j#h>hAhHhhJ}rm(UreftypeXmethhhXasDictU refdomainXpyrnhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]roh)rp}rq(h2jlhJ}rr(hN]hO]rs(hjnXpy-methrtehM]hL]hP]uh3jjh[]ruhjXasDictrvrw}rx(h2Uh3jpubahHhubaubhjX7 returns a dictionary suitable for html/mail rendering.ryrz}r{(h2X7 returns a dictionary suitable for html/mail rendering.h3j#ubeubeubhn)r|}r}(h2XLog information ::r~h3jSh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXLog informationrr}r(h2XLog informationh3j|ubaubh)r}r(h2Xlogs = 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))h3jSh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXlogs = 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))rr}r(h2Uh3jubaubju)r}r(h2Uh3jSh>hAhHjxhJ}r(hL]hM]hN]hO]hP]Uentries]r((UsingleXStatus Targets; IRCX status-IRCrjtr(UsingleXIRC Status TargetjjtreuhSMhThh[]ubhE)r}r(h2Uh3jSh>hAhHhIhJ}r(hN]hO]hM]hL]rjahP]uhSMhThh[]ubju)r}r(h2Uh3jSh>hAhHjxhJ}r(hL]hM]hN]hO]hP]j~]r(jXIRCUindex-1rUtrajuhSMhThh[]ubhE)r}r(h2Uh3jSh>hAhHhIhJ}r(hL]hM]hN]hO]hP]hQjuhSMhThh[]ubeubeubh4)r}r(h2Uh3hhAhC}hHh\hJ}r(hN]hO]hM]hL]r(Uirc-botrjehP]rh auhSMhThhU}rjjsh[]r(hc)r}r(h2XIRC Botrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXIRC Botrr}r(h2jh3jubaubju)r}r(h2Uh3jh>NhHjxhJ}r(hL]hM]hN]hO]hP]Uentries]r(jX*buildbot.status.words.IRC (built-in class)hUtrauhSNhThh[]ubj)r}r(h2Uh3jh>NhHjhJ}r(jjXpyhL]hM]hN]hO]hP]jXclassrjjuhSNhThh[]r(j)r}r(h2Xbuildbot.status.words.IRCh3jh>hAhHjhJ}r(hL]rhajNhM]hN]hO]hP]rhajhjXbuildbot.status.wordsjuhSMhThh[]r(j)r}r(h2Xclass h3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXclass rr}r(h2Uh3jubaubj)r}r(h2Xbuildbot.status.words.h3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXbuildbot.status.words.rr}r(h2Uh3jubaubj)r}r(h2XIRCh3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXIRCrr}r(h2Uh3jubaubeubj)r}r(h2Uh3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]ubeubhn)r}r(h2XThe :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. ::h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X":class:`buildbot.status.words.IRC`rh3jh>hAhHhhJ}r(UreftypeXclasshhXbuildbot.status.words.IRCU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXbuildbot.status.words.IRCrr}r(h2Uh3jubahHhubaubhjX 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(h2X 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.h3jubeubh)r}r(h2Xfrom 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)h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXfrom 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(h2Uh3jubaubhn)r}r(h2XTake 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjX!Take a look at the docstring for rr}r(h2X!Take a look at the docstring for h3jubh)r}r(h2X:class:`words.IRC`rh3jh>hAhHhhJ}r(UreftypeXclasshhX words.IRCU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]r hjX words.IRCr r }r (h2Uh3jubahHhubaubhjX= for more details on configuring this service. Note that the r r}r(h2X= for more details on configuring this service. Note that the h3jubh)r}r(h2X ``useSSL``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXuseSSLrr}r(h2Uh3jubahHhubhjX option requires rr}r(h2X option requires h3jubj)r}r(h2X `PyOpenSSL`_jKh3jhHjhJ}r(UnameX PyOpenSSLjjhL]hM]hN]hO]hP]uh[]rhjX PyOpenSSLrr}r (h2Uh3jubaubhjX. The r!r"}r#(h2X. The h3jubh)r$}r%(h2X ``password``hJ}r&(hN]hO]hM]hL]hP]uh3jh[]r'hjXpasswordr(r)}r*(h2Uh3j$ubahHhubhjX 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 r+r,}r-(h2X 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 h3jubh)r.}r/(h2X``port``hJ}r0(hN]hO]hM]hL]hP]uh3jh[]r1hjXportr2r3}r4(h2Uh3j.ubahHhubhjX number. Default value is 6667.r5r6}r7(h2X number. Default value is 6667.h3jubeubhn)r8}r9(h2XTo 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.h3jh>hAhHhqhJ}r:(hN]hO]hM]hL]hP]uhSMhThh[]r;(hjXKTo use the service, you address messages at the buildbot, either normally (r<r=}r>(h2XKTo use the service, you address messages at the buildbot, either normally (h3j8ubh)r?}r@(h2X``botnickname: status``hJ}rA(hN]hO]hM]hL]hP]uh3j8h[]rBhjXbotnickname: statusrCrD}rE(h2Uh3j?ubahHhubhjX) or with private messages (rFrG}rH(h2X) or with private messages (h3j8ubh)rI}rJ(h2X``/msg botnickname status``hJ}rK(hN]hO]hM]hL]hP]uh3j8h[]rLhjX/msg botnickname statusrMrN}rO(h2Uh3jIubahHhubhjX%). The buildbot will respond in kind.rPrQ}rR(h2X%). The buildbot will respond in kind.h3j8ubeubhn)rS}rT(h2XThe 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().h3jh>hAhHhqhJ}rU(hN]hO]hM]hL]hP]uhSM hThh[]rV(hjXgThe bot will add color to some of its messages. This is enabled by default, you might turn it off with rWrX}rY(h2XgThe bot will add color to some of its messages. This is enabled by default, you might turn it off with h3jSubh)rZ}r[(h2X``useColors=False``hJ}r\(hN]hO]hM]hL]hP]uh3jSh[]r]hjXuseColors=Falser^r_}r`(h2Uh3jZubahHhubhjX argument to words.IRC().rarb}rc(h2X argument to words.IRC().h3jSubeubhn)rd}re(h2XIf 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``.h3jh>hAhHhqhJ}rf(hN]hO]hM]hL]hP]uhSM hThh[]rg(hjXpIf you issue a command that is currently not available, the buildbot will respond with an error message. If the rhri}rj(h2XpIf you issue a command that is currently not available, the buildbot will respond with an error message. If the h3jdubh)rk}rl(h2X``noticeOnChannel=True``hJ}rm(hN]hO]hM]hL]hP]uh3jdh[]rnhjXnoticeOnChannel=Truerorp}rq(h2Uh3jkubahHhubhjXl option was used, error messages will be sent as channel notices instead of messaging. The default value is rrrs}rt(h2Xl option was used, error messages will be sent as channel notices instead of messaging. The default value is h3jdubh)ru}rv(h2X``noticeOnChannel=False``hJ}rw(hN]hO]hM]hL]hP]uh3jdh[]rxhjXnoticeOnChannel=Falseryrz}r{(h2Uh3juubahHhubhjX.r|}r}(h2X.h3jdubeubhn)r~}r(h2X)Some of the commands currently available:rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX)Some of the commands currently available:rr}r(h2jh3j~ubaubjb)r}r(h2Uh3jh>hAhHjehJ}r(hN]hO]hM]hL]hP]uhSNhThh[]r(jh)r}r(h2X9``list builders`` Emit a list of all configured builders h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(jn)r}r(h2X``list builders``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX list buildersrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X&Emit a list of all configured buildersrh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjX&Emit a list of all configured buildersrr}r(h2jh3jubaubahHjubeubjh)r}r(h2X`:samp:`status {BUILDER}` Announce the status of a specific Builder: what it is doing right now. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(jn)r}r(h2X:samp:`status {BUILDER}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXstatus rr}r(h2Xstatus h3jubj$)r}r(h2XBUILDERhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBUILDERrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XFAnnounce the status of a specific Builder: what it is doing right now.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjXFAnnounce the status of a specific Builder: what it is doing right now.rr}r(h2jh3jubaubahHjubeubjh)r}r(h2X3``status all`` Announce the status of all Builders h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(jn)r}r(h2X``status all``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX status allrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X#Announce the status of all Buildersrh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]rhjX#Announce the status of all Buildersrr}r(h2jh3jubaubahHjubeubjh)r}r(h2X:samp:`watch {BUILDER}` If the given :class:`Builder` is currently running, wait until the :class:`Build` is finished and then announce the results. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(jn)r}r(h2X:samp:`watch {BUILDER}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXwatch rr}r(h2Xwatch h3jubj$)r}r(h2XBUILDERhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBUILDERrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X|If the given :class:`Builder` is currently running, wait until the :class:`Build` is finished and then announce the results.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(hjX If the given rr }r (h2X If the given h3jubh)r }r (h2X:class:`Builder`r h3jh>hAhHhhJ}r(UreftypeXclasshhXBuilderU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2j hJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3j h[]rhjXBuilderrr}r(h2Uh3jubahHhubaubhjX& is currently running, wait until the rr}r(h2X& is currently running, wait until the h3jubh)r}r(h2X:class:`Build`rh3jh>hAhHhhJ}r (UreftypeXclasshhXBuildU refdomainXpyr!hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r"h)r#}r$(h2jhJ}r%(hN]hO]r&(hj!Xpy-classr'ehM]hL]hP]uh3jh[]r(hjXBuildr)r*}r+(h2Uh3j#ubahHhubaubhjX+ is finished and then announce the results.r,r-}r.(h2X+ is finished and then announce the results.h3jubeubahHjubeubjh)r/}r0(h2Xb:samp:`last {BUILDER}` Return the results of the last build to run on the given :class:`Builder`. h3jh>hAhHjkhJ}r1(hN]hO]hM]hL]hP]uhSM"hThh[]r2(jn)r3}r4(h2X:samp:`last {BUILDER}`r5h3j/h>hAhHjrhJ}r6(hN]hO]hM]hL]hP]uhSM"h[]r7h)r8}r9(h2UhJ}r:(hL]hM]hN]hO]r;Xsampr<aUrolej<hP]uh3j3h[]r=(hjXlast r>r?}r@(h2Xlast h3j8ubj$)rA}rB(h2XBUILDERhJ}rC(hN]hO]hM]hL]hP]uh3j8h[]rDhjXBUILDERrErF}rG(h2Uh3jAubahHj,ubehHhubaubj|)rH}rI(h2UhJ}rJ(hN]hO]hM]hL]hP]uh3j/h[]rKhn)rL}rM(h2XJReturn the results of the last build to run on the given :class:`Builder`.h3jHh>hAhHhqhJ}rN(hN]hO]hM]hL]hP]uhSM"h[]rO(hjX9Return the results of the last build to run on the given rPrQ}rR(h2X9Return the results of the last build to run on the given h3jLubh)rS}rT(h2X:class:`Builder`rUh3jLh>hAhHhhJ}rV(UreftypeXclasshhXBuilderU refdomainXpyrWhL]hM]U refexplicithN]hO]hP]hhhNhNuhSM"h[]rXh)rY}rZ(h2jUhJ}r[(hN]hO]r\(hjWXpy-classr]ehM]hL]hP]uh3jSh[]r^hjXBuilderr_r`}ra(h2Uh3jYubahHhubaubhjX.rb}rc(h2X.h3jLubeubahHjubeubjh)rd}re(h2X2:samp:`join {CHANNEL}` Join the given IRC channel h3jh>hAhHjkhJ}rf(hN]hO]hM]hL]hP]uhSM%hThh[]rg(jn)rh}ri(h2X:samp:`join {CHANNEL}`rjh3jdh>hAhHjrhJ}rk(hN]hO]hM]hL]hP]uhSM%h[]rlh)rm}rn(h2UhJ}ro(hL]hM]hN]hO]rpXsamprqaUrolejqhP]uh3jhh[]rr(hjXjoin rsrt}ru(h2Xjoin h3jmubj$)rv}rw(h2XCHANNELhJ}rx(hN]hO]hM]hL]hP]uh3jmh[]ryhjXCHANNELrzr{}r|(h2Uh3jvubahHj,ubehHhubaubj|)r}}r~(h2UhJ}r(hN]hO]hM]hL]hP]uh3jdh[]rhn)r}r(h2XJoin the given IRC channelrh3j}h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM%h[]rhjXJoin the given IRC channelrr}r(h2jh3jubaubahHjubeubjh)r}r(h2X4:samp:`leave {CHANNEL}` Leave the given IRC channel h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM(hThh[]r(jn)r}r(h2X:samp:`leave {CHANNEL}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM(h[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXleave rr}r(h2Xleave h3jubj$)r}r(h2XCHANNELhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXCHANNELrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XLeave the given IRC channelrh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM(h[]rhjXLeave the given IRC channelrr}r(h2jh3jubaubahHjubeubjh)r}r(h2X: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 h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMChThh[]r(jn)r}r(h2X":samp:`notify on|off|list {EVENT}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMCh[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXnotify on|off|list rr}r(h2Xnotify on|off|list h3jubj$)r}r(h2XEVENThJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXEVENTrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(hn)r}r(h2XReport 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:rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM+h[]rhjXReport 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:rr}r(h2jh3jubaubjb)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(jh)r}r(h2X ``started`` A build has started h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM1h[]r(jn)r}r(h2X ``started``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM1h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXstartedrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XA build has startedrh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM1h[]rhjXA build has startedrr}r(h2jh3jubaubahHjubeubjh)r}r(h2X"``finished`` A build has finished h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM4h[]r(jn)r}r(h2X ``finished``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM4h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXfinishedrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XA build has finishedr h3jh>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSM4h[]r hjXA build has finishedr r }r(h2j h3jubaubahHjubeubjh)r}r(h2X*``success`` A build finished successfully h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM7h[]r(jn)r}r(h2X ``success``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM7h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXsuccessrr}r(h2Uh3jubahHhubaubj|)r}r (h2UhJ}r!(hN]hO]hM]hL]hP]uh3jh[]r"hn)r#}r$(h2XA build finished successfullyr%h3jh>hAhHhqhJ}r&(hN]hO]hM]hL]hP]uhSM7h[]r'hjXA build finished successfullyr(r)}r*(h2j%h3j#ubaubahHjubeubjh)r+}r,(h2X``failure`` A build failed h3jh>hAhHjkhJ}r-(hN]hO]hM]hL]hP]uhSM:h[]r.(jn)r/}r0(h2X ``failure``r1h3j+h>hAhHjrhJ}r2(hN]hO]hM]hL]hP]uhSM:h[]r3h)r4}r5(h2j1hJ}r6(hN]hO]hM]hL]hP]uh3j/h[]r7hjXfailurer8r9}r:(h2Uh3j4ubahHhubaubj|)r;}r<(h2UhJ}r=(hN]hO]hM]hL]hP]uh3j+h[]r>hn)r?}r@(h2XA build failedrAh3j;h>hAhHhqhJ}rB(hN]hO]hM]hL]hP]uhSM:h[]rChjXA build failedrDrE}rF(h2jAh3j?ubaubahHjubeubjh)rG}rH(h2X.``exception`` A build generated and exception h3jh>hAhHjkhJ}rI(hN]hO]hM]hL]hP]uhSM=h[]rJ(jn)rK}rL(h2X ``exception``rMh3jGh>hAhHjrhJ}rN(hN]hO]hM]hL]hP]uhSM=h[]rOh)rP}rQ(h2jMhJ}rR(hN]hO]hM]hL]hP]uh3jKh[]rShjX exceptionrTrU}rV(h2Uh3jPubahHhubaubj|)rW}rX(h2UhJ}rY(hN]hO]hM]hL]hP]uh3jGh[]rZhn)r[}r\(h2XA build generated and exceptionr]h3jWh>hAhHhqhJ}r^(hN]hO]hM]hL]hP]uhSM=h[]r_hjXA build generated and exceptionr`ra}rb(h2j]h3j[ubaubahHjubeubjh)rc}rd(h2X``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 h3jh>hAhHjkhJ}re(hN]hO]hM]hL]hP]uhSMCh[]rf(jn)rg}rh(h2X``xToY``rih3jch>hAhHjrhJ}rj(hN]hO]hM]hL]hP]uhSMCh[]rkh)rl}rm(h2jihJ}rn(hN]hO]hM]hL]hP]uh3jgh[]rohjXxToYrprq}rr(h2Uh3jlubahHhubaubj|)rs}rt(h2UhJ}ru(hN]hO]hM]hL]hP]uh3jch[]rvhn)rw}rx(h2XThe 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 failedh3jsh>hAhHhqhJ}ry(hN]hO]hM]hL]hP]uhSM@h[]rz(hjXThe 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}(h2XThe 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: h3jwubh)r~}r(h2X``successToFailure``hJ}r(hN]hO]hM]hL]hP]uh3jwh[]rhjXsuccessToFailurerr}r(h2Uh3j~ubahHhubhjXF will notify if the previous build was successful, but this one failedrr}r(h2XF will notify if the previous build was successful, but this one failedh3jwubeubahHjubeubehHjeubehHjubeubjh)r}r(h2Xi:samp:`help {COMMAND}` Describe a command. Use :command:`help commands` to get a list of known commands. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMGhThh[]r(jn)r}r(h2X:samp:`help {COMMAND}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMGh[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXhelp rr}r(h2Xhelp h3jubj$)r}r(h2XCOMMANDhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXCOMMANDrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XQDescribe a command. Use :command:`help commands` to get a list of known commands.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMFh[]r(hjXDescribe a command. Use rr}r(h2XDescribe a command. Use h3jubjy)r}r(h2X:command:`help commands`hJ}r(hN]hO]rj~ahM]hL]hP]uh3jh[]rhjX help commandsrr}r(h2Uh3jubahHjubhjX! to get a list of known commands.rr}r(h2X! to get a list of known commands.h3jubeubahHjubeubjh)r}r(h2X@: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 h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMWhThh[]r(jn)r}r(h2X:samp:`shutdown {ARG}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMWh[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjX shutdown rr}r(h2X shutdown h3jubj$)r}r(h2XARGhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXARGrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(hn)r}r(h2XMControl the shutdown process of the buildbot master. Available arguments are:rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMJh[]rhjXMControl the shutdown process of the buildbot master. Available arguments are:rr}r(h2jh3jubaubjb)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(jh)r}r(h2XC``check`` Check if the buildbot master is running or shutting down h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMNh[]r(jn)r}r(h2X ``check``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMNh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXcheckrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X8Check if the buildbot master is running or shutting downrh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMNh[]rhjX8Check if the buildbot master is running or shutting downrr}r(h2jh3jubaubahHjubeubjh)r}r(h2X``start`` Start clean shutdown h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMQh[]r(jn)r}r(h2X ``start``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMQh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXstartr r }r (h2Uh3jubahHhubaubj|)r }r (h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XStart clean shutdownrh3j h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMQh[]rhjXStart clean shutdownrr}r(h2jh3jubaubahHjubeubjh)r}r(h2X``stop`` Stop clean shutdown h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMTh[]r(jn)r}r(h2X``stop``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMTh[]r h)r!}r"(h2jhJ}r#(hN]hO]hM]hL]hP]uh3jh[]r$hjXstopr%r&}r'(h2Uh3j!ubahHhubaubj|)r(}r)(h2UhJ}r*(hN]hO]hM]hL]hP]uh3jh[]r+hn)r,}r-(h2XStop clean shutdownr.h3j(h>hAhHhqhJ}r/(hN]hO]hM]hL]hP]uhSMTh[]r0hjXStop clean shutdownr1r2}r3(h2j.h3j,ubaubahHjubeubjh)r4}r5(h2XH``now`` Shutdown immediately without waiting for the builders to finish h3jh>hAhHjkhJ}r6(hN]hO]hM]hL]hP]uhSMWh[]r7(jn)r8}r9(h2X``now``r:h3j4h>hAhHjrhJ}r;(hN]hO]hM]hL]hP]uhSMWh[]r<h)r=}r>(h2j:hJ}r?(hN]hO]hM]hL]hP]uh3j8h[]r@hjXnowrArB}rC(h2Uh3j=ubahHhubaubj|)rD}rE(h2UhJ}rF(hN]hO]hM]hL]hP]uh3j4h[]rGhn)rH}rI(h2X?Shutdown immediately without waiting for the builders to finishrJh3jDh>hAhHhqhJ}rK(hN]hO]hM]hL]hP]uhSMWh[]rLhjX?Shutdown immediately without waiting for the builders to finishrMrN}rO(h2jJh3jHubaubahHjubeubehHjeubehHjubeubjh)rP}rQ(h2X9``source`` Announce the URL of the Buildbot's home page. h3jh>hAhHjkhJ}rR(hN]hO]hM]hL]hP]uhSMZhThh[]rS(jn)rT}rU(h2X ``source``rVh3jPh>hAhHjrhJ}rW(hN]hO]hM]hL]hP]uhSMZh[]rXh)rY}rZ(h2jVhJ}r[(hN]hO]hM]hL]hP]uh3jTh[]r\hjXsourcer]r^}r_(h2Uh3jYubahHhubaubj|)r`}ra(h2UhJ}rb(hN]hO]hM]hL]hP]uh3jPh[]rchn)rd}re(h2X-Announce the URL of the Buildbot's home page.rfh3j`h>hAhHhqhJ}rg(hN]hO]hM]hL]hP]uhSMZh[]rhhjX-Announce the URL of the Buildbot's home page.rirj}rk(h2jfh3jdubaubahHjubeubjh)rl}rm(h2X3``version`` Announce the version of this Buildbot. h3jh>hAhHjkhJ}rn(hN]hO]hM]hL]hP]uhSM]hThh[]ro(jn)rp}rq(h2X ``version``rrh3jlh>hAhHjrhJ}rs(hN]hO]hM]hL]hP]uhSM]h[]rth)ru}rv(h2jrhJ}rw(hN]hO]hM]hL]hP]uh3jph[]rxhjXversionryrz}r{(h2Uh3juubahHhubaubj|)r|}r}(h2UhJ}r~(hN]hO]hM]hL]hP]uh3jlh[]rhn)r}r(h2X&Announce the version of this Buildbot.rh3j|h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM]h[]rhjX&Announce the version of this Buildbot.rr}r(h2jh3jubaubahHjubeubeubhn)r}r(h2XgAdditionally, the config file may specify default notification options as shown in the example earlier.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM_hThh[]rhjXgAdditionally, the config file may specify default notification options as shown in the example earlier.rr}r(h2jh3jubaubhn)r}r(h2XWIf the ``allowForce=True`` option was used, some additional commands will be available:h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMbhThh[]r(hjXIf the rr}r(h2XIf the h3jubh)r}r(h2X``allowForce=True``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXallowForce=Truerr}r(h2Uh3jubahHhubhjX= option was used, some additional commands will be available:rr}r(h2X= option was used, some additional commands will be available:h3jubeubju)r}r(h2Uh3jh>hAhHjxhJ}r(hL]hM]hN]hO]hP]j~]r(jXProperties; from forced buildUindex-2rUtrajuhSMehThh[]ubhE)r}r(h2Uh3jh>hAhHhIhJ}r(hL]hM]hN]hO]hP]hQjuhSMfhThh[]ubjb)r}r(h2Uh3jh>hAhC}hHjehJ}r(hN]hO]hM]hL]rjahP]uhSNhThhU}rjjsh[]r(jh)r}r(h2X5: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..}`. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMnh[]r(jn)r}r(h2Xu:samp:`force build [--branch={BRANCH}] [--revision={REVISION}] [--props=PROP1=VAL1,PROP2=VAL2...] {BUILDER} {REASON}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMnh[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXforce build [--branch=rr}r(h2Xforce build [--branch=h3jubj$)r}r(h2XBRANCHhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBRANCHrr}r(h2Uh3jubahHj,ubhjX] [--revision=rr}r(h2X] [--revision=h3jubj$)r}r(h2XREVISIONhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXREVISIONrr}r(h2Uh3jubahHj,ubhjX%] [--props=PROP1=VAL1,PROP2=VAL2...] rr}r(h2X%] [--props=PROP1=VAL1,PROP2=VAL2...] h3jubj$)r}r(h2XBUILDERhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBUILDERrr}r(h2Uh3jubahHj,ubhjX r}r(h2X h3jubj$)r}r(h2XREASONhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXREASONrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XTell 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..}`.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhh[]r(hjXTell the given rr}r(h2XTell the given h3jubh)r}r(h2X:class:`Builder`rh3jh>hAhHhhJ}r(UreftypeXclasshhXBuilderU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMhh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXBuilderrr}r(h2Uh3jubahHhubaubhjXH to start a build of the latest code. The user requesting the build and rr}r(h2XH to start a build of the latest code. The user requesting the build and h3jubj$)r}r(h2X*REASON*hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXREASONrr}r (h2Uh3jubahHj,ubhjX are recorded in the r r }r (h2X are recorded in the h3jubh)r }r(h2X:class:`Build`rh3jh>hAhHhhJ}r(UreftypeXclasshhXBuildU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMhh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3j h[]rhjXBuildrr}r(h2Uh3jubahHhubaubhjX 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(h2X 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 h3jubh)r}r (h2UhJ}r!(hL]hM]hN]hO]r"Xsampr#aUrolej#hP]uh3jh[]r$(hjX --branch=r%r&}r'(h2X --branch=h3jubj$)r(}r)(h2XBRANCHhJ}r*(hN]hO]hM]hL]hP]uh3jh[]r+hjXBRANCHr,r-}r.(h2Uh3j(ubahHj,ubehHhubhjX and r/r0}r1(h2X and h3jubh)r2}r3(h2UhJ}r4(hL]hM]hN]hO]r5Xsampr6aUrolej6hP]uh3jh[]r7(hjX --revision=r8r9}r:(h2X --revision=h3j2ubj$)r;}r<(h2XREVISIONhJ}r=(hN]hO]hM]hL]hP]uh3j2h[]r>hjXREVISIONr?r@}rA(h2Uh3j;ubahHj,ubehHhubhjX3. The user can also give a list of properties with rBrC}rD(h2X3. The user can also give a list of properties with h3jubh)rE}rF(h2UhJ}rG(hL]hM]hN]hO]rHXsamprIaUrolejIhP]uh3jh[]rJ(hjX--props=rKrL}rM(h2X--props=h3jEubj$)rN}rO(h2XPROP1=VAL1,PROP2=VAL2..hJ}rP(hN]hO]hM]hL]hP]uh3jEh[]rQhjXPROP1=VAL1,PROP2=VAL2..rRrS}rT(h2Uh3jNubahHj,ubehHhubhjX.rU}rV(h2X.h3jubeubahHjubeubjh)rW}rX(h2Xv: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. h3jh>hAhHjkhJ}rY(hN]hO]hM]hL]hP]uhSMuhThh[]rZ(jn)r[}r\(h2X%:samp:`stop build {BUILDER} {REASON}`r]h3jWh>hAhHjrhJ}r^(hN]hO]hM]hL]hP]uhSMuh[]r_h)r`}ra(h2UhJ}rb(hL]hM]hN]hO]rcXsamprdaUrolejdhP]uh3j[h[]re(hjX stop build rfrg}rh(h2X stop build h3j`ubj$)ri}rj(h2XBUILDERhJ}rk(hN]hO]hM]hL]hP]uh3j`h[]rlhjXBUILDERrmrn}ro(h2Uh3jiubahHj,ubhjX rp}rq(h2X h3j`ubj$)rr}rs(h2XREASONhJ}rt(hN]hO]hM]hL]hP]uh3j`h[]ruhjXREASONrvrw}rx(h2Uh3jrubahHj,ubehHhubaubj|)ry}rz(h2UhJ}r{(hN]hO]hM]hL]hP]uh3jWh[]r|hn)r}}r~(h2XOTerminate 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.h3jyh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMqh[]r(hjX)Terminate any running build in the given rr}r(h2X)Terminate any running build in the given h3j}ubh)r}r(h2X:class:`Builder`rh3j}h>hAhHhhJ}r(UreftypeXclasshhXBuilderU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMqh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXBuilderrr}r(h2Uh3jubahHhubaubhjX. rr}r(h2X. h3j}ubj$)r}r(h2X*REASON*hJ}r(hN]hO]hM]hL]hP]uh3j}h[]rhjXREASONrr}r(h2Uh3jubahHj,ubhjX  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.rr}r(h2X  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.h3j}ubeubahHjubeubeubhn)r}r(h2XIf 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMwhThh[]r(hjXIf the rr}r(h2XIf the h3jubhw)r}r(h2X `categories`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX categoriesrr}r(h2Uh3jubahHhubhjX@ is set to a category of builders (see the categories option in rr}r(h2X@ is set to a category of builders (see the categories option in h3jubh)r}r(h2X:ref:`Builder-Configuration`rh3jh>hAhHhhJ}r(UreftypeXrefhhXbuilder-configurationU refdomainXstdrhL]hM]U refexplicithN]hO]hP]hhuhSMwh[]rj$)r}r(h2jhJ}r(hN]hO]r(hjXstd-refrehM]hL]hP]uh3jh[]rhjXBuilder-Configurationrr}r(h2Uh3jubahHj,ubaubhjXP) changes related to only that category of builders will be sent to the channel.rr}r(h2XP) changes related to only that category of builders will be sent to the channel.h3jubeubhn)r}r(h2XIf 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM{hThh[]r(hjXIf the rr}r(h2XIf the h3jubhw)r}r(h2X`useRevisions`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX useRevisionsrr}r(h2Uh3jubahHhubhjX option is set to rr}r(h2X option is set to h3jubhw)r}r(h2X`True`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXTruerr}r(h2Uh3jubahHhubhjX, 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(h2X, 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 h3jubhw)r}r(h2X`build #253 of ...`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbuild #253 of ...rr}r(h2Uh3jubahHhubhjX, you would see something like rr}r(h2X, you would see something like h3jubhw)r}r(h2X&`build containing revisions [a87b2c4]`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX$build containing revisions [a87b2c4]rr}r(h2Uh3jubahHhubhjX. 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(h2X. 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.h3jubeubhn)r}r(h2XCTwo 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjX}Two additional arguments can be set to control how fast the IRC bot tries to reconnect when it encounters connection issues. rr}r(h2X}Two additional arguments can be set to control how fast the IRC bot tries to reconnect when it encounters connection issues. h3jubh)r}r(h2X ``lostDelay``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX lostDelayrr}r(h2Uh3jubahHhubhjXb is the number of of seconds the bot will wait to reconnect when the connection is lost, where as rr}r(h2Xb is the number of of seconds the bot will wait to reconnect when the connection is lost, where as h3jubh)r}r(h2X``failedDelay``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX failedDelayrr}r (h2Uh3jubahHhubhjXW is the number of seconds until the bot tries to reconnect when the connection failed. r r }r (h2XW is the number of seconds until the bot tries to reconnect when the connection failed. h3jubh)r }r(h2X ``lostDelay``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX lostDelayrr}r(h2Uh3j ubahHhubhjX4 defaults to a random number between 1 and 5, while rr}r(h2X4 defaults to a random number between 1 and 5, while h3jubh)r}r(h2X``failedDelay``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX failedDelayrr}r(h2Uh3jubahHhubhjX 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 (h2X 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.h3jubeubju)r!}r"(h2Uh3jh>hAhHjxhJ}r#(hL]hM]hN]hO]hP]Uentries]r$((UsingleXStatus Targets; PBListenerXstatus-PBListenerr%j%tr&(UsingleXPBListener Status Targetj%j%tr'euhSMhThh[]ubhE)r(}r)(h2Uh3jh>hAhHhIhJ}r*(hL]hM]hN]hO]hP]hQj%uhSMhThh[]ubeubh4)r+}r,(h2Uh3hhAhC}hHh\hJ}r-(hN]hO]hM]hL]r.(U pblistenerr/j%ehP]r0hauhSMhThhU}r1j%j(sh[]r2(hc)r3}r4(h2X PBListenerr5h3j+h>hAhHhghJ}r6(hN]hO]hM]hL]hP]uhSMhThh[]r7hjX PBListenerr8r9}r:(h2j5h3j3ubaubcdocutils.nodes comment r;)r<}r=(h2X@cindex PBListenerh3j+h>hAhHUcommentr>hJ}r?(hhhL]hM]hN]hO]hP]uhSMhThh[]r@hjX@cindex PBListenerrArB}rC(h2Uh3j<ubaubju)rD}rE(h2Uh3j+h>NhHjxhJ}rF(hL]hM]hN]hO]hP]Uentries]rG(jX2buildbot.status.client.PBListener (built-in class)h'UtrHauhSNhThh[]ubj)rI}rJ(h2Uh3j+h>NhHjhJ}rK(jjXpyhL]hM]hN]hO]hP]jXclassrLjjLuhSNhThh[]rM(j)rN}rO(h2X!buildbot.status.client.PBListenerh3jIh>hAhHjhJ}rP(hL]rQh'ajNhM]hN]hO]hP]rRh'ajh'jXbuildbot.status.clientjuhSMhThh[]rS(j)rT}rU(h2Xclass h3jNh>hAhHjhJ}rV(hN]hO]hM]hL]hP]uhSMhThh[]rWhjXclass rXrY}rZ(h2Uh3jTubaubj)r[}r\(h2Xbuildbot.status.client.h3jNh>hAhHjhJ}r](hN]hO]hM]hL]hP]uhSMhThh[]r^hjXbuildbot.status.client.r_r`}ra(h2Uh3j[ubaubj)rb}rc(h2X PBListenerh3jNh>hAhHjhJ}rd(hN]hO]hM]hL]hP]uhSMhThh[]rehjX PBListenerrfrg}rh(h2Uh3jbubaubeubj)ri}rj(h2Uh3jIh>hAhHjhJ}rk(hN]hO]hM]hL]hP]uhSMhThh[]ubeubh)rl}rm(h2Ximport buildbot.status.client pbl = buildbot.status.client.PBListener(port=int, user=str, passwd=str) c['status'].append(pbl)h3j+h>hAhHhhJ}rn(hhhL]hM]hN]hO]hP]uhSMhThh[]rohjXimport buildbot.status.client pbl = buildbot.status.client.PBListener(port=int, user=str, passwd=str) c['status'].append(pbl)rprq}rr(h2Uh3jlubaubhn)rs}rt(h2X"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.h3j+h>hAhHhqhJ}ru(hN]hO]hM]hL]hP]uhSMhThh[]rv(hjXThis sets up a PB listener on the given TCP port, to which a PB-based status client can connect and retrieve status information. rwrx}ry(h2XThis sets up a PB listener on the given TCP port, to which a PB-based status client can connect and retrieve status information. h3jsubjy)rz}r{(h2X:command:`buildbot statusgui`hJ}r|(hN]hO]r}j~ahM]hL]hP]uh3jsh[]r~hjXbuildbot statusguirr}r(h2Uh3jzubahHjubhjX (rr}r(h2X (h3jsubh)r}r(h2X:bb:cmdline:`statusgui`rh3jsh>hAhHhhJ}r(UreftypeXcmdlinehhX statusguiU refdomainXbbrhL]hM]U refexplicithN]hO]hP]hhuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjX bb-cmdlinerehM]hL]hP]uh3jh[]rhjX statusguirr}r(h2Uh3jubahHhubaubhjX-) is an example of such a status client. The rr}r(h2X-) is an example of such a status client. The h3jsubh)r}r(h2X``port``hJ}r(hN]hO]hM]hL]hP]uh3jsh[]rhjXportrr}r(h2Uh3jubahHhubhjX6 argument can also be a strports specification string.rr}r(h2X6 argument can also be a strports specification string.h3jsubeubju)r}r(h2Uh3j+h>hAhHjxhJ}r(hL]hM]hN]hO]hP]Uentries]r((UsingleXStatus Targets; StatusPushXstatus-StatusPushrjtr(UsingleXStatusPush Status TargetjjtreuhSMhThh[]ubhE)r}r(h2Uh3j+h>hAhHhIhJ}r(hL]hM]hN]hO]hP]hQjuhSMhThh[]ubeubh4)r}r(h2Uh3hhAhC}hHh\hJ}r(hN]hO]hM]hL]r(U statuspushrjehP]rh(auhSMhThhU}rjjsh[]r(hc)r}r(h2X StatusPushrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX StatusPushrr}r(h2jh3jubaubj;)r}r(h2X@cindex StatusPushh3jh>hAhHj>hJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjX@cindex StatusPushrr}r(h2Uh3jubaubju)r}r(h2Uh3jh>NhHjxhJ}r(hL]hM]hN]hO]hP]Uentries]r(jX7buildbot.status.status_push.StatusPush (built-in class)hUtrauhSNhThh[]ubj)r}r(h2Uh3jh>NhHjhJ}r(jjXpyhL]hM]hN]hO]hP]jXclassrjjuhSNhThh[]r(j)r}r(h2X&buildbot.status.status_push.StatusPushh3jh>hAhHjhJ}r(hL]rhajNhM]hN]hO]hP]rhajhjXbuildbot.status.status_pushjuhSMhThh[]r(j)r}r(h2Xclass h3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXclass rr}r(h2Uh3jubaubj)r}r(h2Xbuildbot.status.status_push.h3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXbuildbot.status.status_push.rr}r(h2Uh3jubaubj)r}r(h2X StatusPushh3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX StatusPushrr}r(h2Uh3jubaubeubj)r}r(h2Uh3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]ubeubh)r}r(h2XFdef 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)h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXFdef 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(h2Uh3jubaubhn)r}r(h2X1: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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(h)r}r(h2X:class:`StatusPush`rh3jh>hAhHhhJ}r(UreftypeXclasshhX StatusPushU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjX StatusPushrr}r(h2Uh3jubahHhubaubhjX7 batches events normally processed and sends it to the rr}r(h2X7 batches events normally processed and sends it to the h3jubh)r}r(h2X:func:`serverPushCb`r h3jh>hAhHhhJ}r (UreftypeXfunchhX serverPushCbU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r h)r }r(h2j hJ}r(hN]hO]r(hj Xpy-funcrehM]hL]hP]uh3jh[]rhjX serverPushCbrr}r(h2Uh3j ubahHhubaubhjX callback every rr}r(h2X callback every h3jubh)r}r(h2X``bufferDelay``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX bufferDelayrr}r(h2Uh3jubahHhubhjXv seconds. The callback should pop items from the queue and then queue the next callback. If no items were popped from r r!}r"(h2Xv seconds. The callback should pop items from the queue and then queue the next callback. If no items were popped from h3jubh)r#}r$(h2X``self.queue``hJ}r%(hN]hO]hM]hL]hP]uh3jh[]r&hjX self.queuer'r(}r)(h2Uh3j#ubahHhubhjX, r*r+}r,(h2X, h3jubh)r-}r.(h2X``retryDelay``hJ}r/(hN]hO]hM]hL]hP]uh3jh[]r0hjX retryDelayr1r2}r3(h2Uh3j-ubahHhubhjX seconds will be waited instead.r4r5}r6(h2X seconds will be waited instead.h3jubeubju)r7}r8(h2Uh3jh>hAhHjxhJ}r9(hL]hM]hN]hO]hP]Uentries]r:((UsingleXStatus Targets; HttpStatusPushXstatus-HttpStatusPushr;j;tr<(UsingleXHttpStatusPush Status Targetj;j;tr=euhSMhThh[]ubhE)r>}r?(h2Uh3jh>hAhHhIhJ}r@(hL]hM]hN]hO]hP]hQj;uhSMhThh[]ubeubh4)rA}rB(h2Uh3hhAhC}hHh\hJ}rC(hN]hO]hM]hL]rD(UhttpstatuspushrEj;ehP]rFhauhSMhThhU}rGj;j>sh[]rH(hc)rI}rJ(h2XHttpStatusPushrKh3jAh>hAhHhghJ}rL(hN]hO]hM]hL]hP]uhSMhThh[]rMhjXHttpStatusPushrNrO}rP(h2jKh3jIubaubj;)rQ}rR(h2X@cindex HttpStatusPushh3jAh>hAhHj>hJ}rS(hhhL]hM]hN]hO]hP]uhSMhThh[]rThjX@cindex HttpStatusPushrUrV}rW(h2Uh3jQubaubj;)rX}rY(h2X3@stindex buildbot.status.status_push.HttpStatusPushh3jAh>hAhHj>hJ}rZ(hhhL]hM]hN]hO]hP]uhSMhThh[]r[hjX3@stindex buildbot.status.status_push.HttpStatusPushr\r]}r^(h2Uh3jXubaubh)r_}r`(h2Ximport buildbot.status.status_push sp = buildbot.status.status_push.HttpStatusPush( serverUrl="http://example.com/submit") c['status'].append(sp)h3jAh>hAhHhhJ}ra(hhhL]hM]hN]hO]hP]uhSMhThh[]rbhjXimport buildbot.status.status_push sp = buildbot.status.status_push.HttpStatusPush( serverUrl="http://example.com/submit") c['status'].append(sp)rcrd}re(h2Uh3j_ubaubhn)rf}rg(h2X: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.h3jAh>hAhHhqhJ}rh(hN]hO]hM]hL]hP]uhSMhThh[]ri(h)rj}rk(h2X:class:`HttpStatusPush`rlh3jfh>hAhHhhJ}rm(UreftypeXclasshhXHttpStatusPushU refdomainXpyrnhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]roh)rp}rq(h2jlhJ}rr(hN]hO]rs(hjnXpy-classrtehM]hL]hP]uh3jjh[]ruhjXHttpStatusPushrvrw}rx(h2Uh3jpubahHhubaubhjX builds on ryrz}r{(h2X builds on h3jfubh)r|}r}(h2X:class:`StatusPush`r~h3jfh>hAhHhhJ}r(UreftypeXclasshhX StatusPushU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2j~hJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3j|h[]rhjX StatusPushrr}r(h2Uh3jubahHhubaubhjX and sends HTTP requests to rr}r(h2X and sends HTTP requests to h3jfubh)r}r(h2X ``serverUrl``hJ}r(hN]hO]hM]hL]hP]uh3jfh[]rhjX serverUrlrr}r(h2Uh3jubahHhubhjXx, with all the items json-encoded. It is useful to create a status front end outside of buildbot for better scalability.rr}r(h2Xx, with all the items json-encoded. It is useful to create a status front end outside of buildbot for better scalability.h3jfubeubju)r}r(h2Uh3jAh>hAhHjxhJ}r(hL]hM]hN]hO]hP]Uentries]r((UsingleX Status Targets; GerritStatusPushXstatus-GerritStatusPushrjtr(UsingleXGerritStatusPush Status TargetjjtreuhSMhThh[]ubhE)r}r(h2Uh3jAh>hAhHhIhJ}r(hL]hM]hN]hO]hP]hQjuhSMhThh[]ubeubh4)r}r(h2Uh3hhAhC}hHh\hJ}r(hN]hO]hM]hL]r(UgerritstatuspushrjehP]rhauhSMhThhU}rjjsh[]r(hc)r}r(h2XGerritStatusPushrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXGerritStatusPushrr}r(h2jh3jubaubju)r}r(h2Uh3jh>NhHjxhJ}r(hL]hM]hN]hO]hP]Uentries]r(jX?buildbot.status.status_gerrit.GerritStatusPush (built-in class)h$UtrauhSNhThh[]ubj)r}r(h2Uh3jh>NhHjhJ}r(jjXpyhL]hM]hN]hO]hP]jXclassrjjuhSNhThh[]r(j)r}r(h2X.buildbot.status.status_gerrit.GerritStatusPushh3jh>hAhHjhJ}r(hL]rh$ajNhM]hN]hO]hP]rh$ajh$jXbuildbot.status.status_gerritjuhSMhThh[]r(j)r}r(h2Xclass h3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXclass rr}r(h2Uh3jubaubj)r}r(h2Xbuildbot.status.status_gerrit.h3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXbuildbot.status.status_gerrit.rr}r(h2Uh3jubaubj)r}r(h2XGerritStatusPushh3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXGerritStatusPushrr}r(h2Uh3jubaubeubj)r}r(h2Uh3jh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]ubeubh)r}r(h2Xfrom 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 if arg: message += "\nFor more details visit:\n" message += status.getURLForThing(build) + "\n" return message 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']))h3jh>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSMhThh[]rhjXfrom 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 if arg: message += "\nFor more details visit:\n" message += status.getURLForThing(build) + "\n" return message 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']))rr}r(h2Uh3jubaubhn)r}r(h2X"GerritStatusPush sends review of the :class:`Change` back to the Gerrit server, optionally also sending a message when a build is started. ``reviewCB`` should return a tuple of message, verified, reviewed. If message is ``None``, no review will be sent. ``startCB`` should return a message.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjX%GerritStatusPush sends review of the rr}r(h2X%GerritStatusPush sends review of the h3jubh)r}r(h2X:class:`Change`rh3jh>hAhHhhJ}r(UreftypeXclasshhXChangeU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXChangerr}r(h2Uh3jubahHhubaubhjXW back to the Gerrit server, optionally also sending a message when a build is started. rr}r(h2XW back to the Gerrit server, optionally also sending a message when a build is started. h3jubh)r}r(h2X ``reviewCB``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXreviewCBrr}r(h2Uh3jubahHhubhjXE should return a tuple of message, verified, reviewed. If message is rr}r(h2XE should return a tuple of message, verified, reviewed. If message is h3jubh)r}r(h2X``None``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXNonerr }r (h2Uh3jubahHhubhjX, no review will be sent. r r }r (h2X, no review will be sent. h3jubh)r}r(h2X ``startCB``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXstartCBrr}r(h2Uh3jubahHhubhjX should return a message.rr}r(h2X should return a message.h3jubeubcdocutils.nodes footnote r)r}r(h2XOApparently this is the same way http://buildd.debian.org displays build status h3jh>hAhHUfootnoterhJ}r(UautorKhL]rUid6rahM]r Uid2r!ahN]hO]hP]r"U1auhSMhThh[]r#(cdocutils.nodes label r$)r%}r&(h2Uh3jh>NhHUlabelr'hJ}r((hN]hO]hM]hL]hP]uhSNhThh[]r)hjX1r*}r+(h2Uh3j%ubaubhn)r,}r-(h2XNApparently this is the same way http://buildd.debian.org displays build statush3jh>hAhHhqhJ}r.(hN]hO]hM]hL]hP]uhSMh[]r/(hjX Apparently this is the same way r0r1}r2(h2X Apparently this is the same way h3j,ubj)r3}r4(h2Xhttp://buildd.debian.orgr5hJ}r6(Urefurij5hL]hM]hN]hO]hP]uh3j,h[]r7hjXhttp://buildd.debian.orgr8r9}r:(h2Uh3j3ubahHjubhjX displays build statusr;r<}r=(h2X displays build statush3j,ubeubeubj)r>}r?(h2XIt 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 h3jh>hAhHjhJ}r@(jKhL]rAUid7rBahM]rCUid3rDahN]hO]hP]rEU2auhSMhThh[]rF(j$)rG}rH(h2Uh3j>h>NhHj'hJ}rI(hN]hO]hM]hL]hP]uhSNhThh[]rJhjX2rK}rL(h2Uh3jGubaubhn)rM}rN(h2XIt 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 untestedh3j>h>hAhHhqhJ}rO(hN]hO]hM]hL]hP]uhSMh[]rP(hjXLIt may even be possible to provide SSL access by using a specification like rQrR}rS(h2XLIt may even be possible to provide SSL access by using a specification like h3jMubh)rT}rU(h2X5``"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"``hJ}rV(hN]hO]hM]hL]hP]uh3jMh[]rWhjX1"ssl:12345:privateKey=mykey.pen:certKey=cert.pem"rXrY}rZ(h2Uh3jTubahHhubhjX!, but this is completely untestedr[r\}r](h2X!, but this is completely untestedh3jMubeubeubhE)r^}r_(h2X0.. _PyOpenSSL: http://pyopenssl.sourceforge.net/h7Kh3jh>hAhHhIhJ}r`(jjhL]raU pyopensslrbahM]hN]hO]hP]rch auhSMhThh[]ubeubeubh>hAhC}hHh\hJ}rd(hN]hO]hM]hL]re(U webstatusrfj{ehP]rghauhSK2hThhU}rhj{j~sh[]ri(hc)rj}rk(h2X WebStatusrlh3h:h>hAhHhghJ}rm(hN]hO]hM]hL]hP]uhSK2hThh[]rnhjX WebStatusrorp}rq(h2jlh3jjubaubju)rr}rs(h2Uh3h:h>NhHjxhJ}rt(hL]hM]hN]hO]hP]Uentries]ru(jX6buildbot.status.web.baseweb.WebStatus (built-in class)hUtrvauhSNhThh[]ubj)rw}rx(h2Uh3h:h>NhHjhJ}ry(jjXpyhL]hM]hN]hO]hP]jXclassrzjjzuhSNhThh[]r{(j)r|}r}(h2X%buildbot.status.web.baseweb.WebStatush3jwh>hAhHjhJ}r~(hL]rhajNhM]hN]hO]hP]rhajhjXbuildbot.status.web.basewebjuhSK5hThh[]r(j)r}r(h2Xclass h3j|h>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSK5hThh[]rhjXclass rr}r(h2Uh3jubaubj)r}r(h2Xbuildbot.status.web.baseweb.h3j|h>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSK5hThh[]rhjXbuildbot.status.web.baseweb.rr}r(h2Uh3jubaubj)r}r(h2X WebStatush3j|h>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSK5hThh[]rhjX WebStatusrr}r(h2Uh3jubaubeubj)r}r(h2Uh3jwh>hAhHjhJ}r(hN]hO]hM]hL]hP]uhSK5hThh[]ubeubhn)r}r(h2XThe :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.h3h:h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSK6hThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X':class:`buildbot.status.html.WebStatus`rh3jh>hAhHhhJ}r(UreftypeXclasshhXbuildbot.status.html.WebStatusU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSK6h[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXbuildbot.status.html.WebStatusrr}r(h2Uh3jubahHhubaubhjX 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(h2X 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.h3jubeubhn)r}r(h2XThe 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.h3h:h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSK;hThh[]r(hjX#The first page you will see is the rr}r(h2X#The first page you will see is the h3jubj$)r}r(h2X*Welcome Page*hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX Welcome Pagerr}r(h2Uh3jubahHj,ubhjX_, which contains links to all the other useful pages. By default, this page is served from the rr}r(h2X_, which contains links to all the other useful pages. By default, this page is served from the h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjXstatus/web/templates/root.htmlrr}r(h2Xstatus/web/templates/root.htmlh3jubahHhubhjX! file in buildbot's library area.rr}r(h2X! file in buildbot's library area.h3jubeubhn)r}r(h2XOne 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.h3h:h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSK?hThh[]r(hjX-One of the most complex resource provided by rr}r(h2X-One of the most complex resource provided by h3jubh)r}r(h2X:class:`WebStatus`rh3jh>hAhHhhJ}r(UreftypeXclasshhX WebStatusU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSK?h[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjX WebStatusrr}r(h2Uh3jubahHhubaubhjX is the rr}r(h2X is the h3jubj$)r}r(h2X*Waterfall Display*hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXWaterfall Displayrr}r(h2Uh3jubahHj,ubhjXa, 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(h2Xa, 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.h3jubeubhn)r}r(h2XA 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.h3h:h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKFhThh[]r(hjX6A similar, but more developer-oriented display is the rr}r(h2X6A similar, but more developer-oriented display is the h3jubhw)r}r(h2X`Grid`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXGridrr}r(h2Uh3jubahHhubhjX# display. This arranges builds by rr}r(h2X# display. This arranges builds by h3jubh)r}r(h2X:class:`SourceStamp`rh3jh>hAhHhhJ}r(UreftypeXclasshhX SourceStampU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSKFh[]r h)r }r (h2jhJ}r (hN]hO]r (hjXpy-classrehM]hL]hP]uh3jh[]rhjX SourceStamprr}r(h2Uh3j ubahHhubaubhjX (horizontal axis) and builder (vertical axis), and can provide quick information as to which revisions are passing or failing on which builders.rr}r(h2X (horizontal axis) and builder (vertical axis), and can provide quick information as to which revisions are passing or failing on which builders.h3jubeubhn)r}r(h2XThere 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.h3h:h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKKhThh[]r(hjXwThere 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 rr}r(h2XwThere 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 h3jubh)r}r(h2X:class:`Builder`rh3jh>hAhHhhJ}r (UreftypeXclasshhXBuilderU refdomainXpyr!hL]hM]U refexplicithN]hO]hP]hhhNhNuhSKKh[]r"h)r#}r$(h2jhJ}r%(hN]hO]r&(hj!Xpy-classr'ehM]hL]hP]uh3jh[]r(hjXBuilderr)r*}r+(h2Uh3j#ubahHhubaubhjX3s. These pages are described in great detail below.r,r-}r.(h2X4\s. These pages are described in great detail below.h3jubeubh4)r/}r0(h2Uh3h:h>hAhHh\hJ}r1(hN]hO]hM]hL]r2U configurationr3ahP]r4hauhSKThThh[]r5(hc)r6}r7(h2X Configurationr8h3j/h>hAhHhghJ}r9(hN]hO]hM]hL]hP]uhSKThThh[]r:hjX Configurationr;r<}r=(h2j8h3j6ubaubhn)r>}r?(h2X6The simplest possible configuration for WebStatus is::r@h3j/h>hAhHhqhJ}rA(hN]hO]hM]hL]hP]uhSKVhThh[]rBhjX5The simplest possible configuration for WebStatus is:rCrD}rE(h2X5The simplest possible configuration for WebStatus is:h3j>ubaubh)rF}rG(h2XNfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(8080))h3j/h>hAhHhhJ}rH(hhhL]hM]hN]hO]hP]uhSKXhThh[]rIhjXNfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(8080))rJrK}rL(h2Uh3jFubaubhn)rM}rN(h2X9Buildbot 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.h3j/h>hAhHhqhJ}rO(hN]hO]hM]hL]hP]uhSK[hThh[]rP(hjXkBuildbot uses a templating system for the web interface. The source of these templates can be found in the rQrR}rS(h2XkBuildbot uses a templating system for the web interface. The source of these templates can be found in the h3jMubh)rT}rU(h2UhJ}rV(hL]hM]hN]hO]rWXfilerXaUrolejXhP]uh3jMh[]rYhjXstatus/web/templates/rZr[}r\(h2Xstatus/web/templates/h3jTubahHhubhjXl directory in buildbot's library area. You can override these templates by creating alternate versions in a r]r^}r_(h2Xl directory in buildbot's library area. You can override these templates by creating alternate versions in a h3jMubh)r`}ra(h2UhJ}rb(hL]hM]hN]hO]rcXfilerdaUrolejdhP]uh3jMh[]rehjX templates/rfrg}rh(h2X templates/h3j`ubahHhubhjX3 directory within the buildmaster's base directory.rirj}rk(h2X3 directory within the buildmaster's base directory.h3jMubeubhn)rl}rm(h2XNIf that isn't enough you can also provide additional Jinja2 template loaders::rnh3j/h>hAhHhqhJ}ro(hN]hO]hM]hL]hP]uhSKahThh[]rphjXMIf that isn't enough you can also provide additional Jinja2 template loaders:rqrr}rs(h2XMIf that isn't enough you can also provide additional Jinja2 template loaders:h3jlubaubh)rt}ru(h2Ximport jinja2 myloaders = [ jinja2.FileSystemLoader("/tmp/mypath"), ] c['status'].append(html.WebStatus( …, jinja_loaders = myloaders, ))h3j/h>hAhHhhJ}rv(hhhL]hM]hN]hO]hP]uhSKchThh[]rwhjXimport jinja2 myloaders = [ jinja2.FileSystemLoader("/tmp/mypath"), ] c['status'].append(html.WebStatus( …, jinja_loaders = myloaders, ))rxry}rz(h2Uh3jtubaubhn)r{}r|(h2XThe 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.h3j/h>hAhHhqhJ}r}(hN]hO]hM]hL]hP]uhSKmhThh[]r~(hjX-The first time a buildmaster is created, the rr}r(h2X-The first time a buildmaster is created, the h3j{ubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3j{h[]rhjX public_html/rr}r(h2X public_html/h3jubahHhubhjX 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(h2X 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.h3j{ubeubhn)r}r(h2XZTemplates in :file:`templates/` take precedence over static files in :file:`public_html/`.h3j/h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKshThh[]r(hjX Templates in rr}r(h2X Templates in h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX templates/rr}r(h2X templates/h3jubahHhubhjX& take precedence over static files in rr}r(h2X& take precedence over static files in h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX public_html/rr}r(h2X public_html/h3jubahHhubhjX.r}r(h2X.h3jubeubhn)r}r(h2XThe 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.h3j/h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKvhThh[]r(hjX The initial rr}r(h2X The initial h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX robots.txtrr}r(h2X robots.txth3jubahHhubhjX/ 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(h2X/ 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 h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX robots.txtrr}r(h2X robots.txth3jubahHhubhjX 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(h2X file somewhere else (at the top level of the parent web server), and replace the URL prefixes in it with more suitable values.h3jubeubhn)r}r(h2X|If you would like to use an alternative root directory, add the ``public_html=`` option to the :class:`WebStatus` creation::h3j/h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSK~hThh[]r(hjX@If you would like to use an alternative root directory, add the rr}r(h2X@If you would like to use an alternative root directory, add the h3jubh)r}r(h2X``public_html=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX public_html=rr}r(h2Uh3jubahHhubhjX option to the rr}r(h2X option to the h3jubh)r}r(h2X:class:`WebStatus`rh3jh>hAhHhhJ}r(UreftypeXclasshhX WebStatusU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSK~h[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjX WebStatusrr}r(h2Uh3jubahHhubaubhjX creation:rr}r(h2X creation:h3jubeubh)r}r(h2XDc['status'].append(WebStatus(8080, public_html="/var/www/buildbot"))h3j/h>hAhHhhJ}r(hhhL]hM]hN]hO]hP]uhSKhThh[]rhjXDc['status'].append(WebStatus(8080, public_html="/var/www/buildbot"))rr}r(h2Uh3jubaubhn)r}r(h2XIn 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.h3j/h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKhThh[]r(hjX2In addition, if you are familiar with twisted.web rr}r(h2X2In addition, if you are familiar with twisted.web h3jubj$)r}r(h2X*Resource Trees*hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXResource Treesrr}r(h2Uh3jubahHj,ubhjXW, you can write code to add additional pages at places inside this web space. Just use rr}r(h2XW, you can write code to add additional pages at places inside this web space. Just use h3jubh)r}r(h2X:meth:`webstatus.putChild`rh3jh>hAhHhhJ}r (UreftypeXmethhhXwebstatus.putChildU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSKh[]r h)r }r (h2jhJ}r(hN]hO]r(hj Xpy-methrehM]hL]hP]uh3jh[]rhjXwebstatus.putChildrr}r(h2Uh3j ubahHhubaubhjX to place these resources.rr}r(h2X to place these resources.h3jubeubhn)r}r(h2XSThe following section describes the special URLs and the status views they provide.rh3j/h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKhThh[]rhjXSThe following section describes the special URLs and the status views they provide.rr}r(h2jh3jubaubeubh4)r }r!(h2Uh3h:h>hAhHh\hJ}r"(hN]hO]hM]hL]r#Ubuildbot-web-resourcesr$ahP]r%h!auhSKhThh[]r&(hc)r'}r((h2XBuildbot Web Resourcesr)h3j h>hAhHhghJ}r*(hN]hO]hM]hL]hP]uhSKhThh[]r+hjXBuildbot Web Resourcesr,r-}r.(h2j)h3j'ubaubhn)r/}r0(h2XCertain 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.h3j h>hAhHhqhJ}r1(hN]hO]hM]hL]hP]uhSKhThh[]r2(hjXCertain URLs are r3r4}r5(h2XCertain URLs are h3j/ubhw)r6}r7(h2X`magic`hJ}r8(hN]hO]hM]hL]hP]uh3j/h[]r9hjXmagicr:r;}r<(h2Uh3j6ubahHhubhjXI, and the pages they serve are created by code in various classes in the r=r>}r?(h2XI, and the pages they serve are created by code in various classes in the h3j/ubh)r@}rA(h2UhJ}rB(hL]hM]hN]hO]rCXfilerDaUrolejDhP]uh3j/h[]rEhjXbuildbot.status.webrFrG}rH(h2Xbuildbot.status.webh3j@ubahHhubhjX 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 rIrJ}rK(h2X 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 h3j/ubh)rL}rM(h2UhJ}rN(hL]hM]hN]hO]rOXfilerPaUrolejPhP]uh3j/h[]rQhjX index.htmlrRrS}rT(h2X index.htmlh3jLubahHhubhjXt page to contain links to them. Of course other project web pages can contain links to these buildbot pages as well.rUrV}rW(h2Xt page to contain links to them. Of course other project web pages can contain links to these buildbot pages as well.h3j/ubeubhn)rX}rY(h2X;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.h3j h>hAhHhqhJ}rZ(hN]hO]hM]hL]hP]uhSKhThh[]r[(hjXMany 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 r\r]}r^(h2XMany 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 h3jXubh)r_}r`(h2X``?builder=i386``hJ}ra(hN]hO]hM]hL]hP]uh3jXh[]rbhjX ?builder=i386rcrd}re(h2Uh3j_ubahHhubhjXD to the end of the URL, the page will show only the results for the rfrg}rh(h2XD to the end of the URL, the page will show only the results for the h3jXubhw)ri}rj(h2X`i386`hJ}rk(hN]hO]hM]hL]hP]uh3jXh[]rlhjXi386rmrn}ro(h2Uh3jiubahHhubhjX6 builder. When used in this way, you can add multiple rprq}rr(h2X6 builder. When used in this way, you can add multiple h3jXubh)rs}rt(h2X ``builder=``hJ}ru(hN]hO]hM]hL]hP]uh3jXh[]rvhjXbuilder=rwrx}ry(h2Uh3jsubahHhubhjXX arguments to see multiple builders. Remembering that URL query arguments are separated rzr{}r|(h2XX arguments to see multiple builders. Remembering that URL query arguments are separated h3jXubj$)r}}r~(h2X*from each other*hJ}r(hN]hO]hM]hL]hP]uh3jXh[]rhjXfrom each otherrr}r(h2Uh3j}ubahHj,ubhjX% with ampersands, a URL that ends in rr}r(h2X% with ampersands, a URL that ends in h3jXubh)r}r(h2X``?builder=i386&builder=ppc``hJ}r(hN]hO]hM]hL]hP]uh3jXh[]rhjX?builder=i386&builder=ppcrr}r(h2Uh3jubahHhubhjX/ would show builds for just those two Builders.rr}r(h2X/ would show builds for just those two Builders.h3jXubeubhn)r}r(h2X"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.h3j h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKhThh[]r(hjXThe rr}r(h2XThe h3jubh)r}r(h2X ``branch=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbranch=rr}r(h2Uh3jubahHhubhjX 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(h2X 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 h3jubh)r}r(h2X``branch=trunk``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX branch=trunkrr}r(h2Uh3jubahHhubhjXk to reference the trunk: if you aren't intentionally using branches, you're probably using trunk. Multiple rr}r(h2Xk to reference the trunk: if you aren't intentionally using branches, you're probably using trunk. Multiple h3jubh)r}r(h2X ``branch=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbranch=rr}r(h2Uh3jubahHhubhjXJ arguments can be used to examine multiple branches at once (so appending rr}r(h2XJ arguments can be used to examine multiple branches at once (so appending h3jubh)r}r(h2X``?branch=foo&branch=bar``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX?branch=foo&branch=barrr}r(h2Uh3jubahHhubhjX: to the URL will show builds involving either branch). No rr}r(h2X: to the URL will show builds involving either branch). No h3jubh)r}r(h2X ``branch=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbranch=rr}r(h2Uh3jubahHhubhjX= arguments means to show builds and changes for all branches.rr}r(h2X= arguments means to show builds and changes for all branches.h3jubeubhn)r}r(h2XSome 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`.h3j h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKhThh[]r(hjXSome 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(h2XSome 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 h3jubhw)r}r(h2X`i386`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXi386rr}r(h2Uh3jubahHhubhjX builder would live at rr}r(h2X builder would live at h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX/builders/i386/builds/7rr}r(h2X/builders/i386/builds/7h3jubahHhubhjX.r}r(h2X.h3jubeubhn)r}r(h2X]The table below lists all of the internal pages and the URLs that can be used to access them.rh3j h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKhThh[]rhjX]The table below lists all of the internal pages and the URLs that can be used to access them.rr}r(h2jh3jubaubjb)r}r(h2Uh3j h>hAhHjehJ}r(hN]hO]hM]hL]hP]uhSNhThh[]r(jh)r}r(h2Xh``/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. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSKh[]r(jn)r}r(h2X``/waterfall``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSKh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX /waterfallrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(hn)r}r(h2XThis provides a chronologically-oriented display of the activity of all builders. It is the same display used by the Waterfall display.rh3jh>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSKh[]r hjXThis provides a chronologically-oriented display of the activity of all builders. It is the same display used by the Waterfall display.r r }r (h2jh3jubaubhn)r}r(h2XBy 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]r(hjXBy adding one or more rr}r(h2XBy adding one or more h3jubh)r}r(h2X ``builder=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbuilder=rr}r(h2Uh3jubahHhubhjXz query arguments, the Waterfall is restricted to only showing information about the given Builders. By adding one or more rr}r(h2Xz query arguments, the Waterfall is restricted to only showing information about the given Builders. By adding one or more h3jubh)r}r (h2X ``branch=``hJ}r!(hN]hO]hM]hL]hP]uh3jh[]r"hjXbranch=r#r$}r%(h2Uh3jubahHhubhjX} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more r&r'}r((h2X} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more h3jubh)r)}r*(h2X ``category=``hJ}r+(hN]hO]hM]hL]hP]uh3jh[]r,hjX category=r-r.}r/(h2Uh3j)ubahHhubhjXr query arguments to the URL will limit the display to Builders that were defined with one of the given categories.r0r1}r2(h2Xr query arguments to the URL will limit the display to Builders that were defined with one of the given categories.h3jubeubhn)r3}r4(h2XA ``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.h3jh>hAhHhqhJ}r5(hN]hO]hM]hL]hP]uhSKh[]r6(hjXA r7r8}r9(h2XA h3j3ubh)r:}r;(h2X``show_events=true``hJ}r<(hN]hO]hM]hL]hP]uh3j3h[]r=hjXshow_events=truer>r?}r@(h2Uh3j:ubahHhubhjX2 query argument causes the display to include non-rArB}rC(h2X2 query argument causes the display to include non-h3j3ubh)rD}rE(h2X:class:`Build`rFh3j3h>hAhHhhJ}rG(UreftypeXclasshhXBuildU refdomainXpyrHhL]hM]U refexplicithN]hO]hP]hhhNhNuhSKh[]rIh)rJ}rK(h2jFhJ}rL(hN]hO]rM(hjHXpy-classrNehM]hL]hP]uh3jDh[]rOhjXBuildrPrQ}rR(h2Uh3jJubahHhubaubhjXQ events, like slaves attaching and detaching, as well as reconfiguration events. rSrT}rU(h2XQ events, like slaves attaching and detaching, as well as reconfiguration events. h3j3ubh)rV}rW(h2X``show_events=false``hJ}rX(hN]hO]hM]hL]hP]uh3j3h[]rYhjXshow_events=falserZr[}r\(h2Uh3jVubahHhubhjX1 hides these events. The default is to show them.r]r^}r_(h2X1 hides these events. The default is to show them.h3j3ubeubhn)r`}ra(h2X3By 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.h3jh>hAhHhqhJ}rb(hN]hO]hM]hL]hP]uhSKh[]rc(hjXBy adding the rdre}rf(h2XBy adding the h3j`ubh)rg}rh(h2X``failures_only=true``hJ}ri(hN]hO]hM]hL]hP]uh3j`h[]rjhjXfailures_only=truerkrl}rm(h2Uh3jgubahHhubhjX 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.rnro}rp(h2X 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.h3j`ubeubhn)rq}rr(h2X0The ``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.h3jh>hAhHhqhJ}rs(hN]hO]hM]hL]hP]uhSKh[]rt(hjXThe rurv}rw(h2XThe h3jqubh)rx}ry(h2X``last_time=``hJ}rz(hN]hO]hM]hL]hP]uh3jqh[]r{hjX last_time=r|r}}r~(h2Uh3jxubahHhubhjX, rr}r(h2X, h3jqubh)r}r(h2X``first_time=``hJ}r(hN]hO]hM]hL]hP]uh3jqh[]rhjX first_time=rr}r(h2Uh3jubahHhubhjX, and rr}r(h2X, and h3jqubh)r}r(h2X``show_time=``hJ}r(hN]hO]hM]hL]hP]uh3jqh[]rhjX show_time=rr}r(h2Uh3jubahHhubhjX 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(h2X 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 h3jqubh)r}r(h2X``num_events=``hJ}r(hN]hO]hM]hL]hP]uh3jqh[]rhjX num_events=rr}r(h2Uh3jubahHhubhjXB argument also provides a limit on the size of the displayed page.rr}r(h2XB argument also provides a limit on the size of the displayed page.h3jqubeubhn)r}r(h2XThe 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]r(hjXWThe Waterfall has references to resources many of the other portions of the URL space: rr}r(h2XWThe Waterfall has references to resources many of the other portions of the URL space: h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX /buildersrr}r(h2X /buildersh3jubahHhubhjX" for access to individual builds, rr}r(h2X" for access to individual builds, h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX/changesrr}r(h2X/changesh3jubahHhubhjX: for access to information about source code changes, etc.rr}r(h2X: for access to information about source code changes, etc.h3jubeubehHjubeubjh)r}r(h2X``/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*. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSKhThh[]r(jn)r}r(h2X ``/grid``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSKh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/gridrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(hn)r}r(h2XThis 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.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]rhjXThis 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(h2jh3jubaubhn)r}r(h2XkBy adding one or more ``category=`` arguments the grid will be restricted to revisions in those categories.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]r(hjXBy adding one or more rr}r(h2XBy adding one or more h3jubh)r}r(h2X ``category=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX category=rr}r(h2Uh3jubahHhubhjXH arguments the grid will be restricted to revisions in those categories.rr}r(h2XH arguments the grid will be restricted to revisions in those categories.h3jubeubhn)r}r(h2X^A :samp:`width={N}` argument will limit the number of revisions shown to *N*, defaulting to 5.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]r(hjXA rr}r(h2XA h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXwidth=rr}r(h2Xwidth=h3jubj$)r}r(h2XNhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXNr}r(h2Uh3jubahHj,ubehHhubhjX6 argument will limit the number of revisions shown to rr}r(h2X6 argument will limit the number of revisions shown to h3jubj$)r}r(h2X*N*hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXNr }r (h2Uh3jubahHj,ubhjX, defaulting to 5.r r }r (h2X, defaulting to 5.h3jubeubhn)r}r(h2X_A :samp:`branch={BRANCHNAME}` argument will limit the grid to revisions on branch *BRANCHNAME*.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]r(hjXA rr}r(h2XA h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjXbranch=rr}r(h2Xbranch=h3jubj$)r}r(h2X BRANCHNAMEhJ}r (hN]hO]hM]hL]hP]uh3jh[]r!hjX BRANCHNAMEr"r#}r$(h2Uh3jubahHj,ubehHhubhjX5 argument will limit the grid to revisions on branch r%r&}r'(h2X5 argument will limit the grid to revisions on branch h3jubj$)r(}r)(h2X *BRANCHNAME*hJ}r*(hN]hO]hM]hL]hP]uh3jh[]r+hjX BRANCHNAMEr,r-}r.(h2Uh3j(ubahHj,ubhjX.r/}r0(h2X.h3jubeubehHjubeubjh)r1}r2(h2X(``/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). h3jh>hAhHjkhJ}r3(hN]hO]hM]hL]hP]uhSKhThh[]r4(jn)r5}r6(h2X ``/tgrid``r7h3j1h>hAhHjrhJ}r8(hN]hO]hM]hL]hP]uhSKh[]r9h)r:}r;(h2j7hJ}r<(hN]hO]hM]hL]hP]uh3j5h[]r=hjX/tgridr>r?}r@(h2Uh3j:ubahHhubaubj|)rA}rB(h2UhJ}rC(hN]hO]hM]hL]hP]uh3j1h[]rD(hn)rE}rF(h2XAThe 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``.h3jAh>hAhHhqhJ}rG(hN]hO]hM]hL]hP]uhSKh[]rH(hjXThe 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 rIrJ}rK(h2XThe 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 h3jEubh)rL}rM(h2X ``width``hJ}rN(hN]hO]hM]hL]hP]uh3jEh[]rOhjXwidthrPrQ}rR(h2Uh3jLubahHhubhjX the argument is named rSrT}rU(h2X the argument is named h3jEubh)rV}rW(h2X ``length``hJ}rX(hN]hO]hM]hL]hP]uh3jEh[]rYhjXlengthrZr[}r\(h2Uh3jVubahHhubhjX.r]}r^(h2X.h3jEubeubhn)r_}r`(h2XThis 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).h3jAh>hAhHhqhJ}ra(hN]hO]hM]hL]hP]uhSKh[]rb(hjXThis page also has a rcrd}re(h2XThis page also has a h3j_ubh)rf}rg(h2X``rev_order=``hJ}rh(hN]hO]hM]hL]hP]uh3j_h[]rihjX rev_order=rjrk}rl(h2Uh3jfubahHhubhjXY query argument that lets you change in what order revisions are shown. Valid values are rmrn}ro(h2XY query argument that lets you change in what order revisions are shown. Valid values are h3j_ubh)rp}rq(h2X``asc``hJ}rr(hN]hO]hM]hL]hP]uh3j_h[]rshjXascrtru}rv(h2Uh3jpubahHhubhjX( (ascending, oldest revision first) and rwrx}ry(h2X( (ascending, oldest revision first) and h3j_ubh)rz}r{(h2X``desc``hJ}r|(hN]hO]hM]hL]hP]uh3j_h[]r}hjXdescr~r}r(h2Uh3jzubahHhubhjX% (descending, newest revision first).rr}r(h2X% (descending, newest revision first).h3j_ubeubehHjubeubjh)r}r(h2XQ ``/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) h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(jn)r}r(h2X ``/console``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/consolerr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(hn)r}r(h2XpEXPERIMENTAL: This provides a developer-oriented display of the last changes and how they affected the builders.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]rhjXpEXPERIMENTAL: This provides a developer-oriented display of the last changes and how they affected the builders.rr}r(h2jh3jubaubhn)r}r(h2XIt 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.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]rhjXIt 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(h2jh3jubaubhn)r}r(h2XBy 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSKh[]r(hjXBy adding one or more rr}r(h2XBy adding one or more h3jubh)r}r(h2X ``builder=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbuilder=rr}r(h2Uh3jubahHhubhjXp query arguments, the Console view is restricted to only showing information about the given Builders. Adding a rr}r(h2Xp query arguments, the Console view is restricted to only showing information about the given Builders. Adding a h3jubh)r}r(h2X``repository=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX repository=rr}r(h2Uh3jubahHhubhjXJ argument will limit display to a given repository. By adding one or more rr}r(h2XJ argument will limit display to a given repository. By adding one or more h3jubh)r}r(h2X ``branch=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbranch=rr}r(h2Uh3jubahHhubhjX} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more rr}r(h2X} query arguments, the display is restricted to showing information about the given branches. In addition, adding one or more h3jubh)r}r(h2X ``category=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX category=rr}r(h2Uh3jubahHhubhjX} query arguments to the URL will limit the display to Builders that were defined with one of the given categories. With the rr}r(h2X} query arguments to the URL will limit the display to Builders that were defined with one of the given categories. With the h3jubh)r}r(h2X ``project=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXproject=rr}r(h2Uh3jubahHhubhjXa query argument, it's possible to restrict the view to changes from the given project. With the rr}r(h2Xa query argument, it's possible to restrict the view to changes from the given project. With the h3jubh)r}r(h2X ``codebase=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX codebase=rr}r(h2Uh3jubahHhubhjXV query argument, it's possible to restrict the view to changes for the given codebase.rr}r(h2XV query argument, it's possible to restrict the view to changes for the given codebase.h3jubeubhn)r}r(h2XBy adding one or more ``name=`` query arguments to the URL, the console view is restricted to only showing changes made by the given users.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(hjXBy adding one or more rr}r(h2XBy adding one or more h3jubh)r}r(h2X ``name=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXname=rr}r(h2Uh3jubahHhubhjXl query arguments to the URL, the console view is restricted to only showing changes made by the given users.rr}r(h2Xl query arguments to the URL, the console view is restricted to only showing changes made by the given users.h3jubeubhn)r}r(h2XNOTE: 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(hjXNOTE: To use this page, your rr}r(h2XNOTE: To use this page, your h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX buildbot.cssr r }r (h2X buildbot.cssh3jubahHhubhjX file in r r }r(h2X file in h3jubh)r}r(h2UhJ}r(hL]hM]hN]hO]rXfileraUrolejhP]uh3jh[]rhjX public_htmlrr}r(h2X public_htmlh3jubahHhubhjX must be the one found in rr}r(h2X must be the one found in h3jubj)r}r(h2UhJ}r(j X,master/buildbot/status/web/files/default.cssrjX]https://github.com/buildbot/buildbot/blob/master/master/buildbot/status/web/files/default.csshL]hM]hN]hO]hP]uh3jh[]rh)r }r!(h2jhJ}r"(hN]hO]hM]hL]hP]uh3jh[]r#hjX,master/buildbot/status/web/files/default.cssr$r%}r&(h2Uh3j ubahHhubahHjubhjX|. This is the default for new installs, but upgrades of very old installs of Buildbot may need to manually fix the CSS file.r'r(}r)(h2X|. This is the default for new installs, but upgrades of very old installs of Buildbot may need to manually fix the CSS file.h3jubeubhn)r*}r+(h2XThe 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::h3jh>hAhHhqhJ}r,(hN]hO]hM]hL]hP]uhSMh[]r-(hjXtThe 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 r.r/}r0(h2XtThe 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 h3j*ubh)r1}r2(h2X ``branch=``hJ}r3(hN]hO]hM]hL]hP]uh3j*h[]r4hjXbranch=r5r6}r7(h2Uh3j1ubahHhubhjX query argument. The r8r9}r:(h2X query argument. The h3j*ubh)r;}r<(h2X``order_console_by_time``hJ}r=(hN]hO]hM]hL]hP]uh3j*h[]r>hjXorder_console_by_timer?r@}rA(h2Uh3j;ubahHhubhjXg option may help sorting revisions, although it depends on the date being set correctly in each commit:rBrC}rD(h2Xg option may help sorting revisions, although it depends on the date being set correctly in each commit:h3j*ubeubh)rE}rF(h2X>w = html.WebStatus(http_port=8080, order_console_by_time=True)h3jhHhhJ}rG(hhhL]hM]hN]hO]hP]uhSMh[]rHhjX>w = html.WebStatus(http_port=8080, order_console_by_time=True)rIrJ}rK(h2Uh3jEubaubehHjubeubjh)rL}rM(h2X``/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. h3jh>hAhHjkhJ}rN(hN]hO]hM]hL]hP]uhSMhThh[]rO(jn)rP}rQ(h2X``/rss``rRh3jLh>hAhHjrhJ}rS(hN]hO]hM]hL]hP]uhSMh[]rTh)rU}rV(h2jRhJ}rW(hN]hO]hM]hL]hP]uh3jPh[]rXhjX/rssrYrZ}r[(h2Uh3jUubahHhubaubj|)r\}r](h2UhJ}r^(hN]hO]hM]hL]hP]uh3jLh[]r_hn)r`}ra(h2XThis provides a rss feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.rbh3j\h>hAhHhqhJ}rc(hN]hO]hM]hL]hP]uhSMh[]rdhjXThis provides a rss feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.rerf}rg(h2jbh3j`ubaubahHjubeubjh)rh}ri(h2X``/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. h3jh>hAhHjkhJ}rj(hN]hO]hM]hL]hP]uhSM"hThh[]rk(jn)rl}rm(h2X ``/atom``rnh3jhh>hAhHjrhJ}ro(hN]hO]hM]hL]hP]uhSM"h[]rph)rq}rr(h2jnhJ}rs(hN]hO]hM]hL]hP]uh3jlh[]rthjX/atomrurv}rw(h2Uh3jqubahHhubaubj|)rx}ry(h2UhJ}rz(hN]hO]hM]hL]hP]uh3jhh[]r{hn)r|}r}(h2XThis provides an atom feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.r~h3jxh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM h[]rhjXThis provides an atom feed summarizing all failed builds. The same query-arguments used by 'waterfall' can be added to filter the feed output.rr}r(h2j~h3j|ubaubahHjubeubjh)r}r(h2X``/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. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM(hThh[]r(jn)r}r(h2X ``/json``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM(h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/jsonrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XThis 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM%h[]r(hjXThis view provides quick access to Buildbot status information in a form that is easily digested from other programs, including JavaScript. See rr}r(h2XThis view provides quick access to Buildbot status information in a form that is easily digested from other programs, including JavaScript. See h3jubh)r}r(h2X``/json/help``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX /json/helprr}r(h2Uh3jubahHhubhjXL for detailed interactive documentation of the output formats for this view.rr}r(h2XL for detailed interactive documentation of the output formats for this view.h3jubeubahHjubeubjh)r}r(h2X: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. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM,hThh[]r(jn)r}r(h2X>:samp:`/buildstatus?builder=${BUILDERNAME}&number=${BUILDNUM}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM,h[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjX/buildstatus?builder=$rr}r(h2X/buildstatus?builder=$h3jubj$)r}r(h2X BUILDERNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX BUILDERNAMErr}r(h2Uh3jubahHj,ubhjX &number=$rr}r(h2X &number=$h3jubj$)r}r(h2XBUILDNUMhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBUILDNUMrr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XzThis displays a waterfall-like chronologically-oriented view of all the steps for a given build number on a given builder.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM+h[]rhjXzThis displays a waterfall-like chronologically-oriented view of all the steps for a given build number on a given builder.rr}r(h2jh3jubaubahHjubeubjh)r}r(h2X: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). h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM1hThh[]r(jn)r}r(h2X :samp:`/builders/${BUILDERNAME}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM1h[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjX /builders/$rr}r(h2X /builders/$h3jubj$)r}r(h2X BUILDERNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX BUILDERNAMErr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XThis 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).h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM/h[]r(hjXThis describes the given rr}r(h2XThis describes the given h3jubh)r}r(h2X:class:`Builder`rh3jh>hAhHhhJ}r(UreftypeXclasshhXBuilderU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSM/h[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXBuilderrr }r (h2Uh3jubahHhubaubhjX+ and provides buttons to force a build. A r r }r (h2X+ and provides buttons to force a build. A h3jubh)r}r(h2X``numbuilds=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX numbuilds=rr}r(h2Uh3jubahHhubhjXI argument will control how many build lines are displayed (5 by default).rr}r(h2XI argument will control how many build lines are displayed (5 by default).h3jubeubahHjubeubjh)r}r(h2XU:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}` This describes a specific Build. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM4hThh[]r(jn)r}r(h2X3:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM4h[]r h)r!}r"(h2UhJ}r#(hL]hM]hN]hO]r$Xsampr%aUrolej%hP]uh3jh[]r&(hjX /builders/$r'r(}r)(h2X /builders/$h3j!ubj$)r*}r+(h2X BUILDERNAMEhJ}r,(hN]hO]hM]hL]hP]uh3j!h[]r-hjX BUILDERNAMEr.r/}r0(h2Uh3j*ubahHj,ubhjX /builds/$r1r2}r3(h2X /builds/$h3j!ubj$)r4}r5(h2XBUILDNUMhJ}r6(hN]hO]hM]hL]hP]uh3j!h[]r7hjXBUILDNUMr8r9}r:(h2Uh3j4ubahHj,ubehHhubaubj|)r;}r<(h2UhJ}r=(hN]hO]hM]hL]hP]uh3jh[]r>hn)r?}r@(h2X This describes a specific Build.rAh3j;h>hAhHhqhJ}rB(hN]hO]hM]hL]hP]uhSM4h[]rChjX This describes a specific Build.rDrE}rF(h2jAh3j?ubaubahHjubeubjh)rG}rH(h2Xk:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}` This describes a specific BuildStep. h3jh>hAhHjkhJ}rI(hN]hO]hM]hL]hP]uhSM7hThh[]rJ(jn)rK}rL(h2XE:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}`rMh3jGh>hAhHjrhJ}rN(hN]hO]hM]hL]hP]uhSM7h[]rOh)rP}rQ(h2UhJ}rR(hL]hM]hN]hO]rSXsamprTaUrolejThP]uh3jKh[]rU(hjX /builders/$rVrW}rX(h2X /builders/$h3jPubj$)rY}rZ(h2X BUILDERNAMEhJ}r[(hN]hO]hM]hL]hP]uh3jPh[]r\hjX BUILDERNAMEr]r^}r_(h2Uh3jYubahHj,ubhjX /builds/$r`ra}rb(h2X /builds/$h3jPubj$)rc}rd(h2XBUILDNUMhJ}re(hN]hO]hM]hL]hP]uh3jPh[]rfhjXBUILDNUMrgrh}ri(h2Uh3jcubahHj,ubhjX/steps/$rjrk}rl(h2X/steps/$h3jPubj$)rm}rn(h2XSTEPNAMEhJ}ro(hN]hO]hM]hL]hP]uh3jPh[]rphjXSTEPNAMErqrr}rs(h2Uh3jmubahHj,ubehHhubaubj|)rt}ru(h2UhJ}rv(hN]hO]hM]hL]hP]uh3jGh[]rwhn)rx}ry(h2X$This describes a specific BuildStep.rzh3jth>hAhHhqhJ}r{(hN]hO]hM]hL]hP]uhSM7h[]r|hjX$This describes a specific BuildStep.r}r~}r(h2jzh3jxubaubahHjubeubjh)r}r(h2X:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}/logs/${LOGNAME}` This provides an HTML representation of a specific logfile. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM:hThh[]r(jn)r}r(h2XU:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}/logs/${LOGNAME}`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM:h[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjX /builders/$rr}r(h2X /builders/$h3jubj$)r}r(h2X BUILDERNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX BUILDERNAMErr}r(h2Uh3jubahHj,ubhjX /builds/$rr}r(h2X /builds/$h3jubj$)r}r(h2XBUILDNUMhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBUILDNUMrr}r(h2Uh3jubahHj,ubhjX/steps/$rr}r(h2X/steps/$h3jubj$)r}r(h2XSTEPNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXSTEPNAMErr}r(h2Uh3jubahHj,ubhjX/logs/$rr}r(h2X/logs/$h3jubj$)r}r(h2XLOGNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXLOGNAMErr}r(h2Uh3jubahHj,ubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X;This provides an HTML representation of a specific logfile.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM:h[]rhjX;This provides an HTML representation of a specific logfile.rr}r(h2jh3jubaubahHjubeubjh)r}r(h2X: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`. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMAhThh[]r(jn)r}r(h2XZ:samp:`/builders/${BUILDERNAME}/builds/${BUILDNUM}/steps/${STEPNAME}/logs/${LOGNAME}/text`rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMAh[]rh)r}r(h2UhJ}r(hL]hM]hN]hO]rXsampraUrolejhP]uh3jh[]r(hjX /builders/$rr}r(h2X /builders/$h3jubj$)r}r(h2X BUILDERNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX BUILDERNAMErr}r(h2Uh3jubahHj,ubhjX /builds/$rr}r(h2X /builds/$h3jubj$)r}r(h2XBUILDNUMhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBUILDNUMrr}r(h2Uh3jubahHj,ubhjX/steps/$rr}r(h2X/steps/$h3jubj$)r}r(h2XSTEPNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXSTEPNAMErr}r(h2Uh3jubahHj,ubhjX/logs/$rr}r(h2X/logs/$h3jubj$)r}r(h2XLOGNAMEhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXLOGNAMErr}r(h2Uh3jubahHj,ubhjX/textrr}r(h2X/texth3jubehHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X(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`.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM=h[]r(hjX^This returns the logfile as plain text, without any HTML coloring markup. It also removes the rr}r(h2X^This returns the logfile as plain text, without any HTML coloring markup. It also removes the h3jubhw)r}r (h2X `headers`hJ}r (hN]hO]hM]hL]hP]uh3jh[]r hjXheadersr r }r(h2Uh3jubahHhubhjX, 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 rr}r(h2X, 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 h3jubjy)r}r(h2X:command:`grep`hJ}r(hN]hO]rj~ahM]hL]hP]uh3jh[]rhjXgreprr}r(h2Uh3jubahHjubhjX.r}r(h2X.h3jubeubahHjubeubjh)r}r(h2Xp``/changes`` This provides a brief description of the :class:`ChangeSource` in use (see :ref:`Change-Sources`). h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMEhThh[]r(jn)r }r!(h2X ``/changes``r"h3jh>hAhHjrhJ}r#(hN]hO]hM]hL]hP]uhSMEh[]r$h)r%}r&(h2j"hJ}r'(hN]hO]hM]hL]hP]uh3j h[]r(hjX/changesr)r*}r+(h2Uh3j%ubahHhubaubj|)r,}r-(h2UhJ}r.(hN]hO]hM]hL]hP]uh3jh[]r/hn)r0}r1(h2XbThis provides a brief description of the :class:`ChangeSource` in use (see :ref:`Change-Sources`).h3j,h>hAhHhqhJ}r2(hN]hO]hM]hL]hP]uhSMDh[]r3(hjX)This provides a brief description of the r4r5}r6(h2X)This provides a brief description of the h3j0ubh)r7}r8(h2X:class:`ChangeSource`r9h3j0h>hAhHhhJ}r:(UreftypeXclasshhX ChangeSourceU refdomainXpyr;hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMDh[]r<h)r=}r>(h2j9hJ}r?(hN]hO]r@(hj;Xpy-classrAehM]hL]hP]uh3j7h[]rBhjX ChangeSourcerCrD}rE(h2Uh3j=ubahHhubaubhjX in use (see rFrG}rH(h2X in use (see h3j0ubh)rI}rJ(h2X:ref:`Change-Sources`rKh3j0h>hAhHhhJ}rL(UreftypeXrefhhXchange-sourcesU refdomainXstdrMhL]hM]U refexplicithN]hO]hP]hhuhSMDh[]rNj$)rO}rP(h2jKhJ}rQ(hN]hO]rR(hjMXstd-refrSehM]hL]hP]uh3jIh[]rThjXChange-SourcesrUrV}rW(h2Uh3jOubahHj,ubaubhjX).rXrY}rZ(h2X).h3j0ubeubahHjubeubjh)r[}r\(h2X: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. h3jh>hAhHjkhJ}r](hN]hO]hM]hL]hP]uhSMJhThh[]r^(jn)r_}r`(h2X:samp:`/changes/{NN}`rah3j[h>hAhHjrhJ}rb(hN]hO]hM]hL]hP]uhSMJh[]rch)rd}re(h2UhJ}rf(hL]hM]hN]hO]rgXsamprhaUrolejhhP]uh3j_h[]ri(hjX /changes/rjrk}rl(h2X /changes/h3jdubj$)rm}rn(h2XNNhJ}ro(hN]hO]hM]hL]hP]uh3jdh[]rphjXNNrqrr}rs(h2Uh3jmubahHj,ubehHhubaubj|)rt}ru(h2UhJ}rv(hN]hO]hM]hL]hP]uh3j[h[]rwhn)rx}ry(h2XThis shows detailed information about the numbered :class:`Change`: who was the author, what files were changed, what revision number was represented, etc.h3jth>hAhHhqhJ}rz(hN]hO]hM]hL]hP]uhSMHh[]r{(hjX3This shows detailed information about the numbered r|r}}r~(h2X3This shows detailed information about the numbered h3jxubh)r}r(h2X:class:`Change`rh3jxh>hAhHhhJ}r(UreftypeXclasshhXChangeU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMHh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXChangerr}r(h2Uh3jubahHhubaubhjXY: who was the author, what files were changed, what revision number was represented, etc.rr}r(h2XY: who was the author, what files were changed, what revision number was represented, etc.h3jxubeubahHjubeubjh)r}r(h2Xq``/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. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMRhThh[]r(jn)r}r(h2X``/buildslaves``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMRh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX /buildslavesrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(hn)r}r(h2XThis 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMMh[]r(hjXThis summarizes each rr}r(h2XThis summarizes each h3jubh)r}r(h2X:class:`BuildSlave`rh3jh>hAhHhhJ}r(UreftypeXclasshhX BuildSlaveU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjX BuildSlaverr}r(h2Uh3jubahHhubaubhjX, including which rr}r(h2X, including which h3jubhw)r}r(h2X `Builder`hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXBuilderrr}r(h2Uh3jubahHhubhjXs are configured to use it, whether the buildslave is currently connected or not, and host information retrieved from the buildslave itself.rr}r(h2X\s are configured to use it, whether the buildslave is currently connected or not, and host information retrieved from the buildslave itself.h3jubeubhn)r}r(h2XA ``no_builders=1`` URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMQh[]r(hjXA rr}r(h2XA h3jubh)r}r(h2X``no_builders=1``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX no_builders=1rr}r(h2Uh3jubahHhubhjXz URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders.rr}r(h2Xz URL argument will omit the builders column. This is useful if each buildslave is assigned to a large number of builders.h3jubeubehHjubeubjh)r}r(h2Xy``/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). h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSM_hThh[]r(jn)r}r(h2X``/one_line_per_build``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSM_h[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/one_line_per_buildrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]r(hn)r}r(h2XThis 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMUh[]r(hjXNThis page shows one line of text for each build, merging information from all rr}r(h2XNThis page shows one line of text for each build, merging information from all h3jubh)r}r(h2X:class:`Builder`rh3jh>hAhHhhJ}r(UreftypeXclasshhXBuilderU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMUh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXBuilderrr}r(h2Uh3jubahHhubaubhjXs rr}r(h2X\s h3jubcdocutils.nodes footnote_reference r)r}r(h2X[#]_jKh3jhHUfootnote_referencer hJ}r (jKhL]r j!ahM]hN]hO]hP]hQjuh[]r hjX1r }r(h2Uh3jubaubhjXA. Each line specifies the name of the Builder, the number of the rr}r(h2XA. Each line specifies the name of the Builder, the number of the h3jubh)r}r(h2X:class:`Build`rh3jh>hAhHhhJ}r(UreftypeXclasshhXBuildU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMUh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjXBuildrr}r (h2Uh3jubahHhubaubhjX, 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.r!r"}r#(h2X, 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.h3jubeubhn)r$}r%(h2XOne 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).h3jh>hAhHhqhJ}r&(hN]hO]hM]hL]hP]uhSM]h[]r'(hjX One or more r(r)}r*(h2X One or more h3j$ubh)r+}r,(h2X ``builder=``hJ}r-(hN]hO]hM]hL]hP]uh3j$h[]r.hjXbuilder=r/r0}r1(h2Uh3j+ubahHhubhjX or r2r3}r4(h2X or h3j$ubh)r5}r6(h2X ``branch=``hJ}r7(hN]hO]hM]hL]hP]uh3j$h[]r8hjXbranch=r9r:}r;(h2Uh3j5ubahHhubhjX< arguments can be used to restrict the list. In addition, a r<r=}r>(h2X< arguments can be used to restrict the list. In addition, a h3j$ubh)r?}r@(h2X``numbuilds=``hJ}rA(hN]hO]hM]hL]hP]uh3j$h[]rBhjX numbuilds=rCrD}rE(h2Uh3j?ubahHhubhjXD argument will control how many lines are displayed (20 by default).rFrG}rH(h2XD argument will control how many lines are displayed (20 by default).h3j$ubeubehHjubeubjh)rI}rJ(h2X``/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. h3jh>hAhHjkhJ}rK(hN]hO]hM]hL]hP]uhSMhhThh[]rL(jn)rM}rN(h2X ``/builders``rOh3jIh>hAhHjrhJ}rP(hN]hO]hM]hL]hP]uhSMhh[]rQh)rR}rS(h2jOhJ}rT(hN]hO]hM]hL]hP]uh3jMh[]rUhjX /buildersrVrW}rX(h2Uh3jRubahHhubaubj|)rY}rZ(h2UhJ}r[(hN]hO]hM]hL]hP]uh3jIh[]r\(hn)r]}r^(h2XThis 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.h3jYh>hAhHhqhJ}r_(hN]hO]hM]hL]hP]uhSMbh[]r`(hjX5This page shows a small table, with one box for each rarb}rc(h2X5This page shows a small table, with one box for each h3j]ubh)rd}re(h2X:class:`Builder`rfh3j]h>hAhHhhJ}rg(UreftypeXclasshhXBuilderU refdomainXpyrhhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMbh[]rih)rj}rk(h2jfhJ}rl(hN]hO]rm(hjhXpy-classrnehM]hL]hP]uh3jdh[]rohjXBuilderrprq}rr(h2Uh3jjubahHhubaubhjX,, containing the results of the most recent rsrt}ru(h2X,, containing the results of the most recent h3j]ubh)rv}rw(h2X:class:`Build`rxh3j]h>hAhHhhJ}ry(UreftypeXclasshhXBuildU refdomainXpyrzhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMbh[]r{h)r|}r}(h2jxhJ}r~(hN]hO]r(hjzXpy-classrehM]hL]hP]uh3jvh[]rhjXBuildrr}r(h2Uh3j|ubahHhubaubhjX. 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.rr}r(h2X. 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.h3j]ubeubhn)r}r(h2XbAs with ``/one_line_per_build``, this page will also honor ``builder=`` and ``branch=`` arguments.h3jYh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMgh[]r(hjXAs with rr}r(h2XAs with h3jubh)r}r(h2X``/one_line_per_build``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/one_line_per_buildrr}r(h2Uh3jubahHhubhjX, this page will also honor rr}r(h2X, this page will also honor h3jubh)r}r(h2X ``builder=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbuilder=rr}r(h2Uh3jubahHhubhjX and rr}r(h2X and h3jubh)r}r(h2X ``branch=``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXbranch=rr}r(h2Uh3jubahHhubhjX arguments.rr}r(h2X arguments.h3jubeubehHjubeubjh)r}r(h2X.``/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``. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMnhThh[]r(jn)r}r(h2X ``/users``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMnh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX/usersrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2X"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``.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMkh[]r(hjX:This page exists for authentication reasons when checking rr}r(h2X:This page exists for authentication reasons when checking h3jubh)r}r(h2X``showUsersPage``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX showUsersPagerr}r(h2Uh3jubahHhubhjX. It'll redirect to rr}r(h2X. It'll redirect to h3jubh)r}r(h2X ``/authfail``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX /authfailrr}r(h2Uh3jubahHhubhjX on rr}r(h2X on h3jubh)r}r(h2X ``False``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXFalserr}r(h2Uh3jubahHhubhjX, rr}r(h2X, h3jubh)r}r(h2X``/users/table``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX /users/tablerr}r(h2Uh3jubahHhubhjX on rr}r(h2X on h3jubh)r}r(h2X``True``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXTruerr}r(h2Uh3jubahHhubhjX/, and give a username/password login prompt on rr}r(h2X/, and give a username/password login prompt on h3jubh)r}r(h2X ``'auth'``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX'auth'rr}r(h2Uh3jubahHhubhjX;. Passing or failing results redirect to the same pages as rr}r(h2X;. Passing or failing results redirect to the same pages as h3jubh)r}r(h2X ``False``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXFalserr }r (h2Uh3jubahHhubhjX and r r }r (h2X and h3jubh)r}r(h2X``True``hJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjXTruerr}r(h2Uh3jubahHhubhjX.r}r(h2X.h3jubeubahHjubeubjh)r}r(h2X``/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. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMthThh[]r(jn)r}r(h2X``/users/table``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMth[]rh)r }r!(h2jhJ}r"(hN]hO]hM]hL]hP]uh3jh[]r#hjX /users/tabler$r%}r&(h2Uh3j ubahHhubaubj|)r'}r((h2UhJ}r)(hN]hO]hM]hL]hP]uh3jh[]r*hn)r+}r,(h2XThis 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.h3j'h>hAhHhqhJ}r-(hN]hO]hM]hL]hP]uhSMqh[]r.(hjXnThis page shows a table containing users that are stored in the database. It has columns for their respective r/r0}r1(h2XnThis page shows a table containing users that are stored in the database. It has columns for their respective h3j+ubh)r2}r3(h2X``uid``hJ}r4(hN]hO]hM]hL]hP]uh3j+h[]r5hjXuidr6r7}r8(h2Uh3j2ubahHhubhjX and r9r:}r;(h2X and h3j+ubh)r<}r=(h2X``identifier``hJ}r>(hN]hO]hM]hL]hP]uh3j+h[]r?hjX identifierr@rA}rB(h2Uh3j<ubahHhubhjX values, with the rCrD}rE(h2X values, with the h3j+ubh)rF}rG(h2X``uid``hJ}rH(hN]hO]hM]hL]hP]uh3j+h[]rIhjXuidrJrK}rL(h2Uh3jFubahHhubhjXI values being clickable for more detailed information relating to a user.rMrN}rO(h2XI values being clickable for more detailed information relating to a user.h3j+ubeubahHjubeubjh)rP}rQ(h2Xy``/users/table/{NN}`` Shows all the attributes stored in the database relating to the user with uid ``{NN}`` in a table. h3jh>hAhHjkhJ}rR(hN]hO]hM]hL]hP]uhSMxhThh[]rS(jn)rT}rU(h2X``/users/table/{NN}``rVh3jPh>hAhHjrhJ}rW(hN]hO]hM]hL]hP]uhSMxh[]rXh)rY}rZ(h2jVhJ}r[(hN]hO]hM]hL]hP]uh3jTh[]r\hjX/users/table/{NN}r]r^}r_(h2Uh3jYubahHhubaubj|)r`}ra(h2UhJ}rb(hN]hO]hM]hL]hP]uh3jPh[]rchn)rd}re(h2XbShows all the attributes stored in the database relating to the user with uid ``{NN}`` in a table.h3j`h>hAhHhqhJ}rf(hN]hO]hM]hL]hP]uhSMwh[]rg(hjXNShows all the attributes stored in the database relating to the user with uid rhri}rj(h2XNShows all the attributes stored in the database relating to the user with uid h3jdubh)rk}rl(h2X``{NN}``hJ}rm(hN]hO]hM]hL]hP]uh3jdh[]rnhjX{NN}rorp}rq(h2Uh3jkubahHhubhjX in a table.rrrs}rt(h2X in a table.h3jdubeubahHjubeubjh)ru}rv(h2X``/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. h3jh>hAhHjkhJ}rw(hN]hO]hM]hL]hP]uhSM}hThh[]rx(jn)ry}rz(h2X ``/about``r{h3juh>hAhHjrhJ}r|(hN]hO]hM]hL]hP]uhSM}h[]r}h)r~}r(h2j{hJ}r(hN]hO]hM]hL]hP]uh3jyh[]rhjX/aboutrr}r(h2Uh3j~ubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3juh[]rhn)r}r(h2XThis 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.rh3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSM{h[]rhjXThis 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.rr}r(h2jh3jubaubahHjubeubeubhn)r}r(h2XmThere are also a set of web-status resources that are intended for use by other programs, rather than humans.rh3j h>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXmThere are also a set of web-status resources that are intended for use by other programs, rather than humans.rr}r(h2jh3jubaubjb)r}r(h2Uh3j h>hAhHjehJ}r(hN]hO]hM]hL]hP]uhSNhThh[]rjh)r}r(h2X``/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. h3jh>hAhHjkhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(jn)r}r(h2X``/change_hook``rh3jh>hAhHjrhJ}r(hN]hO]hM]hL]hP]uhSMh[]rh)r}r(h2jhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhjX /change_hookrr}r(h2Uh3jubahHhubaubj|)r}r(h2UhJ}r(hN]hO]hM]hL]hP]uh3jh[]rhn)r}r(h2XThis 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.h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMh[]r(hjXThis provides an endpoint for web-based source change notification. It is used by GitHub and contrib/post_build_request.py. See rr}r(h2XThis provides an endpoint for web-based source change notification. It is used by GitHub and contrib/post_build_request.py. See h3jubh)r}r(h2X:ref:`Change-Hooks`rh3jh>hAhHhhJ}r(UreftypeXrefhhX change-hooksU refdomainXstdrhL]hM]U refexplicithN]hO]hP]hhuhSMh[]rj$)r}r(h2jhJ}r(hN]hO]r(hjXstd-refrehM]hL]hP]uh3jh[]rhjX Change-Hooksrr}r(h2Uh3jubahHj,ubaubhjX for more details.rr}r(h2X for more details.h3jubeubahHjubeubaubeubh8jeubh>hAhHh\hJ}r(hN]hO]hM]hL]rU"webstatus-configuration-parametersrahP]rhauhSMhThh[]r(hc)r}r(h2X"WebStatus Configuration Parametersrh3h8h>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjX"WebStatus Configuration Parametersrr}r(h2jh3jubaubh4)r}r(h2Uh3h8h>hAhHh\hJ}r(hN]hO]hM]hL]rUhttp-connectionrahP]rhauhSMhThh[]r(hc)r}r(h2XHTTP Connectionrh3jh>hAhHhghJ}r(hN]hO]hM]hL]hP]uhSMhThh[]rhjXHTTP Connectionrr}r(h2jh3jubaubhn)r}r(h2XThe 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::h3jh>hAhHhqhJ}r(hN]hO]hM]hL]hP]uhSMhThh[]r(hjXThe most common way to run a rr}r(h2XThe most common way to run a h3jubh)r}r(h2X:class:`WebStatus`rh3jh>hAhHhhJ}r(UreftypeXclasshhX WebStatusU refdomainXpyrhL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rh)r}r(h2jhJ}r(hN]hO]r(hjXpy-classrehM]hL]hP]uh3jh[]rhjX WebStatusrr}r(h2Uh3jubahHhubaubhjX\ is on a regular TCP port. To do this, just pass in the TCP port number when you create the rr}r(h2X\ is on a regular TCP port. To do this, just pass in the TCP port number when you create the h3jubh)r}r (h2X:class:`WebStatus`r h3jh>hAhHhhJ}r (UreftypeXclasshhX WebStatusU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-classr ehM]hL]hP]uh3jh[]r hjX WebStatusr r }r (h2Uh3j ubahHhubaubhjX instance; this is called the r r }r (h2X instance; this is called the h3jubh)r }r (h2X ``http_port``hJ}r (hN]hO]hM]hL]hP]uh3jh[]r hjX http_portr r }r (h2Uh3j ubahHhubhjX argument:r r }r (h2X argument:h3jubeubh)r }r (h2XXfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(http_port=8080))h3jh>hAhHhhJ}r (hhhL]hM]hN]hO]hP]uhSMhThh[]r hjXXfrom buildbot.status.html import WebStatus c['status'].append(WebStatus(http_port=8080))r r }r! (h2Uh3j ubaubhn)r" }r# (h2X>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) [#]_.h3jh>hAhHhqhJ}r$ (hN]hO]hM]hL]hP]uhSMhThh[]r% (hjXThe r& r' }r( (h2XThe h3j" ubh)r) }r* (h2X ``http_port``hJ}r+ (hN]hO]hM]hL]hP]uh3j" h[]r, hjX http_portr- r. }r/ (h2Uh3j) ubahHhubhjX argument is actually a r0 r1 }r2 (h2X argument is actually a h3j" ubhw)r3 }r4 (h2X`strports specification`hJ}r5 (hN]hO]hM]hL]hP]uh3j" h[]r6 hjXstrports specificationr7 r8 }r9 (h2Uh3j3 ubahHhubhjXg for the port that the web server should listen on. This can be a simple port number, or a string like r: r; }r< (h2Xg for the port that the web server should listen on. This can be a simple port number, or a string like h3j" ubh)r= }r> (h2X,``http_port="tcp:8080:interface=127.0.0.1"``hJ}r? (hN]hO]hM]hL]hP]uh3j" h[]r@ hjX(http_port="tcp:8080:interface=127.0.0.1"rA rB }rC (h2Uh3j= ubahHhubhjXe (to limit connections to the loopback interface, and therefore to clients running on the same host) rD rE }rF (h2Xe (to limit connections to the loopback interface, and therefore to clients running on the same host) h3j" ubj)rG }rH (h2X[#]_jKh3j" hHj hJ}rI (jKhL]rJ jDahM]hN]hO]hP]hQjBuh[]rK hjX2rL }rM (h2Uh3jG ubaubhjX.rN }rO (h2X.h3j" ubeubhn)rP }rQ (h2XIf 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"``).h3jh>hAhHhqhJ}rR (hN]hO]hM]hL]hP]uhSMhThh[]rS (hjX,If instead (or in addition) you provide the rT rU }rV (h2X,If instead (or in addition) you provide the h3jP ubh)rW }rX (h2X``distrib_port``hJ}rY (hN]hO]hM]hL]hP]uh3jP h[]rZ hjX distrib_portr[ r\ }r] (h2Uh3jW ubahHhubhjXU argument, a twisted.web distributed server will be started either on a TCP port (if r^ r_ }r` (h2XU argument, a twisted.web distributed server will be started either on a TCP port (if h3jP ubh)ra }rb (h2X``distrib_port``hJ}rc (hN]hO]hM]hL]hP]uh3jP h[]rd hjX distrib_portre rf }rg (h2Uh3ja ubahHhubhjX is like rh ri }rj (h2X is like h3jP ubh)rk }rl (h2X``"tcp:12345"``hJ}rm (hN]hO]hM]hL]hP]uh3jP h[]rn hjX "tcp:12345"ro rp }rq (h2Uh3jk ubahHhubhjX&) or more likely on a UNIX socket (if rr rs }rt (h2X&) or more likely on a UNIX socket (if h3jP ubh)ru }rv (h2X``distrib_port``hJ}rw (hN]hO]hM]hL]hP]uh3jP h[]rx hjX distrib_portry rz }r{ (h2Uh3ju ubahHhubhjX is like r| r} }r~ (h2X is like h3jP ubh)r }r (h2X``"unix:/path/to/socket"``hJ}r (hN]hO]hM]hL]hP]uh3jP h[]r hjX"unix:/path/to/socket"r r }r (h2Uh3j ubahHhubhjX).r r }r (h2X).h3jP ubeubhn)r }r (h2X\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!h3jh>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (hjXThe r r }r (h2XThe h3j ubh)r }r (h2X``public_html``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX public_htmlr r }r (h2Uh3j ubahHhubhjX 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 (r r }r (h2X 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 (h3j ubh)r }r (h2UhJ}r (hL]hM]hN]hO]r Xfiler aUrolej hP]uh3j h[]r hjX /buildbot.cssr r }r (h2X /buildbot.cssh3j ubahHhubhjX%) and a top-level navigational file (r r }r (h2X%) and a top-level navigational file (h3j ubh)r }r (h2UhJ}r (hL]hM]hN]hO]r Xfiler aUrolej hP]uh3j h[]r hjX /index.htmlr r }r (h2X /index.htmlh3j ubahHhubhjXD), but can also serve any other files required - even build results!r r }r (h2XD), but can also serve any other files required - even build results!h3j ubeubhE)r }r (h2X.. _Authorization:h3jh>hAhHhIhJ}r (hL]hM]hN]hO]hP]hQU authorizationr uhSMhThh[]ubeubh5h4)r }r (h2Uh3h8h>hAhHh\hJ}r (hN]hO]hM]hL]r Uauthenticationr ahP]r hauhSMhThh[]r (hc)r }r (h2XAuthenticationr h3j h>hAhHhghJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r hjXAuthenticationr r }r (h2j h3j ubaubhn)r }r (h2X&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"``. ::h3j h>hAhHhqhJ}r (hN]hO]hM]hL]hP]uhSMhThh[]r (hjXIf 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 (h2XIf 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 h3j ubh)r }r (h2X:class:`status.web.auth.IAuth`r h3j h>hAhHhhJ}r (UreftypeXclasshhXstatus.web.auth.IAuthU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-classr ehM]hL]hP]uh3j h[]r hjXstatus.web.auth.IAuthr r }r (h2Uh3j ubahHhubaubhjX as a r r }r (h2X as a h3j ubh)r }r (h2X``auth``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjXauthr r }r (h2Uh3j ubahHhubhjX keyword argument to r r }r (h2X keyword argument to h3j ubh)r }r (h2X:class:`Authz`r h3j h>hAhHhhJ}r (UreftypeXclasshhXAuthzU refdomainXpyr hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r h)r }r (h2j hJ}r (hN]hO]r (hj Xpy-classr ehM]hL]hP]uh3j h[]r hjXAuthzr r }r (h2Uh3j ubahHhubaubhjX, and specify the action as r r }r (h2X, and specify the action as h3j ubh)r }r (h2X ``"auth"``hJ}r (hN]hO]hM]hL]hP]uh3j h[]r hjX"auth"r r }r!(h2Uh3j ubahHhubhjX.r!}r!(h2X.h3j ubeubh)r!}r!(h2X*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()h3j h>hAhHhhJ}r!(hhhL]hM]hN]hO]hP]uhSMhThh[]r!hjX*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 !(h2Uh3j!ubaubhn)r !}r !(h2XThe 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.h3j h>hAhHhqhJ}r !(hN]hO]hM]hL]hP]uhSMhThh[]r !(hjX The class r!r!}r!(h2X The class h3j !ubh)r!}r!(h2X:class:`BasicAuth`r!h3j !h>hAhHhhJ}r!(UreftypeXclasshhX BasicAuthU refdomainXpyr!hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r!h)r!}r!(h2j!hJ}r!(hN]hO]r!(hj!Xpy-classr!ehM]hL]hP]uh3j!h[]r!hjX BasicAuthr!r!}r!(h2Uh3j!ubahHhubaubhjX implements a basic authentication mechanism using a list of user/password tuples provided from the configuration file. The class r !r!!}r"!(h2X implements a basic authentication mechanism using a list of user/password tuples provided from the configuration file. The class h3j !ubhw)r#!}r$!(h2X`HTPasswdAuth`hJ}r%!(hN]hO]hM]hL]hP]uh3j !h[]r&!hjX HTPasswdAuthr'!r(!}r)!(h2Uh3j#!ubahHhubhjX) implements an authentication against an r*!r+!}r,!(h2X) implements an authentication against an h3j !ubh)r-!}r.!(h2UhJ}r/!(hL]hM]hN]hO]r0!Xfiler1!aUrolej1!hP]uh3j !h[]r2!hjX .htpasswdr3!r4!}r5!(h2X .htpasswdh3j-!ubahHhubhjX file. The r6!r7!}r8!(h2X file. The h3j !ubhw)r9!}r:!(h2X`HTPasswdAprAuth`hJ}r;!(hN]hO]hM]hL]hP]uh3j !h[]r!}r?!(h2Uh3j9!ubahHhubhjX a subclass of r@!rA!}rB!(h2X a subclass of h3j !ubhw)rC!}rD!(h2X`HTPasswdAuth`hJ}rE!(hN]hO]hM]hL]hP]uh3j !h[]rF!hjX HTPasswdAuthrG!rH!}rI!(h2Uh3jC!ubahHhubhjX use libaprutil for authenticating. This adds support for apr1/md5 and sha1 password hashes but requires libaprutil at runtime. The rJ!rK!}rL!(h2X use libaprutil for authenticating. This adds support for apr1/md5 and sha1 password hashes but requires libaprutil at runtime. The h3j !ubh)rM!}rN!(h2X:class:`UsersAuth`rO!h3j !h>hAhHhhJ}rP!(UreftypeXclasshhX UsersAuthU refdomainXpyrQ!hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]rR!h)rS!}rT!(h2jO!hJ}rU!(hN]hO]rV!(hjQ!Xpy-classrW!ehM]hL]hP]uh3jM!h[]rX!hjX UsersAuthrY!rZ!}r[!(h2Uh3jS!ubahHhubaubhjX works with r\!r]!}r^!(h2X works with h3j !ubh)r_!}r`!(h2X:ref:`User-Objects`ra!h3j !h>hAhHhhJ}rb!(UreftypeXrefhhX user-objectsU refdomainXstdrc!hL]hM]U refexplicithN]hO]hP]hhuhSMh[]rd!j$)re!}rf!(h2ja!hJ}rg!(hN]hO]rh!(hjc!Xstd-refri!ehM]hL]hP]uh3j_!h[]rj!hjX User-Objectsrk!rl!}rm!(h2Uh3je!ubahHj,ubaubhjX% to check for valid user credentials.rn!ro!}rp!(h2X% to check for valid user credentials.h3j !ubeubhn)rq!}rr!(h2XIf 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. ::h3j h>hAhHhqhJ}rs!(hN]hO]hM]hL]hP]uhSMhThh[]rt!hjXIf 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.ru!rv!}rw!(h2XIf 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.h3jq!ubaubh)rx!}ry!(h2Xldef 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)h3j h>hAhHhhJ}rz!(hhhL]hM]hN]hO]hP]uhSM hThh[]r{!hjXldef 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)r|!r}!}r~!(h2Uh3jx!ubaubhn)r!}r!(h2XThe ``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.h3j h>hAhHhqhJ}r!(hN]hO]hM]hL]hP]uhSMhThh[]r!(hjXThe r!r!}r!(h2XThe h3j!ubh)r!}r!(h2X``forceBuild``hJ}r!(hN]hO]hM]hL]hP]uh3j!h[]r!hjX forceBuildr!r!}r!(h2Uh3j!ubahHhubhjX and r!r!}r!(h2X and h3j!ubh)r!}r!(h2X``pingBuilder``hJ}r!(hN]hO]hM]hL]hP]uh3j!h[]r!hjX pingBuilderr!r!}r!(h2Uh3j!ubahHhubhjX actions both supply a r!r!}r!(h2X actions both supply a h3j!ubh)r!}r!(h2X:class:`BuilderStatus`r!h3j!h>hAhHhhJ}r!(UreftypeXclasshhX BuilderStatusU refdomainXpyr!hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r!h)r!}r!(h2j!hJ}r!(hN]hO]r!(hj!Xpy-classr!ehM]hL]hP]uh3j!h[]r!hjX BuilderStatusr!r!}r!(h2Uh3j!ubahHhubaubhjX object. The r!r!}r!(h2X object. The h3j!ubh)r!}r!(h2X ``stopBuild``hJ}r!(hN]hO]hM]hL]hP]uh3j!h[]r!hjX stopBuildr!r!}r!(h2Uh3j!ubahHhubhjX action supplies a r!r!}r!(h2X action supplies a h3j!ubh)r!}r!(h2X:class:`BuildStatus`r!h3j!h>hAhHhhJ}r!(UreftypeXclasshhX BuildStatusU refdomainXpyr!hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r!h)r!}r!(h2j!hJ}r!(hN]hO]r!(hj!Xpy-classr!ehM]hL]hP]uh3j!h[]r!hjX BuildStatusr!r!}r!(h2Uh3j!ubahHhubaubhjX object. The r!r!}r!(h2X object. The h3j!ubh)r!}r!(h2X``cancelPendingBuild``hJ}r!(hN]hO]hM]hL]hP]uh3j!h[]r!hjXcancelPendingBuildr!r!}r!(h2Uh3j!ubahHhubhjX action supplies a r!r!}r!(h2X action supplies a h3j!ubh)r!}r!(h2X:class:`BuildRequest`r!h3j!h>hAhHhhJ}r!(UreftypeXclasshhX BuildRequestU refdomainXpyr!hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r!h)r!}r!(h2j!hJ}r!(hN]hO]r!(hj!Xpy-classr!ehM]hL]hP]uh3j!h[]r!hjX BuildRequestr!r!}r!(h2Uh3j!ubahHhubaubhjX3. The remainder do not supply any extra arguments.r!r!}r!(h2X3. The remainder do not supply any extra arguments.h3j!ubeubeubh4)r!}r!(h2Uh3h8h>hAhHh\hJ}r!(hN]hO]hM]hL]r!U,http-based-authentication-by-frontend-serverr!ahP]r!hauhSMhThh[]r!(hc)r!}r!(h2X,HTTP-based authentication by frontend serverr!h3j!h>hAhHhghJ}r!(hN]hO]hM]hL]hP]uhSMhThh[]r!hjX,HTTP-based authentication by frontend serverr!r!}r!(h2j!h3j!ubaubhn)r!}r!(h2X&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!h3j!h>hAhHhqhJ}r!(hN]hO]hM]hL]hP]uhSMhThh[]r!hjX&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!(h2j!h3j!ubaubhn)r!}r!(h2XHJust set ``useHttpHeader`` to ``True`` in :class:`Authz` constructor. ::r!h3j!h>hAhHhqhJ}r!(hN]hO]hM]hL]hP]uhSM$hThh[]r!(hjX Just set r"r"}r"(h2X Just set h3j!ubh)r"}r"(h2X``useHttpHeader``hJ}r"(hN]hO]hM]hL]hP]uh3j!h[]r"hjX useHttpHeaderr"r"}r "(h2Uh3j"ubahHhubhjX to r "r "}r "(h2X to h3j!ubh)r "}r"(h2X``True``hJ}r"(hN]hO]hM]hL]hP]uh3j!h[]r"hjXTruer"r"}r"(h2Uh3j "ubahHhubhjX in r"r"}r"(h2X in h3j!ubh)r"}r"(h2X:class:`Authz`r"h3j!h>hAhHhhJ}r"(UreftypeXclasshhXAuthzU refdomainXpyr"hL]hM]U refexplicithN]hO]hP]hhhNhNuhSM$h[]r"h)r"}r"(h2j"hJ}r"(hN]hO]r "(hj"Xpy-classr!"ehM]hL]hP]uh3j"h[]r""hjXAuthzr#"r$"}r%"(h2Uh3j"ubahHhubaubhjX constructor.r&"r'"}r("(h2X constructor.h3j!ubeubh)r)"}r*"(h2XTauthz = Authz(useHttpHeader=True) # WebStatus secured by web frontend with HTTP authh3j!h>hAhHhhJ}r+"(hhhL]hM]hN]hO]hP]uhSM&hThh[]r,"hjXTauthz = Authz(useHttpHeader=True) # WebStatus secured by web frontend with HTTP authr-"r."}r/"(h2Uh3j)"ubaubhn)r0"}r1"(h2XPlease 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.h3j!h>hAhHhqhJ}r2"(hN]hO]hM]hL]hP]uhSM(hThh[]r3"(hjXPlease note that WebStatus can decode password for HTTP Basic requests only (for Digest authentication it's just impossible). Custom r4"r5"}r6"(h2XPlease note that WebStatus can decode password for HTTP Basic requests only (for Digest authentication it's just impossible). Custom h3j0"ubh)r7"}r8"(h2X:class:`status.web.auth.IAuth`r9"h3j0"h>hAhHhhJ}r:"(UreftypeXclasshhXstatus.web.auth.IAuthU refdomainXpyr;"hL]hM]U refexplicithN]hO]hP]hhhNhNuhSM(h[]r<"h)r="}r>"(h2j9"hJ}r?"(hN]hO]r@"(hj;"Xpy-classrA"ehM]hL]hP]uh3j7"h[]rB"hjXstatus.web.auth.IAuthrC"rD"}rE"(h2Uh3j="ubahHhubaubhjXW subclasses may just ignore password at all since it's already validated by web server.rF"rG"}rH"(h2XW subclasses may just ignore password at all since it's already validated by web server.h3j0"ubeubhn)rI"}rJ"(h2XyAdministrator 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).rK"h3j!h>hAhHhqhJ}rL"(hN]hO]hM]hL]hP]uhSM,hThh[]rM"hjXyAdministrator 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).rN"rO"}rP"(h2jK"h3jI"ubaubhn)rQ"}rR"(h2XIf you allow unauthenticated access through frontend as well, it's possible to specify a ``httpLoginLink`` which will be rendered on the WebStatus for unauthenticated users as a link named Login. ::h3j!h>hAhHhqhJ}rS"(hN]hO]hM]hL]hP]uhSM2hThh[]rT"(hjXYIf you allow unauthenticated access through frontend as well, it's possible to specify a rU"rV"}rW"(h2XYIf you allow unauthenticated access through frontend as well, it's possible to specify a h3jQ"ubh)rX"}rY"(h2X``httpLoginLink``hJ}rZ"(hN]hO]hM]hL]hP]uh3jQ"h[]r["hjX httpLoginLinkr\"r]"}r^"(h2Uh3jX"ubahHhubhjXY which will be rendered on the WebStatus for unauthenticated users as a link named Login.r_"r`"}ra"(h2XY which will be rendered on the WebStatus for unauthenticated users as a link named Login.h3jQ"ubeubh)rb"}rc"(h2XIauthz = Authz(useHttpHeader=True, httpLoginLink='https://buildbot/login')h3j!h>hAhHhhJ}rd"(hhhL]hM]hN]hO]hP]uhSM6hThh[]re"hjXIauthz = Authz(useHttpHeader=True, httpLoginLink='https://buildbot/login')rf"rg"}rh"(h2Uh3jb"ubaubhn)ri"}rj"(h2X\A configuration example with Apache HTTPD as reverse proxy could look like the following. ::h3j!h>hAhHhqhJ}rk"(hN]hO]hM]hL]hP]uhSM8hThh[]rl"hjXYA configuration example with Apache HTTPD as reverse proxy could look like the following.rm"rn"}ro"(h2XYA configuration example with Apache HTTPD as reverse proxy could look like the following.h3ji"ubaubh)rp"}rq"(h2Xauthz = Authz( useHttpHeader=True, httpLoginLink='https://buildbot/login', auth = HTPasswdAprAuth('/var/www/htpasswd'), forceBuild = 'auth')h3j!h>hAhHhhJ}rr"(hhhL]hM]hN]hO]hP]uhSM;hThh[]rs"hjXauthz = Authz( useHttpHeader=True, httpLoginLink='https://buildbot/login', auth = HTPasswdAprAuth('/var/www/htpasswd'), forceBuild = 'auth')rt"ru"}rv"(h2Uh3jp"ubaubhn)rw"}rx"(h2X#Corresponding Apache configuration.ry"h3j!h>hAhHhqhJ}rz"(hN]hO]hM]hL]hP]uhSMAhThh[]r{"hjX#Corresponding Apache configuration.r|"r}"}r~"(h2jy"h3jw"ubaubh)r"}r"(h2XProxyPass / 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] h3j!h>hAhHhhJ}r"(Ulinenosr"Ulanguager"XapachehhhL]hM]hN]hO]hP]uhSMChThh[]r"hjXProxyPass / 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] r"r"}r"(h2Uh3j"ubaubeubh4)r"}r"(h2Uh3h8h>hAhHh\hJ}r"(hN]hO]hM]hL]r"Ulogging-configurationr"ahP]r"hauhSMShThh[]r"(hc)r"}r"(h2XLogging configurationr"h3j"h>hAhHhghJ}r"(hN]hO]hM]hL]hP]uhSMShThh[]r"hjXLogging configurationr"r"}r"(h2j"h3j"ubaubhn)r"}r"(h2XUThe `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.h3j"h>hAhHhqhJ}r"(hN]hO]hM]hL]hP]uhSMUhThh[]r"(hjXThe r"r"}r"(h2XThe h3j"ubhw)r"}r"(h2X `WebStatus`hJ}r"(hN]hO]hM]hL]hP]uh3j"h[]r"hjX WebStatusr"r"}r"(h2Uh3j"ubahHhubhjX uses a separate log file (r"r"}r"(h2X uses a separate log file (h3j"ubh)r"}r"(h2UhJ}r"(hL]hM]hN]hO]r"Xfiler"aUrolej"hP]uh3j"h[]r"hjXhttp.logr"r"}r"(h2Xhttp.logh3j"ubahHhubhjX+) to avoid clutter buildbot's default log (r"r"}r"(h2X+) to avoid clutter buildbot's default log (h3j"ubh)r"}r"(h2UhJ}r"(hL]hM]hN]hO]r"Xfiler"aUrolej"hP]uh3j"h[]r"hjX twistd.logr"r"}r"(h2X twistd.logh3j"ubahHhubhjX) 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"(h2X) 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.h3j"ubeubjb)r"}r"(h2Uh3j"h>hAhHjehJ}r"(hN]hO]hM]hL]hP]uhSNhThh[]r"(jh)r"}r"(h2XS``rotateLength`` An integer defining the file size at which log files are rotated. h3j"h>hAhHjkhJ}r"(hN]hO]hM]hL]hP]uhSM\h[]r"(jn)r"}r"(h2X``rotateLength``r"h3j"h>hAhHjrhJ}r"(hN]hO]hM]hL]hP]uhSM\h[]r"h)r"}r"(h2j"hJ}r"(hN]hO]hM]hL]hP]uh3j"h[]r"hjX rotateLengthr"r"}r"(h2Uh3j"ubahHhubaubj|)r"}r"(h2UhJ}r"(hN]hO]hM]hL]hP]uh3j"h[]r"hn)r"}r"(h2XAAn integer defining the file size at which log files are rotated.r"h3j"h>hAhHhqhJ}r"(hN]hO]hM]hL]hP]uhSM\h[]r"hjXAAn integer defining the file size at which log files are rotated.r"r"}r"(h2j"h3j"ubaubahHjubeubjh)r"}r"(h2XA``maxRotatedFiles`` The maximum number of old log files to keep. h3j"h>hAhHjkhJ}r"(hN]hO]hM]hL]hP]uhSM_hThh[]r"(jn)r"}r"(h2X``maxRotatedFiles``r"h3j"h>hAhHjrhJ}r"(hN]hO]hM]hL]hP]uhSM_h[]r"h)r"}r"(h2j"hJ}r"(hN]hO]hM]hL]hP]uh3j"h[]r"hjXmaxRotatedFilesr"r"}r"(h2Uh3j"ubahHhubaubj|)r"}r"(h2UhJ}r"(hN]hO]hM]hL]hP]uh3j"h[]r"hn)r"}r"(h2X,The maximum number of old log files to keep.r"h3j"h>hAhHhqhJ}r"(hN]hO]hM]hL]hP]uhSM_h[]r"hjX,The maximum number of old log files to keep.r"r"}r"(h2j"h3j"ubaubahHjubeubeubeubh4)r"}r"(h2Uh3h8h>hAhHh\hJ}r"(hN]hO]hM]hL]r"Uurl-decorating-optionsr#ahP]r#hauhSMbhThh[]r#(hc)r#}r#(h2XURL-decorating optionsr#h3j"h>hAhHhghJ}r#(hN]hO]hM]hL]hP]uhSMbhThh[]r#hjXURL-decorating optionsr#r #}r #(h2j#h3j#ubaubhn)r #}r #(h2XThese 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 #h3j"h>hAhHhqhJ}r#(hN]hO]hM]hL]hP]uhSMdhThh[]r#hjXThese 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#(h2j #h3j #ubaubh4)r#}r#(h2Uh3j"h>hAhHh\hJ}r#(hN]hO]hM]hL]r#Urevlinkr#ahP]r#h*auhSMihThh[]r#(hc)r#}r#(h2Xrevlinkr#h3j#h>hAhHhghJ}r#(hN]hO]hM]hL]hP]uhSMihThh[]r#hjXrevlinkr#r #}r!#(h2j#h3j#ubaubhn)r"#}r##(h2XThe ``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.h3j#h>hAhHhqhJ}r$#(hN]hO]hM]hL]hP]uhSMkhThh[]r%#(hjXThe r&#r'#}r(#(h2XThe h3j"#ubh)r)#}r*#(h2X ``revlink``hJ}r+#(hN]hO]hM]hL]hP]uh3j"#h[]r,#hjXrevlinkr-#r.#}r/#(h2Uh3j)#ubahHhubhjX argument on r0#r1#}r2#(h2X argument on h3j"#ubh)r3#}r4#(h2X:class:`WebStatus`r5#h3j"#h>hAhHhhJ}r6#(UreftypeXclasshhX WebStatusU refdomainXpyr7#hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMkh[]r8#h)r9#}r:#(h2j5#hJ}r;#(hN]hO]r<#(hj7#Xpy-classr=#ehM]hL]hP]uh3j3#h[]r>#hjX WebStatusr?#r@#}rA#(h2Uh3j9#ubahHhubaubhjX' is deprecated in favour of the global rB#rC#}rD#(h2X' is deprecated in favour of the global h3j"#ubh)rE#}rF#(h2X:bb:cfg:`revlink`rG#h3j"#h>hAhHhhJ}rH#(UreftypeXcfghhXrevlinkU refdomainXbbrI#hL]hM]U refexplicithN]hO]hP]hhuhSMkh[]rJ#h)rK#}rL#(h2jG#hJ}rM#(hN]hO]rN#(hjI#Xbb-cfgrO#ehM]hL]hP]uh3jE#h[]rP#hjXrevlinkrQ#rR#}rS#(h2Uh3jK#ubahHhubaubhjXa option. Only use this if you need to generate different URLs for different web status instances.rT#rU#}rV#(h2Xa option. Only use this if you need to generate different URLs for different web status instances.h3j"#ubeubhn)rW#}rX#(h2XIn 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.h3j#h>hAhHhqhJ}rY#(hN]hO]hM]hL]hP]uhSMohThh[]rZ#(hjXIn addition to a callable like r[#r\#}r]#(h2XIn addition to a callable like h3jW#ubh)r^#}r_#(h2X:bb:cfg:`revlink`r`#h3jW#h>hAhHhhJ}ra#(UreftypeXcfghhXrevlinkU refdomainXbbrb#hL]hM]U refexplicithN]hO]hP]hhuhSMoh[]rc#h)rd#}re#(h2j`#hJ}rf#(hN]hO]rg#(hjb#Xbb-cfgrh#ehM]hL]hP]uh3j^#h[]ri#hjXrevlinkrj#rk#}rl#(h2Uh3jd#ubahHhubaubhjXg, this argument accepts a format string or a dict mapping a string (repository name) to format strings.rm#rn#}ro#(h2Xg, this argument accepts a format string or a dict mapping a string (repository name) to format strings.h3jW#ubeubhn)rp#}rq#(h2XpThe format string should use ``%s`` to insert the revision id in the url. For example, for Buildbot on GitHub::h3j#h>hAhHhqhJ}rr#(hN]hO]hM]hL]hP]uhSMrhThh[]rs#(hjXThe format string should use rt#ru#}rv#(h2XThe format string should use h3jp#ubh)rw#}rx#(h2X``%s``hJ}ry#(hN]hO]hM]hL]hP]uh3jp#h[]rz#hjX%sr{#r|#}r}#(h2Uh3jw#ubahHhubhjXL to insert the revision id in the url. For example, for Buildbot on GitHub:r~#r#}r#(h2XL to insert the revision id in the url. For example, for Buildbot on GitHub:h3jp#ubeubh)r#}r#(h2X5revlink='http://github.com/buildbot/buildbot/tree/%s'h3j#h>hAhHhhJ}r#(hhhL]hM]hN]hO]hP]uhSMuhThh[]r#hjX5revlink='http://github.com/buildbot/buildbot/tree/%s'r#r#}r#(h2Uh3j#ubaubhn)r#}r#(h2XMThe revision ID will be URL encoded before inserted in the replacement stringr#h3j#h>hAhHhqhJ}r#(hN]hO]hM]hL]hP]uhSMwhThh[]r#hjXMThe revision ID will be URL encoded before inserted in the replacement stringr#r#}r#(h2j#h3j#ubaubeubh4)r#}r#(h2Uh3j"h>hAhHh\hJ}r#(hN]hO]hM]hL]r#Uchangecommentlinkr#ahP]r#hauhSMzhThh[]r#(hc)r#}r#(h2Xchangecommentlinkr#h3j#h>hAhHhghJ}r#(hN]hO]hM]hL]hP]uhSMzhThh[]r#hjXchangecommentlinkr#r#}r#(h2j#h3j#ubaubhn)r#}r#(h2XnThe ``changecommentlink`` argument can be used to create links to ticket-ids from change comments (i.e. #123).h3j#h>hAhHhqhJ}r#(hN]hO]hM]hL]hP]uhSM|hThh[]r#(hjXThe r#r#}r#(h2XThe h3j#ubh)r#}r#(h2X``changecommentlink``hJ}r#(hN]hO]hM]hL]hP]uh3j#h[]r#hjXchangecommentlinkr#r#}r#(h2Uh3j#ubahHhubhjXU argument can be used to create links to ticket-ids from change comments (i.e. #123).r#r#}r#(h2XU argument can be used to create links to ticket-ids from change comments (i.e. #123).h3j#ubeubhn)r#}r#(h2XThe 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.h3j#h>hAhHhqhJ}r#(hN]hO]hM]hL]hP]uhSMhThh[]r#(hjXThe 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#(h2XThe argument can either be a tuple of three strings, a dictionary mapping strings (project names) to tuples or a callable taking a changetext (a h3j#ubh)r#}r#(h2X:class:`jinja2.Markup`r#h3j#h>hAhHhhJ}r#(UreftypeXclasshhX jinja2.MarkupU refdomainXpyr#hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r#h)r#}r#(h2j#hJ}r#(hN]hO]r#(hj#Xpy-classr#ehM]hL]hP]uh3j#h[]r#hjX jinja2.Markupr#r#}r#(h2Uh3j#ubahHhubaubhjXl instance) and a project name, returning a the same change text with additional links/html tags added to it.r#r#}r#(h2Xl instance) and a project name, returning a the same change text with additional links/html tags added to it.h3j#ubeubhn)r#}r#(h2XIf 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>")`` .h3j#h>hAhHhqhJ}r#(hN]hO]hM]hL]hP]uhSMhThh[]r#(hjXIf 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#(h2XIf 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 h3j#ubh)r#}r#(h2X``\1``hJ}r#(hN]hO]hM]hL]hP]uh3j#h[]r#hjX\1r#r#}r#(h2Uh3j#ubahHhubhjXL etc, yields the URL and the third is the title attribute of the link. (The r#r#}r#(h2XL etc, yields the URL and the third is the title attribute of the link. (The h3j#ubh)r#}r#(h2X````hJ}r#(hN]hO]hM]hL]hP]uh3j#h[]r#hjXr#r#}r#(h2Uh3j#ubahHhubhjX; is added by the system.) So, for Trac tickets (#42, etc): r#r#}r#(h2X; is added by the system.) So, for Trac tickets (#42, etc): h3j#ubh)r#}r#(h2XX``changecommentlink(r"#(\d+)", r"http://buildbot.net/trac/ticket/\1", r"Ticket \g<0>")``hJ}r#(hN]hO]hM]hL]hP]uh3j#h[]r#hjXTchangecommentlink(r"#(\d+)", r"http://buildbot.net/trac/ticket/\1", r"Ticket \g<0>")r#r#}r#(h2Uh3j#ubahHhubhjX .r#r#}r#(h2X .h3j#ubeubeubh4)r#}r#(h2Uh3j"h>hAhHh\hJ}r#(hN]hO]hM]hL]r#Uprojectsr#ahP]r#h auhSMhThh[]r#(hc)r#}r#(h2Xprojectsr#h3j#h>hAhHhghJ}r#(hN]hO]hM]hL]hP]uhSMhThh[]r#hjXprojectsr#r#}r#(h2j#h3j#ubaubhn)r#}r#(h2X~A dictionary from strings to strings, mapping project names to URLs, or a callable taking a project name and returning an URL.r#h3j#h>hAhHhqhJ}r$(hN]hO]hM]hL]hP]uhSMhThh[]r$hjX~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$(h2j#h3j#ubaubeubh4)r$}r$(h2Uh3j"h>hAhHh\hJ}r$(hN]hO]hM]hL]r$U repositoriesr $ahP]r $h&auhSMhThh[]r $(hc)r $}r $(h2X repositoriesr$h3j$h>hAhHhghJ}r$(hN]hO]hM]hL]hP]uhSMhThh[]r$hjX repositoriesr$r$}r$(h2j$h3j $ubaubhn)r$}r$(h2XQSame as the projects arg above, a dict or callable mapping project names to URLs.r$h3j$h>hAhHhqhJ}r$(hN]hO]hM]hL]hP]uhSMhThh[]r$hjXQSame as the projects arg above, a dict or callable mapping project names to URLs.r$r$}r$(h2j$h3j$ubaubeubeubjeubh>hAhC}r$hj shHh\hJ}r$(hN]r$X authorizationr$ahO]hM]hL]r $(j Uid4r!$ehP]r"$hauhSMhThhU}r#$j j sh[]r$$(hc)r%$}r&$(h2X Authorizationr'$h3h5h>hAhHhghJ}r($(hN]hO]hM]hL]hP]uhSMhThh[]r)$hjX Authorizationr*$r+$}r,$(h2j'$h3j%$ubaubhn)r-$}r.$(h2XBThe 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/$h3h5h>hAhHhqhJ}r0$(hN]hO]hM]hL]hP]uhSMhThh[]r1$hjXBThe 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:r2$r3$}r4$(h2j/$h3j-$ubaubjb)r5$}r6$(h2Uh3h5h>hAhHjehJ}r7$(hN]hO]hM]hL]hP]uhSNhThh[]r8$(jh)r9$}r:$(h2Xo``forceBuild`` force a particular builder to begin building, optionally with a specific revision, branch, etc. h3j5$h>hAhHjkhJ}r;$(hN]hO]hM]hL]hP]uhSMh[]r<$(jn)r=$}r>$(h2X``forceBuild``r?$h3j9$h>hAhHjrhJ}r@$(hN]hO]hM]hL]hP]uhSMh[]rA$h)rB$}rC$(h2j?$hJ}rD$(hN]hO]hM]hL]hP]uh3j=$h[]rE$hjX forceBuildrF$rG$}rH$(h2Uh3jB$ubahHhubaubj|)rI$}rJ$(h2UhJ}rK$(hN]hO]hM]hL]hP]uh3j9$h[]rL$hn)rM$}rN$(h2X_force a particular builder to begin building, optionally with a specific revision, branch, etc.rO$h3jI$h>hAhHhqhJ}rP$(hN]hO]hM]hL]hP]uhSMh[]rQ$hjX_force a particular builder to begin building, optionally with a specific revision, branch, etc.rR$rS$}rT$(h2jO$h3jM$ubaubahHjubeubjh)rU$}rV$(h2X:``forceAllBuilds`` force *all* builders to start building h3j5$h>hAhHjkhJ}rW$(hN]hO]hM]hL]hP]uhSMhThh[]rX$(jn)rY$}rZ$(h2X``forceAllBuilds``r[$h3jU$h>hAhHjrhJ}r\$(hN]hO]hM]hL]hP]uhSMh[]r]$h)r^$}r_$(h2j[$hJ}r`$(hN]hO]hM]hL]hP]uh3jY$h[]ra$hjXforceAllBuildsrb$rc$}rd$(h2Uh3j^$ubahHhubaubj|)re$}rf$(h2UhJ}rg$(hN]hO]hM]hL]hP]uh3jU$h[]rh$hn)ri$}rj$(h2X&force *all* builders to start buildingh3je$h>hAhHhqhJ}rk$(hN]hO]hM]hL]hP]uhSMh[]rl$(hjXforce rm$rn$}ro$(h2Xforce h3ji$ubj$)rp$}rq$(h2X*all*hJ}rr$(hN]hO]hM]hL]hP]uh3ji$h[]rs$hjXallrt$ru$}rv$(h2Uh3jp$ubahHj,ubhjX builders to start buildingrw$rx$}ry$(h2X builders to start buildingh3ji$ubeubahHjubeubjh)rz$}r{$(h2XL``pingBuilder`` "ping" a builder's buildslaves to check that they are alive h3j5$h>hAhHjkhJ}r|$(hN]hO]hM]hL]hP]uhSMhThh[]r}$(jn)r~$}r$(h2X``pingBuilder``r$h3jz$h>hAhHjrhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$h)r$}r$(h2j$hJ}r$(hN]hO]hM]hL]hP]uh3j~$h[]r$hjX pingBuilderr$r$}r$(h2Uh3j$ubahHhubaubj|)r$}r$(h2UhJ}r$(hN]hO]hM]hL]hP]uh3jz$h[]r$hn)r$}r$(h2X;"ping" a builder's buildslaves to check that they are aliver$h3j$h>hAhHhqhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$hjX;"ping" a builder's buildslaves to check that they are aliver$r$}r$(h2j$h3j$ubaubahHjubeubjh)r$}r$(h2X]``gracefulShutdown`` gracefully shut down a slave when it is finished with its current build h3j5$h>hAhHjkhJ}r$(hN]hO]hM]hL]hP]uhSMhThh[]r$(jn)r$}r$(h2X``gracefulShutdown``r$h3j$h>hAhHjrhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$h)r$}r$(h2j$hJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hjXgracefulShutdownr$r$}r$(h2Uh3j$ubahHhubaubj|)r$}r$(h2UhJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hn)r$}r$(h2XGgracefully shut down a slave when it is finished with its current buildr$h3j$h>hAhHhqhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$hjXGgracefully shut down a slave when it is finished with its current buildr$r$}r$(h2j$h3j$ubaubahHjubeubjh)r$}r$(h2X>``pauseSlave`` temporarily stop running new builds on a slave h3j5$h>hAhHjkhJ}r$(hN]hO]hM]hL]hP]uhSMhThh[]r$(jn)r$}r$(h2X``pauseSlave``r$h3j$h>hAhHjrhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$h)r$}r$(h2j$hJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hjX pauseSlaver$r$}r$(h2Uh3j$ubahHhubaubj|)r$}r$(h2UhJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hn)r$}r$(h2X.temporarily stop running new builds on a slaver$h3j$h>hAhHhqhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$hjX.temporarily stop running new builds on a slaver$r$}r$(h2j$h3j$ubaubahHjubeubjh)r$}r$(h2X#``stopBuild`` stop a running build h3j5$h>hAhHjkhJ}r$(hN]hO]hM]hL]hP]uhSMhThh[]r$(jn)r$}r$(h2X ``stopBuild``r$h3j$h>hAhHjrhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$h)r$}r$(h2j$hJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hjX stopBuildr$r$}r$(h2Uh3j$ubahHhubaubj|)r$}r$(h2UhJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hn)r$}r$(h2Xstop a running buildr$h3j$h>hAhHhqhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$hjXstop a running buildr$r$}r$(h2j$h3j$ubaubahHjubeubjh)r$}r$(h2X*``stopAllBuilds`` stop all running builds h3j5$h>hAhHjkhJ}r$(hN]hO]hM]hL]hP]uhSMhThh[]r$(jn)r$}r$(h2X``stopAllBuilds``r$h3j$h>hAhHjrhJ}r$(hN]hO]hM]hL]hP]uhSMh[]r$h)r$}r$(h2j$hJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hjX stopAllBuildsr$r$}r$(h2Uh3j$ubahHhubaubj|)r$}r$(h2UhJ}r$(hN]hO]hM]hL]hP]uh3j$h[]r$hn)r$}r$(h2Xstop all running buildsr%h3j$h>hAhHhqhJ}r%(hN]hO]hM]hL]hP]uhSMh[]r%hjXstop all running buildsr%r%}r%(h2j%h3j$ubaubahHjubeubjh)r%}r%(h2X?``cancelPendingBuild`` cancel a build that has not yet started h3j5$h>hAhHjkhJ}r%(hN]hO]hM]hL]hP]uhSMhThh[]r %(jn)r %}r %(h2X``cancelPendingBuild``r %h3j%h>hAhHjrhJ}r %(hN]hO]hM]hL]hP]uhSMh[]r%h)r%}r%(h2j %hJ}r%(hN]hO]hM]hL]hP]uh3j %h[]r%hjXcancelPendingBuildr%r%}r%(h2Uh3j%ubahHhubaubj|)r%}r%(h2UhJ}r%(hN]hO]hM]hL]hP]uh3j%h[]r%hn)r%}r%(h2X'cancel a build that has not yet startedr%h3j%h>hAhHhqhJ}r%(hN]hO]hM]hL]hP]uhSMh[]r%hjX'cancel a build that has not yet startedr%r %}r!%(h2j%h3j%ubaubahHjubeubjh)r"%}r#%(h2X@``stopChange`` cancel builds that include a given change number h3j5$h>hAhHjkhJ}r$%(hN]hO]hM]hL]hP]uhSMhThh[]r%%(jn)r&%}r'%(h2X``stopChange``r(%h3j"%h>hAhHjrhJ}r)%(hN]hO]hM]hL]hP]uhSMh[]r*%h)r+%}r,%(h2j(%hJ}r-%(hN]hO]hM]hL]hP]uh3j&%h[]r.%hjX stopChanger/%r0%}r1%(h2Uh3j+%ubahHhubaubj|)r2%}r3%(h2UhJ}r4%(hN]hO]hM]hL]hP]uh3j"%h[]r5%hn)r6%}r7%(h2X0cancel builds that include a given change numberr8%h3j2%h>hAhHhqhJ}r9%(hN]hO]hM]hL]hP]uhSMh[]r:%hjX0cancel builds that include a given change numberr;%r<%}r=%(h2j8%h3j6%ubaubahHjubeubjh)r>%}r?%(h2XO``cleanShutdown`` shut down the master gracefully, without interrupting builds h3j5$h>hAhHjkhJ}r@%(hN]hO]hM]hL]hP]uhSMhThh[]rA%(jn)rB%}rC%(h2X``cleanShutdown``rD%h3j>%h>hAhHjrhJ}rE%(hN]hO]hM]hL]hP]uhSMh[]rF%h)rG%}rH%(h2jD%hJ}rI%(hN]hO]hM]hL]hP]uh3jB%h[]rJ%hjX cleanShutdownrK%rL%}rM%(h2Uh3jG%ubahHhubaubj|)rN%}rO%(h2UhJ}rP%(hN]hO]hM]hL]hP]uh3j>%h[]rQ%hn)rR%}rS%(h2X<shut down the master gracefully, without interrupting buildsrT%h3jN%h>hAhHhqhJ}rU%(hN]hO]hM]hL]hP]uhSMh[]rV%hjX<shut down the master gracefully, without interrupting buildsrW%rX%}rY%(h2jT%h3jR%ubaubahHjubeubjh)rZ%}r[%(h2X[``showUsersPage`` access to page displaying users in the database, see :ref:`User-Objects` h3j5$h>hAhHjkhJ}r\%(hN]hO]hM]hL]hP]uhSMhThh[]r]%(jn)r^%}r_%(h2X``showUsersPage``r`%h3jZ%h>hAhHjrhJ}ra%(hN]hO]hM]hL]hP]uhSMh[]rb%h)rc%}rd%(h2j`%hJ}re%(hN]hO]hM]hL]hP]uh3j^%h[]rf%hjX showUsersPagerg%rh%}ri%(h2Uh3jc%ubahHhubaubj|)rj%}rk%(h2UhJ}rl%(hN]hO]hM]hL]hP]uh3jZ%h[]rm%hn)rn%}ro%(h2XHaccess to page displaying users in the database, see :ref:`User-Objects`h3jj%h>hAhHhqhJ}rp%(hN]hO]hM]hL]hP]uhSMh[]rq%(hjX5access to page displaying users in the database, see rr%rs%}rt%(h2X5access to page displaying users in the database, see h3jn%ubh)ru%}rv%(h2X:ref:`User-Objects`rw%h3jn%h>hAhHhhJ}rx%(UreftypeXrefhhX user-objectsU refdomainXstdry%hL]hM]U refexplicithN]hO]hP]hhuhSMh[]rz%j$)r{%}r|%(h2jw%hJ}r}%(hN]hO]r~%(hjy%Xstd-refr%ehM]hL]hP]uh3ju%h[]r%hjX User-Objectsr%r%}r%(h2Uh3j{%ubahHj,ubaubeubahHjubeubeubhn)r%}r%(h2XFor 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%h3h5h>hAhHhqhJ}r%(hN]hO]hM]hL]hP]uhSMhThh[]r%hjXFor 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%(h2j%h3j%ubaubhn)r%}r%(h2X6This is all configured with the :class:`Authz` class::r%h3h5h>hAhHhqhJ}r%(hN]hO]hM]hL]hP]uhSMhThh[]r%(hjX This is all configured with the r%r%}r%(h2X This is all configured with the h3j%ubh)r%}r%(h2X:class:`Authz`r%h3j%h>hAhHhhJ}r%(UreftypeXclasshhXAuthzU refdomainXpyr%hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r%h)r%}r%(h2j%hJ}r%(hN]hO]r%(hj%Xpy-classr%ehM]hL]hP]uh3j%h[]r%hjXAuthzr%r%}r%(h2Uh3j%ubahHhubaubhjX class:r%r%}r%(h2X class:h3j%ubeubh)r%}r%(h2Xfrom 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))h3h5h>hAhHhhJ}r%(hhhL]hM]hN]hO]hP]uhSMhThh[]r%hjXfrom 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%(h2Uh3j%ubaubhn)r%}r%(h2XEach 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.h3h5h>hAhHhqhJ}r%(hN]hO]hM]hL]hP]uhSMhThh[]r%(hjX1Each of the actions listed above is an option to r%r%}r%(h2X1Each of the actions listed above is an option to h3j%ubh)r%}r%(h2X:class:`Authz`r%h3j%h>hAhHhhJ}r%(UreftypeXclasshhXAuthzU refdomainXpyr%hL]hM]U refexplicithN]hO]hP]hhhNhNuhSMh[]r%h)r%}r%(h2j%hJ}r%(hN]hO]r%(hj%Xpy-classr%ehM]hL]hP]uh3j%h[]r%hjXAuthzr%r%}r%(h2Uh3j%ubahHhubaubhjX. You can specify r%r%}r%(h2X. You can specify h3j%ubh)r%}r%(h2X ``False``hJ}r%(hN]hO]hM]hL]hP]uh3j%h[]r%hjXFalser%r%}r%(h2Uh3j%ubahHhubhjX* (the default) to prohibit that action or r%r%}r%(h2X* (the default) to prohibit that action or h3j%ubh)r%}r%(h2X``True``hJ}r%(hN]hO]hM]hL]hP]uh3j%h[]r%hjXTruer%r%}r%(h2Uh3j%ubahHhubhjX 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%(h2X 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 h3j%ubh)r%}r%(h2X``forceBuild``hJ}r%(hN]hO]hM]hL]hP]uh3j%h[]r%hjX forceBuildr%r%}r%(h2Uh3j%ubahHhubhjX,, the second argument is the builder status.r%r%}r%(h2X,, the second argument is the builder status.h3j%ubeubeubh>hAhHUsystem_messager%hJ}r%(hN]UlevelKhL]hM]r%j!$aUsourcehAhO]hP]UlineMUtypeUINFOr%uhSMhThh[]r%hn)r%}r%(h2UhJ}r%(hN]hO]hM]hL]hP]uh3h0h[]r%hjX0Duplicate implicit target name: "authorization".r%r%}r%(h2Uh3j%ubahHhqubaubaUcurrent_sourcer%NU decorationr%NUautofootnote_startr%KUnameidsr%}r%(hj#hjhhh jh h_U1jh jh jbh jhjhj U2jBhj"hjEhj/hhRhj hjfhjhjWhj#hhhjhjhj!hhhjhj3h j#h!j$h"h"h#jh$h$h%j^h&j $h'h'h(jh)jh*j#uh[]r%(ju)r%}r%(h2Uh3hh>hAhHjxhJ}r%(hL]hM]hN]hO]hP]Uentries]r%((UsingleXBuildmaster Config; statushWhWtr%(UsingleXstatus (Buildmaster Config)hWhWtr%euhSKhThh[]ubhXhFh&(h2UhJ}r?&(hN]hO]hM]hL]hP]uh3j9&h[]r@&hjX2Hyperlink target "change-hooks" is not referenced.rA&rB&}rC&(h2Uh3j=&ubahHhqubahHj%ubh/)rD&}rE&(h2UhJ}rF&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineM.Utypej%uh[]rG&hn)rH&}rI&(h2UhJ}rJ&(hN]hO]hM]hL]hP]uh3jD&h[]rK&hjX9Hyperlink target "status-MailNotifier" is not referenced.rL&rM&}rN&(h2Uh3jH&ubahHhqubahHj%ubh/)rO&}rP&(h2UhJ}rQ&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineM0Utypej%uh[]rR&hn)rS&}rT&(h2UhJ}rU&(hN]hO]hM]hL]hP]uh3jO&h[]rV&hjX-Hyperlink target "index-0" is not referenced.rW&rX&}rY&(h2Uh3jS&ubahHhqubahHj%ubh/)rZ&}r[&(h2UhJ}r\&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineMUtypej%uh[]r]&hn)r^&}r_&(h2UhJ}r`&(hN]hO]hM]hL]hP]uh3jZ&h[]ra&hjX0Hyperlink target "status-IRC" is not referenced.rb&rc&}rd&(h2Uh3j^&ubahHhqubahHj%ubh/)re&}rf&(h2UhJ}rg&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineMUtypej%uh[]rh&hn)ri&}rj&(h2UhJ}rk&(hN]hO]hM]hL]hP]uh3je&h[]rl&hjX-Hyperlink target "index-1" is not referenced.rm&rn&}ro&(h2Uh3ji&ubahHhqubahHj%ubh/)rp&}rq&(h2UhJ}rr&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineMfUtypej%uh[]rs&hn)rt&}ru&(h2UhJ}rv&(hN]hO]hM]hL]hP]uh3jp&h[]rw&hjX-Hyperlink target "index-2" is not referenced.rx&ry&}rz&(h2Uh3jt&ubahHhqubahHj%ubh/)r{&}r|&(h2UhJ}r}&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineMUtypej%uh[]r~&hn)r&}r&(h2UhJ}r&(hN]hO]hM]hL]hP]uh3j{&h[]r&hjX7Hyperlink target "status-PBListener" is not referenced.r&r&}r&(h2Uh3j&ubahHhqubahHj%ubh/)r&}r&(h2UhJ}r&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineMUtypej%uh[]r&hn)r&}r&(h2UhJ}r&(hN]hO]hM]hL]hP]uh3j&h[]r&hjX7Hyperlink target "status-StatusPush" is not referenced.r&r&}r&(h2Uh3j&ubahHhqubahHj%ubh/)r&}r&(h2UhJ}r&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineMUtypej%uh[]r&hn)r&}r&(h2UhJ}r&(hN]hO]hM]hL]hP]uh3j&h[]r&hjX;Hyperlink target "status-HttpStatusPush" is not referenced.r&r&}r&(h2Uh3j&ubahHhqubahHj%ubh/)r&}r&(h2UhJ}r&(hN]UlevelKhL]hM]UsourcehAhO]hP]UlineMUtypej%uh[]r&hn)r&}r&(h2UhJ}r&(hN]hO]hM]hL]hP]uh3j&h[]r&hjX=Hyperlink target "status-GerritStatusPush" is not referenced.r&r&}r&(h2Uh3j&ubahHhqubahHj%ubeUreporterr&NUid_startr&KU autofootnotesr&]r&(jj>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&NhgNUerror_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.8/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&(jjjjj{h:jjhj|j!j!jj~j#j"jjjBj>j!$h5jjj!jjDjG h_hahW]r'hXaj]r'jaj]r'jaj]r 'jajB]r 'jG aj%]r 'j(ahR]r 'hFaj ]r 'j aj]r'jauub.PKJtD{Ukm3m30buildbot-v0.8.8/.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.8/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-XFinally, the SSH approach needs to connect to a :class:`PBListener` status port, so it can retrieve and report the results of the build (the PB approach uses the existing connection to retrieve status information, so this step is not necessary). This requires a :option:`--masterstatus` argument, or a ``try_masterstatus`` entry in :file:`.buildbot/options`, in the form of a :samp:`{HOSTNAME}:{PORT}` string.h.j`h7h:hAhehC}r1(hG]hH]hF]hE]hI]uhLKhMhhN]r2(h^X0Finally, the SSH approach needs to connect to a r3r4}r5(h-X0Finally, the SSH approach needs to connect to a h.j/ubjx)r6}r7(h-X:class:`PBListener`r8h.j/h7h:hAj|hC}r9(UreftypeXclassj~jX PBListenerU refdomainXpyr:hE]hF]U refexplicithG]hH]hI]jjjNjNuhLKhN]r;h)r<}r=(h-j8hC}r>(hG]hH]r?(jj:Xpy-classr@ehF]hE]hI]uh.j6hN]rAh^X PBListenerrBrC}rD(h-Uh.j<ubahAhubaubh^X status port, so it can retrieve and report the results of the build (the PB approach uses the existing connection to retrieve status information, so this step is not necessary). This requires a rErF}rG(h-X status port, so it can retrieve and report the results of the build (the PB approach uses the existing connection to retrieve status information, so this step is not necessary). This requires a h.j/ubjx)rH}rI(h-X:option:`--masterstatus`rJh.j/h7h:hAj|hC}rK(UreftypeXoptionj~jX--masterstatusU refdomainXstdrLj NhE]hF]U refexplicithG]hH]hI]jjuhLKhN]rMj )rN}rO(h-jJhC}rP(hG]hH]rQ(jjLX std-optionrRehF]hE]hI]uh.jHhN]rSh^X--masterstatusrTrU}rV(h-Uh.jNubahAjubaubh^X argument, or a rWrX}rY(h-X argument, or a h.j/ubh)rZ}r[(h-X``try_masterstatus``hC}r\(hG]hH]hF]hE]hI]uh.j/hN]r]h^Xtry_masterstatusr^r_}r`(h-Uh.jZubahAhubh^X entry in rarb}rc(h-X entry in h.j/ubh)rd}re(h-UhC}rf(hE]hF]hG]hH]rgXfilerhaUrolejhhI]uh.j/hN]rih^X.buildbot/optionsrjrk}rl(h-X.buildbot/optionsh.jdubahAhubh^X, in the form of a rmrn}ro(h-X, in the form of a h.j/ubh)rp}rq(h-UhC}rr(hE]hF]hG]hH]rsXsamprtaUrolejthI]uh.j/hN]ru(j)rv}rw(h-XHOSTNAMEhC}rx(hG]hH]hF]hE]hI]uh.jphN]ryh^XHOSTNAMErzr{}r|(h-Uh.jvubahAjubh^X:r}}r~(h-X:h.jpubj)r}r(h-XPORThC}r(hG]hH]hF]hE]hI]uh.jphN]rh^XPORTrr}r(h-Uh.jubahAjubehAhubh^X string.rr}r(h-X string.h.j/ubeubhb)r}r(h-X]The following command line arguments are deprecated, but retained for backward compatibility:rh.j`h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^X]The following command line arguments are deprecated, but retained for backward compatibility:rr}r(h-jh.jubaubh)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 --tryhostrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --tryhostrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-Xis replaced by :option:`--host`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^Xis replaced by rr}r(h-Xis replaced by h.jubjx)r}r(h-X:option:`--host`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--hostU 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--hostrr}r(h-Uh.jubahAjubaubeubahAhubeubh)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--trydirrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--trydirrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-X!is replaced by :option:`--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^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]jjuhLMhN]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.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-X(is replaced by :option:`--masterstatus` hC}r (hG]hH]hF]hE]hI]uh.jhN]r hb)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.j ubjx)r}r(h-X:option:`--masterstatus`rh.j h7h: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]uhLM hMhhN]r$(h^XLikewise, the following r%r&}r'(h-XLikewise, the following h.j!ubh)r(}r)(h-UhC}r*(hE]hF]hG]hH]r+Xfiler,aUrolej,hI]uh.j!hN]r-h^X.buildbot/optionsr.r/}r0(h-X.buildbot/optionsh.j(ubahAhubh^XF file entries are deprecated, but retained for backward compatibility:r1r2}r3(h-XF file entries are deprecated, but retained for backward compatibility:h.j!ubeubcdocutils.nodes block_quote r4)r5}r6(h-Uh.j`h7NhAU block_quoter7hC}r8(hG]hH]hF]hE]hI]uhLNhMhhN]r9cdocutils.nodes bullet_list r:)r;}r<(h-UhC}r=(Ubulletr>X*hE]hF]hG]hH]hI]uh.j5hN]r?(cdocutils.nodes list_item r@)rA}rB(h-X)``try_dir`` is replaced by ``try_jobdir``rChC}rD(hG]hH]hF]hE]hI]uh.j;hN]rEhb)rF}rG(h-jCh.jAh7h:hAhehC}rH(hG]hH]hF]hE]hI]uhLM hN]rI(h)rJ}rK(h-X ``try_dir``hC}rL(hG]hH]hF]hE]hI]uh.jFhN]rMh^Xtry_dirrNrO}rP(h-Uh.jJubahAhubh^X is replaced by rQrR}rS(h-X is replaced by h.jFubh)rT}rU(h-X``try_jobdir``hC}rV(hG]hH]hF]hE]hI]uh.jFhN]rWh^X try_jobdirrXrY}rZ(h-Uh.jTubahAhubeubahAU list_itemr[ubj@)r\}r](h-X5``masterstatus`` is replaced by ``try_masterstatus`` hC}r^(hG]hH]hF]hE]hI]uh.j;hN]r_hb)r`}ra(h-X4``masterstatus`` is replaced by ``try_masterstatus``h.j\h7h:hAhehC}rb(hG]hH]hF]hE]hI]uhLMhN]rc(h)rd}re(h-X``masterstatus``hC}rf(hG]hH]hF]hE]hI]uh.j`hN]rgh^X masterstatusrhri}rj(h-Uh.jdubahAhubh^X is replaced by rkrl}rm(h-X is replaced by h.j`ubh)rn}ro(h-X``try_masterstatus``hC}rp(hG]hH]hF]hE]hI]uh.j`hN]rqh^Xtry_masterstatusrrrs}rt(h-Uh.jnubahAhubeubahAj[ubehAU bullet_listruubaubeubh/)rv}rw(h-Uh.jh7h:hAhOhC}rx(hG]hH]hF]hE]ryUchoosing-the-buildersrzahI]r{h"auhLMhMhhN]r|(hW)r}}r~(h-XChoosing the Buildersrh.jvh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^XChoosing the Buildersrr}r(h-jh.j}ubaubhb)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.jvh7h: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.jvh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]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]jjuhLMhN]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.jubeubj4)r}r(h-Uh.jvh7h:hAj7hC}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.jvh7h: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-namesrr}r(h-Uh.jubahAhubh^X argument:rr}r(h-X argument:h.jubeubj4)r}r(h-Uh.jvh7h:hAj7hC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rhb)r}r(h-XVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM)hN]rh^XVbuildbot try --get-builder-names --connect=pb --master=... --username=... --passwd=...rr}r(h-jh.jubaubaubeubh/)r }r (h-Uh.jh7h:hAhOhC}r (hG]hH]hF]hE]r Uspecifying-the-vc-systemr ahI]r hauhLM,hMhhN]r (hW)r }r (h-XSpecifying the VC systemr h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLM,hMhhN]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]uhLM.hMhhN]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 r r }r (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)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 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}r/ (UreftypeXoptionj~jX--vc=cvsU refdomainXstdr0 j NhE]hF]U refexplicithG]hH]hI]jjuhLM.hN]r1 j )r2 }r3 (h-j. hC}r4 (hG]hH]r5 (jj0 X std-optionr6 ehF]hE]hI]uh.j, hN]r7 h^X--vc=cvsr8 r9 }r: (h-Uh.j2 ubahAjubaubh^X or r; r< }r= (h-X or h.j ubjx)r> }r? (h-X:option:`--vc=git`r@ h.j h7h:hAj|hC}rA (UreftypeXoptionj~jX--vc=gitU refdomainXstdrB j NhE]hF]U refexplicithG]hH]hI]jjuhLM.hN]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=gitrJ rK }rL (h-Uh.jD ubahAjubaubh^X. This can also be provided as rM rN }rO (h-X. This can also be provided as h.j ubh)rP }rQ (h-X ``try_vc``hC}rR (hG]hH]hF]hE]hI]uh.j hN]rS h^Xtry_vcrT rU }rV (h-Uh.jP ubahAhubh^X in rW rX }rY (h-X in h.j ubh)rZ }r[ (h-UhC}r\ (hE]hF]hG]hH]r] Xfiler^ aUrolej^ hI]uh.j hN]r_ h^X.buildbot/optionsr` ra }rb (h-X.buildbot/optionsh.jZ ubahAhubh^X.rc }rd (h-X.h.j ubeubcdocutils.nodes comment re )rf }rg (h-XAThe order of this list comes from the end of scripts/tryclient.pyh.j h7h:hAUcommentrh hC}ri (hhhE]hF]hG]hH]hI]uhLM7hMhhN]rj h^XAThe order of this list comes from the end of scripts/tryclient.pyrk rl }rm (h-Uh.jf ubaubhb)rn }ro (h-XcThe following names are recognized: ``bzr`` ``cvs`` ``darcs`` ``hg`` ``git`` ``mtn`` ``p4`` ``svn``h.j h7h:hAhehC}rp (hG]hH]hF]hE]hI]uhLM8hMhhN]rq (h^X$The following names are recognized: rr rs }rt (h-X$The following names are recognized: h.jn ubh)ru }rv (h-X``bzr``hC}rw (hG]hH]hF]hE]hI]uh.jn hN]rx h^Xbzrry rz }r{ (h-Uh.ju ubahAhubh^X r| }r} (h-X h.jn ubh)r~ }r (h-X``cvs``hC}r (hG]hH]hF]hE]hI]uh.jn hN]r h^Xcvsr r }r (h-Uh.j~ ubahAhubh^X r }r (h-X h.jn ubh)r }r (h-X ``darcs``hC}r (hG]hH]hF]hE]hI]uh.jn hN]r h^Xdarcsr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.jn ubh)r }r (h-X``hg``hC}r (hG]hH]hF]hE]hI]uh.jn hN]r h^Xhgr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.jn ubh)r }r (h-X``git``hC}r (hG]hH]hF]hE]hI]uh.jn hN]r h^Xgitr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.jn ubh)r }r (h-X``mtn``hC}r (hG]hH]hF]hE]hI]uh.jn hN]r h^Xmtnr r }r (h-Uh.j ubahAhubh^X r }r (h-X h.jn ubh)r }r (h-X``p4``hC}r (hG]hH]hF]hE]hI]uh.jn hN]r h^Xp4r r }r (h-Uh.j ubahAhubh^X r }r (h-X h.jn ubh)r }r (h-X``svn``hC}r (hG]hH]hF]hE]hI]uh.jn 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%auhLM=hMhhN]r (hW)r }r (h-XFinding the top of the treer h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLM=hMhhN]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]uhLM?hMhhN]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 r }r (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)r }r! (h-X``--topfile=ChangeLog``hC}r" (hG]hH]hF]hE]hI]uh.j hN]r# h^X--topfile=ChangeLogr$ r% }r& (h-Uh.j ubahAhubh^X%, or set it in the options file with r' 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. r/ }r0 (h-Uh.j* ubahAhubh^X.r1 }r2 (h-X.h.j ubeubhb)r3 }r4 (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}r5 (hG]hH]hF]hE]hI]uhLMMhMhhN]r6 (h^X3You can also manually set the top of the tree with r7 r8 }r9 (h-X3You can also manually set the top of the tree with h.j3 ubh)r: }r; (h-X``--topdir=~/trees/mytree``hC}r< (hG]hH]hF]hE]hI]uh.j3 hN]r= h^X--topdir=~/trees/mytreer> r? }r@ (h-Uh.j: ubahAhubh^X, or rA rB }rC (h-X, or h.j3 ubh)rD }rE (h-X!``try_topdir = '~/trees/mytree'``hC}rF (hG]hH]hF]hE]hI]uh.j3 hN]rG h^Xtry_topdir = '~/trees/mytree'rH rI }rJ (h-Uh.jD ubahAhubh^X . If you use rK rL }rM (h-X . If you use h.j3 ubh)rN }rO (h-X``try_topdir``hC}rP (hG]hH]hF]hE]hI]uh.j3 hN]rQ h^X try_topdirrR rS }rT (h-Uh.jN ubahAhubh^X, in a rU rV }rW (h-X, in a h.j3 ubh)rX }rY (h-UhC}rZ (hE]hF]hG]hH]r[ Xfiler\ aUrolej\ hI]uh.j3 hN]r] h^X.buildbot/optionsr^ r_ }r` (h-X.buildbot/optionsh.jX ubahAhubh^Xl file, you will need a separate options file for each tree you use, so it may be more convenient to use the ra rb }rc (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.j3 ubh)rd }re (h-X``try_topfile``hC}rf (hG]hH]hF]hE]hI]uh.j3 hN]rg h^X try_topfilerh ri }rj (h-Uh.jd ubahAhubh^X approach instead.rk rl }rm (h-X approach instead.h.j3 ubeubhb)rn }ro (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}rp (hG]hH]hF]hE]hI]uhLMThMhhN]rq (h^XOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require rr rs }rt (h-XOther VC systems which work on full projects instead of individual directories (Darcs, Mercurial, Git, Monotone) do not require h.jn ubhk)ru }rv (h-X:command:`try`hC}rw (hG]hH]rx hpahF]hE]hI]uh.jn hN]ry h^Xtryrz r{ }r| (h-Uh.ju ubahAhuubh^X# to know the top directory, so the r} r~ }r (h-X# to know the top directory, so the h.jn ubjx)r }r (h-X:option:`--try-topfile`r h.jn h7h:hAj|hC}r (UreftypeXoptionj~jX --try-topfileU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMThN]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.jn ubjx)r }r (h-X:option:`--try-topdir`r h.jn h7h:hAj|hC}r (UreftypeXoptionj~jX --try-topdirU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMThN]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.jn 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]uhLMYhMhhN]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 ubaubj4)r }r (h-Uh.j h7NhAj7hC}r (hG]hH]hF]hE]hI]uhLNhMhhN]r j:)r }r (h-UhC}r (j>X*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]uhLM_hN]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]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--topdirr r }r (h-Uh.j ubahAjubaubeubahAj[ubj@)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]uhLM`hN]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]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 --topfiler r }r (h-Uh.j ubahAjubaubeubahAj[ubehAjuubaubeubh/)r }r (h-Uh.jh7h:hAhOhC}r (hG]hH]hF]hE]r Udetermining-the-branch-namer ahI]r h#auhLMchMhhN]r (hW)r }r (h-XDetermining the branch namer h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLMchMhhN]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]uhLMehMhhN]r (h^X<Some VC systems record the branch information in a way that r r }r (h-X<Some VC systems record the branch information in a way that 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^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 r' 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]jjuhLMehN]r/ j )r0 }r1 (h-j, hC}r2 (hG]hH]r3 (jj. X std-optionr4 ehF]hE]hI]uh.j* hN]r5 h^X--branchr6 r7 }r8 (h-Uh.j0 ubahAjubaubh^X argument, or a r9 r: }r; (h-X argument, or a h.j ubh)r< }r= (h-X``try_branch``hC}r> (hG]hH]hF]hE]hI]uh.j hN]r? h^X try_branchr@ rA }rB (h-Uh.j< ubahAhubh^X entry in the rC rD }rE (h-X entry in the h.j ubh)rF }rG (h-UhC}rH (hE]hF]hG]hH]rI XfilerJ aUrolejJ hI]uh.j hN]rK h^X.buildbot/optionsrL rM }rN (h-X.buildbot/optionsh.jF ubahAhubh^X file.rO rP }rQ (h-X file.h.j ubeubeubh/)rR }rS (h-Uh.jh7h:hAhOhC}rT (hG]hH]hF]hE]rU U"determining-the-revision-and-patchrV ahI]rW hauhLMmhMhhN]rX (hW)rY }rZ (h-X"Determining the revision and patchr[ h.jR h7h:hAh[hC}r\ (hG]hH]hF]hE]hI]uhLMmhMhhN]r] h^X"Determining the revision and patchr^ r_ }r` (h-j[ h.jY ubaubhb)ra }rb (h-XfEach VC system has a separate approach for determining the tree's base revision and computing a patch.rc h.jR h7h:hAhehC}rd (hG]hH]hF]hE]hI]uhLMohMhhN]re h^XfEach VC system has a separate approach for determining the tree's base revision and computing a patch.rf rg }rh (h-jc h.ja ubaubcdocutils.nodes definition_list ri )rj }rk (h-Uh.jR h7h:hAUdefinition_listrl hC}rm (hG]hH]hF]hE]hI]uhLNhMhhN]rn (cdocutils.nodes definition_list_item ro )rp }rq (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.jj h7h:hAUdefinition_list_itemrr hC}rs (hG]hH]hF]hE]hI]uhLMxhN]rt (cdocutils.nodes term ru )rv }rw (h-XCVSrx h.jp h7h:hAUtermry hC}rz (hG]hH]hF]hE]hI]uhLMxhN]r{ h^XCVSr| r} }r~ (h-jx h.jv ubaubcdocutils.nodes definition r )r }r (h-UhC}r (hG]hH]hF]hE]hI]uh.jp 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]uhLMshN]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]jjuhLMshN]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 ubeubjo )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.jj h7h:hAjr hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (ju )r }r (h-XSVNr h.j h7h:hAjy 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]uhLM{hN]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 ubeubjo )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.jj h7h:hAjr hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (ju )r }r (h-Xbzrr h.j h7h:hAjy hC}r (hG]hH]hF]hE]hI]uhLMhN]r h^Xbzrr 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-Xy: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: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 r0 r1 }r2 (h-X does a h.j$ ubh)r3 }r4 (h-X``bzr revision-info``hC}r5 (hG]hH]hF]hE]hI]uh.j$ hN]r6 h^Xbzr revision-infor7 r8 }r9 (h-Uh.j3 ubahAhubh^X# to find the base revision, then a r: r; }r< (h-X# to find the base revision, then a h.j$ ubh)r= }r> (h-X``bzr diff -r$base..``hC}r? (hG]hH]hF]hE]hI]uh.j$ hN]r@ h^Xbzr diff -r$base..rA rB }rC (h-Uh.j= ubahAhubh^X to obtain the patch.rD rE }rF (h-X to obtain the patch.h.j$ ubeubahAj ubeubjo )rG }rH (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.jj h7h:hAjr hC}rI (hG]hH]hF]hE]hI]uhLMhMhhN]rJ (ju )rK }rL (h-X MercurialrM h.jG h7h:hAjy hC}rN (hG]hH]hF]hE]hI]uhLMhN]rO h^X MercurialrP rQ }rR (h-jM h.jK ubaubj )rS }rT (h-UhC}rU (hG]hH]hF]hE]hI]uh.jG hN]rV hb)rW }rX (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.jS h7h:hAhehC}rY (hG]hH]hF]hE]hI]uhLMhN]rZ (h)r[ }r\ (h-X$``hg parents --template '{node}\n'``hC}r] (hG]hH]hF]hE]hI]uh.jW hN]r^ h^X hg parents --template '{node}\n'r_ r` }ra (h-Uh.j[ 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. rb rc }rd (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.jW ubh)re }rf (h-X ``hg diff``hC}rg (hG]hH]hF]hE]hI]uh.jW hN]rh h^Xhg diffri rj }rk (h-Uh.je ubahAhubh^X8 then provides the patch relative to that revision. For rl rm }rn (h-X8 then provides the patch relative to that revision. For h.jW ubhk)ro }rp (h-X:command:`try`hC}rq (hG]hH]rr hpahF]hE]hI]uh.jW hN]rs h^Xtryrt ru }rv (h-Uh.jo ubahAhuubh^X to work, your working directory must only have patches that are available from the same remotely-available repository that the build process' rw rx }ry (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.jW ubh)rz }r{ (h-X``source.Mercurial``hC}r| (hG]hH]hF]hE]hI]uh.jW hN]r} h^Xsource.Mercurialr~ r }r (h-Uh.jz ubahAhubh^X will use.r r }r (h-X will use.h.jW ubeubahAj ubeubjo )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.jj h7h:hAjr hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (ju )r }r (h-XPerforcer h.j h7h:hAjy 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 ubeubjo )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.jj h7h:hAjr hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (ju )r }r (h-XDarcsr h.j h7h:hAjy 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 ubeubjo )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.jj h7h:hAjr hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (ju )r }r (h-XGitr h.j h7h:hAjy hC}r (hG]hH]hF]hE]hI]uhLMhN]r h^XGitr 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``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: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.j' hN]r. h^X git branch -vr/ r0 }r1 (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 r2 r3 }r4 (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.j' ubh)r5 }r6 (h-X``* ``hC}r7 (hG]hH]hF]hE]hI]uh.j' hN]r8 h^X* r9 r: }r; (h-Uh.j5 ubahAhubh^X2 (star and space) while all the others start with r< r= }r> (h-X2 (star and space) while all the others start with h.j' ubh)r? }r@ (h-X``  ``hC}rA (hG]hH]hF]hE]hI]uh.j' hN]rB h^X  rC rD }rE (h-Uh.j? ubahAhubh^X (two spaces). rF rG }rH (h-X (two spaces). h.j' ubhk)rI }rJ (h-X:command:`try`hC}rK (hG]hH]rL hpahF]hE]hI]uh.j' hN]rM h^XtryrN rO }rP (h-Uh.jI ubahAhuubh^X{ scans for this line and extracts the branch name and revision from it. Then it generates a diff against the base revision.rQ rR }rS (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.j' ubeubahAj ubeubeubje )rT }rU (h-XEThe spaces in the previous 2 literals are non-breakable spaces  h.jR h7h:hAjh hC}rV (hhhE]hF]hG]hH]hI]uhLMhMhhN]rW h^XEThe spaces in the previous 2 literals are non-breakable spaces  rX rY }rZ (h-Uh.jT ubaubh>)r[ }r\ (h-Uh.jR h7h:hAhBhC}r] (hE]hF]hG]hH]hI]hJUindex-0r^ uhLNhMhhN]ubcsphinx.ext.todo todo_node r_ )r` }ra (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.rb h.jR h7h:h<}hAU todo_noderc hC}rd (hG]hH]re Uadmonition-todorf ahF]hE]rg j^ ahI]uhLMhMhhT}rh j^ j[ shN]ri (hW)rj }rk (h-XTodorl hC}rm (hG]hH]hF]hE]hI]uh.j` hN]rn h^XTodoro rp }rq (h-jl h.jj ubahAh[ubhb)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.j` h7h:hAhehC}ru (hG]hH]hF]hE]hI]uhLMhN]rv 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.rw rx }ry (h-jt h.jr ubaubeubji )rz }r{ (h-Uh.jR h7h:hAjl hC}r| (hG]hH]hF]hE]hI]uhLNhMhhN]r} jo )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.jz h7h:hAjr hC}r (hG]hH]hF]hE]hI]uhLMhN]r (ju )r }r (h-XMonotoner h.j~ h7h:hAjy 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]r h^Xdevr r }r (h-Uh.j ubahAhubh^XJ to the Reason field on the try build's status web page. You can also set r r }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 r r }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 r r }r (h-X file. Note that h.j ubjx)r }r(h-X:option:`--who=dev`rh.j h7h:hAj|hC}r(UreftypeXoptionj~jX --who=devU 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 --who=devrr}r(h-Uh.jubahAjubaubh^X3 will not work on version 0.8.3 or earlier masters.rr}r(h-X3 will not work on version 0.8.3 or earlier masters.h.j ubeubhb)r}r (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}r!(hG]hH]hF]hE]hI]uhLMhMhhN]r"(h^X Similarly, r#r$}r%(h-X Similarly, h.jubjx)r&}r'(h-X:option:`--comment=COMMENT`r(h.jh7h: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]r/(jj*X std-optionr0ehF]hE]hI]uh.j&hN]r1h^X--comment=COMMENTr2r3}r4(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 r5r6}r7(h-X will specify the comment for the patch, which is also displayed in the patch information. The corresponding config-file option is h.jubh)r8}r9(h-X``try_comment``hC}r:(hG]hH]hF]hE]hI]uh.jhN]r;h^X try_commentr<r=}r>(h-Uh.j8ubahAhubh^X.r?}r@(h-X.h.jubeubeubh/)rA}rB(h-Uh.jh7h:hAhOhC}rC(hG]hH]hF]hE]rDUwaiting-for-resultsrEahI]rFhauhLMhMhhN]rG(hW)rH}rI(h-XWaiting for resultsrJh.jAh7h:hAh[hC}rK(hG]hH]hF]hE]hI]uhLMhMhhN]rLh^XWaiting for resultsrMrN}rO(h-jJh.jHubaubhb)rP}rQ(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.jAh7h:hAhehC}rR(hG]hH]hF]hE]hI]uhLMhMhhN]rS(h^XIf you provide the rTrU}rV(h-XIf you provide the h.jPubjx)rW}rX(h-X:option:`--wait`rYh.jPh7h:hAj|hC}rZ(UreftypeXoptionj~jX--waitU refdomainXstdr[j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r\j )r]}r^(h-jYhC}r_(hG]hH]r`(jj[X std-optionraehF]hE]hI]uh.jWhN]rbh^X--waitrcrd}re(h-Uh.j]ubahAjubaubh^X option (or rfrg}rh(h-X option (or h.jPubh)ri}rj(h-X``try_wait = True``hC}rk(hG]hH]hF]hE]hI]uh.jPhN]rlh^Xtry_wait = Truermrn}ro(h-Uh.jiubahAhubh^X in rprq}rr(h-X in h.jPubh)rs}rt(h-UhC}ru(hE]hF]hG]hH]rvXfilerwaUrolejwhI]uh.jPhN]rxh^X.buildbot/optionsryrz}r{(h-X.buildbot/optionsh.jsubahAhubh^X), the r|r}}r~(h-X), the h.jPubh)r}r(h-X``buildbot try``hC}r(hG]hH]hF]hE]hI]uh.jPhN]rh^X buildbot tryrr}r(h-Uh.jubahAhubh^Xm command will wait until your changes have either been proven good or bad before exiting. Unless you use the rr}r(h-Xm command will wait until your changes have either been proven good or bad before exiting. Unless you use the h.jPubjx)r}r(h-X:option:`--quiet`rh.jPh7h:hAj|hC}r(UreftypeXoptionj~jX--quietU 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--quietrr}r(h-Uh.jubahAjubaubh^X option (or rr}r(h-X option (or h.jPubh)r}r(h-X``try_quiet=True``hC}r(hG]hH]hF]hE]hI]uh.jPhN]rh^Xtry_quiet=Truerr}r(h-Uh.jubahAhubh^XT), it will emit a progress message every 60 seconds until the builds have completed.rr}r(h-XT), it will emit a progress message every 60 seconds until the builds have completed.h.jPubeubeubh/)r}r(h-Uh.jh7h:hAhOhC}r(hG]hH]hF]hE]rUsending-propertiesrahI]rhauhLMhMhhN]r(hW)r}r(h-XSending propertiesrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^XSending propertiesrr}r(h-jh.jubaubhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XAYou can set properties to send with your change using either the rr}r(h-XAYou can set properties to send with your change using either the h.jubjx)r}r(h-X:option:`--property=key=value`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--property=key=valueU 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--property=key=valuerr}r(h-Uh.jubahAjubaubh^X. option, which sets a single property, or the rr}r(h-X. option, which sets a single property, or the h.jubjx)r}r(h-X1:option:`--properties=key1=value1,key2=value2...`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX'--properties=key1=value1,key2=value2...U 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'--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.jubjx)r}r(h-X:option:`--properties`rh.jh7h: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.jubjx)r}r(h-X:option:`--property`rh.jh7h: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.jubeubh>)r}r(h-X.. _try--diff:h.jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJUtry-diffruhLMhMhhN]ubeubeubh/)r}r(h-Uh.j;h7h:h<}r h jshAhOhC}r (hG]hH]hF]hE]r (jUid2r ehI]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 r$r%}r&(h-XeOne approach would be to check out a new local tree, apply the patch, run your local tests, then use h.j ubh)r'}r((h-X``buildbot try``hC}r)(hG]hH]hF]hE]hI]uh.j hN]r*h^X buildbot tryr+r,}r-(h-Uh.j'ubahAhubh^XJ to run the tests on other platforms. An alternate approach is to use the r.r/}r0(h-XJ to run the tests on other platforms. An alternate approach is to use the h.j ubh)r1}r2(h-X``buildbot try --diff``hC}r3(hG]hH]hF]hE]hI]uh.j hN]r4h^Xbuildbot try --diffr5r6}r7(h-Uh.j1ubahAhubh^XE form to have the buildbot test the patch without using a local tree.r8r9}r:(h-XE form to have the buildbot test the patch without using a local tree.h.j ubeubhb)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 r?r@}rA(h-XThis form takes a h.j;ubjx)rB}rC(h-X:option:`--diff`rDh.j;h7h:hAj|hC}rE(UreftypeXoptionj~jX--diffU refdomainXstdrFj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rGj )rH}rI(h-jDhC}rJ(hG]hH]rK(jjFX std-optionrLehF]hE]hI]uh.jBhN]rMh^X--diffrNrO}rP(h-Uh.jHubahAjubaubh^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 rQrR}rS(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.j;ubjx)rT}rU(h-X:option:`--baserev`rVh.j;h7h:hAj|hC}rW(UreftypeXoptionj~jX --baserevU refdomainXstdrXj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rYj )rZ}r[(h-jVhC}r\(hG]hH]r](jjXX std-optionr^ehF]hE]hI]uh.jThN]r_h^X --baserevr`ra}rb(h-Uh.jZubahAjubaubh^XZ argument, a tree of the given revision will be used as a starting point instead of TRUNK.rcrd}re(h-XZ argument, a tree of the given revision will be used as a starting point instead of TRUNK.h.j;ubeubhb)rf}rg(h-XPYou can also use ``buildbot try --diff=-`` to read the patch from :file:`stdin`.h.jh7h:hAhehC}rh(hG]hH]hF]hE]hI]uhLMhMhhN]ri(h^XYou can also use rjrk}rl(h-XYou can also use h.jfubh)rm}rn(h-X``buildbot try --diff=-``hC}ro(hG]hH]hF]hE]hI]uh.jfhN]rph^Xbuildbot try --diff=-rqrr}rs(h-Uh.jmubahAhubh^X to read the patch from rtru}rv(h-X to read the patch from h.jfubh)rw}rx(h-UhC}ry(hE]hF]hG]hH]rzXfiler{aUrolej{hI]uh.jfhN]r|h^Xstdinr}r~}r(h-Xstdinh.jwubahAhubh^X.r}r(h-X.h.jfubeubhb)r}r(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}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^XEach patch has a rr}r(h-XEach patch has a h.jubh)r}r(h-X``patchlevel``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X patchlevelrr}r(h-Uh.jubahAhubh^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 rr}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.jubjx)r}r(h-X :option:`-p`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX-pU 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-prr}r(h-Uh.jubahAjubaubh^X or rr}r(h-X or h.jubjx)r}r(h-X:option:`--strip`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX--stripU 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--striprr}r(h-Uh.jubahAjubaubh^X argument to the rr}r(h-X argument to the h.jubhk)r}r(h-X:command:`patch`hC}r(hG]hH]rhpahF]hE]hI]uh.jhN]rh^Xpatchrr}r(h-Uh.jubahAhuubh^X utility. By default rr}r(h-X utility. By default 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^X< uses a patchlevel of 0, but you can override this with the rr}r(h-X< uses a patchlevel of 0, but you can override this with the h.jubjx)r}r(h-X :option:`-p`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX-pU 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-prr}r(h-Uh.jubahAjubaubh^X argument.rr}r(h-X argument.h.jubeubhb)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`r h.jh7h:hAj|hC}r (UreftypeXoptionj~jX --try-topfileU 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.j hN]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]r j )r!}r"(h-jhC}r#(hG]hH]r$(jjX std-optionr%ehF]hE]hI]uh.jhN]r&h^X --try-topdirr'r(}r)(h-Uh.j!ubahAjubaubh^Xf. These options will be ignored. Of course you must still specify how to get to the buildmaster (with r*r+}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`r/h.jh7h:hAj|hC}r0(UreftypeXoptionj~jX --connectU refdomainXstdr1j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r2j )r3}r4(h-j/hC}r5(hG]hH]r6(jj1X std-optionr7ehF]hE]hI]uh.j-hN]r8h^X --connectr9r:}r;(h-Uh.j3ubahAjubaubh^X, r<r=}r>(h-X, h.jubjx)r?}r@(h-X:option:`--tryhost`rAh.jh7h:hAj|hC}rB(UreftypeXoptionj~jX --tryhostU 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^X --tryhostrKrL}rM(h-Uh.jEubahAjubaubh^X, etc).rNrO}rP(h-X, etc).h.jubeubeubeubh/)rQ}rR(h-Uh.jh7h:hAhOhC}rS(hG]hH]hF]hE]rTU other-toolsrUahI]rVhauhLMhMhhN]rW(hW)rX}rY(h-X Other ToolsrZh.jQh7h:hAh[hC}r[(hG]hH]hF]hE]hI]uhLMhMhhN]r\h^X Other Toolsr]r^}r_(h-jZh.jXubaubhb)r`}ra(h-X=These tools are generally used by buildmaster administrators.rbh.jQh7h:hAhehC}rc(hG]hH]hF]hE]hI]uhLMhMhhN]rdh^X=These tools are generally used by buildmaster administrators.rerf}rg(h-jbh.j`ubaubj)rh}ri(h-Uh.jQh7h:hAjhC}rj(hE]hF]hG]hH]hI]Uentries]rk((UsingleX$Command Line Subcommands; sendchangeXcmdline-sendchangerljltrm(UsingleX"sendchange Command Line SubcommandjljltrneuhLMhMhhN]ubh>)ro}rp(h-Uh.jQh7h:hAhBhC}rq(hE]hF]hG]hH]hI]hJjluhLMhMhhN]ubh/)rr}rs(h-Uh.jQh7h:h<}hAhOhC}rt(hG]hH]hF]hE]ru(U sendchangervjlehI]rwhauhLMhMhhT}rxjljoshN]ry(hW)rz}r{(h-X sendchanger|h.jrh7h:hAh[hC}r}(hG]hH]hF]hE]hI]uhLMhMhhN]r~h^X sendchangerr}r(h-j|h.jzubaubhb)r}r(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.jrh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(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 rr}r(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.jubjx)r}r(h-X:class:`PBChangeSource`rh.jh7h:hAj|hC}r(UreftypeXclassj~jXPBChangeSourceU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^XPBChangeSourcerr}r(h-Uh.jubahAhubaubh^X (rr}r(h-X (h.jubjx)r}r(h-X:bb:chsrc:`PBChangeSource`rh.jh7h:hAj|hC}r(UreftypeXchsrcj~jXPBChangeSourceU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rh)r}r(h-jhC}r(hG]hH]r(jjXbb-chsrcrehF]hE]hI]uh.jhN]rh^XPBChangeSourcerr}r(h-Uh.jubahAhubaubh^X.) running in the buildmaster (by being set in rr}r(h-X.) running in the buildmaster (by being set in h.jubh)r}r(h-X``c['change_source']``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xc['change_source']rr}r(h-Uh.jubahAhubh^X).rr}r(h-X).h.jubeubh)r}r(h-Xhbuildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS} --who {USER} {FILENAMES..}h.jrh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rh^Xhbuildbot sendchange --master {MASTERHOST}:{PORT} --auth {USER}:{PASS} --who {USER} {FILENAMES..}rr}r(h-Uh.jubaubhb)r}r(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.jrh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM"hMhhN]r(h^XThe rr}r(h-XThe h.jubjx)r}r(h-X:option:`auth`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXauthU 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^Xauthrr}r(h-Uh.jubahAjubaubh^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.jubh)r}r(h-X ``user:pass``hC}r(hG]hH]hF]hE]hI]uh.jhN]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.jubeubhb)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.jrh7h: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 r r }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.j hN]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]r!h^XChanger"r#}r$(h-Uh.jubahAhubh^X that gets submitted:r%r&}r'(h-X that gets submitted:h.jubeubh)r(}r)(h-Uh.jrh7h:hAhhC}r*(hG]hH]hF]hE]hI]uhLNhMhhN]r+(h)r,}r-(h-Uh.j(h7h: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--branchr6hC}r7(hG]hH]hF]hE]hI]uh.j0hN]r8h)r9}r:(h-j6hC}r;(hG]hH]hF]hE]hI]uh.j4hN]r<h^X--branchr=r>}r?(h-Uh.j9ubahAhubahAhubahAhubh)r@}rA(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}rB(hG]hH]hF]hE]hI]uh.j,hN]rChb)rD}rE(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.j@h7h:hAhehC}rF(hG]hH]hF]hE]hI]uhLM-hN]rG(h^X (or option rHrI}rJ(h-X (or option h.jDubh)rK}rL(h-X ``branch``hC}rM(hG]hH]hF]hE]hI]uh.jDhN]rNh^XbranchrOrP}rQ(h-Uh.jKubahAhubh^XJ) This provides the (string) branch specifier. If omitted, it defaults to rRrS}rT(h-XJ) This provides the (string) branch specifier. If omitted, it defaults to h.jDubh)rU}rV(h-X``None``hC}rW(hG]hH]hF]hE]hI]uh.jDhN]rXh^XNonerYrZ}r[(h-Uh.jUubahAhubh^X, indicating the r\r]}r^(h-X, indicating the h.jDubh)r_}r`(h-X``default branch``hC}ra(hG]hH]hF]hE]hI]uh.jDhN]rbh^Xdefault branchrcrd}re(h-Uh.j_ubahAhubh^X?. All files included in this Change must be on the same branch.rfrg}rh(h-X?. All files included in this Change must be on the same branch.h.jDubeubahAhubeubh)ri}rj(h-Uh.j(h7h:hAhhC}rk(hG]hH]hF]hE]hI]uhLNhMhhN]rl(h)rm}rn(h-UhC}ro(hG]hH]hF]hE]hI]uh.jihN]rph)rq}rr(h-X --categoryrshC}rt(hG]hH]hF]hE]hI]uh.jmhN]ruh)rv}rw(h-jshC}rx(hG]hH]hF]hE]hI]uh.jqhN]ryh^X --categoryrzr{}r|(h-Uh.jvubahAhubahAhubahAhubh)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.jihN]rhb)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.h.j}h7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM2hN]r(h^X (or option rr}r(h-X (or option h.jubh)r}r(h-X ``category``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xcategoryrr}r(h-Uh.jubahAhubh^XL) This provides the (string) category specifier. If omitted, it defaults to rr}r(h-XL) This provides the (string) category 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 rr}r(h-X , indicating h.jubh)r}r(h-X``no category``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X no categoryrr}r(h-Uh.jubahAhubh^X'. The category property can be used by rr}r(h-X'. The category property can be used by h.jubjx)r}r(h-X:class:`Scheduler`rh.jh7h:hAj|hC}r(UreftypeXclassj~jX SchedulerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM2hN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^X Schedulerrr}r(h-Uh.jubahAhubaubh^X(s to filter what changes they listen to.rr}r(h-X)\s to filter what changes they listen to.h.jubeubahAhubeubh)r}r(h-Uh.j(h7h: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 --projectrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --projectrr}r(h-Uh.jubahAhubahAhubahAhubh)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. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM7hN]r(h^X (or option rr}r(h-X (or option h.jubh)r}r(h-X ``project``hC}r(hG]hH]hF]hE]hI]uh.jhN]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.jubeubahAhubeubh)r}r(h-Uh.j(h7h: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]uhLM<hN]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]r h^X''rr}r(h-Uh.j ubahAhubh^X.r}r(h-X.h.jubeubahAhubeubh)r}r(h-Uh.j(h7h: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]r#h^X --revisionr$r%}r&(h-Uh.j ubahAhubahAhubahAhubh)r'}r((h-XIThis provides a revision specifier, appropriate to the VC system in use. hC}r)(hG]hH]hF]hE]hI]uh.jhN]r*hb)r+}r,(h-XHThis provides a revision specifier, appropriate to the VC system in use.r-h.j'h7h:hAhehC}r.(hG]hH]hF]hE]hI]uhLM@hN]r/h^XHThis provides a revision specifier, appropriate to the VC system in use.r0r1}r2(h-j-h.j+ubaubahAhubeubh)r3}r4(h-Uh.j(h7h:hAhhC}r5(hG]hH]hF]hE]hI]uhLNhMhhN]r6(h)r7}r8(h-UhC}r9(hG]hH]hF]hE]hI]uh.j3hN]r:h)r;}r<(h-X--revision_filer=hC}r>(hG]hH]hF]hE]hI]uh.j7hN]r?h)r@}rA(h-j=hC}rB(hG]hH]hF]hE]hI]uh.j;hN]rCh^X--revision_filerDrE}rF(h-Uh.j@ubahAhubahAhubahAhubh)rG}rH(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}rI(hG]hH]hF]hE]hI]uh.j3hN]rJhb)rK}rL(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.jGh7h:hAhehC}rM(hG]hH]hF]hE]hI]uhLMChN]rN(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 rOrP}rQ(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.jKubh)rR}rS(h-X``darcs changes --context``hC}rT(hG]hH]hF]hE]hI]uh.jKhN]rUh^Xdarcs changes --contextrVrW}rX(h-Uh.jRubahAhubh^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.rYrZ}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.jKubeubahAhubeubh)r\}r](h-Uh.j(h7h:hAhhC}r^(hG]hH]hF]hE]hI]uhLNhMhhN]r_(h)r`}ra(h-UhC}rb(hG]hH]hF]hE]hI]uh.j\hN]rch)rd}re(h-X --propertyrfhC}rg(hG]hH]hF]hE]hI]uh.j`hN]rhh)ri}rj(h-jfhC}rk(hG]hH]hF]hE]hI]uh.jdhN]rlh^X --propertyrmrn}ro(h-Uh.jiubahAhubahAhubahAhubh)rp}rq(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}rr(hG]hH]hF]hE]hI]uh.j\hN]rshb)rt}ru(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.jph7h:hAhehC}rv(hG]hH]hF]hE]hI]uhLMKhN]rw(h^X0This parameter is used to set a property on the rxry}rz(h-X0This parameter is used to set a property on the h.jtubjx)r{}r|(h-X:class:`Change`r}h.jth7h:hAj|hC}r~(UreftypeXclassj~jXChangeU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMKhN]rh)r}r(h-j}hC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.j{hN]rh^XChangerr}r(h-Uh.jubahAhubaubh^X generated by rr}r(h-X generated by h.jtubh)r}r(h-X``sendchange``hC}r(hG]hH]hF]hE]hI]uh.jthN]rh^X sendchangerr}r(h-Uh.jubahAhubh^X . Properties are specified as a rr}r(h-X . Properties are specified as a h.jtubh)r}r(h-UhC}r(hE]hF]hG]hH]rXsampraUrolejhI]uh.jthN]r(j)r}r(h-XnamehC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xnamerr}r(h-Uh.jubahAjubh^X:r}r(h-X:h.jubj)r}r(h-XvaluehC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xvaluerr}r(h-Uh.jubahAjubehAhubh^Xf pair, separated by a colon. You may specify many properties by passing this parameter multiple times.rr}r(h-Xf pair, separated by a colon. You may specify many properties by passing this parameter multiple times.h.jtubeubahAhubeubh)r}r(h-Uh.j(h7h: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 --commentsrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X --commentsrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(h-XiThis provides the change comments as a single argument. You may want to use :option:`--logfile` instead. hC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XhThis provides the change comments as a single argument. You may want to use :option:`--logfile` instead.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMPhN]r(h^XLThis provides the change comments as a single argument. You may want to use rr}r(h-XLThis provides the change comments as a single argument. You may want to use h.jubjx)r}r(h-X:option:`--logfile`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --logfileU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMPhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --logfilerr}r(h-Uh.jubahAjubaubh^X instead.rr}r(h-X instead.h.jubeubahAhubeubh)r}r(h-Uh.j(h7h: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]uhLMThN]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.j(h7h: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 --encodingrhC}r(hG]hH]hF]hE]hI]uh.j hN]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.j hN]r hb)r!}r"(h-XTSpecifies the character encoding for all other parameters, defaulting to ``'utf8'``.h.jh7h:hAhehC}r#(hG]hH]hF]hE]hI]uhLMYhN]r$(h^XISpecifies the character encoding for all other parameters, defaulting to r%r&}r'(h-XISpecifies the character encoding for all other parameters, defaulting to h.j!ubh)r(}r)(h-X ``'utf8'``hC}r*(hG]hH]hF]hE]hI]uh.j!hN]r+h^X'utf8'r,r-}r.(h-Uh.j(ubahAhubh^X.r/}r0(h-X.h.j!ubeubahAhubeubh)r1}r2(h-Uh.j(h7h:hAhhC}r3(hG]hH]hF]hE]hI]uhLNhMhhN]r4(h)r5}r6(h-UhC}r7(hG]hH]hF]hE]hI]uh.j1hN]r8h)r9}r:(h-X--vcr;hC}r<(hG]hH]hF]hE]hI]uh.j5hN]r=h)r>}r?(h-j;hC}r@(hG]hH]hF]hE]hI]uh.j9hN]rAh^X--vcrBrC}rD(h-Uh.j>ubahAhubahAhubahAhubh)rE}rF(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}rG(hG]hH]hF]hE]hI]uh.j1hN]rHhb)rI}rJ(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.jEh7h:hAhehC}rK(hG]hH]hF]hE]hI]uhLM]hN]rL(h^X=Specifies which VC system the Change is coming from, one of: rMrN}rO(h-X=Specifies which VC system the Change is coming from, one of: h.jIubh)rP}rQ(h-X``cvs``hC}rR(hG]hH]hF]hE]hI]uh.jIhN]rSh^XcvsrTrU}rV(h-Uh.jPubahAhubh^X, rWrX}rY(h-X, h.jIubh)rZ}r[(h-X``svn``hC}r\(hG]hH]hF]hE]hI]uh.jIhN]r]h^Xsvnr^r_}r`(h-Uh.jZubahAhubh^X, rarb}rc(h-X, h.jIubh)rd}re(h-X ``darcs``hC}rf(hG]hH]hF]hE]hI]uh.jIhN]rgh^Xdarcsrhri}rj(h-Uh.jdubahAhubh^X, rkrl}rm(h-X, h.jIubh)rn}ro(h-X``hg``hC}rp(hG]hH]hF]hE]hI]uh.jIhN]rqh^Xhgrrrs}rt(h-Uh.jnubahAhubh^X, rurv}rw(h-X, h.jIubh)rx}ry(h-X``bzr``hC}rz(hG]hH]hF]hE]hI]uh.jIhN]r{h^Xbzrr|r}}r~(h-Uh.jxubahAhubh^X, rr}r(h-X, h.jIubh)r}r(h-X``git``hC}r(hG]hH]hF]hE]hI]uh.jIhN]rh^Xgitrr}r(h-Uh.jubahAhubh^X, rr}r(h-X, h.jIubh)r}r(h-X``mtn``hC}r(hG]hH]hF]hE]hI]uh.jIhN]rh^Xmtnrr}r(h-Uh.jubahAhubh^X, or rr}r(h-X, or h.jIubh)r}r(h-X``p4``hC}r(hG]hH]hF]hE]hI]uh.jIhN]rh^Xp4rr}r(h-Uh.jubahAhubh^X. Defaults to rr}r(h-X. Defaults to h.jIubh)r}r(h-X``None``hC}r(hG]hH]hF]hE]hI]uh.jIhN]rh^XNonerr}r(h-Uh.jubahAhubh^X.r}r(h-X.h.jIubeubahAhubeubeubj)r}r(h-Uh.jrh7h:hAjhC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleX%Command Line Subcommands; debugclientXcmdline-debugclientrjtr(UsingleX#debugclient Command Line SubcommandjjtreuhLMbhMhhN]ubh>)r}r(h-Uh.jrh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLMbhMhhN]ubeubh/)r}r(h-Uh.jQh7h:h<}hAhOhC}r(hG]hH]hF]hE]r(U debugclientrjehI]rhauhLMdhMhhT}rjjshN]r(hW)r}r(h-X debugclientrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLMdhMhhN]rh^X debugclientrr}r(h-jh.jubaubh)r}r(h-XDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}h.jh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMfhMhhN]rh^XDbuildbot debugclient --master {MASTERHOST}:{PORT} --passwd {DEBUGPW}rr}r(h-Uh.jubaubhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMjhMhhN]r(h^XSThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's rr}r(h-XSThis launches a small Gtk+/Glade-based debug tool, connecting to the buildmaster's h.jubh)r}r(h-X``debug port``hC}r(hG]hH]hF]hE]hI]uh.jhN]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.jubjx)r}r(h-X%:ref:`Setting-the-PB-Port-for-Slaves`rh.jh7h:hAj|hC}r(UreftypeXrefj~jXsetting-the-pb-port-for-slavesU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMjhN]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.jubh)r}r(h-X ``debugPort``hC}r(hG]hH]hF]hE]hI]uh.jhN]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.jubjx)r}r(h-X:ref:`Debug-Options`rh.jh7h:hAj|hC}r(UreftypeXrefj~jX debug-optionsU refdomainXstdrhE]hF]U refexplicithG]hH]hI]jjuhLMjhN]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.jubjx)r }r (h-X:option:`--passwd`r h.jh7h:hAj|hC}r (UreftypeXoptionj~jX--passwdU refdomainXstdr j NhE]hF]U refexplicithG]hH]hI]jjuhLMjhN]rj )r}r(h-j hC}r(hG]hH]r(jj X std-optionrehF]hE]hI]uh.j hN]rh^X--passwdrr}r(h-Uh.jubahAjubaubh^X option must match the rr}r(h-X option must match the h.jubh)r}r(h-X``c['debugPassword']``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xc['debugPassword']rr }r!(h-Uh.jubahAhubh^X value.r"r#}r$(h-X value.h.jubeubhb)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.jh7h:hAhehC}r'(hG]hH]hF]hE]hI]uhLMrhMhhN]r((jx)r)}r*(h-X:option:`--master`r+h.j%h7h:hAj|hC}r,(UreftypeXoptionj~jX--masterU refdomainXstdr-j NhE]hF]U refexplicithG]hH]hI]jjuhLMrhN]r.j )r/}r0(h-j+hC}r1(hG]hH]r2(jj-X std-optionr3ehF]hE]hI]uh.j)hN]r4h^X--masterr5r6}r7(h-Uh.j/ubahAjubaubh^X can also be provided in r8r9}r:(h-X can also be provided in h.j%ubh)r;}r<(h-UhC}r=(hE]hF]hG]hH]r>Xfiler?aUrolej?hI]uh.j%hN]r@h^X.debug/optionsrArB}rC(h-X.debug/optionsh.j;ubahAhubh^X by the rDrE}rF(h-X by the h.j%ubh)rG}rH(h-X ``master``hC}rI(hG]hH]hF]hE]hI]uh.j%hN]rJh^XmasterrKrL}rM(h-Uh.jGubahAhubh^X key. rNrO}rP(h-X key. h.j%ubjx)rQ}rR(h-X:option:`--passwd`rSh.j%h7h:hAj|hC}rT(UreftypeXoptionj~jX--passwdU refdomainXstdrUj NhE]hF]U refexplicithG]hH]hI]jjuhLMrhN]rVj )rW}rX(h-jShC}rY(hG]hH]rZ(jjUX std-optionr[ehF]hE]hI]uh.jQhN]r\h^X--passwdr]r^}r_(h-Uh.jWubahAjubaubh^X can be provided by the r`ra}rb(h-X can be provided by the h.j%ubh)rc}rd(h-X``debugPassword``hC}re(hG]hH]hF]hE]hI]uh.j%hN]rfh^X debugPasswordrgrh}ri(h-Uh.jcubahAhubh^X key. See rjrk}rl(h-X key. See h.j%ubjx)rm}rn(h-X :ref:`buildbot-config-directory`roh.j%h7h:hAj|hC}rp(UreftypeXrefj~jXbuildbot-config-directoryU refdomainXstdrqhE]hF]U refexplicithG]hH]hI]jjuhLMrhN]rrj)rs}rt(h-johC}ru(hG]hH]rv(jjqXstd-refrwehF]hE]hI]uh.jmhN]rxh^Xbuildbot-config-directoryryrz}r{(h-Uh.jsubahAjubaubh^X.r|}r}(h-X.h.j%ubeubhb)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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMvhMhhN]r(h^XThe rr}r(h-XThe h.j~ubj)r}r(h-UhC}r(UrawtextX:guilabel:`Connect`hE]hF]hG]hH]rXguilabelrahI]uh.j~hN]rh^XConnectrr}r(h-Uh.jubahAjubh^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:rr}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~ubeubji )r}r(h-Uh.jh7h:hAjl hC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(jo )r}r(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.jh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMhN]r(ju )r}r(h-X:guilabel:`Reload .cfg`rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h-UhC}r(UrawtextjhE]hF]hG]hH]rXguilabelrahI]uh.jhN]rh^X Reload .cfgrr}r(h-Uh.jubahAjubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLM{hN]r(h^X%Forces the buildmaster to reload its rr}r(h-X%Forces the buildmaster to reload its h.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X master.cfgrr}r(h-X master.cfgh.jubahAhubh^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 rr}r(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.jubh)r}r(h-UhC}r(hE]hF]hG]hH]rXfileraUrolejhI]uh.jhN]rh^X twistd.logrr}r(h-X twistd.logh.jubahAhubh^Xl as you reload the config file, as any errors which are detected in the config file will be announced there.rr}r(h-Xl as you reload the config file, as any errors which are detected in the config file will be announced there.h.jubeubahAj ubeubjo )r}r(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.jh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(ju )r}r(h-X:guilabel:`Rebuild .py`rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h-UhC}r(UrawtextjhE]hF]hG]hH]rXguilabelrahI]uh.jhN]rh^X Rebuild .pyrr}r(h-Uh.jubahAjubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]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]uhLMhN]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 ubeubjo )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.jh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(ju )r}r(h-X:guilabel:`poke IRC`rh.jh7h:hAjy 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 r r }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 ubeubjo )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.jh7h:hAjr hC}r"(hG]hH]hF]hE]hI]uhLMhMhhN]r#(ju )r$}r%(h-X:guilabel:`Commit`r&h.j h7h:hAjy hC}r'(hG]hH]hF]hE]hI]uhLMhN]r(j)r)}r*(h-UhC}r+(Urawtextj&hE]hF]hG]hH]r,Xguilabelr-ahI]uh.j$hN]r.h^XCommitr/r0}r1(h-Uh.j)ubahAjubaubj )r2}r3(h-UhC}r4(hG]hH]hF]hE]hI]uh.j hN]r5hb)r6}r7(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.j2h7h:hAhehC}r8(hG]hH]hF]hE]hI]uhLMhN]r9(h^XThis allows you to inject a r:r;}r<(h-XThis allows you to inject a h.j6ubjx)r=}r>(h-X:class:`Change`r?h.j6h7h:hAj|hC}r@(UreftypeXclassj~jXChangeU refdomainXpyrAhE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rBh)rC}rD(h-j?hC}rE(hG]hH]rF(jjAXpy-classrGehF]hE]hI]uh.j=hN]rHh^XChangerIrJ}rK(h-Uh.jCubahAhubaubh^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.rLrM}rN(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.j6ubeubahAj ubeubjo )rO}rP(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.jh7h:hAjr hC}rQ(hG]hH]hF]hE]hI]uhLMhMhhN]rR(ju )rS}rT(h-X:guilabel:`Force Build`rUh.jOh7h:hAjy hC}rV(hG]hH]hF]hE]hI]uhLMhN]rWj)rX}rY(h-UhC}rZ(UrawtextjUhE]hF]hG]hH]r[Xguilabelr\ahI]uh.jShN]r]h^X Force Buildr^r_}r`(h-Uh.jXubahAjubaubj )ra}rb(h-UhC}rc(hG]hH]hF]hE]hI]uh.jOhN]rdhb)re}rf(h-XfThis lets you force a :class:`Builder` (selected by name) to start a build of the current source tree.h.jah7h:hAhehC}rg(hG]hH]hF]hE]hI]uhLMhN]rh(h^XThis lets you force a rirj}rk(h-XThis lets you force a h.jeubjx)rl}rm(h-X:class:`Builder`rnh.jeh7h:hAj|hC}ro(UreftypeXclassj~jXBuilderU refdomainXpyrphE]hF]U refexplicithG]hH]hI]jjjNjNuhLMhN]rqh)rr}rs(h-jnhC}rt(hG]hH]ru(jjpXpy-classrvehF]hE]hI]uh.jlhN]rwh^XBuilderrxry}rz(h-Uh.jrubahAhubaubh^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.jeubeubahAj ubeubjo )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.jh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(ju )r}r(h-X:guilabel:`Currently`rh.j~h7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMhN]rj)r}r(h-UhC}r(UrawtextjhE]hF]hG]hH]rXguilabelrahI]uh.jhN]rh^X Currentlyrr}r(h-Uh.jubahAjubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.j~hN]rhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XB(obsolete). This was used to manually set the status of the given rr}r(h-XB(obsolete). This was used to manually set the status of the given 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-classrehF]hE]hI]uh.jhN]rh^XBuilderrr}r(h-Uh.jubahAhubaubh^Xo, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.rr}r(h-Xo, but the status-assignment code was changed in an incompatible way and these buttons are no longer meaningful.h.jubeubahAj ubeubeubj)r}r(h-Uh.jh7h:hAjhC}r(hE]hF]hG]hH]hI]Uentries]r((UsingleXCommand Line Subcommands; userX cmdline-userrjtr(UsingleXuser Command Line SubcommandjjtreuhLMhMhhN]ubh>)r}r(h-Uh.jh7h:hAhBhC}r(hE]hF]hG]hH]hI]hJjuhLMhMhhN]ubeubh/)r}r(h-Uh.jQh7h:h<}hAhOhC}r(hG]hH]hF]hE]r(UuserrjehI]rhauhLMhMhhT}rjjshN]r(hW)r}r(h-Xuserrh.jh7h:hAh[hC}r(hG]hH]hF]hE]hI]uhLMhMhhN]rh^Xuserrr}r(h-jh.jubaubhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^X@Note that in order to use this command, you need to configure a rr}r(h-X@Note that in order to use this command, you need to configure a h.jubcdocutils.nodes title_reference r)r}r(h-X`CommandlineUserManager`hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^XCommandlineUserManagerrr}r(h-Uh.jubahAUtitle_referencerubh^X instance in your rr}r(h-X instance in your h.jubj)r}r(h-X `master.cfg`hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X master.cfgrr}r(h-Uh.jubahAjubh^X file, which is explained in rr}r(h-X file, which is explained in h.jubjx)r}r(h-X:ref:`Users-Options`rh.jh7h: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.jubeubhb)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.jh7h: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.jh7h:hAhhC}r(hG]hH]hF]hE]hI]uhLNhMhhN]r(h)r}r(h-Uh.j h7h: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]r!h^X--masterr"r#}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]r(hb)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.j%h7h:hAhehC}r+(hG]hH]hF]hE]hI]uhLMhN]r,(h^XThe r-r.}r/(h-XThe h.j)ubhk)r0}r1(h-X:command:`user`hC}r2(hG]hH]r3hpahF]hE]hI]uh.j)hN]r4h^Xuserr5r6}r7(h-Uh.j0ubahAhuubh^X[ command can be run virtually anywhere provided a location of the running buildmaster. The r8r9}r:(h-X[ command can be run virtually anywhere provided a location of the running buildmaster. The h.j)ubjx)r;}r<(h-X:option:`master`r=h.j)h7h:hAj|hC}r>(UreftypeXoptionj~jXmasterU 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^XmasterrGrH}rI(h-Uh.jAubahAjubaubh^X argument is of the form rJrK}rL(h-X argument is of the form h.j)ubh)rM}rN(h-X``{MASTERHOST}:{PORT}``hC}rO(hG]hH]hF]hE]hI]uh.j)hN]rPh^X{MASTERHOST}:{PORT}rQrR}rS(h-Uh.jMubahAhubh^X.rT}rU(h-X.h.j)ubeubahAhubeubh)rV}rW(h-Uh.j h7h:hAhhC}rX(hG]hH]hF]hE]hI]uhLNhMhhN]rY(h)rZ}r[(h-UhC}r\(hG]hH]hF]hE]hI]uh.jVhN]r]h)r^}r_(h-X --usernamer`hC}ra(hG]hH]hF]hE]hI]uh.jZhN]rbh)rc}rd(h-j`hC}re(hG]hH]hF]hE]hI]uh.j^hN]rfh^X --usernamergrh}ri(h-Uh.jcubahAhubahAhubahAhubh)rj}rk(h-XZPB connection authentication that should match the arguments to `CommandlineUserManager`. hC}rl(hG]hH]hF]hE]hI]uh.jVhN]rmhb)rn}ro(h-XYPB connection authentication that should match the arguments to `CommandlineUserManager`.h.jjh7h:hAhehC}rp(hG]hH]hF]hE]hI]uhLMhN]rq(h^X@PB connection authentication that should match the arguments to rrrs}rt(h-X@PB connection authentication that should match the arguments to h.jnubj)ru}rv(h-X`CommandlineUserManager`hC}rw(hG]hH]hF]hE]hI]uh.jnhN]rxh^XCommandlineUserManagerryrz}r{(h-Uh.juubahAjubh^X.r|}r}(h-X.h.jnubeubahAhubeubh)r~}r(h-Uh.j h7h: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--passwdrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--passwdrr}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.j~hN]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 rr}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]rh^XCommandlineUserManagerrr}r(h-Uh.jubahAjubh^X.r}r(h-X.h.jubeubahAhubeubh)r}r(h-Uh.j h7h: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--oprhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--oprr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(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}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^X(There are four supported values for the rr}r(h-X(There are four supported values for the h.jubjx)r}r(h-X :option:`op`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jXopU 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^Xoprr}r(h-Uh.jubahAjubaubh^X argument: rr}r(h-X argument: 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, rr}r(h-X, 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, rr}r(h-X, 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, and r r }r (h-X, and h.jubjx)r }r(h-X :option:`get`rh.jh7h: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.j hN]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.jubeubahAhubeubh)r}r (h-Uh.j h7h: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 --bb_usernamer)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 --bb_usernamer0r1}r2(h-Uh.j,ubahAhubahAhubahAhubh)r3}r4(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}r5(hG]hH]hF]hE]hI]uh.jhN]r6hb)r7}r8(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.j3h7h:hAhehC}r9(hG]hH]hF]hE]hI]uhLMhN]r:(h^XUsed with the r;r<}r=(h-XUsed with the h.j7ubjx)r>}r?(h-X:option:`update`r@h.j7h7h:hAj|hC}rA(UreftypeXoptionj~jXupdateU 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^XupdaterJrK}rL(h-Uh.jDubahAjubaubh^X[ option, this sets the user's username for web authentication in the database. It requires rMrN}rO(h-X[ option, this sets the user's username for web authentication in the database. It requires h.j7ubjx)rP}rQ(h-X:option:`bb_password`rRh.j7h7h:hAj|hC}rS(UreftypeXoptionj~jX bb_passwordU 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^X bb_passwordr\r]}r^(h-Uh.jVubahAjubaubh^X to be set along with it.r_r`}ra(h-X to be set along with it.h.j7ubeubahAhubeubh)rb}rc(h-Uh.j h7h:hAhhC}rd(hG]hH]hF]hE]hI]uhLNhMhhN]re(h)rf}rg(h-UhC}rh(hG]hH]hF]hE]hI]uh.jbhN]rih)rj}rk(h-X --bb_passwordrlhC}rm(hG]hH]hF]hE]hI]uh.jfhN]rnh)ro}rp(h-jlhC}rq(hG]hH]hF]hE]hI]uh.jjhN]rrh^X --bb_passwordrsrt}ru(h-Uh.joubahAhubahAhubahAhubh)rv}rw(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}rx(hG]hH]hF]hE]hI]uh.jbhN]ryhb)rz}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.jvh7h:hAhehC}r|(hG]hH]hF]hE]hI]uhLMhN]r}(h^XAlso used with the r~r}r(h-XAlso used with the h.jzubjx)r}r(h-X:option:`update`rh.jzh7h: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 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(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.jzubeubahAhubeubh)r}r(h-Uh.j h7h: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--idsrhC}r(hG]hH]hF]hE]hI]uh.jhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X--idsrr}r(h-Uh.jubahAhubahAhubahAhubh)r}r(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}r(hG]hH]hF]hE]hI]uh.jhN]r(hb)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 :option:`ids` option lets you specify a comma separated list of these identifiers for use with the :command:`user` command.h.jh7h: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 rr}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.jubjx)r}r(h-X :option:`ids`rh.jh7h: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^XV option lets you specify a comma separated list of these identifiers for use with the rr}r(h-XV option lets you specify a comma separated list of these identifiers for use with 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-XTThe :option:`ids` option is used only when using :option:`remove` or :option:`show`.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XThe rr}r(h-XThe h.jubjx)r}r(h-X :option:`ids`rh.jh7h: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.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 or rr}r(h-X or h.jubjx)r}r(h-X:option:`show`rh.jh7h: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.jubeubehAhubeubh)r }r (h-Uh.j h7NhAhhC}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--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.j hN]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 r'r(}r)(h-XgUsers are known in buildbot as a collection of attributes tied together by some unique identifier (see h.j#ubjx)r*}r+(h-X:ref:`Concepts-Users`r,h.j#h7h:hAj|hC}r-(UreftypeXrefj~jXconcepts-usersU refdomainXstdr.hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r/j)r0}r1(h-j,hC}r2(hG]hH]r3(jj.Xstd-refr4ehF]hE]hI]uh.j*hN]r5h^XConcepts-Usersr6r7}r8(h-Uh.j0ubahAjubaubh^X.). These attributes are specified in the form r9r:}r;(h-X.). These attributes are specified in the form h.j#ubh)r<}r=(h-X``{TYPE}={VALUE}``hC}r>(hG]hH]hF]hE]hI]uh.j#hN]r?h^X{TYPE}={VALUE}r@rA}rB(h-Uh.j<ubahAhubh^X when using the rCrD}rE(h-X when using the h.j#ubjx)rF}rG(h-X:option:`info`rHh.j#h7h:hAj|hC}rI(UreftypeXoptionj~jXinfoU refdomainXstdrJj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rKj )rL}rM(h-jHhC}rN(hG]hH]rO(jjJX std-optionrPehF]hE]hI]uh.jFhN]rQh^XinforRrS}rT(h-Uh.jLubahAjubaubh^X option. These rUrV}rW(h-X option. These h.j#ubh)rX}rY(h-X``{TYPE}={VALUE}``hC}rZ(hG]hH]hF]hE]hI]uh.j#hN]r[h^X{TYPE}={VALUE}r\r]}r^(h-Uh.jXubahAhubh^X? pairs are specified in a comma separated list, so for example:r_r`}ra(h-X? pairs are specified in a comma separated list, so for example:h.j#ubeubh)rb}rc(h-X1--info=svn=jschmo,git='Joe Schmo 'h.jh7h:hAhhC}rd(hhXnonehhhE]hF]hG]hH]hI]uhLMhN]reh^X1--info=svn=jschmo,git='Joe Schmo 'rfrg}rh(h-Uh.jbubaubhb)ri}rj(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}rk(hG]hH]hF]hE]hI]uhLMhN]rl(h^XThe rmrn}ro(h-XThe h.jiubjx)rp}rq(h-X:option:`info`rrh.jih7h: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/ option can be specified multiple times in the rr}r(h-X/ option can be specified multiple times in the h.jiubhk)r}r(h-X:command:`user`hC}r(hG]hH]rhpahF]hE]hI]uh.jihN]rh^Xuserrr}r(h-Uh.jubahAhuubh^XP command, as each specified option will be interpreted as a new user. Note that rr}r(h-XP command, as each specified option will be interpreted as a new user. Note that h.jiubjx)r}r(h-X:option:`info`rh.jih7h: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 is only used with rr}r(h-X is only used with h.jiubjx)r}r(h-X :option:`add`rh.jih7h: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 or with rr}r(h-X or with h.jiubjx)r}r(h-X:option:`update`rh.jih7h: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, and whenever you use rr}r(h-X, and whenever you use h.jiubjx)r}r(h-X:option:`update`rh.jih7h: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^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.jiubjx)r}r(h-X:option:`info`rh.jih7h: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.jiubh)r}r(h-X ``{ID:}``hC}r(hG]hH]hF]hE]hI]uh.jihN]rh^X{ID:}rr}r(h-Uh.jubahAhubh^X. If we were to update rr}r(h-X. If we were to update h.jiubh)r}r(h-X ``'jschmo'``hC}r(hG]hH]hF]hE]hI]uh.jihN]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.jiubeubh)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.jh7h: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`r h.jh7h:hAj|hC}r (UreftypeXoptionj~jX--masterU 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.j hN]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]r j )r!}r"(h-jhC}r#(hG]hH]r$(jjX std-optionr%ehF]hE]hI]uh.jhN]r&h^X --usernamer'r(}r)(h-Uh.j!ubahAjubaubh^X, r*r+}r,(h-X, h.jubjx)r-}r.(h-X:option:`--passwd`r/h.jh7h:hAj|hC}r0(UreftypeXoptionj~jX--passwdU refdomainXstdr1j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r2j )r3}r4(h-j/hC}r5(hG]hH]r6(jj1X std-optionr7ehF]hE]hI]uh.j-hN]r8h^X--passwdr9r:}r;(h-Uh.j3ubahAjubaubh^X, and r<r=}r>(h-X, and h.jubjx)r?}r@(h-X:option:`--op`rAh.jh7h:hAj|hC}rB(UreftypeXoptionj~jX--opU 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^X--oprKrL}rM(h-Uh.jEubahAjubaubh^X" are always required to issue the rNrO}rP(h-X" are always required to issue the h.jubhk)rQ}rR(h-X:command:`user`hC}rS(hG]hH]rThpahF]hE]hI]uh.jhN]rUh^XuserrVrW}rX(h-Uh.jQubahAhuubh^X command.rYrZ}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.jh7h:hAhehC}r^(hG]hH]hF]hE]hI]uhLMhMhhN]r_(h^XThe r`ra}rb(h-XThe h.j\ubjx)rc}rd(h-X:option:`--master`reh.j\h7h:hAj|hC}rf(UreftypeXoptionj~jX--masterU refdomainXstdrgj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rhj )ri}rj(h-jehC}rk(hG]hH]rl(jjgX std-optionrmehF]hE]hI]uh.jchN]rnh^X--masterrorp}rq(h-Uh.jiubahAjubaubh^X, rrrs}rt(h-X, h.j\ubjx)ru}rv(h-X:option:`--username`rwh.j\h7h:hAj|hC}rx(UreftypeXoptionj~jX --usernameU refdomainXstdryj NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rzj )r{}r|(h-jwhC}r}(hG]hH]r~(jjyX std-optionrehF]hE]hI]uh.juhN]rh^X --usernamerr}r(h-Uh.j{ubahAjubaubh^X, and rr}r(h-X, and h.j\ubjx)r}r(h-X:option:`--passwd`rh.j\h7h: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; options can be specified in the option file with keywords rr}r(h-X; options can be specified in the option file with keywords 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.jhN]rh^X user_masterrr}r(h-Uh.jubahAjubaubh^X, rr}r(h-X, h.j\ubjx)r}r(h-X:option:`user_username`rh.j\h7h:hAj|hC}r(UreftypeXoptionj~jX user_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 user_usernamerr}r(h-Uh.jubahAjubaubh^X, and rr}r(h-X, and h.j\ubjx)r}r(h-X:option:`user_passwd`rh.j\h7h:hAj|hC}r(UreftypeXoptionj~jX user_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 user_passwdrr}r(h-Uh.jubahAjubaubh^X, respectively. If rr}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.jhN]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.jh7h: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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r (h^XFor r r }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.j hN]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.jh7h:hAhhC}r (hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]r!h^X~buildbot user --master={MASTERHOST} --op=add \ --username={USER} --passwd={USERPW} \ --info={TYPE}={VALUE},...r"r#}r$(h-Uh.jubaubhb)r%}r&(h-XFor :option:`update`:r'h.jh7h:hAhehC}r((hG]hH]hF]hE]hI]uhLMhMhhN]r)(h^XFor r*r+}r,(h-XFor h.j%ubjx)r-}r.(h-X:option:`update`r/h.j%h7h:hAj|hC}r0(UreftypeXoptionj~jXupdateU refdomainXstdr1j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]r2j )r3}r4(h-j/hC}r5(hG]hH]r6(jj1X std-optionr7ehF]hE]hI]uh.j-hN]r8h^Xupdater9r:}r;(h-Uh.j3ubahAjubaubh^X:r<}r=(h-X:h.j%ubeubh)r>}r?(h-Xbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...h.jh7h:hAhhC}r@(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rAh^Xbuildbot user --master={MASTERHOST} --op=update \ --username={USER} --passwd={USERPW} \ --info={ID}:{TYPE}={VALUE},...rBrC}rD(h-Uh.j>ubaubhb)rE}rF(h-XFor :option:`remove`:rGh.jh7h:hAhehC}rH(hG]hH]hF]hE]hI]uhLMhMhhN]rI(h^XFor rJrK}rL(h-XFor h.jEubjx)rM}rN(h-X:option:`remove`rOh.jEh7h:hAj|hC}rP(UreftypeXoptionj~jXremoveU 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^XremoverYrZ}r[(h-Uh.jSubahAjubaubh^X:r\}r](h-X:h.jEubeubh)r^}r_(h-X}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h.jh7h:hAhhC}r`(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rah^X}buildbot user --master={MASTERHOST} --op=remove \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...rbrc}rd(h-Uh.j^ubaubhb)re}rf(h-XFor :option:`get`:rgh.jh7h:hAhehC}rh(hG]hH]hF]hE]hI]uhLMhMhhN]ri(h^XFor rjrk}rl(h-XFor h.jeubjx)rm}rn(h-X :option:`get`roh.jeh7h:hAj|hC}rp(UreftypeXoptionj~jXgetU 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^Xgetryrz}r{(h-Uh.jsubahAjubaubh^X:r|}r}(h-X:h.jeubeubh)r~}r(h-Xzbuildbot user --master={MASTERHOST} --op=get \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...h.jh7h:hAhhC}r(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]rh^Xzbuildbot user --master={MASTERHOST} --op=get \ --username={USER} --passwd={USERPW} \ --ids={ID1},{ID2},...rr}r(h-Uh.j~ubaubhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhMhhN]r(h^X A note on rr}r(h-X A note on 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: when updating the rr}r(h-X: when updating the h.jubjx)r}r(h-X:option:`bb_username`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX bb_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 bb_usernamerr}r(h-Uh.jubahAjubaubh^X and rr}r(h-X and 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]rh^X bb_passwordrr}r(h-Uh.jubahAjubaubh^X, the rr}r(h-X, 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! doesn't need to have additional rr}r(h-X! doesn't need to have additional 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' pairs to update and can just take the rr}r(h-X' pairs to update and can just take the 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 portion.rr}r(h-X portion.h.jubeubh>)r}r(h-X.. _buildbot-config-directory:h.jh7h: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]uhLM hMhhN]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^Xbuildbotr r }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 r r }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 r!r"}r#(h-X1 command will look for a special directory named h.jubh)r$}r%(h-UhC}r&(hE]hF]hG]hH]r'Xfiler(aUrolej(hI]uh.jhN]r)h^X .buildbotr*r+}r,(h-X .buildboth.j$ubahAhubh^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 r-r.}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)r0}r1(h-UhC}r2(hE]hF]hG]hH]r3Xfiler4aUrolej4hI]uh.jhN]r5h^Xoptionsr6r7}r8(h-Xoptionsh.j0ubahAhubh^Xz in this directory, and will evaluate it as a Python script, looking for certain names to be set. You can just put simple r9r:}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]r?h^Xname = 'value'r@rA}rB(h-Uh.j<ubahAhubh^X' pairs in this file to set the options.rCrD}rE(h-X' pairs in this file to set the options.h.jubeubhb)rF}rG(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}rH(hG]hH]hF]hE]hI]uhLM,hMhhN]rI(h^XbFor a description of the names used in this file, please see the documentation for the individual rJrK}rL(h-XbFor a description of the names used in this file, please see the documentation for the individual h.jFubhk)rM}rN(h-X:command:`buildbot`hC}rO(hG]hH]rPhpahF]hE]hI]uh.jFhN]rQh^XbuildbotrRrS}rT(h-Uh.jMubahAhuubh^XU sub-commands. The following is a brief sample of what this file's contents could be.rUrV}rW(h-XU sub-commands. The following is a brief sample of what this file's contents could be.h.jFubeubh)rX}rY(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}rZ(hhXnonehhhE]hF]hG]hH]hI]uhLM0hMhhN]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.jXubaubhb)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}ra(hG]hH]hF]hE]hI]uhLM8hMhhN]rb(h^X%Note carefully that the names in the rcrd}re(h-X%Note carefully that the names in the h.j_ubh)rf}rg(h-UhC}rh(hE]hF]hG]hH]riXfilerjaUrolejjhI]uh.j_hN]rkh^Xoptionsrlrm}rn(h-Xoptionsh.jfubahAhubh^X8 file usually do not match the command-line option name.rorp}rq(h-X8 file usually do not match the command-line option name.h.j_ubeubji )rr}rs(h-Uh.jh7h:hAjl hC}rt(hG]hH]hF]hE]hI]uhLNhMhhN]ru(jo )rv}rw(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.jrh7h:hAjr hC}rx(hG]hH]hF]hE]hI]uhLM=hN]ry(ju )rz}r{(h-X``masterstatus``r|h.jvh7h:hAjy hC}r}(hG]hH]hF]hE]hI]uhLM=hN]r~h)r}r(h-j|hC}r(hG]hH]hF]hE]hI]uh.jzhN]rh^X masterstatusrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jvhN]rhb)r}r(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.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:`statuslog`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jX statuslogU 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 statuslogrr}r(h-Uh.jubahAhubaubh^X and rr}r(h-X and h.jubjx)r}r(h-X:bb:cmdline:`statusgui`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jX statusguiU 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 statusguirr}r(h-Uh.jubahAhubaubh^X!, this gives the location of the rr}r(h-X!, this gives the location of the h.jubjx)r}r(h-X:class:`client.PBListener`rh.jh7h:hAj|hC}r(UreftypeXclassj~jXclient.PBListenerU refdomainXpyrhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM<hN]rh)r}r(h-jhC}r(hG]hH]r(jjXpy-classrehF]hE]hI]uh.jhN]rh^Xclient.PBListenerrr}r(h-Uh.jubahAhubaubh^X status port.rr}r(h-X status port.h.jubeubahAj ubeubjo )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.jrh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMDhMhhN]r(ju )r}r(h-X ``master``rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMDhN]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 refdomainXbbr hE]hF]U refexplicithG]hH]hI]jjuhLM@hN]r h)r }r (h-jhC}r(hG]hH]r(jj X bb-cmdlinerehF]hE]hI]uh.jhN]rh^X debugclientrr}r(h-Uh.j ubahAhubaubh^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-cmdliner"ehF]hE]hI]uh.jhN]r#h^X sendchanger$r%}r&(h-Uh.jubahAhubaubh^XC. This option is used for two purposes. It is the location of the r'r(}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]r-h^X debugPortr.r/}r0(h-Uh.j*ubahAhubh^X for r1r2}r3(h-X for h.jubh)r4}r5(h-X``debugclient``hC}r6(hG]hH]hF]hE]hI]uh.jhN]r7h^X debugclientr8r9}r:(h-Uh.j4ubahAhubh^X and the location of the r;r<}r=(h-X and the location of the h.jubjx)r>}r?(h-X:class:`pb.PBChangeSource`r@h.jh7h:hAj|hC}rA(UreftypeXclassj~jXpb.PBChangeSourceU refdomainXpyrBhE]hF]U refexplicithG]hH]hI]jjjNjNuhLM@hN]rCh)rD}rE(h-j@hC}rF(hG]hH]rG(jjBXpy-classrHehF]hE]hI]uh.j>hN]rIh^Xpb.PBChangeSourcerJrK}rL(h-Uh.jDubahAhubaubh^X for rMrN}rO(h-X for h.jubh)rP}rQ(h-X```sendchange``hC}rR(hG]hH]hF]hE]hI]uh.jhN]rSh^X `sendchangerTrU}rV(h-Uh.jPubahAhubh^X%. Generally these are the same port.rWrX}rY(h-X%. Generally these are the same port.h.jubeubahAj ubeubjo )rZ}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.jrh7h:hAjr hC}r\(hG]hH]hF]hE]hI]uhLMLhMhhN]r](ju )r^}r_(h-X``debugPassword``r`h.jZh7h:hAjy hC}ra(hG]hH]hF]hE]hI]uhLMLhN]rbh)rc}rd(h-j`hC}re(hG]hH]hF]hE]hI]uh.j^hN]rfh^X debugPasswordrgrh}ri(h-Uh.jcubahAhubaubj )rj}rk(h-UhC}rl(hG]hH]hF]hE]hI]uh.jZhN]rm(hb)rn}ro(h-X?Equivalent to :option:`--passwd` for :bb:cmdline:`debugclient`.rph.jjh7h:hAhehC}rq(hG]hH]hF]hE]hI]uhLMGhN]rr(h^XEquivalent to rsrt}ru(h-XEquivalent to h.jnubjx)rv}rw(h-X:option:`--passwd`rxh.jnh7h:hAj|hC}ry(UreftypeXoptionj~jX--passwdU refdomainXstdrzj NhE]hF]U refexplicithG]hH]hI]jjuhLMGhN]r{j )r|}r}(h-jxhC}r~(hG]hH]r(jjzX std-optionrehF]hE]hI]uh.jvhN]rh^X--passwdrr}r(h-Uh.j|ubahAjubaubh^X for rr}r(h-X for h.jnubjx)r}r(h-X:bb:cmdline:`debugclient`rh.jnh7h:hAj|hC}r(UreftypeXcmdlinej~jX debugclientU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMGhN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^X debugclientrr}r(h-Uh.jubahAhubaubh^X.r}r(h-X.h.jnubeubcdocutils.nodes important r)r}r(h-XThis value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command.hC}r(hG]hH]hF]hE]hI]uh.jjhN]rhb)r}r(h-XThis value must match the value of :bb:cfg:`debugPassword`, used to protect the debug port, for the :bb:cmdline:`debugclient` command.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMKhN]r(h^X#This value must match the value of rr}r(h-X#This value must match the value of h.jubjx)r}r(h-X:bb:cfg:`debugPassword`rh.jh7h:hAj|hC}r(UreftypeXcfgj~jX debugPasswordU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMKhN]rh)r}r(h-jhC}r(hG]hH]r(jjXbb-cfgrehF]hE]hI]uh.jhN]rh^X debugPasswordrr}r(h-Uh.jubahAhubaubh^X*, used to protect the debug port, for the rr}r(h-X*, used to protect the debug port, for the h.jubjx)r}r(h-X:bb:cmdline:`debugclient`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jX debugclientU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMKhN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^X debugclientrr}r(h-Uh.jubahAhubaubh^X command.rr}r(h-X command.h.jubeubahAU importantrubehAj ubeubjo )r}r(h-XZ``username`` Equivalent to :option:`--username` for the :bb:cmdline:`sendchange` command. h.jrh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMOhMhhN]r(ju )r}r(h-X ``username``rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMOhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xusernamerr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(h-XLEquivalent to :option:`--username` 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.jubjx)r}r(h-X:option:`--username`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --usernameU 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 --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]jjuhLMOhN]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 ubeubjo )r }r (h-XV``branch`` Equivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command. h.jrh7h:hAjr hC}r (hG]hH]hF]hE]hI]uhLMRhMhhN]r (ju )r }r(h-X ``branch``rh.j h7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMRhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.j hN]rh^Xbranchrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.j hN]rhb)r}r(h-XJEquivalent to :option:`--branch` for the :bb:cmdline:`sendchange` command.h.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMRhN]r (h^XEquivalent to r!r"}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]jjuhLMRhN]r)j )r*}r+(h-j&hC}r,(hG]hH]r-(jj(X std-optionr.ehF]hE]hI]uh.j$hN]r/h^X--branchr0r1}r2(h-Uh.j*ubahAjubaubh^X for the r3r4}r5(h-X for the h.jubjx)r6}r7(h-X:bb:cmdline:`sendchange`r8h.jh7h:hAj|hC}r9(UreftypeXcmdlinej~jX sendchangeU refdomainXbbr:hE]hF]U refexplicithG]hH]hI]jjuhLMRhN]r;h)r<}r=(h-j8hC}r>(hG]hH]r?(jj:X bb-cmdliner@ehF]hE]hI]uh.j6hN]rAh^X sendchangerBrC}rD(h-Uh.j<ubahAhubaubh^X command.rErF}rG(h-X command.h.jubeubahAj ubeubjo )rH}rI(h-XZ``category`` Equivalent to :option:`--category` for the :bb:cmdline:`sendchange` command. h.jrh7h:hAjr hC}rJ(hG]hH]hF]hE]hI]uhLMUhMhhN]rK(ju )rL}rM(h-X ``category``rNh.jHh7h:hAjy hC}rO(hG]hH]hF]hE]hI]uhLMUhN]rPh)rQ}rR(h-jNhC}rS(hG]hH]hF]hE]hI]uh.jLhN]rTh^XcategoryrUrV}rW(h-Uh.jQubahAhubaubj )rX}rY(h-UhC}rZ(hG]hH]hF]hE]hI]uh.jHhN]r[hb)r\}r](h-XLEquivalent to :option:`--category` for the :bb:cmdline:`sendchange` command.h.jXh7h:hAhehC}r^(hG]hH]hF]hE]hI]uhLMUhN]r_(h^XEquivalent to r`ra}rb(h-XEquivalent to h.j\ubjx)rc}rd(h-X:option:`--category`reh.j\h7h:hAj|hC}rf(UreftypeXoptionj~jX --categoryU refdomainXstdrgj NhE]hF]U refexplicithG]hH]hI]jjuhLMUhN]rhj )ri}rj(h-jehC}rk(hG]hH]rl(jjgX std-optionrmehF]hE]hI]uh.jchN]rnh^X --categoryrorp}rq(h-Uh.jiubahAjubaubh^X for the rrrs}rt(h-X for the h.j\ubjx)ru}rv(h-X:bb:cmdline:`sendchange`rwh.j\h7h:hAj|hC}rx(UreftypeXcmdlinej~jX sendchangeU refdomainXbbryhE]hF]U refexplicithG]hH]hI]jjuhLMUhN]rzh)r{}r|(h-jwhC}r}(hG]hH]r~(jjyX bb-cmdlinerehF]hE]hI]uh.juhN]rh^X sendchangerr}r(h-Uh.j{ubahAhubaubh^X command.rr}r(h-X command.h.j\ubeubahAj ubeubjo )r}r(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.jrh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMZhMhhN]r(ju )r}r(h-X``try_connect``rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMZhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_connectrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMXhN]r(h^XEquivalent to rr}r(h-XEquivalent to h.jubjx)r}r(h-X:option:`--connect`rh.jh7h:hAj|hC}r(UreftypeXoptionj~jX --connectU refdomainXstdrj NhE]hF]U refexplicithG]hH]hI]jjuhLMXhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --connectrr}r(h-Uh.jubahAjubaubh^X, this specifies how the rr}r(h-X, this specifies how the h.jubjx)r}r(h-X:bb:cmdline:`try`rh.jh7h:hAj|hC}r(UreftypeXcmdlinej~jXtryU refdomainXbbrhE]hF]U refexplicithG]hH]hI]jjuhLMXhN]rh)r}r(h-jhC}r(hG]hH]r(jjX bb-cmdlinerehF]hE]hI]uh.jhN]rh^Xtryrr}r(h-Uh.jubahAhubaubh^XZ command should deliver its request to the buildmaster. The currently accepted values are rr}r(h-XZ command should deliver its request to the buildmaster. The currently accepted values are h.jubh)r}r(h-X``ssh``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xsshrr}r(h-Uh.jubahAhubh^X and rr}r(h-X and h.jubh)r}r(h-X``pb``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xpbrr}r(h-Uh.jubahAhubh^X.r}r(h-X.h.jubeubahAj ubeubjo )r}r(h-X~``try_builders`` Equivalent to :option:`--builders`, specifies which builders should be used for the :bb:cmdline:`try` build. h.jrh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLM^hMhhN]r(ju )r}r(h-X``try_builders``rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLM^hN]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]uhLM]hN]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]jjuhLM]hN]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 refdomainXbbr hE]hF]U refexplicithG]hH]hI]jjuhLM]hN]r h)r }r (h-jhC}r(hG]hH]r(jj X bb-cmdlinerehF]hE]hI]uh.jhN]rh^Xtryrr}r(h-Uh.j ubahAhubaubh^X build.rr}r(h-X build.h.jubeubahAj ubeubjo )r}r(h-Xu``try_vc`` Equivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used. h.jrh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMbhMhhN]r(ju )r}r(h-X ``try_vc``rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMbhN]r h)r!}r"(h-jhC}r#(hG]hH]hF]hE]hI]uh.jhN]r$h^Xtry_vcr%r&}r'(h-Uh.j!ubahAhubaubj )r(}r)(h-UhC}r*(hG]hH]hF]hE]hI]uh.jhN]r+hb)r,}r-(h-XiEquivalent to :option:`--vc` for :bb:cmdline:`try`, this specifies the version control system being used.h.j(h7h:hAhehC}r.(hG]hH]hF]hE]hI]uhLMahN]r/(h^XEquivalent to r0r1}r2(h-XEquivalent to h.j,ubjx)r3}r4(h-X:option:`--vc`r5h.j,h7h:hAj|hC}r6(UreftypeXoptionj~jX--vcU refdomainXstdr7j NhE]hF]U refexplicithG]hH]hI]jjuhLMahN]r8j )r9}r:(h-j5hC}r;(hG]hH]r<(jj7X std-optionr=ehF]hE]hI]uh.j3hN]r>h^X--vcr?r@}rA(h-Uh.j9ubahAjubaubh^X for rBrC}rD(h-X for h.j,ubjx)rE}rF(h-X:bb:cmdline:`try`rGh.j,h7h:hAj|hC}rH(UreftypeXcmdlinej~jXtryU refdomainXbbrIhE]hF]U refexplicithG]hH]hI]jjuhLMahN]rJh)rK}rL(h-jGhC}rM(hG]hH]rN(jjIX bb-cmdlinerOehF]hE]hI]uh.jEhN]rPh^XtryrQrR}rS(h-Uh.jKubahAhubaubh^X7, this specifies the version control system being used.rTrU}rV(h-X7, this specifies the version control system being used.h.j,ubeubahAj ubeubjo )rW}rX(h-Xp``try_branch`` Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch. h.jrh7h:hAjr hC}rY(hG]hH]hF]hE]hI]uhLMfhMhhN]rZ(ju )r[}r\(h-X``try_branch``r]h.jWh7h:hAjy hC}r^(hG]hH]hF]hE]hI]uhLMfhN]r_h)r`}ra(h-j]hC}rb(hG]hH]hF]hE]hI]uh.j[hN]rch^X try_branchrdre}rf(h-Uh.j`ubahAhubaubj )rg}rh(h-UhC}ri(hG]hH]hF]hE]hI]uh.jWhN]rjhb)rk}rl(h-X`Equivalent to :option:`--branch`, this indicates that the current tree is on a non-trunk branch.h.jgh7h:hAhehC}rm(hG]hH]hF]hE]hI]uhLMehN]rn(h^XEquivalent to rorp}rq(h-XEquivalent to h.jkubjx)rr}rs(h-X:option:`--branch`rth.jkh7h:hAj|hC}ru(UreftypeXoptionj~jX--branchU refdomainXstdrvj NhE]hF]U refexplicithG]hH]hI]jjuhLMehN]rwj )rx}ry(h-jthC}rz(hG]hH]r{(jjvX std-optionr|ehF]hE]hI]uh.jrhN]r}h^X--branchr~r}r(h-Uh.jxubahAjubaubh^X@, this indicates that the current tree is on a non-trunk branch.rr}r(h-X@, this indicates that the current tree is on a non-trunk branch.h.jkubeubahAj ubeubeubhb)r}r(h-X``try_topdir``rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhhMhhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_topdirrr}r(h-Uh.jubahAhubaubji )r}r(h-Uh.jh7h:hAjl hC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rjo )r}r(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.jh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMnhN]r(ju )r}r(h-X``try_topfile``rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMnhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_topfilerr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMkhN]r(h^XUse rr}r(h-XUse h.jubh)r}r(h-X``try_topdir``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_topdirrr}r(h-Uh.jubahAhubh^X, equivalent to rr}r(h-X, equivalent to 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]jjuhLMkhN]rj )r}r(h-jhC}r(hG]hH]r(jjX std-optionrehF]hE]hI]uh.jhN]rh^X --try-topdirrr}r(h-Uh.jubahAjubaubh^X:, to explicitly indicate the top of your working tree, or rr}r(h-X:, to explicitly indicate the top of your working tree, or h.jubh)r}r(h-X``try_topfile``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_topfilerr}r(h-Uh.jubahAhubh^X, equivalent to rr}r(h-X, equivalent to 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]jjuhLMkhN]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.jubeubahAj ubeubaubhb)r}r(h-X ``try_host``rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMphMhhN]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]uhLMrhMhhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_usernamerr}r(h-Uh.jubahAhubaubji )r}r(h-Uh.jh7h:hAjl hC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rjo )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:hAjr hC}r(hG]hH]hF]hE]hI]uhLMxhN]r(ju )r}r(h-X ``try_dir``r h.jh7h:hAjy hC}r (hG]hH]hF]hE]hI]uhLMxhN]r h)r }r (h-j hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xtry_dirrr}r(h-Uh.j ubahAhubaubj )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]uhLMuhN]r(h^XWhen rr}r(h-XWhen h.jubh)r}r(h-X``try_connect``hC}r (hG]hH]hF]hE]hI]uh.jhN]r!h^X try_connectr"r#}r$(h-Uh.jubahAhubh^X is r%r&}r'(h-X is h.jubh)r(}r)(h-X``ssh``hC}r*(hG]hH]hF]hE]hI]uh.jhN]r+h^Xsshr,r-}r.(h-Uh.j(ubahAhubh^X, the command will use r/r0}r1(h-X, the command will use h.jubh)r2}r3(h-X ``try_host``hC}r4(hG]hH]hF]hE]hI]uh.jhN]r5h^Xtry_hostr6r7}r8(h-Uh.j2ubahAhubh^X for r9r:}r;(h-X for h.jubjx)r<}r=(h-X:option:`--tryhost`r>h.jh7h:hAj|hC}r?(UreftypeXoptionj~jX --tryhostU refdomainXstdr@j NhE]hF]U refexplicithG]hH]hI]jjuhLMuhN]rAj )rB}rC(h-j>hC}rD(hG]hH]rE(jj@X std-optionrFehF]hE]hI]uh.j<hN]rGh^X --tryhostrHrI}rJ(h-Uh.jBubahAjubaubh^X, rKrL}rM(h-X, h.jubh)rN}rO(h-X``try_username``hC}rP(hG]hH]hF]hE]hI]uh.jhN]rQh^X try_usernamerRrS}rT(h-Uh.jNubahAhubh^X for rUrV}rW(h-X for h.jubjx)rX}rY(h-X:option:`--username`rZh.jh7h:hAj|hC}r[(UreftypeXoptionj~jX --usernameU refdomainXstdr\j NhE]hF]U refexplicithG]hH]hI]jjuhLMuhN]r]j )r^}r_(h-jZhC}r`(hG]hH]ra(jj\X std-optionrbehF]hE]hI]uh.jXhN]rch^X --usernamerdre}rf(h-Uh.j^ubahAjubaubh^X, and rgrh}ri(h-X, and h.jubh)rj}rk(h-X ``try_dir``hC}rl(hG]hH]hF]hE]hI]uh.jhN]rmh^Xtry_dirrnro}rp(h-Uh.jjubahAhubh^X for rqrr}rs(h-X for h.jubjx)rt}ru(h-X:option:`--trydir`rvh.jh7h:hAj|hC}rw(UreftypeXoptionj~jX--trydirU refdomainXstdrxj NhE]hF]U refexplicithG]hH]hI]jjuhLMuhN]ryj )rz}r{(h-jvhC}r|(hG]hH]r}(jjxX std-optionr~ehF]hE]hI]uh.jthN]rh^X--trydirrr}r(h-Uh.jzubahAjubaubh^X=. Apologies for the confusing presence and absence of 'try'.rr}r(h-X=. Apologies for the confusing presence and absence of 'try'.h.jubeubahAj ubeubaubhb)r}r(h-X``try_username``rh.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMzhMhhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_usernamerr}r(h-Uh.jubahAhubaubhb)r}r(h-X``try_password``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^X try_passwordrr}r(h-Uh.jubahAhubaubji )r}r(h-Uh.jh7h:hAjl hC}r(hG]hH]hF]hE]hI]uhLNhMhhN]rjo )r}r(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.jh7h:hAjr hC}r(hG]hH]hF]hE]hI]uhLMhN]r(ju )r}r(h-X``try_master``rh.jh7h:hAjy hC}r(hG]hH]hF]hE]hI]uhLMhN]rh)r}r(h-jhC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_masterrr}r(h-Uh.jubahAhubaubj )r}r(h-UhC}r(hG]hH]hF]hE]hI]uh.jhN]rhb)r}r(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.jh7h:hAhehC}r(hG]hH]hF]hE]hI]uhLMhN]r(h^XSimilarly, when rr}r(h-XSimilarly, when 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``pb``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^Xpbrr}r(h-Uh.jubahAhubh^X$, the command will pay attention to rr}r(h-X$, the command will pay attention to 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 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.jubh)r}r(h-X``try_password``hC}r(hG]hH]hF]hE]hI]uh.jhN]rh^X try_passwordrr}r(h-Uh.jubahAhubh^X for rr}r(h-X for 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-optionr ehF]hE]hI]uh.jhN]r h^X--passwdr r }r (h-Uh.jubahAjubaubh^X, and r r }r (h-X, and 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 for r r }r (h-X for h.jubjx)r }r (h-X:option:`--master`r h.jh7h:hAj|hC}r (UreftypeXoptionj~jX--masterU 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--masterr r }r! (h-Uh.j ubahAjubaubh^X.r" }r# (h-X.h.jubeubahAj ubeubaubhb)r$ }r% (h-X ``try_wait``r& h.jh7h:hAhehC}r' (hG]hH]hF]hE]hI]uhLMhMhhN]r( h)r) }r* (h-j& hC}r+ (hG]hH]hF]hE]hI]uh.j$ hN]r, h^Xtry_waitr- r. }r/ (h-Uh.j) ubahAhubaubji )r0 }r1 (h-Uh.jh7h:hAjl hC}r2 (hG]hH]hF]hE]hI]uhLNhMhhN]r3 jo )r4 }r5 (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.j0 h7h:hAjr hC}r6 (hG]hH]hF]hE]hI]uhLMhN]r7 (ju )r8 }r9 (h-X``masterstatus``r: h.j4 h7h:hAjy hC}r; (hG]hH]hF]hE]hI]uhLMhN]r< h)r= }r> (h-j: hC}r? (hG]hH]hF]hE]hI]uh.j8 hN]r@ h^X masterstatusrA rB }rC (h-Uh.j= ubahAhubaubj )rD }rE (h-UhC}rF (hG]hH]hF]hE]hI]uh.j4 hN]rG hb)rH }rI (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.jD h7h:hAhehC}rJ (hG]hH]hF]hE]hI]uhLMhN]rK (h)rL }rM (h-X ``try_wait``hC}rN (hG]hH]hF]hE]hI]uh.jH hN]rO h^Xtry_waitrP rQ }rR (h-Uh.jL ubahAhubh^X and rS rT }rU (h-X and h.jH ubh)rV }rW (h-X``masterstatus``hC}rX (hG]hH]hF]hE]hI]uh.jH hN]rY h^X masterstatusrZ r[ }r\ (h-Uh.jV ubahAhubh^X (equivalent to r] r^ }r_ (h-X (equivalent to h.jH ubjx)r` }ra (h-X:option:`--wait`rb h.jH h7h:hAj|hC}rc (UreftypeXoptionj~jX--waitU refdomainXstdrd j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]re j )rf }rg (h-jb hC}rh (hG]hH]ri (jjd X std-optionrj ehF]hE]hI]uh.j` hN]rk h^X--waitrl rm }rn (h-Uh.jf ubahAjubaubh^X and ro rp }rq (h-X and h.jH ubh)rr }rs (h-X ``master``hC}rt (hG]hH]hF]hE]hI]uh.jH hN]ru h^Xmasterrv rw }rx (h-Uh.jr ubahAhubh^X$, respectively) are used to ask the ry rz }r{ (h-X$, respectively) are used to ask the h.jH ubjx)r| }r} (h-X:bb:cmdline:`try`r~ h.jH h7h:hAj|hC}r (UreftypeXcmdlinej~jXtryU refdomainXbbr hE]hF]U refexplicithG]hH]hI]jjuhLMhN]r h)r }r (h-j~ hC}r (hG]hH]r (jj X bb-cmdliner ehF]hE]hI]uh.j| hN]r h^Xtryr r }r (h-Uh.j ubahAhubaubh^X5 command to wait for the requested build to complete.r r }r (h-X5 command to wait for the requested build to complete.h.jH ubeubahAj ubeubaubeubeubh3eubh7h:hAhOhC}r (hG]hH]hF]hE]r U buildslaver ahI]r h auhLMhMhhN]r (hW)r }r (h-X buildslaver h.h3h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r h^X buildslaver r }r (h-j h.j ubaubhb)r }r (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}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (hk)r }r (h-X:command:`buildslave`hC}r (hG]hH]r hpahF]hE]hI]uh.j hN]r h^X buildslaver r }r (h-Uh.j 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.r r }r (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.j ubeubj)r }r (h-Uh.h3h7h:hAjhC}r (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}r (hE]hF]hG]hH]hI]hJj uhLMhMhhN]ubh/)r }r (h-Uh.h3h7h:h<}hAhOhC}r (hG]hH]hF]hE]r (U create-slaver j ehI]r h auhLMhMhhT}r j j shN]r (hW)r }r (h-X create-slaver h.j h7h:hAh[hC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r h^X create-slaver r }r (h-j h.j ubaubhb)r }r (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.j h7h:hAhehC}r (hG]hH]hF]hE]hI]uhLMhMhhN]r (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 r r }r (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.j ubh)r }r (h-UhC}r (hE]hF]hG]hH]r Xfiler aUrolej hI]uh.j hN]r h^X buildbot.tacr r }r (h-X buildbot.tach.j ubahAhubh^X file.r r }r (h-X file.h.j ubeubhb)r }r (h-XKThe :option:`-r` option is advisable here, just like for ``create-master``.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:`-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.j 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.j 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.j 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.j 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)r0!}r1!(h-Xrestartr2!h.j$!h7h:hAh[hC}r3!(hG]hH]hF]hE]hI]uhLMhMhhN]r4!h^Xrestartr5!r6!}r7!(h-j2!h.j0!ubaubh)r8!}r9!(h-X'buildslave restart [--nodaemon] BASEDIRh.j$!h7h:hAhhC}r:!(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]r;!h^X'buildslave restart [--nodaemon] BASEDIRr!(h-Uh.j8!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}rA!(hG]hH]hF]hE]hI]uhLMhMhhN]rB!(h^XKThis restarts a buildslave which is already running. It is equivalent to a rC!rD!}rE!(h-XKThis restarts a buildslave which is already running. It is equivalent to a h.j?!ubh)rF!}rG!(h-X``stop``hC}rH!(hG]hH]hF]hE]hI]uh.j?!hN]rI!h^XstoprJ!rK!}rL!(h-Uh.jF!ubahAhubh^X followed by a rM!rN!}rO!(h-X followed by a h.j?!ubh)rP!}rQ!(h-X ``start``hC}rR!(hG]hH]hF]hE]hI]uh.j?!hN]rS!h^XstartrT!rU!}rV!(h-Uh.jP!ubahAhubh^X.rW!}rX!(h-X.h.j?!ubeubhb)rY!}rZ!(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.jY!ubjx)ra!}rb!(h-X:option:`--nodaemon`rc!h.jY!h7h:hAj|hC}rd!(UreftypeXoptionj~jX --nodaemonU refdomainXstdre!j NhE]hF]U refexplicithG]hH]hI]jjuhLMhN]rf!j )rg!}rh!(h-jc!hC}ri!(hG]hH]rj!(jje!X std-optionrk!ehF]hE]hI]uh.ja!hN]rl!h^X --nodaemonrm!rn!}ro!(h-Uh.jg!ubahAjubaubh^X$ option has the same meaning as for rp!rq!}rr!(h-X$ option has the same meaning as for h.jY!ubh)rs!}rt!(h-X ``start``hC}ru!(hG]hH]hF]hE]hI]uh.jY!hN]rv!h^Xstartrw!rx!}ry!(h-Uh.js!ubahAhubh^X.rz!}r{!(h-X.h.jY!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!tr!euhLMhMhhN]ubh>)r!}r!(h-Uh.j$!h7h:hAhBhC}r!(hE]hF]hG]hH]hI]hJj!uhLMhMhhN]ubeubh/)r!}r!(h-Uh2Kh.h3h7h:h<}hAhOhC}r!(hG]r!jahH]hF]hE]r!(j!Uid6r!ehI]uhLMhMhhT}r!j!j!shN]r!(hW)r!}r!(h-Xstopr!h.j!h7h:hAh[hC}r!(hG]hH]hF]hE]hI]uhLMhMhhN]r!h^Xstopr!r!}r!(h-j!h.j!ubaubhb)r!}r!(h-XEThis terminates the daemon buildslave running in the given directory.r!h.j!h7h:hAhehC}r!(hG]hH]hF]hE]hI]uhLMhMhhN]r!h^XEThis terminates the daemon buildslave running in the given directory.r!r!}r!(h-j!h.j!ubaubh)r!}r!(h-Xbuildbot stop BASEDIRh.j!h7h:hAhhC}r!(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]r!h^Xbuildbot stop BASEDIRr!r!}r!(h-Uh.j!ubaubeubeubh7h:h<}hAhOhC}r!(hG]r!j4ahH]hF]hE]r!(j!Uid4r!ehI]uhLMhMhhT}r!j!j!!shN]r!(hW)r!}r!(h-Xstartr!h.h0h7h:hAh[hC}r!(hG]hH]hF]hE]hI]uhLMhMhhN]r!h^Xstartr!r!}r!(h-j!h.j!ubaubhb)r!}r!(h-XThis 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.h0h7h:hAhehC}r!(hG]hH]hF]hE]hI]uhLMhMhhN]r!(h^XThis 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 r!r!}r!(h-XThis 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.j!ubh)r!}r!(h-UhC}r!(hE]hF]hG]hH]r!Xfiler!aUrolej!hI]uh.j!hN]r!h^X twistd.logr!r!}r!(h-X twistd.logh.j!ubahAhubh^X.r!}r!(h-X.h.j!ubeubh)r!}r!(h-X%buildslave start [--nodaemon] BASEDIRh.h0h7h:hAhhC}r!(hhXnonehhhE]hF]hG]hH]hI]uhLMhMhhN]r!h^X%buildslave start [--nodaemon] BASEDIRr!r!}r!(h-Uh.j!ubaubhb)r!}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.h0h7h: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 instructs Buildbot to skip daemonizing. The process will start in the foreground. It will only return to the command-line when it is stopped.r!r!}r!(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.j!ubeubj)r!}r!(h-Uh.h0h7h:hAjhC}r!(hE]hF]hG]hH]hI]Uentries]r!((UsingleX.Command Line Subcommands; restart (buildslave)j)!j)!tr!(UsingleX,restart (buildslave) Command Line Subcommandj)!j)!tr!euhLMhMhhN]ubj,!eubh7h:hAUsystem_messager!hC}r!(hG]UlevelKhE]hF]r!j!aUsourceh:hH]hI]UlineMUtypeUINFOr!uhLMhMhhN]r!hb)r!}r!(h-UhC}r!(hG]hH]hF]hE]hI]uh.h+hN]r!h^X(Duplicate implicit target name: "start".r!r!}r!(h-Uh.j!ubahAheubaubh*)r!}r!(h-Uh.j$!h7h:hAj!hC}r!(hG]UlevelKhE]hF]r!j*!aUsourceh:hH]hI]UlineMUtypej!uhLMhMhhN]r!hb)r!}r!(h-UhC}r!(hG]hH]hF]hE]hI]uh.j!hN]r!h^X*Duplicate implicit target name: "restart".r"r"}r"(h-Uh.j!ubahAheubaubh*)r"}r"(h-Uh.j!h7h:hAj!hC}r"(hG]UlevelKhE]hF]r"j!aUsourceh:hH]hI]UlineMUtypej!uhLMhMhhN]r"hb)r"}r "(h-UhC}r "(hG]hH]hF]hE]hI]uh.j"hN]r "h^X'Duplicate implicit target name: "stop".r "r "}r"(h-Uh.j"ubahAheubaubeUcurrent_sourcer"NU decorationr"NUautofootnote_startr"KUnameidsr"}r"(hjEhjhhKh j h j8h jh j h jhj hNhjhjvhjhj?hhRhjhNhj`hjhjhjUhjV hNhjdhjhjh j h!j h"jzh#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*)r0"}r1"(h-UhC}r2"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKAUtypej!uhN]r3"hb)r4"}r5"(h-UhC}r6"(hG]hH]hF]hE]hI]uh.j0"hN]r7"h^X;Hyperlink target "cmdline-create-master" is not referenced.r8"r9"}r:"(h-Uh.j4"ubahAheubahAj!ubh*)r;"}r<"(h-UhC}r="(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKOUtypej!uhN]r>"hb)r?"}r@"(h-UhC}rA"(hG]hH]hF]hE]hI]uh.j;"hN]rB"h^X>Hyperlink target "cmdline-start (buildbot)" is not referenced.rC"rD"}rE"(h-Uh.j?"ubahAheubahAj!ubh*)rF"}rG"(h-UhC}rH"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineK_Utypej!uhN]rI"hb)rJ"}rK"(h-UhC}rL"(hG]hH]hF]hE]hI]uh.jF"hN]rM"h^X@Hyperlink target "cmdline-restart (buildbot)" is not referenced.rN"rO"}rP"(h-Uh.jJ"ubahAheubahAj!ubh*)rQ"}rR"(h-UhC}rS"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKlUtypej!uhN]rT"hb)rU"}rV"(h-UhC}rW"(hG]hH]hF]hE]hI]uh.jQ"hN]rX"h^X=Hyperlink target "cmdline-stop (buildbot)" is not referenced.rY"rZ"}r["(h-Uh.jU"ubahAheubahAj!ubh*)r\"}r]"(h-UhC}r^"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKxUtypej!uhN]r_"hb)r`"}ra"(h-UhC}rb"(hG]hH]hF]hE]hI]uh.j\"hN]rc"h^X4Hyperlink target "cmdline-sighup" is not referenced.rd"re"}rf"(h-Uh.j`"ubahAheubahAj!ubh*)rg"}rh"(h-UhC}ri"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypej!uhN]rj"hb)rk"}rl"(h-UhC}rm"(hG]hH]hF]hE]hI]uh.jg"hN]rn"h^X7Hyperlink target "cmdline-statuslog" is not referenced.ro"rp"}rq"(h-Uh.jk"ubahAheubahAj!ubh*)rr"}rs"(h-UhC}rt"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineKUtypej!uhN]ru"hb)rv"}rw"(h-UhC}rx"(hG]hH]hF]hE]hI]uh.jr"hN]ry"h^X7Hyperlink target "cmdline-statusgui" is not referenced.rz"r{"}r|"(h-Uh.jv"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^X1Hyperlink target "cmdline-try" is not referenced.r"r"}r"(h-Uh.j"ubahAheubahAj!ubh*)r"}r"(h-UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]Utypej!uhN]r"hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j"hN]r"h^X-Hyperlink target "index-0" 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 "try-diff" 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^X8Hyperlink target "cmdline-sendchange" is not referenced.r"r"}r"(h-Uh.j"ubahAheubahAj!ubh*)r"}r"(h-UhC}r"(hG]UlevelKhE]hF]Usourceh:hH]hI]UlineMbUtypej!uhN]r"hb)r"}r"(h-UhC}r"(hG]hH]hF]hE]hI]uh.j"hN]r"h^X9Hyperlink target "cmdline-debugclient" 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^X2Hyperlink target "cmdline-user" 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 "buildbot-config-directory" 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-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_widthr0#KUerror_encodingr1#UUTF-8r2#U_sourcer3#UO/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cmdline.rstr4#Ugettext_compactr5#U generatorr6#NUdump_internalsr7#NU smart_quotesr8#U pep_base_urlr9#Uhttp://www.python.org/dev/peps/r:#Usyntax_highlightr;#Ulongr<#Uinput_encoding_error_handlerr=#j#Uauto_id_prefixr>#Uidr?#Udoctitle_xformr@#Ustrip_elements_with_classesrA#NU _config_filesrB#]Ufile_insertion_enabledrC#U raw_enabledrD#KU dump_settingsrE#NubUsymbol_footnote_startrF#KUidsrG#}rH#(jV jR j j j j jjj.j4jjjdj`j j jjj jhKh5jEjAj)!j$!j h3j!j!j8j4jUjQjwj}j!j!j!h0j*!j$!j jjjjjhRh5j6j0j^ j` jvjrjjjjjjjjjjj j j!h0jjjjj`j\jljrjzjvjjj*j0jjj j jj}jjj j jjjjj?j;jVj\uUsubstitution_namesrI#}rJ#hAhMhC}rK#(hG]hE]hF]Usourceh:hH]hI]uU footnotesrL#]rM#UrefidsrN#}rO#(j]rP#jajw]rQ#jzaj!]rR#j!!aj]rS#jaj]rT#jaj.]rU#j1aj ]rV#j aj]rW#jaj!]rX#j!ajl]rY#joaj^ ]rZ#j[ aj]r[#jaj*]r\#j-ahK]r]#h?aj]r^#jaj)!]r_#j,!ajV]r`#jYaj ]ra#j aj]rb#jauub.PKJtD27buildbot-v0.8.8/.doctrees/manual/cfg-interlocks.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XcountqNX access-modesqX interlocksqU3U1X access modesq NU2Xexamplesq NXscopeq NuUsubstitution_defsq }q Uparse_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.8/master/docs/manual/cfg-interlocks.rstqq}qbUexpect_referenced_by_nameq}qhcdocutils.nodes target q )q!}q"(hX.. _Interlocks:hhhhUtagnameq#Utargetq$U attributesq%}q&(Uidsq']Ubackrefsq(]Udupnamesq)]Uclassesq*]Unamesq+]Urefidq,U interlocksq-uUlineq.KUdocumentq/hUchildrenq0]ubsh#Usectionq1h%}q2(h)]q3X interlocksq4ah*]h(]h']q5(h-Uid1q6eh+]q7hauh.Kh/hUexpect_referenced_by_idq8}q9h-h!sh0]q:(cdocutils.nodes title q;)q<}q=(hX Interlocksq>hhhhh#Utitleq?h%}q@(h)]h*]h(]h']h+]uh.Kh/hh0]qAcdocutils.nodes Text qBX InterlocksqCqD}qE(hh>hhr?}r@(hUhj:ubah#j6ubhBXY string is used for uniquely identifying the lock. At the next line, a slave lock called rArB}rC(hXY string is used for uniquely identifying the lock. At the next line, a slave lock called hjubj)rD}rE(hX:data:`build_lock`rFhjhhh#j!h%}rG(UreftypeXdataj#j$X build_lockU refdomainXpyrHh']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.KFh0]rIj+)rJ}rK(hjFh%}rL(h)]h*]rM(j0jHXpy-datarNeh(]h']h+]uhjDh0]rOhBX build_lockrPrQ}rR(hUhjJubah#j6ubaubhBX% is created. It is identified by the rSrT}rU(hX% is created. It is identified by the hjubj+)rV}rW(hX``slave_builds``h%}rX(h)]h*]h(]h']h+]uhjh0]rYhBX slave_buildsrZr[}r\(hUhjVubah#j6ubhBXw string. Since the requirements of the lock are a bit more complicated, two optional arguments are also specified. The r]r^}r_(hXw string. Since the requirements of the lock are a bit more complicated, two optional arguments are also specified. The hjubj+)r`}ra(hX ``maxCount``h%}rb(h)]h*]h(]h']h+]uhjh0]rchBXmaxCountrdre}rf(hUhj`ubah#j6ubhBXA parameter sets the default limit for builds in counting mode to rgrh}ri(hXA parameter sets the default limit for builds in counting mode to hjubj+)rj}rk(hX``1``h%}rl(h)]h*]h(]h']h+]uhjh0]rmhBX1rn}ro(hUhjjubah#j6ubhBX. For the slave called rprq}rr(hX. For the slave called hjubj+)rs}rt(hX ``'fast'``h%}ru(h)]h*]h(]h']h+]uhjh0]rvhBX'fast'rwrx}ry(hUhjsubah#j6ubhBXI however, we want to have at most three builds, and for the slave called rzr{}r|(hXI however, we want to have at most three builds, and for the slave called hjubj+)r}}r~(hX ``'new'``h%}r(h)]h*]h(]h']h+]uhjh0]rhBX'new'rr}r(hUhj}ubah#j6ubhBX8 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.hjubeubhF)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.hhhhh#hJh%}r(h)]h*]h(]h']h+]uh.KPh/hh0]r(hBX1The 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, hjubhl)r}r(hX[#]_hoKhjh#hph%}r(hrKh']rUid4rah(]h)]h*]h+]h,Uid7ruh0]rhBX2r}r(hUhjubaubhBX= 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.hjubeubhF)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"``.hhhhh#hJh%}r(h)]h*]h(]h']h+]uh.KWh/hh0]r(hBX"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+]uhjh0]rhBXlocksrr}r(hUhjubah#j6ubhBX 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+]uhjh0]rhBXlock.access(mode)rr}r(hUhjubah#j6ubhBX, where rr}r(hX, where hjubj)r}r(hX :data:`mode`rhjhhh#j!h%}r(UreftypeXdataj#j$XmodeU refdomainXpyrh']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.KWh0]rj+)r}r(hjh%}r(h)]h*]r(j0jXpy-datareh(]h']h+]uhjh0]rhBXmoderr}r(hUhjubah#j6ubaubhBX is one of rr}r(hX is one of hjubj+)r}r(hX``"counting"``h%}r(h)]h*]h(]h']h+]uhjh0]rhBX "counting"rr}r(hUhjubah#j6ubhBX or rr}r(hX or hjubj+)r}r(hX``"exclusive"``h%}r(h)]h*]h(]h']h+]uhjh0]rhBX "exclusive"rr}r(hUhjubah#j6ubhBX.r}r(hX.hjubeubhF)r}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 [#]_ by other builds that need fewer locks.hhhhh#hJh%}r(h)]h*]h(]h']h+]uh.K\h/hh0]r(hBXA 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 rr}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 hjubhl)r}r(hX[#]_hoKhjh#hph%}r(hrKh']rUid5rah(]h)]h*]h+]h,Uid8ruh0]rhBX3r}r(hUhjubaubhBX' by other builds that need fewer locks.rr}r(hX' by other builds that need fewer locks.hjubeubhF)r}r(hX.To illustrate use of locks, a few examples. ::rhhhhh#hJh%}r(h)]h*]h(]h']h+]uh.K`h/hh0]rhBX+To illustrate use of locks, a few examples.rr}r(hX+To illustrate use of locks, a few examples.hjubaubj )r}r(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]hhhhh#jh%}r(jjh']h(]h)]h*]h+]uh.Kbh/hh0]rhBXSfrom 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]rr}r(hUhjubaubhF)r}r(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.hhhhh#hJh%}r(h)]h*]h(]h']h+]uh.Kh/hh0]r(hBXHere we have four slaves rr}r(hXHere we have four slaves hjubj)r}r(hX :data:`b1`rhjhhh#j!h%}r(UreftypeXdataj#j$Xb1U refdomainXpyrh']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.Kh0]rj+)r }r (hjh%}r (h)]h*]r (j0jXpy-datar eh(]h']h+]uhjh0]rhBXb1rr}r(hUhj ubah#j6ubaubhBX, rr}r(hX, hjubj)r}r(hX :data:`b2`rhjhhh#j!h%}r(UreftypeXdataj#j$Xb2U refdomainXpyrh']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.Kh0]rj+)r}r(hjh%}r(h)]h*]r(j0jXpy-datareh(]h']h+]uhjh0]r hBXb2r!r"}r#(hUhjubah#j6ubaubhBX, r$r%}r&(hX, hjubj)r'}r((hX :data:`b3`r)hjhhh#j!h%}r*(UreftypeXdataj#j$Xb3U refdomainXpyr+h']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.Kh0]r,j+)r-}r.(hj)h%}r/(h)]h*]r0(j0j+Xpy-datar1eh(]h']h+]uhj'h0]r2hBXb3r3r4}r5(hUhj-ubah#j6ubaubhBX, and r6r7}r8(hX, and hjubj)r9}r:(hX :data:`b4`r;hjhhh#j!h%}r<(UreftypeXdataj#j$Xb4U refdomainXpyr=h']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.Kh0]r>j+)r?}r@(hj;h%}rA(h)]h*]rB(j0j=Xpy-datarCeh(]h']h+]uhj9h0]rDhBXb4rErF}rG(hUhj?ubah#j6ubaubhBX. 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 rHrI}rJ(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 hjubj+)rK}rL(hX ``locks=``h%}rM(h)]h*]h(]h']h+]uhjh0]rNhBXlocks=rOrP}rQ(hUhjKubah#j6ubhBXg parameter with the third step. It takes a list of locks with their access mode. In this case only the rRrS}rT(hXg parameter with the third step. It takes a list of locks with their access mode. In this case only the hjubj)rU}rV(hX:data:`db_lock`rWhjhhh#j!h%}rX(UreftypeXdataj#j$Xdb_lockU refdomainXpyrYh']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.Kh0]rZj+)r[}r\(hjWh%}r](h)]h*]r^(j0jYXpy-datar_eh(]h']h+]uhjUh0]r`hBXdb_lockrarb}rc(hUhj[ubah#j6ubaubhBXo is needed. The exclusive access mode is used to ensure there is at most one slave that executes the test step.rdre}rf(hXo is needed. The exclusive access mode is used to ensure there is at most one slave that executes the test step.hjubeubhF)rg}rh(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')]``.hhhhh#hJh%}ri(h)]h*]h(]h']h+]uh.Kh/hh0]rj(hBXIn 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 rkrl}rm(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 hjgubj)rn}ro(hX:data:`build_lock`rphjghhh#j!h%}rq(UreftypeXdataj#j$X build_lockU refdomainXpyrrh']h(]U refexplicith)]h*]h+]j&j'j(Nj)Nuh.Kh0]rsj+)rt}ru(hjph%}rv(h)]h*]rw(j0jrXpy-datarxeh(]h']h+]uhjnh0]ryhBX build_lockrzr{}r|(hUhjtubah#j6ubaubhBXd is defined. Since the restraint holds for entire builds, the lock is specified in the builder with r}r~}r(hXd is defined. Since the restraint holds for entire builds, the lock is specified in the builder with hjgubj+)r}r(hX,``'locks': [build_lock.access('counting')]``h%}r(h)]h*]h(]h']h+]uhjgh0]rhBX('locks': [build_lock.access('counting')]rr}r(hUhjubah#j6ubhBX.r}r(hX.hjgubeubhF)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.hhhhh#hJh%}r(h)]h*]h(]h']h+]uh.Kh/hh0]r(hBX$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+]uhjh0]rhBXlock.access(mode)rr}r(hUhjubah#j6ubhBX written as rr}r(hX written as hjubj+)r}r(hX``LockAccess(lock, mode)``h%}r(h)]h*]h(]h']h+]uhjh0]rhBXLockAccess(lock, mode)rr}r(hUhjubah#j6ubhBX7. 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. hhhhh#Ufootnoterh%}r(hrKh']rhuah(]rhtah)]h*]h+]rU1auh.Kh/hh0]r(cdocutils.nodes label r)r}r(hUhjhNh#Ulabelrh%}r(h)]h*]h(]h']h+]uh.Nh/hh0]rhBX1r}r(hUhjubaubhF)r}r(hXNSee http://en.wikipedia.org/wiki/Read/write_lock_pattern for more information.hjhhh#hJh%}r(h)]h*]h(]h']h+]uh.Kh0]r(hBXSee rr}r(hXSee hjubcdocutils.nodes reference r)r}r(hX4http://en.wikipedia.org/wiki/Read/write_lock_patternrh%}r(Urefurijh']h(]h)]h*]h+]uhjh0]rhBX4http://en.wikipedia.org/wiki/Read/write_lock_patternrr}r(hUhjubah#U referencerubhBX 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. hhhhh#jh%}r(hrKh']rjah(]rjah)]h*]h+]rU2auh.Kh/hh0]r(j)r}r(hUhjhNh#jh%}r(h)]h*]h(]h']h+]uh.Nh/hh0]rhBX2r}r(hUhjubaubhF)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.rhjhhh#hJh%}r(h)]h*]h(]h']h+]uh.Kh0]rhBXDeadlock 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.rr}r(hjhjubaubeubj)r}r(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. hhhhh#jh%}r(hrKh']rjah(]rjah)]h*]h+]rU3auh.Kh/hh0]r(j)r}r(hUhjhNh#jh%}r(h)]h*]h(]h']h+]uh.Nh/hh0]rhBX3r}r(hUhjubaubhF)r}r(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.rhjhhh#hJh%}r(h)]h*]h(]h']h+]uh.Kh0]rhBXStarving 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.rr}r(hjhjubaubeubeubeubhhh#Usystem_messagerh%}r(h)]UlevelKh']h(]rh6aUsourcehh*]h+]UlineKUtypeUINFOruh.Kh/hh0]rhF)r}r(hUh%}r(h)]h*]h(]h']h+]uhhh0]rhBX-Duplicate implicit target name: "interlocks".rr}r(hUhjubah#hJubaubaUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hhhhShh-U3jU1huh hYU2jh hh huh0]r(cdocutils.nodes comment r)r}r(hX -*- rst -*-hhhhh#Ucommentrh%}r (jjh']h(]h)]h*]h+]uh.Kh/hh0]r hBX -*- rst -*-r r }r (hUhjubaubh!hehUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]r(hmjjeUsymbol_footnote_refsr]rU citationsr]rh/hU current_linerNUtransform_messagesr]r(h)r}r(hUh%}r (h)]UlevelKh']h(]Usourcehh*]h+]UlineKUtypejuh0]r!hF)r"}r#(hUh%}r$(h)]h*]h(]h']h+]uhjh0]r%hBX0Hyperlink target "interlocks" is not referenced.r&r'}r((hUhj"ubah#hJubah#jubh)r)}r*(hUh%}r+(h)]UlevelKh']h(]Usourcehh*]h+]UlineK Utypejuh0]r,hF)r-}r.(hUh%}r/(h)]h*]h(]h']h+]uhj)h0]r0hBX2Hyperlink target "access-modes" is not referenced.r1r2}r3(hUhj-ubah#hJubah#jubeUreporterr4NUid_startr5K U autofootnotesr6]r7(jjjeU citation_refsr8}r9Uindirect_targetsr:]r;Usettingsr<(cdocutils.frontend Values r=or>}r?(Ufootnote_backlinksr@KUrecord_dependenciesrANU rfc_base_urlrBUhttp://tools.ietf.org/html/rCU tracebackrDUpep_referencesrENUstrip_commentsrFNU toc_backlinksrGUentryrHU language_coderIUenrJU datestamprKNU report_levelrLKU _destinationrMNU halt_levelrNKU strip_classesrONh?NUerror_encoding_error_handlerrPUbackslashreplacerQUdebugrRNUembed_stylesheetrSUoutput_encoding_error_handlerrTUstrictrUU sectnum_xformrVKUdump_transformsrWNU docinfo_xformrXKUwarning_streamrYNUpep_file_url_templaterZUpep-%04dr[Uexit_status_levelr\KUconfigr]NUstrict_visitorr^NUcloak_email_addressesr_Utrim_footnote_reference_spacer`UenvraNUdump_pseudo_xmlrbNUexpose_internalsrcNUsectsubtitle_xformrdU source_linkreNUrfc_referencesrfNUoutput_encodingrgUutf-8rhU source_urlriNUinput_encodingrjU utf-8-sigrkU_disable_configrlNU id_prefixrmUU tab_widthrnKUerror_encodingroUUTF-8rpU_sourcerqUV/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/manual/cfg-interlocks.rstrrUgettext_compactrsU generatorrtNUdump_internalsruNU smart_quotesrvU pep_base_urlrwUhttp://www.python.org/dev/peps/rxUsyntax_highlightryUlongrzUinput_encoding_error_handlerr{jUUauto_id_prefixr|Uidr}Udoctitle_xformr~Ustrip_elements_with_classesrNU _config_filesr]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hhhShTjjhujh-hjjjjhYhThthmh6hhhjjhhuUsubstitution_namesr}rh#h/h%}r(h)]h']h(]Usourcehh*]h+]uU footnotesr]rUrefidsr}r(hu]rhmaj]rjah-]rh!ahS]rhPaj]rjauub.PKJtDEF//>buildbot-v0.8.8/.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.8/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 commandh-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']r hL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-j h']rhHXDeferredrr}r(h,XDeferredh-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`rh-jh.h1h3hYh5}r(UreftypeXclassh[h\X RemoteCommandU refdomainXpyr h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>K3h']r!hd)r"}r#(h,jh5}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)r.}r/(h,Uh-jh.h1h3hh5}r0(h:]h9]h7]h8]h<]Uentries]r1(hX=interrupt() (buildbot.process.buildstep.RemoteCommand method)hUtr2auh>Nh?hh']ubh)r3}r4(h,Uh-jh.h1h3hh5}r5(hhXpyr6h:]h9]h7]h8]h<]hXmethodr7hj7uh>Nh?hh']r8(h)r9}r:(h,Xinterrupt(why)h-j3h.h1h3hh5}r;(h:]r<hahhbh9]h7]h8]h<]r=hahXRemoteCommand.interrupthhhuh>KAh?hh']r>(h)r?}r@(h,X interrupth-j9h.h1h3hh5}rA(h7]h8]h9]h:]h<]uh>KAh?hh']rBhHX interruptrCrD}rE(h,Uh-j?ubaubh)rF}rG(h,Uh-j9h.h1h3hh5}rH(h7]h8]h9]h:]h<]uh>KAh?hh']rIh)rJ}rK(h,Xwhyh5}rL(h7]h8]h9]h:]h<]uh-jFh']rMhHXwhyrNrO}rP(h,Uh-jJubah3hubaubeubj)rQ}rR(h,Uh-j3h.h1h3jh5}rS(h7]h8]h9]h:]h<]uh>KAh?hh']rT(j)rU}rV(h,Uh-jQh.h1h3j h5}rW(h7]h8]h9]h:]h<]uh>Nh?hh']rX(j)rY}rZ(h,Uh5}r[(h7]h8]h9]h:]h<]uh-jUh']r\(j)r]}r^(h,Uh5}r_(h7]h8]h9]h:]h<]uh-jYh']r`hHX Parametersrarb}rc(h,Uh-j]ubah3jubj)rd}re(h,Uh5}rf(h7]h8]h9]h:]h<]uh-jYh']rghL)rh}ri(h,Uh5}rj(h7]h8]h9]h:]h<]uh-jdh']rk(j/)rl}rm(h,Xwhyh5}rn(h7]h8]h9]h:]h<]uh-jhh']rohHXwhyrprq}rr(h,Uh-jlubah3j7ubhHX (rsrt}ru(h,Uh-jhubhU)rv}rw(h,Uh5}rx(Ureftypej>U reftargetXTwisted FailureryU refdomainj6h:]h9]U refexplicith7]h8]h<]uh-jhh']rzh)r{}r|(h,jyh5}r}(h7]h8]h9]h:]h<]uh-jvh']r~hHXTwisted Failurerr}r(h,Uh-j{ubah3hubah3hYubhHX)r}r(h,Uh-jhubhHX -- rr}r(h,Uh-jhubhHXreason for interruptrr}r(h,Xreason for interrupth-jhubeh3hOubah3jubeh3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jUh']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-jQh.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 constanth-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 Utrauh>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-jh.h1h3hh5}r(h:]rh ahhbh9]h7]h8]h<]rh ahXRemoteCommand.didFailhhhuh>KMh?hh']r(h)r}r(h,XdidFailh-j h.h1h3hh5}r(h7]h8]h9]h:]h<]uh>KMh?hh']rhHXdidFailrr}r(h,Uh-jubaubh)r}r(h,Uh-j h.h1h3hh5}r(h7]h8]h9]h:]h<]uh>KMh?hh']ubeubj)r}r(h,Uh-jh.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,r-}r.(h,Uh-j(ubah3jubj)r/}r0(h,Uh5}r1(h7]h8]h9]h:]h<]uh-j$h']r2hL)r3}r4(h,Uh5}r5(h7]h8]h9]h:]h<]uh-j/h']r6hHXboolr7r8}r9(h,Xboolh-j3ubah3hOubah3jubeh3jubaubhL)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']r>hHXBThis method returns True if the results() function returns FAILUREr?r@}rA(h,j<h-j:ubaubeubeubhL)rB}rC(h,XVThe following methods are invoked from the slave. They should not be called directly.rDh-jh.h1h3hOh5}rE(h7]h8]h9]h:]h<]uh>KNh?hh']rFhHXVThe following methods are invoked from the slave. They should not be called directly.rGrH}rI(h,jDh-jBubaubh)rJ}rK(h,Uh-jh.h1h3hh5}rL(h:]h9]h7]h8]h<]Uentries]rM(hXAremote_update() (buildbot.process.buildstep.RemoteCommand method)hUtrNauh>Nh?hh']ubh)rO}rP(h,Uh-jh.h1h3hh5}rQ(hhXpyh:]h9]h7]h8]h<]hXmethodrRhjRuh>Nh?hh']rS(h)rT}rU(h,Xremote_update(updates)h-jOh.h1h3hh5}rV(h:]rWhahhbh9]h7]h8]h<]rXhahXRemoteCommand.remote_updatehhhuh>KYh?hh']rY(h)rZ}r[(h,X remote_updateh-jTh.h1h3hh5}r\(h7]h8]h9]h:]h<]uh>KYh?hh']r]hHX remote_updater^r_}r`(h,Uh-jZubaubh)ra}rb(h,Uh-jTh.h1h3hh5}rc(h7]h8]h9]h:]h<]uh>KYh?hh']rdh)re}rf(h,Xupdatesh5}rg(h7]h8]h9]h:]h<]uh-jah']rhhHXupdatesrirj}rk(h,Uh-jeubah3hubaubeubj)rl}rm(h,Uh-jOh.h1h3jh5}rn(h7]h8]h9]h:]h<]uh>KYh?hh']ro(j)rp}rq(h,Uh-jlh.h1h3j h5}rr(h7]h8]h9]h:]h<]uh>Nh?hh']rsj)rt}ru(h,Uh5}rv(h7]h8]h9]h:]h<]uh-jph']rw(j)rx}ry(h,Uh5}rz(h7]h8]h9]h:]h<]uh-jth']r{hHX Parametersr|r}}r~(h,Uh-jxubah3jubj)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jth']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-jlh.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 hHXfailurer r }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-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']rhHXrcr 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-r.}r/(h,X1 is set, then the step should finish with status h-jubhU)r0}r1(h,X*:attr:`~buildbot.status.results.EXCEPTION`r2h-jh.h1h3hYh5}r3(UreftypeXattrh[h\X!buildbot.status.results.EXCEPTIONU refdomainXpyr4h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>K_h']r5hd)r6}r7(h,j2h5}r8(h7]h8]r9(hij4Xpy-attrr:eh9]h:]h<]uh-j0h']r;hHX EXCEPTIONr<r=}r>(h,Uh-j6ubah3houbaubhHX.r?}r@(h,X.h-jubeubeubeubhL)rA}rB(h,X<These methods are hooks for subclasses to add functionality.rCh-jh.h1h3hOh5}rD(h7]h8]h9]h:]h<]uh>Kdh?hh']rEhHX<These methods are hooks for subclasses to add functionality.rFrG}rH(h,jCh-jAubaubh)rI}rJ(h,Uh-jh.h1h3hh5}rK(h:]h9]h7]h8]h<]Uentries]rL(hX@remoteUpdate() (buildbot.process.buildstep.RemoteCommand method)hUtrMauh>Nh?hh']ubh)rN}rO(h,Uh-jh.h1h3hh5}rP(hhXpyh:]h9]h7]h8]h<]hXmethodrQhjQuh>Nh?hh']rR(h)rS}rT(h,XremoteUpdate(update)h-jNh.h1h3hh5}rU(h:]rVhahhbh9]h7]h8]h<]rWhahXRemoteCommand.remoteUpdatehhhuh>Kkh?hh']rX(h)rY}rZ(h,X remoteUpdateh-jSh.h1h3hh5}r[(h7]h8]h9]h:]h<]uh>Kkh?hh']r\hHX remoteUpdater]r^}r_(h,Uh-jYubaubh)r`}ra(h,Uh-jSh.h1h3hh5}rb(h7]h8]h9]h:]h<]uh>Kkh?hh']rch)rd}re(h,Xupdateh5}rf(h7]h8]h9]h:]h<]uh-j`h']rghHXupdaterhri}rj(h,Uh-jdubah3hubaubeubj)rk}rl(h,Uh-jNh.h1h3jh5}rm(h7]h8]h9]h:]h<]uh>Kkh?hh']rn(j)ro}rp(h,Uh-jkh.h1h3j h5}rq(h7]h8]h9]h:]h<]uh>Nh?hh']rrj)rs}rt(h,Uh5}ru(h7]h8]h9]h:]h<]uh-joh']rv(j)rw}rx(h,Uh5}ry(h7]h8]h9]h:]h<]uh-jsh']rzhHX Parametersr{r|}r}(h,Uh-jwubah3jubj)r~}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-jsh']rhL)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-j~h']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 handleh-jubeh3hOubah3jubeh3jubaubhL)r}r(h,X>Handle a single update. Subclasses must override this method.rh-jkh.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']rhHXfailurerr }r (h,Uh-jubah3houbhHX@ is not None, it should be returned to ensure proper processing.r r }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<]rhahXRemoteCommand.logshhhuh>K{h?hh']rh)r}r (h,jh-jh.h1h3hh5}r!(h7]h8]h9]h:]h<]uh>K{h?hh']r"hHXlogsr#r$}r%(h,Uh-jubaubaubj)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']r-(hHXA dictionary of r.r/}r0(h,XA dictionary of h-j*ubhU)r1}r2(h,X):class:`~buildbot.status.logfile.LogFile`r3h-j*h.h1h3hYh5}r4(UreftypeXclassh[h\Xbuildbot.status.logfile.LogFileU refdomainXpyr5h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kxh']r6hd)r7}r8(h,j3h5}r9(h7]h8]r:(hij5Xpy-classr;eh9]h:]h<]uh-j1h']r<hHXLogFiler=r>}r?(h,Uh-j7ubah3houbaubhHXI instances representing active logs. Do not modify this directly -- use r@rA}rB(h,XI instances representing active logs. Do not modify this directly -- use h-j*ubhU)rC}rD(h,X:meth:`useLog`rEh-j*h.h1h3hYh5}rF(UreftypeXmethh[h\XuseLogU refdomainXpyrGh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kxh']rHhd)rI}rJ(h,jEh5}rK(h7]h8]rL(hijGXpy-methrMeh9]h:]h<]uh-jCh']rNhHXuseLogrOrP}rQ(h,Uh-jIubah3houbaubhHX instead.rRrS}rT(h,X instead.h-j*ubeubaubeubh)rU}rV(h,Uh-jh.h1h3hh5}rW(h:]h9]h7]h8]h<]Uentries]rX(hX7rc (buildbot.process.buildstep.RemoteCommand attribute)hUtrYauh>Nh?hh']ubh)rZ}r[(h,Uh-jh.h1h3hh5}r\(hhXpyh:]h9]h7]h8]h<]hX attributer]hj]uh>Nh?hh']r^(h)r_}r`(h,Xrcrah-jZh.h1h3hh5}rb(h:]rchahhbh9]h7]h8]h<]rdhahXRemoteCommand.rchhhuh>Kh?hh']reh)rf}rg(h,jah-j_h.h1h3hh5}rh(h7]h8]h9]h:]h<]uh>Kh?hh']rihHXrcrjrk}rl(h,Uh-jfubaubaubj)rm}rn(h,Uh-jZh.h1h3jh5}ro(h7]h8]h9]h:]h<]uh>Kh?hh']rphL)rq}rr(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.rsh-jmh.h1h3hOh5}rt(h7]h8]h9]h:]h<]uh>K~h?hh']ruhHXSet 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.rvrw}rx(h,jsh-jqubaubaubeubh)ry}rz(h,Uh-jh.h1h3hh5}r{(h:]h9]h7]h8]h<]Uentries]r|(hX;stdout (buildbot.process.buildstep.RemoteCommand attribute)hUtr}auh>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-j~h.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-j~h.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']rhHXlogfileName=Nonerr }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-j h.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-jh']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,Xlogh5}r0(h7]h8]h9]h:]h<]uh-j*h']r1hHXlogr2r3}r4(h,Uh-j.ubah3j7ubhHX -- r5r6}r7(h,Uh-j*ubhHXthe r8r9}r:(h,Xthe h-j*ubhU)r;}r<(h,X):class:`~buildbot.status.logfile.LogFile`r=h-j*h.h1h3hYh5}r>(UreftypeXclassh[h\Xbuildbot.status.logfile.LogFileU refdomainXpyr?h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']r@hd)rA}rB(h,j=h5}rC(h7]h8]rD(hij?Xpy-classrEeh9]h:]h<]uh-j;h']rFhHXLogFilerGrH}rI(h,Uh-jAubah3houbaubhHX instance to add to.rJrK}rL(h,X instance to add to.h-j*ubeh3hOubah3jQubj&)rM}rN(h,Uh5}rO(h7]h8]h9]h:]h<]uh-j"h']rPhL)rQ}rR(h,Uh5}rS(h7]h8]h9]h:]h<]uh-jMh']rT(j/)rU}rV(h,XcloseWhenFinishedh5}rW(h7]h8]h9]h:]h<]uh-jQh']rXhHXcloseWhenFinishedrYrZ}r[(h,Uh-jUubah3j7ubhHX -- r\r]}r^(h,Uh-jQubhHXif true, call r_r`}ra(h,Xif true, call h-jQubhU)rb}rc(h,X/:meth:`~buildbot.status.logfile.LogFile.finish`rdh-jQh.h1h3hYh5}re(UreftypeXmethh[h\X&buildbot.status.logfile.LogFile.finishU refdomainXpyrfh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rghd)rh}ri(h,jdh5}rj(h7]h8]rk(hijfXpy-methrleh9]h:]h<]uh-jbh']rmhHXfinishrnro}rp(h,Uh-jhubah3houbaubhHX when the command is finished.rqrr}rs(h,X when the command is finished.h-jQubeh3hOubah3jQubj&)rt}ru(h,Uh5}rv(h7]h8]h9]h:]h<]uh-j"h']rwhL)rx}ry(h,Uh5}rz(h7]h8]h9]h:]h<]uh-jth']r{(j/)r|}r}(h,X logfileNameh5}r~(h7]h8]h9]h:]h<]uh-jxh']rhHX logfileNamerr}r(h,Uh-j|ubah3j7ubhHX -- rr}r(h,Uh-jxubhHX8the 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-jxubhd)r}r(h,X ``stdio``h5}r(h7]h8]h9]h:]h<]uh-jxh']rhHXstdiorr}r(h,Uh-jubah3houbhHX for standard streams.rr}r(h,X for standard streams.h-jxubeh3hOubah3jQubeh3jubah3jubeh3jubaubhL)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-j h.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,XJuseLogDelayed(log, 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,Xlogh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXlogrr}r(h,Uh-jubah3hubh)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-j h']r(j/)r}r(h,Xlogh5}r(h7]h8]h9]h:]h<]uh-jh']rhHXlogrr}r(h,Uh-jubah3j7ubhHX -- rr}r(h,Uh-jubhHXthe rr}r(h,Xthe h-jubhU)r}r (h,X):class:`~buildbot.status.logfile.LogFile`r!h-jh.h1h3hYh5}r"(UreftypeXclassh[h\Xbuildbot.status.logfile.LogFileU refdomainXpyr#h:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']r$hd)r%}r&(h,j!h5}r'(h7]h8]r((hij#Xpy-classr)eh9]h:]h<]uh-jh']r*hHXLogFiler+r,}r-(h,Uh-j%ubah3houbaubhHX instance to add to.r.r/}r0(h,X instance to add to.h-jubeh3hOubah3jQubj&)r1}r2(h,Uh5}r3(h7]h8]h9]h:]h<]uh-jh']r4hL)r5}r6(h,Uh5}r7(h7]h8]h9]h:]h<]uh-j1h']r8(j/)r9}r:(h,X logfileNameh5}r;(h7]h8]h9]h:]h<]uh-j5h']r<hHX logfileNamer=r>}r?(h,Uh-j9ubah3j7ubhHX -- r@rA}rB(h,Uh-j5ubhHX8the name of the logfile, as given to the slave. This is rCrD}rE(h,X8the name of the logfile, as given to the slave. This is h-j5ubhd)rF}rG(h,X ``stdio``h5}rH(h7]h8]h9]h:]h<]uh-j5h']rIhHXstdiorJrK}rL(h,Uh-jFubah3houbhHX for standard streams.rMrN}rO(h,X for standard streams.h-j5ubeh3hOubah3jQubj&)rP}rQ(h,Uh5}rR(h7]h8]h9]h:]h<]uh-jh']rShL)rT}rU(h,Uh5}rV(h7]h8]h9]h:]h<]uh-jPh']rW(j/)rX}rY(h,XactivateCallbackh5}rZ(h7]h8]h9]h:]h<]uh-jTh']r[hHXactivateCallbackr\r]}r^(h,Uh-jXubah3j7ubhHX -- r_r`}ra(h,Uh-jTubhHX-callback for when the log is added; see belowrbrc}rd(h,X-callback for when the log is added; see belowreh-jTubeh3hOubah3jQubj&)rf}rg(h,Uh5}rh(h7]h8]h9]h:]h<]uh-jh']rihL)rj}rk(h,Uh5}rl(h7]h8]h9]h:]h<]uh-jfh']rm(j/)rn}ro(h,XcloseWhenFinishedh5}rp(h7]h8]h9]h:]h<]uh-jjh']rqhHXcloseWhenFinishedrrrs}rt(h,Uh-jnubah3j7ubhHX -- rurv}rw(h,Uh-jjubhHXif true, call rxry}rz(h,Xif true, call h-jjubhU)r{}r|(h,X/:meth:`~buildbot.status.logfile.LogFile.finish`r}h-jjh.h1h3hYh5}r~(UreftypeXmethh[h\X&buildbot.status.logfile.LogFile.finishU refdomainXpyrh:]h9]U refexplicith7]h8]h<]h^h_h`hhahbuh>Kh']rhd)r}r(h,j}h5}r(h7]h8]r(hijXpy-methreh9]h:]h<]uh-j{h']rhHXfinishrr}r(h,Uh-jubah3houbaubhHX when the command is finished.rr}r(h,X when the command is finished.h-jjubeh3hOubah3jQubeh3jubah3jubeh3jubaubhL)r}r(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}r(h7]h8]h9]h:]h<]uh>Kh?hh']r(hHX Similar to rr}r(h,X Similar to 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-jubah3houbaubhHXW, but the logfile is only actually added when an update arrives for it. The callback, rr}r(h,XW, but the logfile is only actually added when an update arrives for it. The callback, h-jubhd)r}r(h,X``activateCallback``h5}r(h7]h8]h9]h:]h<]uh-jh']rhHXactivateCallbackrr}r(h,Uh-jubah3houbhHX, will be called with the rr}r(h,X, will be called with the h-jubhU)r}r(h,X2:class:`~buildbot.process.buildstep.RemoteCommand`rh-jh.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-jubeubeubeubhL)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']r j)r }r (h,Uh-jh.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 logfiler% h-j ubeh3hOubah3jubeh3jubaubaubeubhL)r& }r' (h,X%Add stdout data to the ``stdio`` log.r( h-jh.h1h3hOh5}r) (h7]h8]h9]h:]h<]uh>Kh?hh']r* (hHXAdd stdout data to the r+ r, }r- (h,XAdd stdout data to the h-j& ubhd)r. }r/ (h,X ``stdio``h5}r0 (h7]h8]h9]h:]h<]uh-j& h']r1 hHXstdior2 r3 }r4 (h,Uh-j. ubah3houbhHX log.r5 r6 }r7 (h,X log.h-j& ubeubh)r8 }r9 (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']rA (h)rB }rC (h,XaddStderr(data)h-j= h.h1h3hh5}rD (h:]rE hahhbh9]h7]h8]h<]rF hahXRemoteCommand.addStderrhhhuh>Kh?hh']rG (h)rH }rI (h,X addStderrh-jB h.h1h3hh5}rJ (h7]h8]h9]h:]h<]uh>Kh?hh']rK hHX addStderrrL rM }rN (h,Uh-jH ubaubh)rO }rP (h,Uh-jB h.h1h3hh5}rQ (h7]h8]h9]h:]h<]uh>Kh?hh']rR h)rS }rT (h,Xdatah5}rU (h7]h8]h9]h:]h<]uh-jO h']rV hHXdatarW rX }rY (h,Uh-jS ubah3hubaubeubj)rZ }r[ (h,Uh-j= h.h1h3jh5}r\ (h7]h8]h9]h:]h<]uh>Kh?hh']r] j)r^ }r_ (h,Uh-jZ h.Nh3j h5}r` (h7]h8]h9]h:]h<]uh>Nh?hh']ra j)rb }rc (h,Uh5}rd (h7]h8]h9]h:]h<]uh-j^ h']re (j)rf }rg (h,Uh5}rh (h7]h8]h9]h:]h<]uh-jb h']ri hHX Parametersrj rk }rl (h,Uh-jf ubah3jubj)rm }rn (h,Uh5}ro (h7]h8]h9]h:]h<]uh-jb h']rp hL)rq }rr (h,Uh5}rs (h7]h8]h9]h:]h<]uh-jm h']rt (j/)ru }rv (h,Xdatah5}rw (h7]h8]h9]h:]h<]uh-jq h']rx hHXdatary rz }r{ (h,Uh-ju ubah3j7ubhHX -- r| r} }r~ (h,Uh-jq ubhHXdata to add to the logfiler r }r (h,Xdata to add to the logfileh-jq ubeh3hOubah3jubeh3jubaubaubeubhL)r }r (h,X%Add stderr data to the ``stdio`` log.r h-jh.h1h3hOh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r (hHXAdd stderr data to the r r }r (h,XAdd stderr 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=addHeader() (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,XaddHeader(data)h-j h.h1h3hh5}r (h:]r hahhbh9]h7]h8]h<]r hahXRemoteCommand.addHeaderhhhuh>Kh?hh']r (h)r }r (h,X addHeaderh-j h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r hHX addHeaderr 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']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 logfiler h-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']r0 j!)r1 }r2 (h,Uh5}r3 (h7]h8]h9]h:]h<]uh-j- h']r4 (j&)r5 }r6 (h,Uh5}r7 (h7]h8]h9]h:]h<]uh-j1 h']r8 hL)r9 }r: (h,Uh5}r; (h7]h8]h9]h:]h<]uh-j5 h']r< (j/)r= }r> (h,Xlognameh5}r? (h7]h8]h9]h:]h<]uh-j9 h']r@ hHXlognamerA rB }rC (h,Uh-j= ubah3j7ubhHX -- rD rE }rF (h,Uh-j9 ubhHXthe logfile to receive the datarG rH }rI (h,Xthe logfile to receive the datarJ h-j9 ubeh3hOubah3jQubj&)rK }rL (h,Uh5}rM (h7]h8]h9]h:]h<]uh-j1 h']rN hL)rO }rP (h,Uh5}rQ (h7]h8]h9]h:]h<]uh-jK h']rR (j/)rS }rT (h,Xdatah5}rU (h7]h8]h9]h:]h<]uh-jO h']rV hHXdatarW rX }rY (h,Uh-jS ubah3j7ubhHX -- rZ r[ }r\ (h,Uh-jO ubhHXdata to add to the logfiler] r^ }r_ (h,Xdata to add to the logfiler` h-jO ubeh3hOubah3jQubeh3jubah3jubeh3jubaubaubeubhL)ra }rb (h,X+Add data to a logfile other than ``stdio``.rc h-jh.h1h3hOh5}rd (h7]h8]h9]h:]h<]uh>Kh?hh']re (hHX!Add data to a logfile other than rf rg }rh (h,X!Add data to a logfile other than h-ja ubhd)ri }rj (h,X ``stdio``h5}rk (h7]h8]h9]h:]h<]uh-ja h']rl hHXstdiorm rn }ro (h,Uh-ji ubah3houbhHX.rp }rq (h,X.h-ja ubeubeubeubh)rr }rs (h,Uh-hh.h1h3hh5}rt (h:]h9]h7]h8]h<]Uentries]ru (hX8RemoteShellCommand (class in buildbot.process.buildstep)hUtrv auh>Nh?hh']ubh)rw }rx (h,Uh-hh.h1h3hh5}ry (hhXpyrz h:]h9]h7]h8]h<]hXclassr{ hj{ uh>Nh?hh']r| (h)r} }r~ (h,XRemoteShellCommand(workdir, command, env=None, want_stdout=True, want_stderr=True, timeout=20*60, maxTime=None, logfiles={}, usePTY="slave-config", logEnviron=True, collectStdio=False)h-jw h.h1h3hh5}r (h:]r hahhbh9]h7]h8]h<]r hahXRemoteShellCommandr hUhuh>Kh?hh']r (h)r }r (h,Xclass h-j} h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r hHXclass r r }r (h,Uh-j ubaubh)r }r (h,Xbuildbot.process.buildstep.h-j} h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r hHXbuildbot.process.buildstep.r r }r (h,Uh-j ubaubh)r }r (h,j h-j} h.h1h3hh5}r (h7]h8]h9]h:]h<]uh>Kh?hh']r hHXRemoteShellCommandr 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,Xworkdirh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXworkdirr r }r (h,Uh-j ubah3hubh)r }r (h,Xcommandh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXcommandr r }r (h,Uh-j ubah3hubh)r }r (h,Xenv=Noneh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXenv=Noner r }r (h,Uh-j ubah3hubh)r }r (h,Xwant_stdout=Trueh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXwant_stdout=Truer r }r (h,Uh-j ubah3hubh)r }r (h,Xwant_stderr=Trueh5}r (h7]h8]h9]h:]h<]uh-j 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-j 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-j h']r hHX maxTime=Noner r }r (h,Uh-j ubah3hubh)r }r (h,X logfiles={}h5}r (h7]h8]h9]h:]h<]uh-j 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-j h']r hHXusePTY="slave-config"r r }r (h,Uh-j ubah3hubh)r }r (h,XlogEnviron=Trueh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXlogEnviron=Truer r }r (h,Uh-j ubah3hubh)r }r (h,XcollectStdio=Falseh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXcollectStdio=Falser r }r (h,Uh-j ubah3hubeubeubj)r }r (h,Uh-jw 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 listr0 U refdomainjz h:]h9]U refexplicith7]h8]h<]uh-j h']r1 h)r2 }r3 (h,j0 h5}r4 (h7]h8]h9]h:]h<]uh-j- h']r5 hHXstring or listr6 r7 }r8 (h,Uh-j2 ubah3hubah3hYubhHX)r9 }r: (h,Uh-j ubhHX -- r; r< }r= (h,Uh-j ubhHXshell command to runr> r? }r@ (h,Xshell command to runrA h-j ubeh3hOubah3jQubj&)rB }rC (h,Uh5}rD (h7]h8]h9]h:]h<]uh-j h']rE hL)rF }rG (h,Uh5}rH (h7]h8]h9]h:]h<]uh-jB h']rI (j/)rJ }rK (h,X want_stdouth5}rL (h7]h8]h9]h:]h<]uh-jF h']rM hHX want_stdoutrN rO }rP (h,Uh-jJ ubah3j7ubhHX -- rQ rR }rS (h,Uh-jF ubhHX2If false, then no updates will be sent for stdout.rT rU }rV (h,X2If false, then no updates will be sent for stdout.rW h-jF ubeh3hOubah3jQubj&)rX }rY (h,Uh5}rZ (h7]h8]h9]h:]h<]uh-j h']r[ hL)r\ }r] (h,Uh5}r^ (h7]h8]h9]h:]h<]uh-jX h']r_ (j/)r` }ra (h,X want_stderrh5}rb (h7]h8]h9]h:]h<]uh-j\ h']rc hHX want_stderrrd re }rf (h,Uh-j` ubah3j7ubhHX -- rg rh }ri (h,Uh-j\ ubhHX2If false, then no updates will be sent for stderr.rj rk }rl (h,X2If false, then no updates will be sent for stderr.rm h-j\ ubeh3hOubah3jQubj&)rn }ro (h,Uh5}rp (h7]h8]h9]h:]h<]uh-j h']rq hL)rr }rs (h,Uh5}rt (h7]h8]h9]h:]h<]uh-jn h']ru (j/)rv }rw (h,Xtimeouth5}rx (h7]h8]h9]h:]h<]uh-jr h']ry hHXtimeoutrz r{ }r| (h,Uh-jv ubah3j7ubhHX -- r} r~ }r (h,Uh-jr ubhHX9Maximum time without output before the command is killed.r r }r (h,X9Maximum time without output before the command is killed.r h-jr 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,XmaxTimeh5}r (h7]h8]h9]h:]h<]uh-j h']r hHXmaxTimer r }r (h,Uh-j ubah3j7ubhHX -- r r }r (h,Uh-j ubhHXAMaximum overall time from the start before the command is killed.r r }r (h,XAMaximum overall time from the start before the command is killed.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,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,XqThis class is used by the :bb:step:`ShellCommand` step, and by steps that run multiple customized shell commands.h-j h.h1h3hOh5}r- (h7]h8]h9]h:]h<]uh>Kh?hh']r. (hHXThis class is used by the r/ r0 }r1 (h,XThis class is used by the h-j+ ubhU)r2 }r3 (h,X:bb:step:`ShellCommand`r4 h-j+ h.h1h3hYh5}r5 (UreftypeXsteph[h\X ShellCommandU refdomainXbbr6 h:]h9]U refexplicith7]h8]h<]h^h_uh>Kh']r7 hd)r8 }r9 (h,j4 h5}r: (h7]h8]r; (hij6 Xbb-stepr< eh9]h:]h<]uh-j2 h']r= hHX ShellCommandr> r? }r@ (h,Uh-j8 ubah3houbaubhHX@ step, and by steps that run multiple customized shell commands.rA rB }rC (h,X@ step, and by steps that run multiple customized shell commands.h-j+ ubeubeubeubeubeubah,UU transformerrD NU footnote_refsrE }rF UrefnamesrG }rH Usymbol_footnotesrI ]rJ Uautofootnote_refsrK ]rL Usymbol_footnote_refsrM ]rN U citationsrO ]rP h?hU current_linerQ NUtransform_messagesrR ]rS UreporterrT NUid_startrU KU autofootnotesrV ]rW U citation_refsrX }rY Uindirect_targetsrZ ]r[ Usettingsr\ (cdocutils.frontend Values r] or^ }r_ (Ufootnote_backlinksr` KUrecord_dependenciesra NU rfc_base_urlrb Uhttp://tools.ietf.org/html/rc U tracebackrd Upep_referencesre NUstrip_commentsrf NU toc_backlinksrg Uentryrh U language_coderi Uenrj U datestamprk NU report_levelrl KU _destinationrm NU halt_levelrn KU strip_classesro NhENUerror_encoding_error_handlerrp Ubackslashreplacerq Udebugrr NUembed_stylesheetrs Uoutput_encoding_error_handlerrt Ustrictru U sectnum_xformrv KUdump_transformsrw NU docinfo_xformrx KUwarning_streamry NUpep_file_url_templaterz 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.8/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 ju 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 (hjThjhjh jh%hh hh j h j hj9hjB hjhjhj hj} hjShjhjhjhjeh&h*hjhj_uUsubstitution_namesr }r h3h?h5}r (h7]h:]h9]Usourceh1h8]h<]uU footnotesr ]r Urefidsr }r ub.PKJtDa'^NN5buildbot-v0.8.8/.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.8/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.8/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.PKJtD8FF1buildbot-v0.8.8/.doctrees/developer/utils.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X"raymond hettinger's implementationqX'buildbot.util.misc.SerializedInvocationqX%buildbot.util.state.StateMixin.masterqX'buildbot.util.state.StateMixin.getStateq Xbuildbot.util.subscriptionq NX netstringsq X-buildbot.util.netstrings.NetstringParser.feedq Xbuildbot.util.lru.hitsq Xbuildbot.util.none_or_strqXbuildbot.util.safeTranslateqXbuildbot.util.makeListqXbuildbot.util.eventualqNXbuildbot.util.stateqNX1buildbot.util.maildir.MaildirService.moveToCurDirqXbuildbot.util.naturalSortqX&buildbot.util.sautils.InsertFromSelectqXbuildbot.util.lru.max_sizeqXbuildbot.util.maildirqNXbuildbot.util.bbcollectionsqNX$buildbot.util.maildir.MaildirServiceqXbuildbot.util.diffSetsqX!buildbot.util.eventual.eventuallyqXbuildbot.util.UTCqXbuildbot.util.lru.invqXmaildirsqXbuildbot.util.in_reactorqX)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.fireEventuallyq)X#buildbot.util.state.StateMixin.nameq*X(buildbot.util.netstrings.NetstringParserq+X'buildbot.util.bbcollections.defaultdictq,Xbuildbot.util.ComparableMixinq-Xbuildbot.util.flattenq.Xbuildbot.util.netstringsq/NX!buildbot.util.misc.deferredLockedq0Xbuildbot.util.lru.refhitsq1X/buildbot.util.maildir.MaildirService.setBasedirq2Xbuildbot.util.jsonq3NX buildbot.util.sautils.sa_versionq4Xbuildbot.util.lru.putq5Xbuildbot.util.miscq6NXbuildbot.util.nowq7Xbuildbot.util.lru.getq8Xbuildbot.util.state.StateMixinq9Xbuildbot.util.formatIntervalq:Xbuildbot.util.croniterq;NX0buildbot.util.netstrings.NetstringParser.stringsquUsubstitution_defsq?}q@Uparse_messagesqA]qBUcurrent_sourceqCNU decorationqDNUautofootnote_startqEKUnameidsqF}qG(hU"raymond-hettinger-s-implementationqHhhhhh h h Ubuildbot-util-subscriptionqIh U netstringsqJh h h h hhhhhhhUbuildbot-util-eventualqKhUbuildbot-util-stateqLhhhhhhhhhUbuildbot-util-maildirqMhUbuildbot-util-bbcollectionsqNhhhhhhhhhhhUmaildirsqOhhh h h!h!h"h"h#h#h$h$h%U compiler-htmlqPh&Ubuildbot-util-lruqQh'h'h(U utilitiesqRh)h)h*h*h+h+h,h,h-h-h.h.h/Ubuildbot-util-netstringsqSh0h0h1h1h2h2h3Ubuildbot-util-jsonqTh4h4h5h5h6Ubuildbot-util-miscqUh7h7h8h8h9h9h:h:h;Ubuildbot-util-croniterqVhh>uUchildrenqX]qYcdocutils.nodes section qZ)q[}q\(U rawsourceq]UUparentq^hUsourceq_cdocutils.nodes reprunicode q`XP/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/utils.rstqaqb}qcbUtagnameqdUsectionqeU attributesqf}qg(Udupnamesqh]Uclassesqi]Ubackrefsqj]Uidsqk]ql(Xmodule-buildbot.utilqmhReUnamesqn]qoh(auUlineqpKUdocumentqqhhX]qr(cdocutils.nodes title qs)qt}qu(h]X Utilitiesqvh^h[h_hbhdUtitleqwhf}qx(hh]hi]hj]hk]hn]uhpKhqhhX]qycdocutils.nodes Text qzX Utilitiesq{q|}q}(h]hvh^htubaubcsphinx.addnodes index q~)q}q(h]Uh^h[h_hbhdUindexqhf}q(hk]hj]hh]hi]hn]Uentries]q(UsingleqXbuildbot.util (module)Xmodule-buildbot.utilUtqauhpKhqhhX]ubcdocutils.nodes paragraph q)q}q(h]XTSeveral small utilities are available at the top-level :mod:`buildbot.util` package.h^h[h_hbhdU paragraphqhf}q(hh]hi]hj]hk]hn]uhpKhqhhX]q(hzX7Several small utilities are available at the top-level qq}q(h]X7Several small utilities are available at the top-level h^hubcsphinx.addnodes pending_xref q)q}q(h]X:mod:`buildbot.util`qh^hh_hbhdU pending_xrefqhf}q(UreftypeXmodUrefwarnqU reftargetqX buildbot.utilU refdomainXpyqhk]hj]U refexplicithh]hi]hn]UrefdocqXdeveloper/utilsqUpy:classqNU py:moduleqX buildbot.utilquhpKhX]qcdocutils.nodes literal q)q}q(h]hhf}q(hh]hi]q(UxrefqhXpy-modqehj]hk]hn]uh^hhX]qhzX buildbot.utilqq}q(h]Uh^hubahdUliteralqubaubhzX package.qq}q(h]X package.h^hubeubh~)q}q(h]Uh^h[h_hbhdhhf}q(hk]hj]hh]hi]hn]Uentries]q(hX'naturalSort() (in module buildbot.util)hUtqauhpNhqhhX]ubcsphinx.addnodes desc q)q}q(h]Uh^h[h_hbhdUdescqhf}q(UnoindexqUdomainqXpyhk]hj]hh]hi]hn]UobjtypeqXfunctionqUdesctypeqhuhpNhqhhX]q(csphinx.addnodes desc_signature q)q}q(h]XnaturalSort(list)h^hh_hbhdUdesc_signatureqhf}q(hk]qhaUmoduleqhhj]hh]hi]hn]qhaUfullnameqX naturalSortqUclassqUUfirstqȉuhpKhqhhX]q(csphinx.addnodes desc_addname q)q}q(h]Xbuildbot.util.h^hh_hbhdU desc_addnameqhf}q(hh]hi]hj]hk]hn]uhpKhqhhX]qhzXbuildbot.util.qЅq}q(h]Uh^hubaubcsphinx.addnodes desc_name q)q}q(h]hh^hh_hbhdU desc_nameqhf}q(hh]hi]hj]hk]hn]uhpKhqhhX]qhzX naturalSortqمq}q(h]Uh^hubaubcsphinx.addnodes desc_parameterlist q)q}q(h]Uh^hh_hbhdUdesc_parameterlistqhf}q(hh]hi]hj]hk]hn]uhpKhqhhX]qcsphinx.addnodes desc_parameter q)q}q(h]Xlisthf}q(hh]hi]hj]hk]hn]uh^hhX]qhzXlistq煁q}q(h]Uh^hubahdUdesc_parameterqubaubeubcsphinx.addnodes desc_content q)q}q(h]Uh^hh_hbhdU desc_contentqhf}q(hh]hi]hj]hk]hn]uhpKhqhhX]q(cdocutils.nodes field_list q)q}q(h]Uh^hh_hbhdU field_listqhf}q(hh]hi]hj]hk]hn]uhpNhqhhX]q(cdocutils.nodes field q)q}q(h]Uhf}q(hh]hi]hj]hk]hn]uh^hhX]q(cdocutils.nodes field_name q)q}q(h]Uhf}q(hh]hi]hj]hk]hn]uh^hhX]rhzX Parametersrr}r(h]Uh^hubahdU field_namerubcdocutils.nodes field_body r)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^hhX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^jhX]r (cdocutils.nodes strong r)r}r(h]Xlisthf}r(hh]hi]hj]hk]hn]uh^j hX]rhzXlistrr}r(h]Uh^jubahdUstrongrubhzX -- rr}r(h]Uh^j ubhzXlist of stringsrr}r(h]Xlist of stringsh^j ubehdhubahdU field_bodyrubehdUfieldrubh)r}r (h]Uhf}r!(hh]hi]hj]hk]hn]uh^hhX]r"(h)r#}r$(h]Uhf}r%(hh]hi]hj]hk]hn]uh^jhX]r&hzXReturnsr'r(}r)(h]Uh^j#ubahdjubj)r*}r+(h]Uhf}r,(hh]hi]hj]hk]hn]uh^jhX]r-h)r.}r/(h]Uhf}r0(hh]hi]hj]hk]hn]uh^j*hX]r1hzXsorted stringsr2r3}r4(h]Xsorted stringsh^j.ubahdhubahdjubehdjubeubh)r5}r6(h]XThis 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``h^hh_hbhdhhf}r7(hh]hi]hj]hk]hn]uhpKhqhhX]r8(hzXThis function sorts strings "naturally", with embedded numbers sorted numerically. This ordering is good for objects which might have a numeric suffix, e.g., r9r:}r;(h]XThis function sorts strings "naturally", with embedded numbers sorted numerically. This ordering is good for objects which might have a numeric suffix, e.g., h^j5ubh)r<}r=(h]X ``winslave1``hf}r>(hh]hi]hj]hk]hn]uh^j5hX]r?hzX winslave1r@rA}rB(h]Uh^j<ubahdhubhzX, rCrD}rE(h]X, h^j5ubh)rF}rG(h]X ``winslave2``hf}rH(hh]hi]hj]hk]hn]uh^j5hX]rIhzX winslave2rJrK}rL(h]Uh^jFubahdhubeubeubeubh~)rM}rN(h]Uh^h[h_hbhdhhf}rO(hk]hj]hh]hi]hn]Uentries]rP(hX*formatInterval() (in module buildbot.util)h:UtrQauhpNhqhhX]ubh)rR}rS(h]Uh^h[h_hbhdhhf}rT(hhXpyhk]hj]hh]hi]hn]hXfunctionrUhjUuhpNhqhhX]rV(h)rW}rX(h]XformatInterval(interval)h^jRh_hbhdhhf}rY(hk]rZh:ahhhj]hh]hi]hn]r[h:ahXformatIntervalr\hUhȉuhpKhqhhX]r](h)r^}r_(h]Xbuildbot.util.h^jWh_hbhdhhf}r`(hh]hi]hj]hk]hn]uhpKhqhhX]rahzXbuildbot.util.rbrc}rd(h]Uh^j^ubaubh)re}rf(h]j\h^jWh_hbhdhhf}rg(hh]hi]hj]hk]hn]uhpKhqhhX]rhhzXformatIntervalrirj}rk(h]Uh^jeubaubh)rl}rm(h]Uh^jWh_hbhdhhf}rn(hh]hi]hj]hk]hn]uhpKhqhhX]roh)rp}rq(h]Xintervalhf}rr(hh]hi]hj]hk]hn]uh^jlhX]rshzXintervalrtru}rv(h]Uh^jpubahdhubaubeubh)rw}rx(h]Uh^jRh_hbhdhhf}ry(hh]hi]hj]hk]hn]uhpKhqhhX]rz(h)r{}r|(h]Uh^jwh_hbhdhhf}r}(hh]hi]hj]hk]hn]uhpNhqhhX]r~(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^j{hX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xintervalhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXintervalrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzXduration in secondsrr}r(h]Xduration in secondsh^jubehdhubahdjubehdjubh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^j{hX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXReturnsrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX#human-readable (English) equivalentrr}r(h]X#human-readable (English) equivalenth^jubahdhubahdjubehdjubeubh)r}r(h]XiThis function will return a human-readable string describing a length of time, given a number of seconds.rh^jwh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXiThis function will return a human-readable string describing a length of time, given a number of seconds.rr}r(h]jh^jubaubeubeubh~)r}r(h]Uh^h[h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX(ComparableMixin (class in buildbot.util)h-UtrauhpNhqhhX]ubh)r}r(h]Uh^h[h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXclassrhjuhpNhqhhX]r(h)r}r(h]XComparableMixinrh^jh_hbhdhhf}r(hk]rh-ahhhj]hh]hi]hn]rh-ahjhUhȉuhpK&hqhhX]r(csphinx.addnodes desc_annotation r)r}r(h]Xclass h^jh_hbhdUdesc_annotationrhf}r(hh]hi]hj]hk]hn]uhpK&hqhhX]rhzXclass rr}r(h]Uh^jubaubh)r}r(h]Xbuildbot.util.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK&hqhhX]rhzXbuildbot.util.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK&hqhhX]rhzXComparableMixinrr}r(h]Uh^jubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK&hqhhX]r(h)r}r(h]XFThis mixin class adds comparability to a subclass. Use it like this::h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXEThis mixin class adds comparability to a subclass. Use it like this:rr}r(h]XEThis mixin class adds comparability to a subclass. Use it like this:h^jubaubcdocutils.nodes literal_block r)r}r(h]Xfclass Widget(FactoryProduct, ComparableMixin): compare_attrs = [ 'radius', 'thickness' ] # ...h^jh_hbhdU literal_blockrhf}r(U xml:spacerUpreserverhk]hj]hh]hi]hn]uhpKhqhhX]rhzXfclass Widget(FactoryProduct, ComparableMixin): compare_attrs = [ 'radius', 'thickness' ] # ...rr}r(h]Uh^jubaubh)r}r(h]X&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.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK"hqhhX]r(hzXAny attributes not in rr}r(h]XAny attributes not in h^jubh)r}r(h]X``compare_attrs``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX compare_attrsrr}r(h]Uh^jubahdhubhzX 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.r r }r (h]X 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.h^jubeubeubeubh~)r }r (h]Uh^h[h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX)safeTranslate() (in module buildbot.util)hUtrauhpNhqhhX]ubh)r}r(h]Uh^h[h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]XsafeTranslate(str)h^jh_hbhdhhf}r(hk]rhahhhj]hh]hi]hn]rhahX safeTranslaterhUhȉuhpK/hqhhX]r(h)r}r(h]Xbuildbot.util.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK/hqhhX]r hzXbuildbot.util.r!r"}r#(h]Uh^jubaubh)r$}r%(h]jh^jh_hbhdhhf}r&(hh]hi]hj]hk]hn]uhpK/hqhhX]r'hzX safeTranslater(r)}r*(h]Uh^j$ubaubh)r+}r,(h]Uh^jh_hbhdhhf}r-(hh]hi]hj]hk]hn]uhpK/hqhhX]r.h)r/}r0(h]Xstrhf}r1(hh]hi]hj]hk]hn]uh^j+hX]r2hzXstrr3r4}r5(h]Uh^j/ubahdhubaubeubh)r6}r7(h]Uh^jh_hbhdhhf}r8(hh]hi]hj]hk]hn]uhpK/hqhhX]r9(h)r:}r;(h]Uh^j6h_hbhdhhf}r<(hh]hi]hj]hk]hn]uhpNhqhhX]r=(h)r>}r?(h]Uhf}r@(hh]hi]hj]hk]hn]uh^j:hX]rA(h)rB}rC(h]Uhf}rD(hh]hi]hj]hk]hn]uh^j>hX]rEhzX ParametersrFrG}rH(h]Uh^jBubahdjubj)rI}rJ(h]Uhf}rK(hh]hi]hj]hk]hn]uh^j>hX]rLh)rM}rN(h]Uhf}rO(hh]hi]hj]hk]hn]uh^jIhX]rP(j)rQ}rR(h]Xstrhf}rS(hh]hi]hj]hk]hn]uh^jMhX]rThzXstrrUrV}rW(h]Uh^jQubahdjubhzX -- rXrY}rZ(h]Uh^jMubhzX input stringr[r\}r](h]X input stringh^jMubehdhubahdjubehdjubh)r^}r_(h]Uhf}r`(hh]hi]hj]hk]hn]uh^j:hX]ra(h)rb}rc(h]Uhf}rd(hh]hi]hj]hk]hn]uh^j^hX]rehzXReturnsrfrg}rh(h]Uh^jbubahdjubj)ri}rj(h]Uhf}rk(hh]hi]hj]hk]hn]uh^j^hX]rlh)rm}rn(h]Uhf}ro(hh]hi]hj]hk]hn]uh^jihX]rphzXsafe version of the inputrqrr}rs(h]Xsafe version of the inputh^jmubahdhubahdjubehdjubeubh)rt}ru(h]XThis 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.rvh^j6h_hbhdhhf}rw(hh]hi]hj]hk]hn]uhpK,hqhhX]rxhzXThis 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.ryrz}r{(h]jvh^jtubaubeubeubh~)r|}r}(h]Uh^h[h_hbhdhhf}r~(hk]hj]hh]hi]hn]Uentries]r(hX*epoch2datetime() (in module buildbot.util)h"UtrauhpNhqhhX]ubh)r}r(h]Uh^h[h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]Xepoch2datetime(epoch)h^jh_hbhdhhf}r(hk]rh"ahhhj]hh]hi]hn]rh"ahXepoch2datetimerhUhȉuhpK8hqhhX]r(h)r}r(h]Xbuildbot.util.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK8hqhhX]rhzXbuildbot.util.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK8hqhhX]rhzXepoch2datetimerr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK8hqhhX]rh)r}r(h]Xepochhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXepochrr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK8hqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xepochhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXepochrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzXan epoch time (integer)rr}r(h]Xan epoch time (integer)h^jubehdhubahdjubehdjubh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXReturnsrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXequivalent datetime objectrr}r(h]Xequivalent datetime objecth^jubahdhubahdjubehdjubeubh)r}r(h]XConvert 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).rh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK5hqhhX]rhzXConvert 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(h]jh^jubaubeubeubh~)r}r(h]Uh^h[h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX*datetime2epoch() (in module buildbot.util)h$UtrauhpNhqhhX]ubh)r}r(h]Uh^h[h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]Xdatetime2epoch(datetime)h^jh_hbhdhhf}r(hk]rh$ahhhj]hh]hi]hn]rh$ahXdatetime2epochrhUhȉuhpK?hqhhX]r(h)r}r(h]Xbuildbot.util.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK?hqhhX]rhzXbuildbot.util.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK?hqhhX]rhzXdatetime2epochrr }r (h]Uh^jubaubh)r }r (h]Uh^jh_hbhdhhf}r (hh]hi]hj]hk]hn]uhpK?hqhhX]rh)r}r(h]Xdatetimehf}r(hh]hi]hj]hk]hn]uh^j hX]rhzXdatetimerr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK?hqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r (hh]hi]hj]hk]hn]uh^jhX]r!(h)r"}r#(h]Uhf}r$(hh]hi]hj]hk]hn]uh^jhX]r%hzX Parametersr&r'}r((h]Uh^j"ubahdjubj)r)}r*(h]Uhf}r+(hh]hi]hj]hk]hn]uh^jhX]r,h)r-}r.(h]Uhf}r/(hh]hi]hj]hk]hn]uh^j)hX]r0(j)r1}r2(h]Xdatetimehf}r3(hh]hi]hj]hk]hn]uh^j-hX]r4hzXdatetimer5r6}r7(h]Uh^j1ubahdjubhzX -- r8r9}r:(h]Uh^j-ubhzXa datetime objectr;r<}r=(h]Xa datetime objecth^j-ubehdhubahdjubehdjubh)r>}r?(h]Uhf}r@(hh]hi]hj]hk]hn]uh^jhX]rA(h)rB}rC(h]Uhf}rD(hh]hi]hj]hk]hn]uh^j>hX]rEhzXReturnsrFrG}rH(h]Uh^jBubahdjubj)rI}rJ(h]Uhf}rK(hh]hi]hj]hk]hn]uh^j>hX]rLh)rM}rN(h]Uhf}rO(hh]hi]hj]hk]hn]uh^jIhX]rPhzXequivalent epoch time (integer)rQrR}rS(h]Xequivalent epoch time (integer)h^jMubahdhubahdjubehdjubeubh)rT}rU(h]XHConvert an arbitrary Python datetime object into a UNIX epoch timestamp.rVh^jh_hbhdhhf}rW(hh]hi]hj]hk]hn]uhpK>hqhhX]rXhzXHConvert an arbitrary Python datetime object into a UNIX epoch timestamp.rYrZ}r[(h]jVh^jTubaubeubeubh~)r\}r](h]Uh^h[h_hbhdhhf}r^(hk]hj]hh]hi]hn]Uentries]r_(hXUTC (in module buildbot.util)hUtr`auhpNhqhhX]ubh)ra}rb(h]Uh^h[h_hbhdhhf}rc(hhXpyhk]hj]hh]hi]hn]hXdatardhjduhpNhqhhX]re(h)rf}rg(h]XUTCrhh^jah_hbhdhhf}ri(hk]rjhahhhj]hh]hi]hn]rkhahjhhUhȉuhpKHhqhhX]rl(h)rm}rn(h]Xbuildbot.util.h^jfh_hbhdhhf}ro(hh]hi]hj]hk]hn]uhpKHhqhhX]rphzXbuildbot.util.rqrr}rs(h]Uh^jmubaubh)rt}ru(h]jhh^jfh_hbhdhhf}rv(hh]hi]hj]hk]hn]uhpKHhqhhX]rwhzXUTCrxry}rz(h]Uh^jtubaubeubh)r{}r|(h]Uh^jah_hbhdhhf}r}(hh]hi]hj]hk]hn]uhpKHhqhhX]r~(h)r}r(h]XA ``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::h^j{h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKBhqhhX]r(hzXA rr}r(h]XA h^jubh)r}r(h]X``datetime.tzinfo``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXdatetime.tzinforr}r(h]Uh^jubahdhubhzX 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(h]X 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:h^jubeubj)r}r(h]X;dt = datetime.datetime(1978, 6, 15, 12, 31, 15, tzinfo=UTC)h^j{h_hbhdjhf}r(jjhk]hj]hh]hi]hn]uhpKGhqhhX]rhzX;dt = datetime.datetime(1978, 6, 15, 12, 31, 15, tzinfo=UTC)rr}r(h]Uh^jubaubeubeubh~)r}r(h]Uh^h[h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX$diffSets() (in module buildbot.util)hUtrauhpNhqhhX]ubh)r}r(h]Uh^h[h_hbhdhhf}r(hhXpyrhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]XdiffSets(old, new)h^jh_hbhdhhf}r(hk]rhahhhj]hh]hi]hn]rhahXdiffSetsrhUhȉuhpKThqhhX]r(h)r}r(h]Xbuildbot.util.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKThqhhX]rhzXbuildbot.util.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKThqhhX]rhzXdiffSetsrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKThqhhX]r(h)r}r(h]Xoldhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXoldrr}r(h]Uh^jubahdhubh)r}r(h]Xnewhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXnewrr}r(h]Uh^jubahdhubeubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKThqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rcdocutils.nodes bullet_list r)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(cdocutils.nodes list_item r)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xoldhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXoldrr}r(h]Uh^jubahdjubhzX (rr}r(h]Uh^jubh)r}r(h]Uhf}r(UreftypeUobjrU reftargetXset or iterablerU refdomainjhk]hj]U refexplicithh]hi]hn]uh^jhX]rcdocutils.nodes emphasis r)r}r(h]jhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXset or iterablerr}r(h]Uh^jubahdUemphasisrubahdhubhzX)r}r(h]Uh^jubhzX -- r r }r (h]Uh^jubhzXold setr r }r(h]Xold seth^jubehdhubahdU list_itemrubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xnewhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXnewrr}r(h]Uh^jubahdjubhzX (rr }r!(h]Uh^jubh)r"}r#(h]Uhf}r$(UreftypejU reftargetXset or iterabler%U refdomainjhk]hj]U refexplicithh]hi]hn]uh^jhX]r&j)r'}r((h]j%hf}r)(hh]hi]hj]hk]hn]uh^j"hX]r*hzXset or iterabler+r,}r-(h]Uh^j'ubahdjubahdhubhzX)r.}r/(h]Uh^jubhzX -- r0r1}r2(h]Uh^jubhzXnew setr3r4}r5(h]Xnew seth^jubehdhubahdjubehdU bullet_listr6ubahdjubehdjubh)r7}r8(h]Uhf}r9(hh]hi]hj]hk]hn]uh^jhX]r:(h)r;}r<(h]Uhf}r=(hh]hi]hj]hk]hn]uh^j7hX]r>hzXReturnsr?r@}rA(h]Uh^j;ubahdjubj)rB}rC(h]Uhf}rD(hh]hi]hj]hk]hn]uh^j7hX]rEh)rF}rG(h]Uhf}rH(hh]hi]hj]hk]hn]uh^jBhX]rIhzXa tuple, (removed, added)rJrK}rL(h]Xa tuple, (removed, added)h^jFubahdhubahdjubehdjubeubh)rM}rN(h]XThis 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.rOh^jh_hbhdhhf}rP(hh]hi]hj]hk]hn]uhpKQhqhhX]rQhzXThis 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.rRrS}rT(h]jOh^jMubaubeubeubh~)rU}rV(h]Uh^h[h_hbhdhhf}rW(hk]hj]hh]hi]hn]Uentries]rX(hX$makeList() (in module buildbot.util)hUtrYauhpNhqhhX]ubh)rZ}r[(h]Uh^h[h_hbhdhhf}r\(hhXpyhk]hj]hh]hi]hn]hXfunctionr]hj]uhpNhqhhX]r^(h)r_}r`(h]XmakeList(input)h^jZh_hbhdhhf}ra(hk]rbhahhhj]hh]hi]hn]rchahXmakeListrdhUhȉuhpK_hqhhX]re(h)rf}rg(h]Xbuildbot.util.h^j_h_hbhdhhf}rh(hh]hi]hj]hk]hn]uhpK_hqhhX]rihzXbuildbot.util.rjrk}rl(h]Uh^jfubaubh)rm}rn(h]jdh^j_h_hbhdhhf}ro(hh]hi]hj]hk]hn]uhpK_hqhhX]rphzXmakeListrqrr}rs(h]Uh^jmubaubh)rt}ru(h]Uh^j_h_hbhdhhf}rv(hh]hi]hj]hk]hn]uhpK_hqhhX]rwh)rx}ry(h]Xinputhf}rz(hh]hi]hj]hk]hn]uh^jthX]r{hzXinputr|r}}r~(h]Uh^jxubahdhubaubeubh)r}r(h]Uh^jZh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK_hqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xinputhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXinputrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzXa thingrr}r(h]Xa thingh^jubehdhubahdjubehdjubh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXReturnsrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXa list of zero or more thingsrr}r(h]Xa list of zero or more thingsh^jubahdhubahdjubehdjubeubh)r}r(h]XUThis 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.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKZhqhhX]r(hzXThis 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(h]XThis 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, h^jubh)r}r(h]X``None``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXNonerr}r(h]Uh^jubahdhubhzXa to an empty list, and any iterable to a list. Input lists are copied, avoiding aliasing issues.rr}r(h]Xa to an empty list, and any iterable to a list. Input lists are copied, avoiding aliasing issues.h^jubeubeubeubh~)r}r(h]Uh^h[h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hXnow() (in module buildbot.util)h7UtrauhpNhqhhX]ubh)r}r(h]Uh^h[h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]Xnow()h^jh_hbhdhhf}r(hk]rh7ahhhj]hh]hi]hn]rh7ahXnowrhUhȉuhpKfhqhhX]r(h)r}r(h]Xbuildbot.util.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKfhqhhX]rhzXbuildbot.util.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKfhqhhX]rhzXnowrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKfhqhhX]ubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKfhqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXReturnsrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r (hh]hi]hj]hk]hn]uh^jhX]r hzXepoch time (integer)r r }r (h]Xepoch time (integer)h^jubahdhubahdjubehdjubaubh)r}r(h]XMReturn the current time, using either ``reactor.seconds`` or ``time.time()``.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKdhqhhX]r(hzX&Return the current time, using either rr}r(h]X&Return the current time, using either h^jubh)r}r(h]X``reactor.seconds``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXreactor.secondsrr}r(h]Uh^jubahdhubhzX or rr}r(h]X or h^jubh)r}r (h]X``time.time()``hf}r!(hh]hi]hj]hk]hn]uh^jhX]r"hzX time.time()r#r$}r%(h]Uh^jubahdhubhzX.r&}r'(h]X.h^jubeubeubeubh~)r(}r)(h]Uh^h[h_hbhdhhf}r*(hk]hj]hh]hi]hn]Uentries]r+(hX#flatten() (in module buildbot.util)h.Utr,auhpNhqhhX]ubh)r-}r.(h]Uh^h[h_hbhdhhf}r/(hhXpyhk]hj]hh]hi]hn]hXfunctionr0hj0uhpNhqhhX]r1(h)r2}r3(h]X flatten(list)h^j-h_hbhdhhf}r4(hk]r5h.ahhhj]hh]hi]hn]r6h.ahXflattenr7hUhȉuhpKuhqhhX]r8(h)r9}r:(h]Xbuildbot.util.h^j2h_hbhdhhf}r;(hh]hi]hj]hk]hn]uhpKuhqhhX]r<hzXbuildbot.util.r=r>}r?(h]Uh^j9ubaubh)r@}rA(h]j7h^j2h_hbhdhhf}rB(hh]hi]hj]hk]hn]uhpKuhqhhX]rChzXflattenrDrE}rF(h]Uh^j@ubaubh)rG}rH(h]Uh^j2h_hbhdhhf}rI(hh]hi]hj]hk]hn]uhpKuhqhhX]rJh)rK}rL(h]Xlisthf}rM(hh]hi]hj]hk]hn]uh^jGhX]rNhzXlistrOrP}rQ(h]Uh^jKubahdhubaubeubh)rR}rS(h]Uh^j-h_hbhdhhf}rT(hh]hi]hj]hk]hn]uhpKuhqhhX]rU(h)rV}rW(h]Uh^jRh_hbhdhhf}rX(hh]hi]hj]hk]hn]uhpNhqhhX]rY(h)rZ}r[(h]Uhf}r\(hh]hi]hj]hk]hn]uh^jVhX]r](h)r^}r_(h]Uhf}r`(hh]hi]hj]hk]hn]uh^jZhX]rahzX Parametersrbrc}rd(h]Uh^j^ubahdjubj)re}rf(h]Uhf}rg(hh]hi]hj]hk]hn]uh^jZhX]rhh)ri}rj(h]Uhf}rk(hh]hi]hj]hk]hn]uh^jehX]rl(j)rm}rn(h]Xlisthf}ro(hh]hi]hj]hk]hn]uh^jihX]rphzXlistrqrr}rs(h]Uh^jmubahdjubhzX -- rtru}rv(h]Uh^jiubhzXpotentially nested listrwrx}ry(h]Xpotentially nested listh^jiubehdhubahdjubehdjubh)rz}r{(h]Uhf}r|(hh]hi]hj]hk]hn]uh^jVhX]r}(h)r~}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jzhX]rhzXReturnsrr}r(h]Uh^j~ubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jzhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX flat listrr}r(h]X flat listh^jubahdhubahdjubehdjubeubh)r}r(h]XIFlatten nested lists into a list containing no other lists. For example:rh^jRh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKlhqhhX]rhzXIFlatten nested lists into a list containing no other lists. For example:rr}r(h]jh^jubaubj)r}r(h]X7>>> flatten([ [ 1, 2 ], 3, [ [ 4 ] ] ]) [ 1, 2, 3, 4 ]h^jRh_hbhdjhf}r(UlinenosrUlanguagerXnonejjhk]hj]hh]hi]hn]uhpKnhqhhX]rhzX7>>> flatten([ [ 1, 2 ], 3, [ [ 4 ] ] ]) [ 1, 2, 3, 4 ]rr}r(h]Uh^jubaubh)r}r(h]XRNote that this looks strictly for lists -- tuples, for example, are not flattened.rh^jRh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKshqhhX]rhzXRNote that this looks strictly for lists -- tuples, for example, are not flattened.rr}r(h]jh^jubaubeubeubh~)r}r(h]Uh^h[h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX'none_or_str() (in module buildbot.util)hUtrauhpNhqhhX]ubh)r}r(h]Uh^h[h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]Xnone_or_str(obj)h^jh_hbhdhhf}r(hk]rhahhhj]hh]hi]hn]rhahX none_or_strrhUhȉuhpK|hqhhX]r(h)r}r(h]Xbuildbot.util.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK|hqhhX]rhzXbuildbot.util.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK|hqhhX]rhzX none_or_strrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK|hqhhX]rh)r}r(h]Xobjhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXobjrr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK|hqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xobjhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXobjrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzX input valuerr}r(h]X input valueh^jubehdhubahdjubehdjubh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXReturnsrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^jhX]r (hzX string or rr}r(h]X string or h^j ubh)r}r(h]X``None``hf}r(hh]hi]hj]hk]hn]uh^j hX]rhzXNonerr}r(h]Uh^jubahdhubehdhubahdjubehdjubeubh)r}r(h]X9If ``obj`` is not None, return its string representation.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpK{hqhhX]r(hzXIf rr}r(h]XIf h^jubh)r}r (h]X``obj``hf}r!(hh]hi]hj]hk]hn]uh^jhX]r"hzXobjr#r$}r%(h]Uh^jubahdhubhzX/ is not None, return its string representation.r&r'}r((h]X/ is not None, return its string representation.h^jubeubeubeubh~)r)}r*(h]Uh^h[h_hbhdhhf}r+(hk]hj]hh]hi]hn]Uentries]r,(hX$NotABranch (in module buildbot.util)h>Utr-auhpNhqhhX]ubh)r.}r/(h]Uh^h[h_hbhdhhf}r0(hhXpyhk]hj]hh]hi]hn]hXdatar1hj1uhpNhqhhX]r2(h)r3}r4(h]X NotABranchr5h^j.h_hbhdhhf}r6(hk]r7h>ahhhj]hh]hi]hn]r8h>ahj5hUhȉuhpKhqhhX]r9(h)r:}r;(h]Xbuildbot.util.h^j3h_hbhdhhf}r<(hh]hi]hj]hk]hn]uhpKhqhhX]r=hzXbuildbot.util.r>r?}r@(h]Uh^j:ubaubh)rA}rB(h]j5h^j3h_hbhdhhf}rC(hh]hi]hj]hk]hn]uhpKhqhhX]rDhzX NotABranchrErF}rG(h]Uh^jAubaubeubh)rH}rI(h]Uh^j.h_hbhdhhf}rJ(hh]hi]hj]hk]hn]uhpKhqhhX]rK(h)rL}rM(h]XThis 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``::h^jHh_hbhdhhf}rN(hh]hi]hj]hk]hn]uhpKhqhhX]rO(hzXThis is a sentinel value used to indicate that no branch is specified. It is necessary since schedulers and change sources consider rPrQ}rR(h]XThis is a sentinel value used to indicate that no branch is specified. It is necessary since schedulers and change sources consider h^jLubh)rS}rT(h]X``None``hf}rU(hh]hi]hj]hk]hn]uh^jLhX]rVhzXNonerWrX}rY(h]Uh^jSubahdhubhzX{ a valid name for a branch. This is generally used as a default value in a method signature, and then tested against with rZr[}r\(h]X{ a valid name for a branch. This is generally used as a default value in a method signature, and then tested against with h^jLubh)r]}r^(h]X``is``hf}r_(hh]hi]hj]hk]hn]uh^jLhX]r`hzXisrarb}rc(h]Uh^j]ubahdhubhzX:rd}re(h]X:h^jLubeubj)rf}rg(h]X'if branch is NotABranch: pass # ...h^jHh_hbhdjhf}rh(jjhk]hj]hh]hi]hn]uhpKhqhhX]rihzX'if branch is NotABranch: pass # ...rjrk}rl(h]Uh^jfubaubeubeubh~)rm}rn(h]Uh^h[h_hbhdhhf}ro(hk]hj]hh]hi]hn]Uentries]rp(hX&in_reactor() (in module buildbot.util)hUtrqauhpNhqhhX]ubh)rr}rs(h]Uh^h[h_hbhdhhf}rt(hhXpyhk]hj]hh]hi]hn]hXfunctionruhjuuhpNhqhhX]rv(h)rw}rx(h]Xin_reactor(fn)h^jrh_hbhdhhf}ry(hk]rzhahhhj]hh]hi]hn]r{hahX in_reactorr|hUhȉuhpKhqhhX]r}(h)r~}r(h]Xbuildbot.util.h^jwh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXbuildbot.util.rr}r(h]Uh^j~ubaubh)r}r(h]j|h^jwh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzX in_reactorrr}r(h]Uh^jubaubh)r}r(h]Uh^jwh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rh)r}r(h]Xfnhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXfnrr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jrh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rh)r}r(h]X 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.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]r(hzXThis 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(h]XThis 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 h^jubh)r}r(h]X``None``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXNonerr}r(h]Uh^jubahdhubhzX returned.rr}r(h]X returned.h^jubeubaubeubhZ)r}r(h]Uh^h[h_hbhdhehf}r(hh]hi]hj]hk]r(Xmodule-buildbot.util.lrurhQehn]rh&auhpKhqhhX]r(hs)r}r(h]Xbuildbot.util.lrurh^jh_hbhdhwhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXbuildbot.util.lrurr}r(h]jh^jubaubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hXbuildbot.util.lru (module)Xmodule-buildbot.util.lruUtrauhpKhqhhX]ubh~)r}r(h]Uh^jh_Nhdhhf}r(hk]hj]hh]hi]hn]Uentries]uhpNhqhhX]ubh)r}r(h]Uh^jh_Nhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXclassrhjuhpNhqhhX]r(h)r}r(h]XLRUCache(miss_fn, max_size=50):rh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]hȉuhpKhqhhX]rh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXLRUCache(miss_fn, max_size=50):rr}r(h]Uh^jubaubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]r(h)r}r(h]Uh^jh_Nhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xmiss_fnhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXmiss_fnrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzXfunction 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.rr}r(h]Xfunction 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.rh^jubehdhubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^jhX]r (j)r }r(h]Xmax_sizehf}r(hh]hi]hj]hk]hn]uh^j hX]rhzXmax_sizerr}r(h]Uh^j ubahdjubhzX -- rr}r(h]Uh^j ubhzX'maximum number of objects in the cache.rr}r(h]X'maximum number of objects in the cache.rh^j ubehdhubahdjubehdj6ubahdjubehdjubaubh)r}r(h]XThis 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.rh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXThis 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"(h]jh^jubaubh)r#}r$(h]XThis cache is designed to control memory usage by minimizing duplication of objects, while avoiding unnecessary re-fetching of the same rows from the database.r%h^jh_hbhdhhf}r&(hh]hi]hj]hk]hn]uhpKhqhhX]r'hzXThis cache is designed to control memory usage by minimizing duplication of objects, while avoiding unnecessary re-fetching of the same rows from the database.r(r)}r*(h]j%h^j#ubaubh)r+}r,(h]XAll 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``.h^jh_hbhdhhf}r-(hh]hi]hj]hk]hn]uhpKhqhhX]r.(hzXAll 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 r/r0}r1(h]XAll 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 h^j+ubh)r2}r3(h]X``dict``hf}r4(hh]hi]hj]hk]hn]uh^j+hX]r5hzXdictr6r7}r8(h]Uh^j2ubahdhubhzX.r9}r:(h]X.h^j+ubeubh)r;}r<(h]XIf the result of the ``miss_fn`` is ``None``, then the value is not cached; this is intended to avoid caching negative results.h^jh_hbhdhhf}r=(hh]hi]hj]hk]hn]uhpKhqhhX]r>(hzXIf the result of the r?r@}rA(h]XIf the result of the h^j;ubh)rB}rC(h]X ``miss_fn``hf}rD(hh]hi]hj]hk]hn]uh^j;hX]rEhzXmiss_fnrFrG}rH(h]Uh^jBubahdhubhzX is rIrJ}rK(h]X is h^j;ubh)rL}rM(h]X``None``hf}rN(hh]hi]hj]hk]hn]uh^j;hX]rOhzXNonerPrQ}rR(h]Uh^jLubahdhubhzXS, then the value is not cached; this is intended to avoid caching negative results.rSrT}rU(h]XS, then the value is not cached; this is intended to avoid caching negative results.h^j;ubeubh)rV}rW(h]XThis is based on `Raymond Hettinger's implementation `_, licensed under the PSF license, which is GPL-compatiblie.h^jh_hbhdhhf}rX(hh]hi]hj]hk]hn]uhpKhqhhX]rY(hzXThis is based on rZr[}r\(h]XThis is based on h^jVubcdocutils.nodes reference r])r^}r_(h]Xp`Raymond Hettinger's implementation `_hf}r`(UnameX"Raymond Hettinger's implementationUrefuriraXHhttp://code.activestate.com/recipes/498245-lru-and-lfu-cache-decorators/rbhk]hj]hh]hi]hn]uh^jVhX]rchzX"Raymond Hettinger's implementationrdre}rf(h]Uh^j^ubahdU referencergubcdocutils.nodes target rh)ri}rj(h]XK U referencedrkKh^jVhdUtargetrlhf}rm(Urefurijbhk]rnhHahj]hh]hi]hn]rohauhX]ubhzX;, licensed under the PSF license, which is GPL-compatiblie.rprq}rr(h]X;, licensed under the PSF license, which is GPL-compatiblie.h^jVubeubh~)rs}rt(h]Uh^jh_hbhdhhf}ru(hk]hj]hh]hi]hn]Uentries]rv(hX"hits (in module buildbot.util.lru)h UtrwauhpNhqhhX]ubh)rx}ry(h]Uh^jh_hbhdhhf}rz(hhXpyhk]hj]hh]hi]hn]hX attributer{hj{uhpNhqhhX]r|(h)r}}r~(h]Xhitsrh^jxh_hbhdhhf}r(hk]rh ahXbuildbot.util.lrurhj]hh]hi]hn]rh ahjhUhȉuhpKhqhhX]r(h)r}r(h]Xbuildbot.util.lru.h^j}h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXbuildbot.util.lru.rr}r(h]Uh^jubaubh)r}r(h]jh^j}h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXhitsrr}r(h]Uh^jubaubeubh)r}r(h]Uh^jxh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rh)r}r(h]Xcache hits so farrh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXcache hits so farrr}r(h]jh^jubaubaubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX%refhits (in module buildbot.util.lru)h1UtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hX attributerhjuhpNhqhhX]r(h)r}r(h]Xrefhitsrh^jh_hbhdhhf}r(hk]rh1ahjhj]hh]hi]hn]rh1ahjhUhȉuhpKhqhhX]r(h)r}r(h]Xbuildbot.util.lru.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXbuildbot.util.lru.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXrefhitsrr}r(h]Uh^jubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rh)r}r(h]X5cache misses found in the weak ref dictionary, so farrh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzX5cache misses found in the weak ref dictionary, so farrr}r(h]jh^jubaubaubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX$misses (in module buildbot.util.lru)h'UtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hX attributerhjuhpNhqhhX]r(h)r}r(h]Xmissesrh^jh_hbhdhhf}r(hk]rh'ahjhj]hh]hi]hn]rh'ahjhUhȉuhpKhqhhX]r(h)r}r(h]Xbuildbot.util.lru.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXbuildbot.util.lru.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXmissesrr}r(h]Uh^jubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rh)r}r(h]X*cache misses leading to re-fetches, so farrh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzX*cache misses leading to re-fetches, so farrr}r(h]jh^jubaubaubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX&max_size (in module buildbot.util.lru)hUtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hX attributerhjuhpNhqhhX]r(h)r}r(h]Xmax_sizerh^jh_hbhdhhf}r(hk]rhahjhj]hh]hi]hn]rhahjhUhȉuhpKhqhhX]r(h)r}r(h]Xbuildbot.util.lru.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]r hzXbuildbot.util.lru.r r }r (h]Uh^jubaubh)r }r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXmax_sizerr}r(h]Uh^j ubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rh)r}r(h]X!maximum allowed size of the cacherh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzX!maximum allowed size of the cacherr}r(h]jh^jubaubaubeubh~)r }r!(h]Uh^jh_hbhdhhf}r"(hk]hj]hh]hi]hn]Uentries]r#(hX#get() (in module buildbot.util.lru)h8Utr$auhpNhqhhX]ubh)r%}r&(h]Uh^jh_hbhdhhf}r'(hhXpyhk]hj]hh]hi]hn]hXmethodr(hj(uhpNhqhhX]r)(h)r*}r+(h]Xget(key, **miss_fn_kwargs)h^j%h_hbhdhhf}r,(hk]r-h8ahjhj]hh]hi]hn]r.h8ahXgetr/hUhȉuhpKhqhhX]r0(h)r1}r2(h]Xbuildbot.util.lru.h^j*h_hbhdhhf}r3(hh]hi]hj]hk]hn]uhpKhqhhX]r4hzXbuildbot.util.lru.r5r6}r7(h]Uh^j1ubaubh)r8}r9(h]j/h^j*h_hbhdhhf}r:(hh]hi]hj]hk]hn]uhpKhqhhX]r;hzXgetr<r=}r>(h]Uh^j8ubaubh)r?}r@(h]Uh^j*h_hbhdhhf}rA(hh]hi]hj]hk]hn]uhpKhqhhX]rB(h)rC}rD(h]Xkeyhf}rE(hh]hi]hj]hk]hn]uh^j?hX]rFhzXkeyrGrH}rI(h]Uh^jCubahdhubh)rJ}rK(h]X**miss_fn_kwargshf}rL(hh]hi]hj]hk]hn]uh^j?hX]rMhzX**miss_fn_kwargsrNrO}rP(h]Uh^jJubahdhubeubeubh)rQ}rR(h]Uh^j%h_hbhdhhf}rS(hh]hi]hj]hk]hn]uhpKhqhhX]rT(h)rU}rV(h]Uh^jQh_hbhdhhf}rW(hh]hi]hj]hk]hn]uhpNhqhhX]rX(h)rY}rZ(h]Uhf}r[(hh]hi]hj]hk]hn]uh^jUhX]r\(h)r]}r^(h]Uhf}r_(hh]hi]hj]hk]hn]uh^jYhX]r`hzX Parametersrarb}rc(h]Uh^j]ubahdjubj)rd}re(h]Uhf}rf(hh]hi]hj]hk]hn]uh^jYhX]rgj)rh}ri(h]Uhf}rj(hh]hi]hj]hk]hn]uh^jdhX]rk(j)rl}rm(h]Uhf}rn(hh]hi]hj]hk]hn]uh^jhhX]roh)rp}rq(h]Uhf}rr(hh]hi]hj]hk]hn]uh^jlhX]rs(j)rt}ru(h]Xkeyhf}rv(hh]hi]hj]hk]hn]uh^jphX]rwhzXkeyrxry}rz(h]Uh^jtubahdjubhzX -- r{r|}r}(h]Uh^jpubhzX cache keyr~r}r(h]X cache keyh^jpubehdhubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xmiss_fn_kwargshf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXmiss_fn_kwargsrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzXkeyword arguments to the rr}r(h]Xkeyword arguments to the h^jubh)r}r(h]X ``miss_fn``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXmiss_fnrr}r(h]Uh^jubahdhubehdhubahdjubehdj6ubahdjubehdjubh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jUhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXReturnsrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXvalue via Deferredrr}r(h]Xvalue via Deferredh^jubahdhubahdjubehdjubeubh)r}r(h]XpFetch a value from the cache by key, invoking ``miss_fn(key, **miss_fn_kwargs)`` if the key is not in the cache.h^jQh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]r(hzX.Fetch a value from the cache by key, invoking rr}r(h]X.Fetch a value from the cache by key, invoking h^jubh)r}r(h]X"``miss_fn(key, **miss_fn_kwargs)``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXmiss_fn(key, **miss_fn_kwargs)rr}r(h]Uh^jubahdhubhzX if the key is not in the cache.rr}r(h]X if the key is not in the cache.h^jubeubh)r}r(h]XfAny 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.h^jQh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]r(hzX3Any additional keyword arguments are passed to the rr}r(h]X3Any additional keyword arguments are passed to the h^jubh)r}r(h]X ``miss_fn``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXmiss_fnrr}r(h]Uh^jubahdhubhzX 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 rr}r(h]X 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 h^jubh)r}r(h]X ``miss_fn``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXmiss_fnrr}r(h]Uh^jubahdhubhzX; will not be invoked, even if the keyword arguments differ.rr}r(h]X; will not be invoked, even if the keyword arguments differ.h^jubeubeubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX#put() (in module buildbot.util.lru)h5UtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXmethodrhjuhpNhqhhX]r(h)r}r(h]Xput(key, value)h^jh_hbhdhhf}r(hk]rh5ahjhj]hh]hi]hn]rh5ahXputrhUhȉuhpKhqhhX]r(h)r}r(h]Xbuildbot.util.lru.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXbuildbot.util.lru.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpKhqhhX]rhzXputrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r (h)r }r (h]Xkeyhf}r (hh]hi]hj]hk]hn]uh^jhX]r hzXkeyr r }r (h]Uh^j ubahdhubh)r }r (h]Xvaluehf}r (hh]hi]hj]hk]hn]uh^jhX]r hzXvaluer r }r (h]Uh^j ubahdhubeubeubh)r }r (h]Uh^jh_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r (h)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpNhqhhX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzX Parametersr r! }r" (h]Uh^j ubahdjubj)r# }r$ (h]Uhf}r% (hh]hi]hj]hk]hn]uh^j hX]r& j)r' }r( (h]Uhf}r) (hh]hi]hj]hk]hn]uh^j# hX]r* (j)r+ }r, (h]Uhf}r- (hh]hi]hj]hk]hn]uh^j' hX]r. h)r/ }r0 (h]Uhf}r1 (hh]hi]hj]hk]hn]uh^j+ hX]r2 (j)r3 }r4 (h]Xkeyhf}r5 (hh]hi]hj]hk]hn]uh^j/ hX]r6 hzXkeyr7 r8 }r9 (h]Uh^j3 ubahdjubhzX -- r: r; }r< (h]Uh^j/ ubhzXkey at which to place the valuer= r> }r? (h]Xkey at which to place the valueh^j/ ubehdhubahdjubj)r@ }rA (h]Uhf}rB (hh]hi]hj]hk]hn]uh^j' hX]rC h)rD }rE (h]Uhf}rF (hh]hi]hj]hk]hn]uh^j@ hX]rG (j)rH }rI (h]Xvaluehf}rJ (hh]hi]hj]hk]hn]uh^jD hX]rK hzXvaluerL rM }rN (h]Uh^jH ubahdjubhzX -- rO rP }rQ (h]Uh^jD ubhzXvalue to place thererR rS }rT (h]Xvalue to place thereh^jD ubehdhubahdjubehdj6ubahdjubehdjubaubh)rU }rV (h]XUpdate the cache with the given key and value, but only if the key is already in 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).h^j h_hbhdhhf}rW (hh]hi]hj]hk]hn]uhpKhqhhX]rX (hzXUpdate the cache with the given key and value, but only if the key is already in the cache. The purpose of this method is to insert a new value into the cache rY rZ }r[ (h]XUpdate the cache with the given key and value, but only if the key is already in the cache. The purpose of this method is to insert a new value into the cache h^jU ubj)r\ }r] (h]X *without*hf}r^ (hh]hi]hj]hk]hn]uh^jU hX]r_ hzXwithoutr` ra }rb (h]Uh^j\ ubahdjubhzX< invoking the miss_fn (e.g., to avoid unnecessary overhead).rc rd }re (h]X< invoking the miss_fn (e.g., to avoid unnecessary overhead).h^jU ubeubeubeubcdocutils.nodes comment rf )rg }rh (h]Xpy: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.h^jh_hbhdUcommentri hf}rj (jjhk]hj]hh]hi]hn]uhpKhqhhX]rk hzXpy: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.rl rm }rn (h]Uh^jg ubaubh~)ro }rp (h]Uh^jh_hbhdhhf}rq (hk]hj]hh]hi]hn]Uentries]rr (hX#inv() (in module buildbot.util.lru)hUtrs auhpNhqhhX]ubh)rt }ru (h]Uh^jh_hbhdhhf}rv (hhXpyhk]hj]hh]hi]hn]hXmethodrw hjw uhpNhqhhX]rx (h)ry }rz (h]Xinv()h^jt h_hbhdhhf}r{ (hk]r| hahjhj]hh]hi]hn]r} hahXinvr~ hUhȉuhpKhqhhX]r (h)r }r (h]Xbuildbot.util.lru.h^jy h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r hzXbuildbot.util.lru.r r }r (h]Uh^j ubaubh)r }r (h]j~ h^jy h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r hzXinvr r }r (h]Uh^j ubaubh)r }r (h]Uh^jy h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]ubeubh)r }r (h]Uh^jt h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r h)r }r (h]XHCheck invariants on the cache. This is intended for debugging purposes.r h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r hzXHCheck invariants on the cache. This is intended for debugging purposes.r r }r (h]j h^j ubaubaubeubeubeubh~)r }r (h]Uh^jh_hbhdhhf}r (hk]hj]hh]hi]hn]Uentries]uhpNhqhhX]ubh)r }r (h]Uh^jh_hbhdhhf}r (hhXpyhk]hj]hh]hi]hn]hXclassr hj uhpNhqhhX]r (h)r }r (h]X$AsyncLRUCache(miss_fn, max_size=50):r h^j h_hbhdhhf}r (hk]hj]hh]hi]hn]hȉuhpKhqhhX]r h)r }r (h]j h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r hzX$AsyncLRUCache(miss_fn, max_size=50):r r }r (h]Uh^j ubaubaubh)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r (h)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpNhqhhX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzX Parametersr r }r (h]Uh^j ubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r j)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Xmiss_fnhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXmiss_fnr r }r (h]Uh^j ubahdjubhzX -- r r }r (h]Uh^j ubhzX[This is the same as the miss_fn for class LRUCache, with the difference that this function r r }r (h]X[This is the same as the miss_fn for class LRUCache, with the difference that this function h^j ubj)r }r (h]X*must*hf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXmustr r }r (h]Uh^j ubahdjubhzX return a Deferred.r r }r (h]X return a Deferred.h^j ubehdhubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Xmax_sizehf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXmax_sizer r }r (h]Uh^j ubahdjubhzX -- r r }r (h]Uh^j ubhzX'maximum number of objects in the cache.r r }r (h]X'maximum number of objects in the cache.h^j ubehdhubahdjubehdj6ubahdjubehdjubaubh)r }r (h]XThis 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 h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r hzXThis 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 r }r (h]j h^j ubaubeubeubeubhZ)r }r (h]Uh^h[h_hbhdhehf}r (hh]hi]hj]hk]r (X"module-buildbot.util.bbcollectionsr hNehn]r hauhpKhqhhX]r (hs)r }r (h]Xbuildbot.util.bbcollectionsr h^j h_hbhdhwhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r hzXbuildbot.util.bbcollectionsr r }r (h]j h^j ubaubh~)r }r (h]Uh^j h_hbhdhhf}r (hk]hj]hh]hi]hn]Uentries]r (hX$buildbot.util.bbcollections (module)X"module-buildbot.util.bbcollectionsUtr auhpKhqhhX]ubh)r }r (h]X6This package provides a few useful collection objects.r h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r hzX6This package provides a few useful collection objects.r! r" }r# (h]j h^j ubaubcdocutils.nodes note r$ )r% }r& (h]XThis module used to be named ``collections``, but without absolute imports (:pep:`328`), this precluded using the standard library's ``collections`` module.h^j h_hbhdUnoter' hf}r( (hh]hi]hj]hk]hn]uhpNhqhhX]r) h)r* }r+ (h]XThis module used to be named ``collections``, but without absolute imports (:pep:`328`), this precluded using the standard library's ``collections`` module.h^j% h_hbhdhhf}r, (hh]hi]hj]hk]hn]uhpKhX]r- (hzXThis module used to be named r. r/ }r0 (h]XThis module used to be named h^j* ubh)r1 }r2 (h]X``collections``hf}r3 (hh]hi]hj]hk]hn]uh^j* hX]r4 hzX collectionsr5 r6 }r7 (h]Uh^j1 ubahdhubhzX , but without absolute imports (r8 r9 }r: (h]X , but without absolute imports (h^j* ubh~)r; }r< (h]Uhf}r= (hk]hj]hh]hi]hn]Uentriesr> ]r? (hX%Python Enhancement Proposals; PEP 328Uindex-0r@ UtrA auh^j* hX]hdhubjh)rB }rC (h]Uhf}rD (hh]hi]hj]hk]rE j@ ahn]uh^j* hX]hdjlubj])rF }rG (h]Uhf}rH (UrefuriU'http://www.python.org/dev/peps/pep-0328hk]hj]hh]hi]rI XpeprJ ahn]Uinternaluh^j* hX]rK j)rL }rM (h]XPEP 328hf}rN (hh]hi]hj]hk]hn]uh^jF hX]rO hzXPEP 328rP rQ }rR (h]Uh^jL ubahdjubahdjgubhzX/), this precluded using the standard library's rS rT }rU (h]X/), this precluded using the standard library's h^j* ubh)rV }rW (h]X``collections``hf}rX (hh]hi]hj]hk]hn]uh^j* hX]rY hzX collectionsrZ r[ }r\ (h]Uh^jV ubahdhubhzX module.r] r^ }r_ (h]X module.h^j* ubeubaubh~)r` }ra (h]Uh^j h_hbhdhhf}rb (hk]hj]hh]hi]hn]Uentries]rc (hX2defaultdict (class in buildbot.util.bbcollections)h,Utrd auhpNhqhhX]ubh)re }rf (h]Uh^j h_hbhdhhf}rg (hhXpyhk]hj]hh]hi]hn]hXclassrh hjh uhpNhqhhX]ri (h)rj }rk (h]X defaultdictrl h^je h_hbhdhhf}rm (hk]rn h,ahXbuildbot.util.bbcollectionsro hj]hh]hi]hn]rp h,ahjl hUhȉuhpMhqhhX]rq (j)rr }rs (h]Xclass h^jj h_hbhdjhf}rt (hh]hi]hj]hk]hn]uhpMhqhhX]ru hzXclass rv rw }rx (h]Uh^jr ubaubh)ry }rz (h]Xbuildbot.util.bbcollections.h^jj h_hbhdhhf}r{ (hh]hi]hj]hk]hn]uhpMhqhhX]r| hzXbuildbot.util.bbcollections.r} r~ }r (h]Uh^jy ubaubh)r }r (h]jl h^jj h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzX defaultdictr r }r (h]Uh^j ubaubeubh)r }r (h]Uh^je h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r h)r }r (h]XThis 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.h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpKhqhhX]r (hzXThis is a clone of the Python r r }r (h]XThis is a clone of the Python h^j ubh)r }r (h]X :class:`collections.defaultdict`r h^j h_hbhdhhf}r (UreftypeXclasshhXcollections.defaultdictU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhjl hjo uhpKhX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-classr ehj]hk]hn]uh^j hX]r hzXcollections.defaultdictr r }r (h]Uh^j ubahdhubaubhzXW for use in Python-2.4. In later versions, this is simply a reference to the built-in r r }r (h]XW for use in Python-2.4. In later versions, this is simply a reference to the built-in h^j ubh)r }r (h]X:class:`defaultdict`r h^j h_hbhdhhf}r (UreftypeXclasshhX defaultdictU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhjl hjo uhpKhX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-classr ehj]hk]hn]uh^j hX]r hzX defaultdictr r }r (h]Uh^j ubahdhubaubhzX", so buildbot code can simply use r r }r (h]X", so buildbot code can simply use h^j ubh)r }r (h]X.:class:`buildbot.util.collections.defaultdict`r h^j h_hbhdhhf}r (UreftypeXclasshhX%buildbot.util.collections.defaultdictU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhjl hjo uhpKhX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-classr ehj]hk]hn]uh^j hX]r hzX%buildbot.util.collections.defaultdictr r }r (h]Uh^j ubahdhubaubhzX everywhere.r r }r (h]X everywhere.h^j ubeubaubeubh~)r }r (h]Uh^j h_hbhdhhf}r (hk]hj]hh]hi]hn]Uentries]r (hX0KeyedSets (class in buildbot.util.bbcollections)h#Utr auhpNhqhhX]ubh)r }r (h]Uh^j h_hbhdhhf}r (hhXpyhk]hj]hh]hi]hn]hXclassr hj uhpNhqhhX]r (h)r }r (h]X KeyedSetsr h^j h_hbhdhhf}r (hk]r h#ahjo hj]hh]hi]hn]r h#ahj hUhȉuhpMhqhhX]r (j)r }r (h]Xclass h^j h_hbhdjhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXclass r r }r (h]Uh^j ubaubh)r }r (h]Xbuildbot.util.bbcollections.h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXbuildbot.util.bbcollections.r r }r (h]Uh^j ubaubh)r }r (h]j h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzX KeyedSetsr r }r (h]Uh^j ubaubeubh)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r (h)r }r (h]XThis 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. ::h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXThis 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.r r }r (h]XThis 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.h^j ubaubj)r }r (h]X>>> 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([])h^j h_hbhdjhf}r (jjhk]hj]hh]hi]hn]uhpM hqhhX]r hzX>>> 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 (h]Uh^j ubaubh)r }r (h]XTThis class is careful to conserve memory space - empty sets do not occupy any space.r h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXTThis class is careful to conserve memory space - empty sets do not occupy any space.r r }r (h]j h^j ubaubeubeubeubhZ)r }r (h]Uh^h[h_hbhdhehf}r (hh]hi]hj]hk]r (Xmodule-buildbot.util.eventualr hKehn]r hauhpMhqhhX]r (hs)r }r (h]Xbuildbot.util.eventualr h^j h_hbhdhwhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXbuildbot.util.eventualr r }r (h]j h^j ubaubh~)r }r (h]Uh^j h_hbhdhhf}r (hk]hj]hh]hi]hn]Uentries]r (hXbuildbot.util.eventual (module)Xmodule-buildbot.util.eventualUtr auhpM!hqhhX]ubh)r }r (h]XQThis function provides a simple way to say "please do this later". For example::r h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpM"hqhhX]r hzXPThis function provides a simple way to say "please do this later". For example:r! r" }r# (h]XPThis function provides a simple way to say "please do this later". For example:h^j ubaubj)r$ }r% (h]Xfrom buildbot.util.eventual import eventually def do_what_I_say(what, where): # ... return d eventually(do_what_I_say, "clean up", "your bedroom")h^j h_hbhdjhf}r& (jjhk]hj]hh]hi]hn]uhpM$hqhhX]r' hzXfrom 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* (h]Uh^j$ ubaubh)r+ }r, (h]XThe 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- h^j h_hbhdhhf}r. (hh]hi]hj]hk]hn]uhpM*hqhhX]r/ hzXThe 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.r0 r1 }r2 (h]j- h^j+ ubaubh~)r3 }r4 (h]Uh^j h_hbhdhhf}r5 (hk]hj]hh]hi]hn]Uentries]r6 (hX/eventually() (in module buildbot.util.eventual)hUtr7 auhpNhqhhX]ubh)r8 }r9 (h]Uh^j h_hbhdhhf}r: (hhXpyhk]hj]hh]hi]hn]hXfunctionr; hj; uhpNhqhhX]r< (h)r= }r> (h]Xeventually(cb, *args, **kwargs)h^j8 h_hbhdhhf}r? (hk]r@ hahXbuildbot.util.eventualrA hj]hh]hi]hn]rB hahX eventuallyrC hUhȉuhpM?hqhhX]rD (h)rE }rF (h]Xbuildbot.util.eventual.h^j= h_hbhdhhf}rG (hh]hi]hj]hk]hn]uhpM?hqhhX]rH hzXbuildbot.util.eventual.rI rJ }rK (h]Uh^jE ubaubh)rL }rM (h]jC h^j= h_hbhdhhf}rN (hh]hi]hj]hk]hn]uhpM?hqhhX]rO hzX eventuallyrP rQ }rR (h]Uh^jL ubaubh)rS }rT (h]Uh^j= h_hbhdhhf}rU (hh]hi]hj]hk]hn]uhpM?hqhhX]rV (h)rW }rX (h]Xcbhf}rY (hh]hi]hj]hk]hn]uh^jS hX]rZ hzXcbr[ r\ }r] (h]Uh^jW ubahdhubh)r^ }r_ (h]X*argshf}r` (hh]hi]hj]hk]hn]uh^jS hX]ra hzX*argsrb rc }rd (h]Uh^j^ ubahdhubh)re }rf (h]X**kwargshf}rg (hh]hi]hj]hk]hn]uh^jS hX]rh hzX**kwargsri rj }rk (h]Uh^je ubahdhubeubeubh)rl }rm (h]Uh^j8 h_hbhdhhf}rn (hh]hi]hj]hk]hn]uhpM?hqhhX]ro (h)rp }rq (h]Uh^jl h_hbhdhhf}rr (hh]hi]hj]hk]hn]uhpNhqhhX]rs h)rt }ru (h]Uhf}rv (hh]hi]hj]hk]hn]uh^jp hX]rw (h)rx }ry (h]Uhf}rz (hh]hi]hj]hk]hn]uh^jt hX]r{ hzX Parametersr| r} }r~ (h]Uh^jx ubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^jt hX]r j)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Xcbhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXcbr r }r (h]Uh^j ubahdjubhzX -- r r }r (h]Uh^j ubhzXcallable to invoke laterr r }r (h]Xcallable to invoke laterh^j ubehdhubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Xargshf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXargsr r }r (h]Uh^j ubahdjubhzX -- r r }r (h]Uh^j ubhzXargs to pass to r r }r (h]Xargs to pass to h^j ubh)r }r (h]X``cb``hf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXcbr r }r (h]Uh^j ubahdhubehdhubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Xkwargshf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXkwargsr r }r (h]Uh^j ubahdjubhzX -- r r }r (h]Uh^j ubhzXkwargs to pass to r r }r (h]Xkwargs to pass to h^j ubh)r }r (h]X``cb``hf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXcbr r }r (h]Uh^j ubahdhubehdhubahdjubehdj6ubahdjubehdjubaubh)r }r (h]X3Invoke the callable ``cb`` in a later reactor turn.h^jl h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpM3hqhhX]r (hzXInvoke the callable r r }r (h]XInvoke the callable h^j ubh)r }r (h]X``cb``hf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXcbr r }r (h]Uh^j ubahdhubhzX in a later reactor turn.r r }r (h]X in a later reactor turn.h^j ubeubh)r }r (h]XCallables 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``.h^jl h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpM5hqhhX]r (hzXCallables given to r r }r (h]XCallables given to h^j ubh)r }r (h]X:func:`eventually`r h^j h_hbhdhhf}r (UreftypeXfunchhX eventuallyU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhNhjA uhpM5hX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-funcr ehj]hk]hn]uh^j hX]r hzX eventuallyr r }r (h]Uh^j ubahdhubaubhzX? are guaranteed to be called in the same order as the calls to r r }r (h]X? are guaranteed to be called in the same order as the calls to h^j ubh)r }r (h]X:func:`eventually`r h^j h_hbhdhhf}r (UreftypeXfunchhX eventuallyU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhNhjA uhpM5hX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-funcr ehj]hk]hn]uh^j hX]r hzX eventuallyr r }r (h]Uh^j ubahdhubaubhzX -- writing r r }r (h]X -- writing h^j ubh)r }r (h]X ``eventually(a); eventually(b)``hf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXeventually(a); eventually(b)r r }r (h]Uh^j ubahdhubhzX guarantees that r r }r (h]X guarantees that h^j ubh)r }r (h]X``a``hf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXar }r (h]Uh^j ubahdhubhzX will be called before r r! }r" (h]X will be called before h^j ubh)r# }r$ (h]X``b``hf}r% (hh]hi]hj]hk]hn]uh^j hX]r& hzXbr' }r( (h]Uh^j# ubahdhubhzX.r) }r* (h]X.h^j ubeubh)r+ }r, (h]XAny 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.h^jl h_hbhdhhf}r- (hh]hi]hj]hk]hn]uhpM9hqhhX]r. (hzX>Any exceptions that occur in the callable will be logged with r/ r0 }r1 (h]X>Any exceptions that occur in the callable will be logged with h^j+ ubh)r2 }r3 (h]X ``log.err()``hf}r4 (hh]hi]hj]hk]hn]uh^j+ hX]r5 hzX log.err()r6 r7 }r8 (h]Uh^j2 ubahdhubhzXW. If you really want to ignore them, provide a callable that catches those exceptions.r9 r: }r; (h]XW. If you really want to ignore them, provide a callable that catches those exceptions.h^j+ ubeubh)r< }r= (h]XThis function returns None. If you care to know when the callable was run, be sure to provide a callable that notifies somebody.r> h^jl h_hbhdhhf}r? (hh]hi]hj]hk]hn]uhpM=hqhhX]r@ hzXThis function returns None. If you care to know when the callable was run, be sure to provide a callable that notifies somebody.rA rB }rC (h]j> h^j< ubaubeubeubh~)rD }rE (h]Uh^j h_hbhdhhf}rF (hk]hj]hh]hi]hn]Uentries]rG (hX3fireEventually() (in module buildbot.util.eventual)h)UtrH auhpNhqhhX]ubh)rI }rJ (h]Uh^j h_hbhdhhf}rK (hhXpyhk]hj]hh]hi]hn]hXfunctionrL hjL uhpNhqhhX]rM (h)rN }rO (h]XfireEventually(value=None)h^jI h_hbhdhhf}rP (hk]rQ h)ahjA hj]hh]hi]hn]rR h)ahXfireEventuallyrS hUhȉuhpMIhqhhX]rT (h)rU }rV (h]Xbuildbot.util.eventual.h^jN h_hbhdhhf}rW (hh]hi]hj]hk]hn]uhpMIhqhhX]rX hzXbuildbot.util.eventual.rY rZ }r[ (h]Uh^jU ubaubh)r\ }r] (h]jS h^jN h_hbhdhhf}r^ (hh]hi]hj]hk]hn]uhpMIhqhhX]r_ hzXfireEventuallyr` ra }rb (h]Uh^j\ ubaubh)rc }rd (h]Uh^jN h_hbhdhhf}re (hh]hi]hj]hk]hn]uhpMIhqhhX]rf h)rg }rh (h]X value=Nonehf}ri (hh]hi]hj]hk]hn]uh^jc hX]rj hzX value=Nonerk rl }rm (h]Uh^jg ubahdhubaubeubh)rn }ro (h]Uh^jI h_hbhdhhf}rp (hh]hi]hj]hk]hn]uhpMIhqhhX]rq (h)rr }rs (h]Uh^jn h_hbhdhhf}rt (hh]hi]hj]hk]hn]uhpNhqhhX]ru (h)rv }rw (h]Uhf}rx (hh]hi]hj]hk]hn]uh^jr hX]ry (h)rz }r{ (h]Uhf}r| (hh]hi]hj]hk]hn]uh^jv hX]r} hzX Parametersr~ r }r (h]Uh^jz ubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^jv hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (j)r }r (h]Xvaluehf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXvaluer r }r (h]Uh^j ubahdjubhzX -- r r }r (h]Uh^j ubhzX)value with which the Deferred should firer r }r (h]X)value with which the Deferred should fireh^j ubehdhubahdjubehdjubh)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^jr hX]r (h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXReturnsr r }r (h]Uh^j ubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXDeferredr r }r (h]XDeferredh^j ubahdhubahdjubehdjubeubh)r }r (h]XThis 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.h^jn h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMEhqhhX]r (hzXThis 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 (h]XThis 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 h^j ubh)r }r (h]X:py:func:`eventually`r h^j h_hbhdhhf}r (UreftypeXfunchhX eventuallyU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhNhjA uhpMEhX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-funcr ehj]hk]hn]uh^j hX]r hzX eventuallyr r }r (h]Uh^j ubahdhubaubhzX). The returned Deferred will never fail.r r }r (h]X). The returned Deferred will never fail.h^j ubeubeubeubh~)r }r (h]Uh^j h_hbhdhhf}r (hk]hj]hh]hi]hn]Uentries]r (hX7flushEventualQueue() (in module buildbot.util.eventual)h Utr auhpNhqhhX]ubh)r }r (h]Uh^j h_hbhdhhf}r (hhXpyhk]hj]hh]hi]hn]hXfunctionr hj uhpNhqhhX]r (h)r }r (h]XflushEventualQueue()h^j h_hbhdhhf}r (hk]r h ahjA hj]hh]hi]hn]r h ahXflushEventualQueuer hUhȉuhpMQhqhhX]r (h)r }r (h]Xbuildbot.util.eventual.h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMQhqhhX]r hzXbuildbot.util.eventual.r r }r (h]Uh^j ubaubh)r }r (h]j h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMQhqhhX]r hzXflushEventualQueuer r }r (h]Uh^j ubaubh)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMQhqhhX]ubeubh)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMQhqhhX]r (h)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpNhqhhX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r (h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXReturnsr r }r (h]Uh^j ubahdjubj)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXDeferredr r }r (h]XDeferredh^j ubahdhubahdjubehdjubaubh)r }r (h]XThis 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.r h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMNhqhhX]r hzXThis 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.r r }r (h]j h^j ubaubeubeubeubhZ)r }r (h]Uh^h[h_hbhdhehf}r (hh]hi]hj]hk]r (Xmodule-buildbot.util.jsonr hTehn]r h3auhpMShqhhX]r (hs)r }r (h]Xbuildbot.util.jsonr h^j h_hbhdhwhf}r (hh]hi]hj]hk]hn]uhpMShqhhX]r hzXbuildbot.util.jsonr r }r (h]j h^j ubaubh~)r }r (h]Uh^j h_hbhdhhf}r (hk]hj]hh]hi]hn]Uentries]r (hXbuildbot.util.json (module)Xmodule-buildbot.util.jsonUtr auhpMVhqhhX]ubh)r! }r" (h]XThis 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`::h^j h_hbhdhhf}r# (hh]hi]hj]hk]hn]uhpMWhqhhX]r$ (hzXzThis package is just an import of the best available JSON module. Use it instead of a more complex conditional import of r% r& }r' (h]XzThis package is just an import of the best available JSON module. Use it instead of a more complex conditional import of h^j! ubh)r( }r) (h]X:mod:`simplejson`r* h^j! h_hbhdhhf}r+ (UreftypeXmodhhX simplejsonU refdomainXpyr, hk]hj]U refexplicithh]hi]hn]hhhNhXbuildbot.util.jsonr- uhpMWhX]r. h)r/ }r0 (h]j* hf}r1 (hh]hi]r2 (hj, Xpy-modr3 ehj]hk]hn]uh^j( hX]r4 hzX simplejsonr5 r6 }r7 (h]Uh^j/ ubahdhubaubhzX or r8 r9 }r: (h]X or h^j! ubh)r; }r< (h]X :mod:`json`r= h^j! h_hbhdhhf}r> (UreftypeXmodhhXjsonU refdomainXpyr? hk]hj]U refexplicithh]hi]hn]hhhNhj- uhpMWhX]r@ h)rA }rB (h]j= hf}rC (hh]hi]rD (hj? Xpy-modrE ehj]hk]hn]uh^j; hX]rF hzXjsonrG rH }rI (h]Uh^jA ubahdhubaubhzX:rJ }rK (h]X:h^j! ubeubj)rL }rM (h]Xfrom buildbot.util import jsonh^j h_hbhdjhf}rN (jjhk]hj]hh]hi]hn]uhpM[hqhhX]rO hzXfrom buildbot.util import jsonrP rQ }rR (h]Uh^jL ubaubeubhZ)rS }rT (h]Uh^h[h_hbhdhehf}rU (hh]hi]hj]hk]rV (Xmodule-buildbot.util.maildirrW hMehn]rX hauhpM^hqhhX]rY (hs)rZ }r[ (h]Xbuildbot.util.maildirr\ h^jS h_hbhdhwhf}r] (hh]hi]hj]hk]hn]uhpM^hqhhX]r^ hzXbuildbot.util.maildirr_ r` }ra (h]j\ h^jZ ubaubh~)rb }rc (h]Uh^jS h_hbhdhhf}rd (hk]hj]hh]hi]hn]Uentries]re (hXbuildbot.util.maildir (module)Xmodule-buildbot.util.maildirUtrf auhpMahqhhX]ubh)rg }rh (h]XSeveral 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.h^jS h_hbhdhhf}ri (hh]hi]hj]hk]hn]uhpMbhqhhX]rj (hzX(Several Buildbot components make use of rk rl }rm (h]X(Several Buildbot components make use of h^jg ubj])rn }ro (h]X5`maildirs `_hf}rp (UnamehjaX'http://www.courier-mta.org/maildir.htmlrq hk]hj]hh]hi]hn]uh^jg hX]rr hzXmaildirsrs rt }ru (h]Uh^jn ubahdjgubjh)rv }rw (h]X* jkKh^jg hdjlhf}rx (Urefurijq hk]ry hOahj]hh]hi]hn]rz hauhX]ubhzX 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.r{ r| }r} (h]X 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.h^jg ubeubh~)r~ }r (h]Uh^jS h_Nhdhhf}r (hk]hj]hh]hi]hn]Uentries]r (hX/MaildirService (class in buildbot.util.maildir)hUtr auhpNhqhhX]ubh)r }r (h]Uh^jS h_Nhdhhf}r (hhXpyhk]hj]hh]hi]hn]hXclassr hj uhpNhqhhX]r (h)r }r (h]XMaildirService(basedir)h^j h_hbhdhhf}r (hk]r hahXbuildbot.util.maildirr hj]hh]hi]hn]r hahXMaildirServicer hUhȉuhpMhqhhX]r (j)r }r (h]Xclass h^j h_hbhdjhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXclass r r }r (h]Uh^j ubaubh)r }r (h]Xbuildbot.util.maildir.h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXbuildbot.util.maildir.r r }r (h]Uh^j ubaubh)r }r (h]j h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r hzXMaildirServicer r }r (h]Uh^j ubaubh)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r h)r }r (h]Xbasedirhf}r (hh]hi]hj]hk]hn]uh^j hX]r hzXbasedirr r }r (h]Uh^j ubahdhubaubeubh)r }r (h]Uh^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r (cdocutils.nodes block_quote r )r }r (h]Uh^j h_NhdU block_quoter hf}r (hh]hi]hj]hk]hn]uhpNhqhhX]r h)r }r (h]Uhf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]Uh^j h_hbhdjhf}r (hh]hi]hj]hk]hn]uhpMihX]r (h)r }r (h]X param basedirr hf}r (hh]hi]hj]hk]hn]uh^j hX]r hzX param basedirr r }r (h]j h^j ubahdjubj)r }r (h]X)(optional) base directory of the maildir hf}r (hh]hi]hj]hk]hn]uh^j hX]r h)r }r (h]X((optional) base directory of the maildirr h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMihX]r hzX((optional) base directory of the maildirr r }r (h]j h^j ubaubahdjubeubahdhubaubh)r }r (h]XA :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.h^j h_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMkhqhhX]r (hzXA r r }r (h]XA h^j ubh)r }r (h]X:py:class:`MaildirService`r h^j h_hbhdhhf}r (UreftypeXclasshhXMaildirServiceU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhj hj uhpMkhX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-classr ehj]hk]hn]uh^j hX]r hzXMaildirServicer r }r (h]Uh^j ubahdhubaubhzXS instance watches a maildir for new messages. It should be a child service of some r r }r (h]XS instance watches a maildir for new messages. It should be a child service of some h^j ubh)r }r (h]X5:py:class:`~twisted.application.service.MultiService`r h^j h_hbhdhhf}r (UreftypeXclasshhX(twisted.application.service.MultiServiceU refdomainXpyr hk]hj]U refexplicithh]hi]hn]hhhj hj uhpMkhX]r h)r }r (h]j hf}r (hh]hi]r (hj Xpy-classr ehj]hk]hn]uh^j hX]r hzX MultiServicer r }r (h]Uh^j ubahdhubaubhzX 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 r r }r(h]X 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 h^j ubh)r}r(h]X:py:meth:`messageReceived`rh^j h_hbhdhhf}r(UreftypeXmethhhXmessageReceivedU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhj hj uhpMkhX]rh)r}r(h]jhf}r (hh]hi]r (hjXpy-methr ehj]hk]hn]uh^jhX]r hzXmessageReceivedr r}r(h]Uh^jubahdhubaubhzX method.rr}r(h]X method.h^j ubeubh)r}r(h]XdTo use this class, subclass it and implement a more interesting :py:meth:`messageReceived` function.h^j h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMqhqhhX]r(hzX@To use this class, subclass it and implement a more interesting rr}r(h]X@To use this class, subclass it and implement a more interesting h^jubh)r}r(h]X:py:meth:`messageReceived`rh^jh_hbhdhhf}r(UreftypeXmethhhXmessageReceivedU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhj hj uhpMqhX]rh)r }r!(h]jhf}r"(hh]hi]r#(hjXpy-methr$ehj]hk]hn]uh^jhX]r%hzXmessageReceivedr&r'}r((h]Uh^j ubahdhubaubhzX function.r)r*}r+(h]X function.h^jubeubh~)r,}r-(h]Uh^j h_hbhdhhf}r.(hk]hj]hh]hi]hn]Uentries]r/(hX:setBasedir() (buildbot.util.maildir.MaildirService method)h2Utr0auhpNhqhhX]ubh)r1}r2(h]Uh^j h_hbhdhhf}r3(hhXpyhk]hj]hh]hi]hn]hXmethodr4hj4uhpNhqhhX]r5(h)r6}r7(h]XsetBasedir(basedir)h^j1h_hbhdhhf}r8(hk]r9h2ahj hj]hh]hi]hn]r:h2ahXMaildirService.setBasedirhj hȉuhpMzhqhhX]r;(h)r<}r=(h]X setBasedirh^j6h_hbhdhhf}r>(hh]hi]hj]hk]hn]uhpMzhqhhX]r?hzX setBasedirr@rA}rB(h]Uh^j<ubaubh)rC}rD(h]Uh^j6h_hbhdhhf}rE(hh]hi]hj]hk]hn]uhpMzhqhhX]rFh)rG}rH(h]Xbasedirhf}rI(hh]hi]hj]hk]hn]uh^jChX]rJhzXbasedirrKrL}rM(h]Uh^jGubahdhubaubeubh)rN}rO(h]Uh^j1h_hbhdhhf}rP(hh]hi]hj]hk]hn]uhpMzhqhhX]rQ(h)rR}rS(h]Uh^jNh_hbhdhhf}rT(hh]hi]hj]hk]hn]uhpNhqhhX]rUh)rV}rW(h]Uhf}rX(hh]hi]hj]hk]hn]uh^jRhX]rY(h)rZ}r[(h]Uhf}r\(hh]hi]hj]hk]hn]uh^jVhX]r]hzX Parametersr^r_}r`(h]Uh^jZubahdjubj)ra}rb(h]Uhf}rc(hh]hi]hj]hk]hn]uh^jVhX]rdh)re}rf(h]Uhf}rg(hh]hi]hj]hk]hn]uh^jahX]rh(j)ri}rj(h]Xbasedirhf}rk(hh]hi]hj]hk]hn]uh^jehX]rlhzXbasedirrmrn}ro(h]Uh^jiubahdjubhzX -- rprq}rr(h]Uh^jeubhzXbase directory of the maildirrsrt}ru(h]Xbase directory of the maildirh^jeubehdhubahdjubehdjubaubh)rv}rw(h]XxIf no ``basedir`` is provided to the constructor, this method must be used to set the basedir before the service starts.h^jNh_hbhdhhf}rx(hh]hi]hj]hk]hn]uhpMxhqhhX]ry(hzXIf no rzr{}r|(h]XIf no h^jvubh)r}}r~(h]X ``basedir``hf}r(hh]hi]hj]hk]hn]uh^jvhX]rhzXbasedirrr}r(h]Uh^j}ubahdhubhzXg is provided to the constructor, this method must be used to set the basedir before the service starts.rr}r(h]Xg is provided to the constructor, this method must be used to set the basedir before the service starts.h^jvubeubeubeubh~)r}r(h]Uh^j h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX?messageReceived() (buildbot.util.maildir.MaildirService method)h!UtrauhpNhqhhX]ubh)r}r(h]Uh^j h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXmethodrhjuhpNhqhhX]r(h)r}r(h]XmessageReceived(filename)h^jh_hbhdhhf}r(hk]rh!ahj hj]hh]hi]hn]rh!ahXMaildirService.messageReceivedhj hȉuhpMhqhhX]r(h)r}r(h]XmessageReceivedh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXmessageReceivedrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rh)r}r(h]Xfilenamehf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXfilenamerr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xfilenamehf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXfilenamerr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzX'unqualified filename of the new messagerr}r(h]X'unqualified filename of the new messageh^jubehdhubahdjubehdjubaubh)r}r(h]XThis 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.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(hzXuThis method is called with the short filename of the new message. The full name of the new file can be obtained with rr}r(h]XuThis method is called with the short filename of the new message. The full name of the new file can be obtained with h^jubh)r}r(h]X*``os.path.join(maildir, 'new', filename)``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX&os.path.join(maildir, 'new', filename)rr}r(h]Uh^jubahdhubhzX'. The method is un-implemented in the rr}r(h]X'. The method is un-implemented in the h^jubh)r}r(h]X:py:class:`MaildirService`rh^jh_hbhdhhf}r(UreftypeXclasshhXMaildirServiceU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhj hj uhpMhX]rh)r}r(h]jhf}r(hh]hi]r(hjXpy-classrehj]hk]hn]uh^jhX]rhzXMaildirServicerr}r(h]Uh^jubahdhubaubhzX. class, and must be implemented in subclasses.rr}r(h]X. class, and must be implemented in subclasses.h^jubeubeubeubh~)r}r(h]Uh^j h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX<moveToCurDir() (buildbot.util.maildir.MaildirService method)hUtrauhpNhqhhX]ubh)r}r(h]Uh^j h_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXmethodrhjuhpNhqhhX]r(h)r}r(h]XmoveToCurDir(filename)h^jh_hbhdhhf}r(hk]rhahj hj]hh]hi]hn]rhahXMaildirService.moveToCurDirhj hȉuhpMhqhhX]r(h)r}r(h]X moveToCurDirh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzX moveToCurDirrr }r (h]Uh^jubaubh)r }r (h]Uh^jh_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]rh)r}r(h]Xfilenamehf}r(hh]hi]hj]hk]hn]uh^j hX]rhzXfilenamerr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r (hh]hi]hj]hk]hn]uh^jhX]r!(h)r"}r#(h]Uhf}r$(hh]hi]hj]hk]hn]uh^jhX]r%hzX Parametersr&r'}r((h]Uh^j"ubahdjubj)r)}r*(h]Uhf}r+(hh]hi]hj]hk]hn]uh^jhX]r,h)r-}r.(h]Uhf}r/(hh]hi]hj]hk]hn]uh^j)hX]r0(j)r1}r2(h]Xfilenamehf}r3(hh]hi]hj]hk]hn]uh^j-hX]r4hzXfilenamer5r6}r7(h]Uh^j1ubahdjubhzX -- r8r9}r:(h]Uh^j-ubhzX'unqualified filename of the new messager;r<}r=(h]X'unqualified filename of the new messager>h^j-ubehdhubahdjubehdjubh)r?}r@(h]Uhf}rA(hh]hi]hj]hk]hn]uh^jhX]rB(h)rC}rD(h]Uhf}rE(hh]hi]hj]hk]hn]uh^j?hX]rFhzXReturnsrGrH}rI(h]Uh^jCubahdjubj)rJ}rK(h]Uhf}rL(hh]hi]hj]hk]hn]uh^j?hX]rMh)rN}rO(h]Uhf}rP(hh]hi]hj]hk]hn]uh^jJhX]rQhzXopen file objectrRrS}rT(h]Xopen file objectrUh^jNubahdhubahdjubehdjubeubh)rV}rW(h]XCall 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.h^jh_hbhdhhf}rX(hh]hi]hj]hk]hn]uhpMhqhhX]rY(hzXCall this from rZr[}r\(h]XCall this from h^jVubh)r]}r^(h]X:py:meth:`messageReceived`r_h^jVh_hbhdhhf}r`(UreftypeXmethhhXmessageReceivedU refdomainXpyrahk]hj]U refexplicithh]hi]hn]hhhj hj uhpMhX]rbh)rc}rd(h]j_hf}re(hh]hi]rf(hjaXpy-methrgehj]hk]hn]uh^j]hX]rhhzXmessageReceivedrirj}rk(h]Uh^jcubahdhubaubhzX| to start processing the message; this moves the message file to the 'cur' directory and returns an open file handle for it.rlrm}rn(h]X| to start processing the message; this moves the message file to the 'cur' directory and returns an open file handle for it.h^jVubeubeubeubeubeubeubhZ)ro}rp(h]Uh^h[h_hbhdhehf}rq(hh]hi]hj]hk]rr(Xmodule-buildbot.util.miscrshUehn]rth6auhpMhqhhX]ru(hs)rv}rw(h]Xbuildbot.util.miscrxh^joh_hbhdhwhf}ry(hh]hi]hj]hk]hn]uhpMhqhhX]rzhzXbuildbot.util.miscr{r|}r}(h]jxh^jvubaubh~)r~}r(h]Uh^joh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hXbuildbot.util.misc (module)Xmodule-buildbot.util.miscUtrauhpMhqhhX]ubh~)r}r(h]Uh^joh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX/deferredLocked() (in module buildbot.util.misc)h0UtrauhpNhqhhX]ubh)r}r(h]Uh^joh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]XdeferredLocked(lock)h^jh_hbhdhhf}r(hk]rh0ahXbuildbot.util.miscrhj]hh]hi]hn]rh0ahXdeferredLockedrhUhȉuhpMhqhhX]r(h)r}r(h]Xbuildbot.util.misc.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXbuildbot.util.misc.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXdeferredLockedrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rh)r}r(h]Xlockhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXlockrr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xlockhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXlockrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzXa rr}r(h]Xa h^jubh)r}r(h]X/:py:class:`twisted.internet.defer.DeferredLock`rh^jh_hbhdhhf}r(UreftypeXclasshhX#twisted.internet.defer.DeferredLockU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhNhjuhpMhX]rh)r}r(h]jhf}r(hh]hi]r(hjXpy-classrehj]hk]hn]uh^jhX]rhzX#twisted.internet.defer.DeferredLockrr}r(h]Uh^jubahdhubaubhzXA instance or a string naming an instance attribute containing onerr}r(h]XA instance or a string naming an instance attribute containing oneh^jubehdhubahdjubehdjubaubh)r}r(h]XThis 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::h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(hzXDThis is a decorator to wrap an event-driven method (one returning a rr}r(h]XDThis is a decorator to wrap an event-driven method (one returning a h^jubh)r}r(h]X ``Deferred``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXDeferredrr}r(h]Uh^jubahdhubhzX-) in an acquire/release pair of a designated rr}r(h]X-) in an acquire/release pair of a designated h^jubh)r}r(h]X0:py:class:`~twisted.internet.defer.DeferredLock`rh^jh_hbhdhhf}r(UreftypeXclasshhX#twisted.internet.defer.DeferredLockU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhNhjuhpMhX]rh)r}r(h]jhf}r(hh]hi]r(hjXpy-classrehj]hk]hn]uh^jhX]rhzX DeferredLockrr}r(h]Uh^jubahdhubaubhzX?. For simple functions with a static lock, this is as easy as:rr }r (h]X?. For simple functions with a static lock, this is as easy as:h^jubeubj)r }r (h]XnsomeLock = defer.DeferredLock() @util.deferredLocked(someLock) def someLockedFunction(): # .. return dh^jh_hbhdjhf}r (jjhk]hj]hh]hi]hn]uhpMhqhhX]rhzXnsomeLock = defer.DeferredLock() @util.deferredLocked(someLock) def someLockedFunction(): # .. return drr}r(h]Uh^j ubaubh)r}r(h]XFor 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::h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXFor 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(h]XFor 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:h^jubaubj)r}r(h]Xdef __init__(self): self.someLock = defer.DeferredLock() @util.deferredLocked('someLock') def someLockedFunction(): # .. return dh^jh_hbhdjhf}r(jjhk]hj]hh]hi]hn]uhpMhqhhX]rhzXdef __init__(self): self.someLock = defer.DeferredLock() @util.deferredLocked('someLock') def someLockedFunction(): # .. return drr}r(h]Uh^jubaubeubeubh~)r }r!(h]Uh^joh_hbhdhhf}r"(hk]hj]hh]hi]hn]Uentries]r#(hX2SerializedInvocation (class in buildbot.util.misc)hUtr$auhpNhqhhX]ubh)r%}r&(h]Uh^joh_hbhdhhf}r'(hhXpyhk]hj]hh]hi]hn]hXclassr(hj(uhpNhqhhX]r)(h)r*}r+(h]XSerializedInvocation(method)h^j%h_hbhdhhf}r,(hk]r-hahjhj]hh]hi]hn]r.hahXSerializedInvocationr/hUhȉuhpMhqhhX]r0(j)r1}r2(h]Xclass h^j*h_hbhdjhf}r3(hh]hi]hj]hk]hn]uhpMhqhhX]r4hzXclass r5r6}r7(h]Uh^j1ubaubh)r8}r9(h]Xbuildbot.util.misc.h^j*h_hbhdhhf}r:(hh]hi]hj]hk]hn]uhpMhqhhX]r;hzXbuildbot.util.misc.r<r=}r>(h]Uh^j8ubaubh)r?}r@(h]j/h^j*h_hbhdhhf}rA(hh]hi]hj]hk]hn]uhpMhqhhX]rBhzXSerializedInvocationrCrD}rE(h]Uh^j?ubaubh)rF}rG(h]Uh^j*h_hbhdhhf}rH(hh]hi]hj]hk]hn]uhpMhqhhX]rIh)rJ}rK(h]Xmethodhf}rL(hh]hi]hj]hk]hn]uh^jFhX]rMhzXmethodrNrO}rP(h]Uh^jJubahdhubaubeubh)rQ}rR(h]Uh^j%h_hbhdhhf}rS(hh]hi]hj]hk]hn]uhpMhqhhX]rT(h)rU}rV(h]XThis 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.rWh^jQh_hbhdhhf}rX(hh]hi]hj]hk]hn]uhpMhqhhX]rYhzXThis 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.rZr[}r\(h]jWh^jUubaubh)r]}r^(h]XNote 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::h^jQh_hbhdhhf}r_(hh]hi]hj]hk]hn]uhpMhqhhX]r`hzXNote 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:rarb}rc(h]XNote 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:h^j]ubaubj)rd}re(h]XOdef __init__(self): self.someMethod = SerializedInovcation(self.someMethod)h^jQh_hbhdjhf}rf(jjhk]hj]hh]hi]hn]uhpMhqhhX]rghzXOdef __init__(self): self.someMethod = SerializedInovcation(self.someMethod)rhri}rj(h]Uh^jdubaubh)rk}rl(h]XsTests can monkey-patch the ``_quiet`` method of the class to be notified when all planned invocations are complete.h^jQh_hbhdhhf}rm(hh]hi]hj]hk]hn]uhpMhqhhX]rn(hzXTests can monkey-patch the rorp}rq(h]XTests can monkey-patch the h^jkubh)rr}rs(h]X ``_quiet``hf}rt(hh]hi]hj]hk]hn]uh^jkhX]ruhzX_quietrvrw}rx(h]Uh^jrubahdhubhzXN method of the class to be notified when all planned invocations are complete.ryrz}r{(h]XN method of the class to be notified when all planned invocations are complete.h^jkubeubeubeubeubhZ)r|}r}(h]Uh^h[h_hbhdhehf}r~(hh]hi]hj]hk]r(Xmodule-buildbot.util.netstringsrhSehn]rh/auhpMhqhhX]r(hs)r}r(h]Xbuildbot.util.netstringsrh^j|h_hbhdhwhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXbuildbot.util.netstringsrr}r(h]jh^jubaubh~)r}r(h]Uh^j|h_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX!buildbot.util.netstrings (module)Xmodule-buildbot.util.netstringsUtrauhpMhqhhX]ubh)r}r(h]XSimilar 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.h^j|h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(hzXSimilar to maildirs, rr}r(h]XSimilar to maildirs, h^jubj])r}r(h]X4`netstrings `_hf}r(Unameh jaX$http://cr.yp.to/proto/netstrings.txtrhk]hj]hh]hi]hn]uh^jhX]rhzX netstringsrr}r(h]Uh^jubahdjgubjh)r}r(h]X' jkKh^jhdjlhf}r(Urefurijhk]rhJahj]hh]hi]hn]rh auhX]ubhzX 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(h]X 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.h^jubeubh~)r}r(h]Uh^j|h_Nhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX3NetstringParser (class in buildbot.util.netstrings)h+UtrauhpNhqhhX]ubh)r}r(h]Uh^j|h_Nhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXclassrhjuhpNhqhhX]r(h)r}r(h]XNetstringParserrh^jh_hbhdhhf}r(hk]rh+ahXbuildbot.util.netstringsrhj]hh]hi]hn]rh+ahjhUhȉuhpMhqhhX]r(j)r}r(h]Xclass h^jh_hbhdjhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXclass rr}r(h]Uh^jubaubh)r}r(h]Xbuildbot.util.netstrings.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXbuildbot.util.netstrings.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXNetstringParserrr}r(h]Uh^jubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(h)r}r(h]XxThis class parses strings piece by piece, either collecting the accumulated strings or invoking a callback for each one.rh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXxThis class parses strings piece by piece, either collecting the accumulated strings or invoking a callback for each one.rr}r(h]jh^jubaubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX8feed() (buildbot.util.netstrings.NetstringParser method)h UtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXmethodrhjuhpNhqhhX]r(h)r}r(h]X feed(data)h^jh_hbhdhhf}r(hk]rh ahjhj]hh]hi]hn]rh ahXNetstringParser.feedhjhȉuhpMhqhhX]r(h)r}r(h]Xfeedh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXfeedrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rh)r}r(h]Xdatahf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXdatarr}r(h]Uh^jubahdhubaubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r (h]Uhf}r (hh]hi]hj]hk]hn]uh^jhX]r hzX Parametersr r }r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xdatahf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXdatarr}r(h]Uh^jubahdjubhzX -- rr}r (h]Uh^jubhzX%a portion of netstring-formatted datar!r"}r#(h]X%a portion of netstring-formatted datah^jubehdhubahdjubehdjubh)r$}r%(h]Uh^jh_hbhdjhf}r&(hh]hi]hj]hk]hn]uhpMhqhhX]r'(h)r(}r)(h]Xraiseshf}r*(hh]hi]hj]hk]hn]uh^j$hX]r+hzXRaisesr,r-}r.(h]Uh^j(ubahdjubj)r/}r0(h]X6:py:exc:`twisted.protocols.basic.NetstringParseError` hf}r1(hh]hi]hj]hk]hn]uh^j$hX]r2h)r3}r4(h]X5:py:exc:`twisted.protocols.basic.NetstringParseError`r5h^j/h_hbhdhhf}r6(hh]hi]hj]hk]hn]uhpMhX]r7h)r8}r9(h]j5h^j3h_hbhdhhf}r:(UreftypeXexchhX+twisted.protocols.basic.NetstringParseErrorU refdomainXpyr;hk]hj]U refexplicithh]hi]hn]hhhjhjuhpMhX]r<h)r=}r>(h]j5hf}r?(hh]hi]r@(hj;Xpy-excrAehj]hk]hn]uh^j8hX]rBhzX+twisted.protocols.basic.NetstringParseErrorrCrD}rE(h]Uh^j=ubahdhubaubaubahdjubeubeubh)rF}rG(h]XAdd arbitrarily-sized ``data`` to the incoming-data buffer. Any complete netstrings will trigger a call to the :py:meth:`stringReceived` method.h^jh_hbhdhhf}rH(hh]hi]hj]hk]hn]uhpMhqhhX]rI(hzXAdd arbitrarily-sized rJrK}rL(h]XAdd arbitrarily-sized h^jFubh)rM}rN(h]X``data``hf}rO(hh]hi]hj]hk]hn]uh^jFhX]rPhzXdatarQrR}rS(h]Uh^jMubahdhubhzXR to the incoming-data buffer. Any complete netstrings will trigger a call to the rTrU}rV(h]XR to the incoming-data buffer. Any complete netstrings will trigger a call to the h^jFubh)rW}rX(h]X:py:meth:`stringReceived`rYh^jFh_hbhdhhf}rZ(UreftypeXmethhhXstringReceivedU refdomainXpyr[hk]hj]U refexplicithh]hi]hn]hhhjhjuhpMhX]r\h)r]}r^(h]jYhf}r_(hh]hi]r`(hj[Xpy-methraehj]hk]hn]uh^jWhX]rbhzXstringReceivedrcrd}re(h]Uh^j]ubahdhubaubhzX method.rfrg}rh(h]X method.h^jFubeubh)ri}rj(h]XNote 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.rkh^jh_hbhdhhf}rl(hh]hi]hj]hk]hn]uhpMhqhhX]rmhzXNote 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.rnro}rp(h]jkh^jiubaubeubeubh~)rq}rr(h]Uh^jh_hbhdhhf}rs(hk]hj]hh]hi]hn]Uentries]uhpNhqhhX]ubh)rt}ru(h]Uh^jh_hbhdhhf}rv(hhXpyhk]hj]hh]hi]hn]hXmethodrwhjwuhpNhqhhX]rx(h)ry}rz(h]XstringReceived(string):r{h^jth_hbhdhhf}r|(hk]hj]hh]hi]hn]hȉuhpMhqhhX]r}h)r~}r(h]j{h^jyh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXstringReceived(string):rr}r(h]Uh^j~ubaubaubh)r}r(h]Uh^jth_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(h)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xstringhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXstringrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzXthe decoded stringrr}r(h]Xthe decoded stringrh^jubehdhubahdjubehdjubaubh)r}r(h]XThis 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.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(hzXThis method is called for each decoded string as soon as it is read completely. The default implementation appends the string to the rr}r(h]XThis method is called for each decoded string as soon as it is read completely. The default implementation appends the string to the h^jubh)r}r(h]X:py:attr:`strings`rh^jh_hbhdhhf}r(UreftypeXattrhhXstringsU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhjhjuhpMhX]rh)r}r(h]jhf}r(hh]hi]r(hjXpy-attrrehj]hk]hn]uh^jhX]rhzXstringsrr}r(h]Uh^jubahdhubaubhzX+ attribute, but subclasses can do anything.rr}r(h]X+ attribute, but subclasses can do anything.h^jubeubeubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX<strings (buildbot.util.netstrings.NetstringParser attribute)h(h]Uh^j8ubaubh)r?}r@(h]Uh^j"h_hbhdhhf}rA(hh]hi]hj]hk]hn]uhpMhqhhX]rB(h)rC}rD(h]Xtablehf}rE(hh]hi]hj]hk]hn]uh^j?hX]rFhzXtablerGrH}rI(h]Uh^jCubahdhubh)rJ}rK(h]Xselecthf}rL(hh]hi]hj]hk]hn]uh^j?hX]rMhzXselectrNrO}rP(h]Uh^jJubahdhubeubeubh)rQ}rR(h]Uh^jh_hbhdhhf}rS(hh]hi]hj]hk]hn]uhpMhqhhX]rT(h)rU}rV(h]Uh^jQh_hbhdhhf}rW(hh]hi]hj]hk]hn]uhpNhqhhX]rXh)rY}rZ(h]Uhf}r[(hh]hi]hj]hk]hn]uh^jUhX]r\(h)r]}r^(h]Uhf}r_(hh]hi]hj]hk]hn]uh^jYhX]r`hzX Parametersrarb}rc(h]Uh^j]ubahdjubj)rd}re(h]Uhf}rf(hh]hi]hj]hk]hn]uh^jYhX]rgj)rh}ri(h]Uhf}rj(hh]hi]hj]hk]hn]uh^jdhX]rk(j)rl}rm(h]Uhf}rn(hh]hi]hj]hk]hn]uh^jhhX]roh)rp}rq(h]Uhf}rr(hh]hi]hj]hk]hn]uh^jlhX]rs(j)rt}ru(h]Xtablehf}rv(hh]hi]hj]hk]hn]uh^jphX]rwhzXtablerxry}rz(h]Uh^jtubahdjubhzX -- r{r|}r}(h]Uh^jpubhzX+table into which insert should be performedr~r}r(h]X+table into which insert should be performedrh^jpubehdhubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Xselecthf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXselectrr}r(h]Uh^jubahdjubhzX -- rr}r(h]Uh^jubhzX,select query from which data should be drawnrr}r(h]X,select query from which data should be drawnrh^jubehdhubahdjubehdj6ubahdjubehdjubaubh)r}r(h]XThis class is taken directly from SQLAlchemy's `compiler.html `_, and allows a Pythonic representation of ``INSERT INTO .. SELECT ..`` queries.h^jQh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(hzX/This class is taken directly from SQLAlchemy's rr}r(h]X/This class is taken directly from SQLAlchemy's h^jubj])r}r(h]X|`compiler.html `_hf}r(Unameh%jaXihttp://www.sqlalchemy.org/docs/core/compiler.html#compiling-sub-elements-of-a-custom-expression-constructrhk]hj]hh]hi]hn]uh^jhX]rhzX compiler.htmlrr}r(h]Uh^jubahdjgubjh)r}r(h]Xl jkKh^jhdjlhf}r(Urefurijhk]rhPahj]hh]hi]hn]rh%auhX]ubhzX*, and allows a Pythonic representation of rr}r(h]X*, and allows a Pythonic representation of h^jubh)r}r(h]X``INSERT INTO .. SELECT ..``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXINSERT INTO .. SELECT ..rr}r(h]Uh^jubahdhubhzX queries.rr}r(h]X queries.h^jubeubeubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX.sa_version() (in module buildbot.util.sautils)h4UtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hXfunctionrhjuhpNhqhhX]r(h)r}r(h]X sa_version()h^jh_hbhdhhf}r(hk]rh4ahj&hj]hh]hi]hn]rh4ahX sa_versionrhUhȉuhpMhqhhX]r(h)r}r(h]Xbuildbot.util.sautils.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXbuildbot.util.sautils.rr}r(h]Uh^jubaubh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzX sa_versionrr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]ubeubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rh)r}r(h]XReturn a 3-tuple representing the SQLAlchemy version. Note that older versions that did not have a ``__version__`` attribute are represented by ``(0,0,0)``.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]r(hzXdReturn a 3-tuple representing the SQLAlchemy version. Note that older versions that did not have a rr}r(h]XdReturn a 3-tuple representing the SQLAlchemy version. Note that older versions that did not have a h^jubh)r}r(h]X``__version__``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX __version__rr}r(h]Uh^jubahdhubhzX attribute are represented by rr}r(h]X attribute are represented by h^jubh)r}r(h]X ``(0,0,0)``hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX(0,0,0)rr}r(h]Uh^jubahdhubhzX.r}r(h]X.h^jubeubaubeubeubhZ)r}r(h]Uh^h[h_hbhdhehf}r(hh]hi]hj]hk]rhIahn]rh auhpMhqhhX]r(hs)r}r(h]Xbuildbot.util.subscriptionrh^jh_hbhdhwhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXbuildbot.util.subscriptionrr}r(h]jh^jubaubh)r}r(h]XThe 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.h^jh_hbhdhhf}r (hh]hi]hj]hk]hn]uhpMhqhhX]r (hzXThe classes in the r r }r (h]XThe classes in the h^jubh)r}r(h]X$:py:mod:`buildbot.util.subscription`rh^jh_hbhdhhf}r(UreftypeXmodhhXbuildbot.util.subscriptionU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhNhj&uhpMhX]rh)r}r(h]jhf}r(hh]hi]r(hjXpy-modrehj]hk]hn]uh^jhX]rhzXbuildbot.util.subscriptionrr}r(h]Uh^jubahdhubaubhzX 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.rr}r(h]X 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.h^jubeubeubhZ)r }r!(h]Uh^h[h_hbhdhehf}r"(hh]hi]hj]hk]r#hVahn]r$h;auhpM hqhhX]r%(hs)r&}r'(h]Xbuildbot.util.croniterr(h^j h_hbhdhwhf}r)(hh]hi]hj]hk]hn]uhpM hqhhX]r*hzXbuildbot.util.croniterr+r,}r-(h]j(h^j&ubaubh)r.}r/(h]XThis module is a copy of https://github.com/taichino/croniter, and provides support for converting cron-like time specifications into actual times.h^j h_hbhdhhf}r0(hh]hi]hj]hk]hn]uhpM hqhhX]r1(hzXThis module is a copy of r2r3}r4(h]XThis module is a copy of h^j.ubj])r5}r6(h]X$https://github.com/taichino/croniterr7hf}r8(Urefurij7hk]hj]hh]hi]hn]uh^j.hX]r9hzX$https://github.com/taichino/croniterr:r;}r<(h]Uh^j5ubahdjgubhzXV, and provides support for converting cron-like time specifications into actual times.r=r>}r?(h]XV, and provides support for converting cron-like time specifications into actual times.h^j.ubeubeubhZ)r@}rA(h]Uh^h[h_hbhdhehf}rB(hh]hi]hj]hk]rC(Xmodule-buildbot.util.staterDhLehn]rEhauhpMhqhhX]rF(hs)rG}rH(h]Xbuildbot.util.staterIh^j@h_hbhdhwhf}rJ(hh]hi]hj]hk]hn]uhpMhqhhX]rKhzXbuildbot.util.staterLrM}rN(h]jIh^jGubaubh~)rO}rP(h]Uh^j@h_hbhdhhf}rQ(hk]hj]hh]hi]hn]Uentries]rR(hXbuildbot.util.state (module)Xmodule-buildbot.util.stateUtrSauhpMhqhhX]ubh)rT}rU(h]X}The classes in the :py:mod:`buildbot.util.subscription` module are used for dealing with object state stored in the database.rVh^j@h_hbhdhhf}rW(hh]hi]hj]hk]hn]uhpMhqhhX]rX(hzXThe classes in the rYrZ}r[(h]XThe classes in the h^jTubh)r\}r](h]X$:py:mod:`buildbot.util.subscription`r^h^jTh_hbhdhhf}r_(UreftypeXmodhhXbuildbot.util.subscriptionU refdomainXpyr`hk]hj]U refexplicithh]hi]hn]hhhNhXbuildbot.util.staterauhpMhX]rbh)rc}rd(h]j^hf}re(hh]hi]rf(hj`Xpy-modrgehj]hk]hn]uh^j\hX]rhhzXbuildbot.util.subscriptionrirj}rk(h]Uh^jcubahdhubaubhzXF module are used for dealing with object state stored in the database.rlrm}rn(h]XF module are used for dealing with object state stored in the database.h^jTubeubh~)ro}rp(h]Uh^j@h_Nhdhhf}rq(hk]hj]hh]hi]hn]Uentries]rr(hX)StateMixin (class in buildbot.util.state)h9UtrsauhpNhqhhX]ubh)rt}ru(h]Uh^j@h_Nhdhhf}rv(hhXpyhk]hj]hh]hi]hn]hXclassrwhjwuhpNhqhhX]rx(h)ry}rz(h]X StateMixinr{h^jth_hbhdhhf}r|(hk]r}h9ahjahj]hh]hi]hn]r~h9ahj{hUhȉuhpM4hqhhX]r(j)r}r(h]Xclass h^jyh_hbhdjhf}r(hh]hi]hj]hk]hn]uhpM4hqhhX]rhzXclass rr}r(h]Uh^jubaubh)r}r(h]Xbuildbot.util.state.h^jyh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM4hqhhX]rhzXbuildbot.util.state.rr}r(h]Uh^jubaubh)r}r(h]j{h^jyh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM4hqhhX]rhzX StateMixinrr}r(h]Uh^jubaubeubh)r}r(h]Uh^jth_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM4hqhhX]r(h)r}r(h]XYThis class provides helper methods for accessing the object state stored in the database.rh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXYThis class provides helper methods for accessing the object state stored in the database.rr}r(h]jh^jubaubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX/name (buildbot.util.state.StateMixin attribute)h*UtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hX attributerhjuhpNhqhhX]r(h)r}r(h]Xnamerh^jh_hbhdhhf}r(hk]rh*ahjahj]hh]hi]hn]rh*ahXStateMixin.namehj{hȉuhpMhqhhX]rh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXnamerr}r(h]Uh^jubaubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rh)r}r(h]XPThis must be set to the name to be used to identify this object in the database.rh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpMhqhhX]rhzXPThis must be set to the name to be used to identify this object in the database.rr}r(h]jh^jubaubaubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX1master (buildbot.util.state.StateMixin attribute)hUtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyhk]hj]hh]hi]hn]hX attributerhjuhpNhqhhX]r(h)r}r(h]Xmasterrh^jh_hbhdhhf}r(hk]rhahjahj]hh]hi]hn]rhahXStateMixin.masterhj{hȉuhpM!hqhhX]rh)r}r(h]jh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM!hqhhX]rhzXmasterrr}r(h]Uh^jubaubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM!hqhhX]rh)r}r(h]X6This must point to the :py:class:`BuildMaster` object.h^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM hqhhX]r(hzXThis must point to the rr}r(h]XThis must point to the h^jubh)r}r(h]X:py:class:`BuildMaster`rh^jh_hbhdhhf}r(UreftypeXclasshhX BuildMasterU refdomainXpyrhk]hj]U refexplicithh]hi]hn]hhhj{hjauhpM hX]rh)r}r(h]jhf}r(hh]hi]r(hjXpy-classrehj]hk]hn]uh^jhX]rhzX BuildMasterrr}r(h]Uh^jubahdhubaubhzX object.rr}r(h]X object.h^jubeubaubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX2getState() (buildbot.util.state.StateMixin method)h UtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyrhk]hj]hh]hi]hn]hXmethodrhjuhpNhqhhX]r(h)r}r(h]XgetState(name, default)h^jh_hbhdhhf}r(hk]rh ahjahj]hh]hi]hn]r h ahXStateMixin.getStatehj{hȉuhpM+hqhhX]r (h)r }r (h]XgetStateh^jh_hbhdhhf}r (hh]hi]hj]hk]hn]uhpM+hqhhX]rhzXgetStaterr}r(h]Uh^j ubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM+hqhhX]r(h)r}r(h]Xnamehf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXnamerr}r(h]Uh^jubahdhubh)r}r(h]Xdefaulthf}r(hh]hi]hj]hk]hn]uh^jhX]r hzXdefaultr!r"}r#(h]Uh^jubahdhubeubeubh)r$}r%(h]Uh^jh_hbhdhhf}r&(hh]hi]hj]hk]hn]uhpM+hqhhX]r'(h)r(}r)(h]Uh^j$h_hbhdhhf}r*(hh]hi]hj]hk]hn]uhpNhqhhX]r+(h)r,}r-(h]Uhf}r.(hh]hi]hj]hk]hn]uh^j(hX]r/(h)r0}r1(h]Uhf}r2(hh]hi]hj]hk]hn]uh^j,hX]r3hzX Parametersr4r5}r6(h]Uh^j0ubahdjubj)r7}r8(h]Uhf}r9(hh]hi]hj]hk]hn]uh^j,hX]r:j)r;}r<(h]Uhf}r=(hh]hi]hj]hk]hn]uh^j7hX]r>(j)r?}r@(h]Uhf}rA(hh]hi]hj]hk]hn]uh^j;hX]rBh)rC}rD(h]Uhf}rE(hh]hi]hj]hk]hn]uh^j?hX]rF(j)rG}rH(h]Xnamehf}rI(hh]hi]hj]hk]hn]uh^jChX]rJhzXnamerKrL}rM(h]Uh^jGubahdjubhzX -- rNrO}rP(h]Uh^jCubhzXname of the value to retrieverQrR}rS(h]Xname of the value to retrieveh^jCubehdhubahdjubj)rT}rU(h]Uhf}rV(hh]hi]hj]hk]hn]uh^j;hX]rWh)rX}rY(h]Uhf}rZ(hh]hi]hj]hk]hn]uh^jThX]r[(j)r\}r](h]Xdefaulthf}r^(hh]hi]hj]hk]hn]uh^jXhX]r_hzXdefaultr`ra}rb(h]Uh^j\ubahdjubhzX -- rcrd}re(h]Uh^jXubhzX(optional) value to return if rfrg}rh(h]X(optional) value to return if h^jXubcdocutils.nodes title_reference ri)rj}rk(h]X`name`hf}rl(hh]hi]hj]hk]hn]uh^jXhX]rmhzXnamernro}rp(h]Uh^jjubahdUtitle_referencerqubhzX is not presentrrrs}rt(h]X is not presenth^jXubehdhubahdjubehdj6ubahdjubehdjubh)ru}rv(h]Uhf}rw(hh]hi]hj]hk]hn]uh^j(hX]rx(h)ry}rz(h]Uhf}r{(hh]hi]hj]hk]hn]uh^juhX]r|hzXReturnsr}r~}r(h]Uh^jyubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^juhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXstate value via a Deferredrr}r(h]Xstate value via a Deferredh^jubahdhubahdjubehdjubh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^j(hX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXRaisesrr}r(h]Uh^jubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(j)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(UreftypeUexcrU reftargetXKeyErrorrU refdomainjhk]hj]U refexplicithh]hi]hn]uh^jhX]rj)r}r(h]jhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXKeyErrorrr}r(h]Uh^jubahdjubahdhubhzX -- rr}r(h]Uh^jubhzXif rr}r(h]Xif h^jubji)r}r(h]X`name`hf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXnamerr}r(h]Uh^jubahdjqubhzX' is not present and no default is givenrr}r(h]X' is not present and no default is givenh^jubehdhubahdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(UreftypejU reftargetX TypeErrorrU refdomainjhk]hj]U refexplicithh]hi]hn]uh^jhX]rj)r}r(h]jhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX TypeErrorrr}r(h]Uh^jubahdjubahdhubhzX -- rr}r(h]Uh^jubhzXif JSON parsing failsrr}r(h]Xif JSON parsing failsh^jubehdhubahdjubehdj6ubahdjubehdjubeubh)r}r(h]X0Get a named state value from the object's state.rh^j$h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM*hqhhX]rhzX0Get a named state value from the object's state.rr}r(h]jh^jubaubeubeubh~)r}r(h]Uh^jh_hbhdhhf}r(hk]hj]hh]hi]hn]Uentries]r(hX2getState() (buildbot.util.state.StateMixin method)X'buildbot.util.state.StateMixin.getStateUtrauhpNhqhhX]ubh)r}r(h]Uh^jh_hbhdhhf}r(hhXpyrhk]hj]hh]hi]hn]hXmethodrhjuhpNhqhhX]r(h)r}r(h]XgetState(name, value)h^jh_hbhdhhf}r(hk]hjahj]hh]hi]hn]hXStateMixin.getStatehj{hȉuhpM4hqhhX]r(h)r}r(h]XgetStateh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM4hqhhX]rhzXgetStaterr}r(h]Uh^jubaubh)r}r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM4hqhhX]r(h)r}r(h]Xnamehf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXnamerr}r(h]Uh^jubahdhubh)r}r(h]Xvaluehf}r(hh]hi]hj]hk]hn]uh^jhX]r hzXvaluer r }r (h]Uh^jubahdhubeubeubh)r }r(h]Uh^jh_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM4hqhhX]r(h)r}r(h]Uh^j h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpNhqhhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]r(h)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX Parametersrr}r(h]Uh^jubahdjubj)r }r!(h]Uhf}r"(hh]hi]hj]hk]hn]uh^jhX]r#j)r$}r%(h]Uhf}r&(hh]hi]hj]hk]hn]uh^j hX]r'(j)r(}r)(h]Uhf}r*(hh]hi]hj]hk]hn]uh^j$hX]r+h)r,}r-(h]Uhf}r.(hh]hi]hj]hk]hn]uh^j(hX]r/(j)r0}r1(h]Xnamehf}r2(hh]hi]hj]hk]hn]uh^j,hX]r3hzXnamer4r5}r6(h]Uh^j0ubahdjubhzX -- r7r8}r9(h]Uh^j,ubhzXthe name of the value to changer:r;}r<(h]Xthe name of the value to changer=h^j,ubehdhubahdjubj)r>}r?(h]Uhf}r@(hh]hi]hj]hk]hn]uh^j$hX]rAh)rB}rC(h]Uhf}rD(hh]hi]hj]hk]hn]uh^j>hX]rE(j)rF}rG(h]Xvaluehf}rH(hh]hi]hj]hk]hn]uh^jBhX]rIhzXvaluerJrK}rL(h]Uh^jFubahdjubhzX -- rMrN}rO(h]Uh^jBubhzX,the value to set - must be a JSONable objectrPrQ}rR(h]X,the value to set - must be a JSONable objectrSh^jBubehdhubahdjubj)rT}rU(h]Uhf}rV(hh]hi]hj]hk]hn]uh^j$hX]rWh)rX}rY(h]Uhf}rZ(hh]hi]hj]hk]hn]uh^jThX]r[(j)r\}r](h]Xreturnshf}r^(hh]hi]hj]hk]hn]uh^jXhX]r_hzXreturnsr`ra}rb(h]Uh^j\ubahdjubhzX -- rcrd}re(h]Uh^jXubhzXDeferredrfrg}rh(h]XDeferredrih^jXubehdhubahdjubehdj6ubahdjubehdjubh)rj}rk(h]Uhf}rl(hh]hi]hj]hk]hn]uh^jhX]rm(h)rn}ro(h]Uhf}rp(hh]hi]hj]hk]hn]uh^jjhX]rq(hzXRaisesrrrs}rt(h]Uh^jnubhzX ru}rv(h]Uh^jnubh)rw}rx(h]Uhf}ry(UreftypejU reftargetX TypeErrorrzU refdomainjhk]hj]U refexplicithh]hi]hn]uh^jnhX]r{hzX TypeErrorr|r}}r~(h]jzh^jwubahdhubehdjubj)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jjhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzXif JSONification failsrr}r(h]Xif JSONification failsrh^jubahdhubahdjubehdjubeubh)r}r(h]X\Set a named state value in the object's persistent state. Note that value must be json-able.rh^j h_hbhdhhf}r(hh]hi]hj]hk]hn]uhpM3hqhhX]rhzX\Set a named state value in the object's persistent state. Note that value must be json-able.rr}r(h]jh^jubaubeubeubeubeubeubeubah]UU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rhqhU current_linerNUtransform_messagesr]rcdocutils.nodes system_message r)r}r(h]Uhf}r(hh]UlevelKhk]hj]Usourcehbhi]hn]UlineKUtypeUINFOruhX]rh)r}r(h]Uhf}r(hh]hi]hj]hk]hn]uh^jhX]rhzX-Hyperlink target "index-0" is not referenced.rr}r(h]Uh^jubahdhubahdUsystem_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_classesrNhwNUerror_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.8/master/docs/developer/utils.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(hVj hPjhNj hj*h jhjhIjjjh)r}r(h]Uh^jh_hbhdjlhf}r(hh]hk]rjahj]Uismodhi]hn]uhpKhqhhX]ubhJjh j}hWjhjjDjh)r}r (h]Uh^j@h_hbhdjlhf}r (hh]hk]r jDahj]Uismodhi]hn]uhpMhqhhX]ubhjhj_hSj|j jh)r }r (h]Uh^j h_hbhdjlhf}r(hh]hk]rj ahj]Uismodhi]hn]uhpKhqhhX]ubhjhmjh)r}r(h]Uh^h[h_hbhdjlhf}r(hh]hk]rhmahj]Uismodhi]hn]uhpKhqhhX]ubjsjh)r}r(h]Uh^joh_hbhdjlhf}r(hh]hk]rjsahj]Uismodhi]hn]uhpMhqhhX]ubhhjjh)r}r(h]Uh^j|h_hbhdjlhf}r(hh]hk]rjahj]Uismodhi]hn]uhpMhqhhX]ubhj"hjj jh)r}r(h]Uh^j h_hbhdjlhf}r(hh]hk]rj ahj]Uismodhi]hn]uhpM!hqhhX]ubh jhj jjh)r }r!(h]Uh^jh_hbhdjlhf}r"(hh]hk]r#jahj]Uismodhi]hn]uhpMhqhhX]ubh+jhjj@ jB hj= hQjhjfhHjihOjv h)jN hjwh j h!jh"jh#j h$jh2j6hj3uUsubstitution_namesr,}r-hdhqhf}r.(hh]hk]hj]Usourcehbhi]hn]uU footnotesr/]r0Urefidsr1}r2ub.PKJtD-;buildbot-v0.8.8/.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.8/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.8/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]rfUfile_insertion_enabledrgU raw_enabledrhKU dump_settingsriNubUsymbol_footnote_startrjKUidsrk}rl(hh6h*h6hhuUsubstitution_namesrm}rnhh.h }ro(h$]h"]h#]Usourcehh%]h&]uU footnotesrp]rqUrefidsrr}rsh*]rth0asub.PKJtD@RbEbE7buildbot-v0.8.8/.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.8/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.8/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~(hhhX 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.8/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.PKJtDGG4buildbot-v0.8.8/.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&NX?buildbot.db.changes.ChangesConnectorComponent.getLatestChangeidq'X)buildbot.db.state.StateConnectorComponentq(Xsqlalchemy-migrateq)X7buildbot.db.sourcestamps.SourceStampsConnectorComponentq*X4buildbot.db.builds.BuildsConnectorComponent.getBuildq+Xdeveloper-databaseq,Xtransactions in mysqlq-NXchangesq.NXsqlalchemy coreq/X4buildbot.db.builds.BuildsConnectorComponent.addBuildq0X!buildbot.db.connector.DBConnectorq1XJbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestsq2XPbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimExpiredRequestsq3X=buildbot.db.buildsets.BuildsetsConnectorComponent.addBuildsetq4X4buildbot.db.users.UsersConnectorComponent.removeUserq5Xdatabase schemaq6NXBbuildbot.db.buildsets.BuildsetsConnectorComponent.completeBuildsetq7XGbuildbot.db.buildsets.BuildsetsConnectorComponent.getBuildsetPropertiesq8Xthe db connector and componentsq9NXschemaq:NX2buildbot.db.users.UsersConnectorComponent.getUsersq;X,buildbot.db.pool.DBThreadPool.do_with_engineqX sourcestampsq?NXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStampq@X(buildbot.db.base.DBConnectorComponent.dbqAXdatabase overviewqBNX3buildbot.db.schedulers.SchedulersConnectorComponentqCXLbuildbot.db.schedulers.SchedulersConnectorComponent.getChangeClassificationsqDX1buildbot.db.buildsets.BuildsetsConnectorComponentqEX2buildbot.db.state.StateConnectorComponent.getStateqFX5buildbot.db.state.StateConnectorComponent.getObjectIdqGXGbuildbot.db.sourcestamps.SourceStampsConnectorComponent.getSourceStampsqHX4buildbot.db.users.UsersConnectorComponent.updateUserqIXIbuildbot.db.buildrequests.BuildRequestsConnectorComponent.getBuildRequestqJX%buildbot.db.base.DBConnectorComponentqKX)buildbot.db.users.UsersConnectorComponentqLXdatabase compatibility notesqMNX9buildbot.db.users.UsersConnectorComponent.identifierToUidqNXusersqONXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.unclaimBuildRequestsqPXD"specified key was too long; max key length is 1000 bytes" with utf8qQXbuildbot.db.pool.DBThreadPoolqRX schedulersqSNX"writing database connector methodsqTNXNbuildbot.db.buildrequests.BuildRequestsConnectorComponent.reclaimBuildRequestsqUX7buildbot.db.changes.ChangesConnectorComponent.getChangeqVXbuildbot.db.model.Model.upgradeqWXdatabaseqXNXFbuildbot.db.sourcestamps.SourceStampsConnectorComponent.addSourceStampqYX8buildbot.db.users.UsersConnectorComponent.findUserByAttrqZX2buildbot.db.state.StateConnectorComponent.setStateq[Xcachingq\NXbuildbot.db.model.Modelq]X7buildbot.db.changes.ChangesConnectorComponent.addChangeq^uUsubstitution_defsq_}q`Uparse_messagesqa]qb(cdocutils.nodes system_message qc)qd}qe(U rawsourceqfUUparentqgcdocutils.nodes section qh)qi}qj(hfUhghh)qk}ql(hfUhghh)qm}qn(hfUhghUsourceqocdocutils.nodes reprunicode qpXS/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/database.rstqqqr}qsbUexpect_referenced_by_nameqt}quh,cdocutils.nodes target qv)qw}qx(hfX.. _developer-database:hghhohrUtagnameqyUtargetqzU attributesq{}q|(Uidsq}]Ubackrefsq~]Udupnamesq]Uclassesq]Unamesq]UrefidqUdeveloper-databasequUlineqKUdocumentqhUchildrenq]ubshyUsectionqh{}q(h]h]h~]h}]q(Udatabaseqheh]q(hXh,euhKhhUexpect_referenced_by_idq}qhhwsh]q(cdocutils.nodes title q)q}q(hfXDatabaseqhghmhohrhyUtitleqh{}q(h]h]h~]h}]h]uhKhhh]qcdocutils.nodes Text qXDatabaseqq}q(hfhhghubaubcdocutils.nodes paragraph q)q}q(hfX 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.qhghmhohrhyU 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(hfhhghubaubcdocutils.nodes note q)q}q(hfXBuildbot 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.hghmhohrhyUnoteqh{}q(h]h]h~]h}]h]uhNhhh]qh)q}q(hfXBuildbot 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.qhghhohrhyhh{}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(hfhhghubaubaubhh)q}q(hfUhghmhohrhyhh{}q(h]h]h~]h}]qUdatabase-overviewqah]qhBauhKhhh]q(h)q}q(hfXDatabase Overviewqhghhohrhyhh{}q(h]h]h~]h}]h]uhKhhh]qhXDatabase Overviewqq}q(hfhhghubaubh)q}q(hfXAll 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.qhghhohrhyhh{}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(hfhhghubaubh)q}q(hfX%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``.hghhohrhyhh{}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(hfX{The connector API, defined below, is a stable API in Buildbot, and can be called from any other component. Given a master hghubcdocutils.nodes literal q)q}q(hfX ``master``h{}q(h]h]h~]h}]h]uhghh]qhXmasterqՅq}q(hfUhghubahyUliteralqubhX6, the root of the database connectors is available at qمq}q(hfX6, the root of the database connectors is available at hghubh)q}q(hfX ``master.db``h{}q(h]h]h~]h}]h]uhghh]qhX master.dbqq}q(hfUhghubahyhubhX), so, for example, the state connector's qㅁq}q(hfX), so, for example, the state connector's hghubh)q}q(hfX ``getState``h{}q(h]h]h~]h}]h]uhghh]qhXgetStateqꅁq}q(hfUhghubahyhubhX method is q텁q}q(hfX method is hghubh)q}q(hfX``master.db.state.getState``h{}q(h]h]h~]h}]h]uhghh]qhXmaster.db.state.getStateqq}q(hfUhghubahyhubhX.q}q(hfX.hghubeubh)q}q(hfX6The 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.hghhohrhyhh{}q(h]h]h~]h}]h]uhKhhh]q(hXThe connectors all use qq}q(hfXThe connectors all use hghubcdocutils.nodes reference r)r}r(hfX>`SQLAlchemy Core `_h{}r(UnameXSQLAlchemy CoreUrefurirX)http://www.sqlalchemy.org/docs/index.htmlrh}]h~]h]h]h]uhghh]rhXSQLAlchemy Corerr}r (hfUhgjubahyU referencer ubhv)r }r (hfX, U referencedr Khghhyhzh{}r(Urefurijh}]rUsqlalchemy-corerah~]h]h]h]rh/auh]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(hfX 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.hghubeubeubhh)r}r(hfUhghmhohrhyhh{}r(h]h]h~]h}]rUschemarah]rh:auhK%hhh]r(h)r}r(hfXSchemarhgjhohrhyhh{}r(h]h]h~]h}]h]uhK%hhh]r hXSchemar!r"}r#(hfjhgjubaubh)r$}r%(hfXThe database schema is maintained with `SQLAlchemy-Migrate `_. This package handles the details of upgrading users between different schema versions.hgjhohrhyhh{}r&(h]h]h~]h}]h]uhK'hhh]r'(hX'The database schema is maintained with r(r)}r*(hfX'The database schema is maintained with hgj$ubj)r+}r,(hfXD`SQLAlchemy-Migrate `_h{}r-(UnameXSQLAlchemy-MigratejX,http://code.google.com/p/sqlalchemy-migrate/r.h}]h~]h]h]h]uhgj$h]r/hXSQLAlchemy-Migrater0r1}r2(hfUhgj+ubahyj ubhv)r3}r4(hfX/ j Khgj$hyhzh{}r5(Urefurij.h}]r6Usqlalchemy-migrater7ah~]h]h]h]r8h)auh]ubhXY. This package handles the details of upgrading users between different schema versions.r9r:}r;(hfXY. This package handles the details of upgrading users between different schema versions.hgj$ubeubh)r<}r=(hfXThe 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.r>hgjhohrhyhh{}r?(h]h]h~]h}]h]uhK+hhh]r@hXThe 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.rArB}rC(hfj>hgj<ubaubeubhh)rD}rE(hfUhghmhohrhyhh{}rF(h]h]h~]h}]rGUapirHah]rIhauhK0hhh]rJ(h)rK}rL(hfXAPIrMhgjDhohrhyhh{}rN(h]h]h~]h}]h]uhK0hhh]rOhXAPIrPrQ}rR(hfjMhgjKubaubhh)rS}rT(hfUhgjDhohrhyhh{}rU(h]h]h~]h}]rV(X module-buildbot.db.buildrequestsrWU buildrequestsrXeh]rYh auhK3hhh]rZ(h)r[}r\(hfX buildrequestsr]hgjShohrhyhh{}r^(h]h]h~]h}]h]uhK3hhh]r_hX buildrequestsr`ra}rb(hfj]hgj[ubaubcsphinx.addnodes index rc)rd}re(hfUhgjShohrhyUindexrfh{}rg(h}]h~]h]h]h]Uentries]rh(UsingleriX"buildbot.db.buildrequests (module)X module-buildbot.db.buildrequestsUtrjauhK6hhh]ubjc)rk}rl(hfUhgjShohrhyjfh{}rm(h}]h~]h]h]h]Uentriesrn]ro(UpairrpX%BuildRequests; DB Connector ComponentUindex-0rqUtrraUinlinersuhK7hhh]ubhv)rt}ru(hfUhgjShohrhyhzh{}rv(h]h]h~]h}]rwjqah]uhK8hhh]ubjc)rx}ry(hfUhgjShohrhyjfh{}rz(h}]h~]h]h]h]Uentries]r{(jiXAlreadyClaimedErrorr|hUtr}auhNhhh]ubcsphinx.addnodes desc r~)r}r(hfUhgjShohrhyUdescrh{}r(UnoindexrUdomainrXpyh}]h~]h]h]h]UobjtyperX exceptionrUdesctyperjuhNhhh]r(csphinx.addnodes desc_signature r)r}r(hfj|hgjhohrhyUdesc_signaturerh{}r(h}]rhaUmodulerXbuildbot.db.buildrequestsrh~]h]h]h]rhaUfullnamerj|UclassrUUfirstruhK(hfX:py:meth:`claimBuildRequests`r?hgjhohrhyj&h{}r@(UreftypeXmethj(j)XclaimBuildRequestsU refdomainXpyrAh}]h~]U refexplicith]h]h]j+j,j-jj.juhKCh]rBh)rC}rD(hfj?h{}rE(h]h]rF(j4jAXpy-methrGeh~]h}]h]uhgj=h]rHhXclaimBuildRequestsrIrJ}rK(hfUhgjCubahyhubaubhXO. The claim can fail if another master has claimed the request in the interim.rLrM}rN(hfXO. The claim can fail if another master has claimed the request in the interim.hgjubeubh)rO}rP(hfXFAn instance of this class is available at ``master.db.buildrequests``.hgjhohrhyhh{}rQ(h]h]h~]h}]h]uhKIhhh]rR(hX*An instance of this class is available at rSrT}rU(hfX*An instance of this class is available at hgjOubh)rV}rW(hfX``master.db.buildrequests``h{}rX(h]h]h~]h}]h]uhgjOh]rYhXmaster.db.buildrequestsrZr[}r\(hfUhgjVubahyhubhX.r]}r^(hfX.hgjOubeubjc)r_}r`(hfUhgjhohrhyjfh{}ra(h}]h~]h]h]h]jn]rb((jiXbrdictUindex-1rcUtrd(jiXbridjcUtreejsuhKKhhh]ubhv)rf}rg(hfUhgjhohrhyhzh{}rh(h}]h~]h]h]h]hjcuhKLhhh]ubh)ri}rj(hfXBuild requests are indexed by an ID referred to as a *brid*. The contents of a request are represented as build request dictionaries (brdicts) with keyshgjhohrht}hyhh{}rk(h]h]h~]h}]rljcah]uhKMhhh}rmjcjfsh]rn(hX5Build requests are indexed by an ID referred to as a rorp}rq(hfX5Build requests are indexed by an ID referred to as a hgjiubcdocutils.nodes emphasis rr)rs}rt(hfX*brid*h{}ru(h]h]h~]h}]h]uhgjih]rvhXbridrwrx}ry(hfUhgjsubahyUemphasisrzubhX^. The contents of a request are represented as build request dictionaries (brdicts) with keysr{r|}r}(hfX^. The contents of a request are represented as build request dictionaries (brdicts) with keyshgjiubeubcdocutils.nodes bullet_list r~)r}r(hfUhgjhohrhyU bullet_listrh{}r(UbulletrX*h}]h~]h]h]h]uhKQhhh]r(cdocutils.nodes list_item r)r}r(hfX``brid``rhgjhohrhyU list_itemrh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKQh]rh)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXbridrr}r(hfUhgjubahyhubaubaubj)r}r(hfX``buildsetid``rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKRh]rh)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhX buildsetidrr}r(hfUhgjubahyhubaubaubj)r}r(hfX``buildername``rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKSh]rh)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhX buildernamerr}r(hfUhgjubahyhubaubaubj)r}r(hfX ``priority``rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKTh]rh)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXpriorityrr}r(hfUhgjubahyhubaubaubj)r}r(hfX5``claimed`` (boolean, true if the request is claimed)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKUh]r(h)r}r(hfX ``claimed``h{}r(h]h]h~]h}]h]uhgjh]rhXclaimedrr}r(hfUhgjubahyhubhX* (boolean, true if the request is claimed)rr}r(hfX* (boolean, true if the request is claimed)hgjubeubaubj)r}r(hfXD``claimed_at`` (datetime object, time this request was last claimed)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKVh]r(h)r}r(hfX``claimed_at``h{}r(h]h]h~]h}]h]uhgjh]rhX claimed_atrr}r(hfUhgjubahyhubhX6 (datetime object, time this request was last claimed)rr}r(hfX6 (datetime object, time this request was last claimed)hgjubeubaubj)r}r(hfXA``mine`` (boolean, true if the request is claimed by this master)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKWh]r(h)r}r(hfX``mine``h{}r(h]h]h~]h}]h]uhgjh]rhXminerr}r(hfUhgjubahyhubhX9 (boolean, true if the request is claimed by this master)rr}r(hfX9 (boolean, true if the request is claimed by this master)hgjubeubaubj)r}r(hfX7``complete`` (boolean, true if the request is complete)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhKXh]r(h)r }r (hfX ``complete``h{}r (h]h]h~]h}]h]uhgjh]r hXcompleter r}r(hfUhgj ubahyhubhX+ (boolean, true if the request is complete)rr}r(hfX+ (boolean, true if the request is complete)hgjubeubaubj)r}r(hfXC``complete_at`` (datetime object, time this request was completed) hgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfXB``complete_at`` (datetime object, time this request was completed)hgjhohrhyhh{}r(h]h]h~]h}]h]uhKYh]r(h)r}r(hfX``complete_at``h{}r(h]h]h~]h}]h]uhgjh]rhX complete_atrr }r!(hfUhgjubahyhubhX3 (datetime object, time this request was completed)r"r#}r$(hfX3 (datetime object, time this request was completed)hgjubeubaubeubjc)r%}r&(hfUhgjhohrhyjfh{}r'(h}]h~]h]h]h]Uentries]r((jiXTgetBuildRequest() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)hJUtr)auhNhhh]ubj~)r*}r+(hfUhgjhohrhyjh{}r,(jjXpyh}]h~]h]h]h]jXmethodr-jj-uhNhhh]r.(j)r/}r0(hfXgetBuildRequest(brid)hgj*hohrhyjh{}r1(h}]r2hJajjh~]h]h]h]r3hJajX/BuildRequestsConnectorComponent.getBuildRequestjjjuhKchhh]r4(j)r5}r6(hfXgetBuildRequesthgj/hohrhyjh{}r7(h]h]h~]h}]h]uhKchhh]r8hXgetBuildRequestr9r:}r;(hfUhgj5ubaubcsphinx.addnodes desc_parameterlist r<)r=}r>(hfUhgj/hohrhyUdesc_parameterlistr?h{}r@(h]h]h~]h}]h]uhKchhh]rAcsphinx.addnodes desc_parameter rB)rC}rD(hfXbridh{}rE(h]h]h~]h}]h]uhgj=h]rFhXbridrGrH}rI(hfUhgjCubahyUdesc_parameterrJubaubeubj)rK}rL(hfUhgj*hohrhyjh{}rM(h]h]h~]h}]h]uhKchhh]rN(cdocutils.nodes field_list rO)rP}rQ(hfUhgjKhohrhyU field_listrRh{}rS(h]h]h~]h}]h]uhNhhh]rT(cdocutils.nodes field rU)rV}rW(hfUh{}rX(h]h]h~]h}]h]uhgjPh]rY(cdocutils.nodes field_name rZ)r[}r\(hfUh{}r](h]h]h~]h}]h]uhgjVh]r^hX Parametersr_r`}ra(hfUhgj[ubahyU field_namerbubcdocutils.nodes field_body rc)rd}re(hfUh{}rf(h]h]h~]h}]h]uhgjVh]rgh)rh}ri(hfUh{}rj(h]h]h~]h}]h]uhgjdh]rk(cdocutils.nodes strong rl)rm}rn(hfXbridh{}ro(h]h]h~]h}]h]uhgjhh]rphXbridrqrr}rs(hfUhgjmubahyUstrongrtubhX -- rurv}rw(hfUhgjhubhXbuild request id to look uprxry}rz(hfXbuild request id to look uphgjhubehyhubahyU field_bodyr{ubehyUfieldr|ubjU)r}}r~(hfUh{}r(h]h]h~]h}]h]uhgjPh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgj}h]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgj}h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(hX brdict or rr}r(hfX brdict or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX, via Deferredrr}r(hfX, via Deferredhgjubehyhubahyj{ubehyj|ubeubh)r}r(hfXGet 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.hgjKhohrhyhh{}r(h]h]h~]h}]h]uhK`hhh]r(hXOGet a single BuildRequest, in the format described above. This method returns rr}r(hfXOGet a single BuildRequest, in the format described above. This method returns hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhXy if there is no such buildrequest. Note that build requests are not cached, as the values in the database are not fixed.rr}r(hfXy if there is no such buildrequest. Note that build requests are not cached, as the values in the database are not fixed.hgjubeubeubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXUgetBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h2UtrauhNhhh]ubj~)r}r(hfUhgjhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXigetBuildRequests(buildername=None, complete=None, claimed=None, bsid=None, branch=None, repository=None))hgjhohrhyjh{}r(h}]rh2ajjh~]h]h]h]rh2ajX0BuildRequestsConnectorComponent.getBuildRequestsjjjuhKhhh]r(j)r}r(hfXgetBuildRequestshgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]rhXgetBuildRequestsrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhKhhh]r(jB)r}r(hfXbuildername=Noneh{}r(h]h]h~]h}]h]uhgjh]rhXbuildername=Nonerr}r(hfUhgjubahyjJubjB)r}r(hfX complete=Noneh{}r(h]h]h~]h}]h]uhgjh]rhX complete=Nonerr}r(hfUhgjubahyjJubjB)r}r(hfX claimed=Noneh{}r(h]h]h~]h}]h]uhgjh]rhX claimed=Nonerr}r(hfUhgjubahyjJubjB)r}r(hfX bsid=Noneh{}r(h]h]h~]h}]h]uhgjh]rhX bsid=Nonerr}r(hfUhgjubahyjJubjB)r}r(hfX branch=Noneh{}r(h]h]h~]h}]h]uhgjh]rhX branch=Nonerr}r(hfUhgjubahyjJubjB)r}r(hfXrepository=None)h{}r(h]h]h~]h}]h]uhgjh]rhXrepository=None)rr}r(hfUhgjubahyjJubeubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r (h]h]h~]h}]h]uhgjh]r j~)r }r (hfUh{}r (h]h]h~]h}]h]uhgjh]r(j)r}r(hfUh{}r(h]h]h~]h}]h]uhgj h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX buildernameh{}r(h]h]h~]h}]h]uhgjh]rhX buildernamerr}r(hfUhgjubahyjtubhX (rr}r (hfUhgjubj")r!}r"(hfUh{}r#(UreftypeUobjr$U reftargetXstringr%U refdomainjh}]h~]U refexplicith]h]h]uhgjh]r&jr)r'}r((hfj%h{}r)(h]h]h~]h}]h]uhgj!h]r*hXstringr+r,}r-(hfUhgj'ubahyjzubahyj&ubhX)r.}r/(hfUhgjubhX -- r0r1}r2(hfUhgjubhX/limit results to buildrequests for this builderr3r4}r5(hfX/limit results to buildrequests for this builderhgjubehyhubahyjubj)r6}r7(hfUh{}r8(h]h]h~]h}]h]uhgj h]r9h)r:}r;(hfUh{}r<(h]h]h~]h}]h]uhgj6h]r=(jl)r>}r?(hfXcompleteh{}r@(h]h]h~]h}]h]uhgj:h]rAhXcompleterBrC}rD(hfUhgj>ubahyjtubhX -- rErF}rG(hfUhgj:ubhX[if true, limit to completed buildrequests; if false, limit to incomplete buildrequests; if rHrI}rJ(hfX[if true, limit to completed buildrequests; if false, limit to incomplete buildrequests; if hgj:ubh)rK}rL(hfX``None``h{}rM(h]h]h~]h}]h]uhgj:h]rNhXNonerOrP}rQ(hfUhgjKubahyhubhX#, do not limit based on completion.rRrS}rT(hfX#, do not limit based on completion.hgj:ubehyhubahyjubj)rU}rV(hfUh{}rW(h]h]h~]h}]h]uhgj h]rXh)rY}rZ(hfUh{}r[(h]h]h~]h}]h]uhgjUh]r\(jl)r]}r^(hfXclaimedh{}r_(h]h]h~]h}]h]uhgjYh]r`hXclaimedrarb}rc(hfUhgj]ubahyjtubhX -- rdre}rf(hfUhgjYubhX see belowrgrh}ri(hfX see belowhgjYubehyhubahyjubj)rj}rk(hfUh{}rl(h]h]h~]h}]h]uhgj h]rmh)rn}ro(hfUh{}rp(h]h]h~]h}]h]uhgjjh]rq(jl)rr}rs(hfXbsidh{}rt(h]h]h~]h}]h]uhgjnh]ruhXbsidrvrw}rx(hfUhgjrubahyjtubhX -- ryrz}r{(hfUhgjnubhX see belowr|r}}r~(hfX see belowhgjnubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgj h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX repositoryh{}r(h]h]h~]h}]h]uhgjh]rhX repositoryrr}r(hfUhgjubahyjtubhX -- rr}r(hfUhgjubhXHthe repository associated with the sourcestamps originating the requestsrr}r(hfXHthe repository associated with the sourcestamps originating the requestshgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgj h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXbranchh{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyjtubhX -- rr}r(hfUhgjubhXDthe branch associated with the sourcestamps originating the requestsrr}r(hfXDthe branch associated with the sourcestamps originating the requestshgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXlist of brdicts, via Deferredrr}r(hfXlist of brdicts, via Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfX@Get a list of build requests matching the given characteristics.rhgjhohrhyhh{}r(h]h]h~]h}]h]uhKqhhh]rhX@Get a list of build requests matching the given characteristics.rr}r(hfjhgjubaubh)r}r(hfXDPass all parameters as keyword parameters to allow future expansion.rhgjhohrhyhh{}r(h]h]h~]h}]h]uhKshhh]rhXDPass all parameters as keyword parameters to allow future expansion.rr}r(hfjhgjubaubh)r}r(hfXThe ``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.hgjhohrhyhh{}r(h]h]h~]h}]h]uhKuhhh]r(hXThe rr}r(hfXThe hgjubh)r}r(hfX ``claimed``h{}r(h]h]h~]h}]h]uhgjh]rhXclaimedrr}r(hfUhgjubahyhubhX parameter can be rr}r(hfX parameter can be hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX9 (the default) to ignore the claimed status of requests; rr}r(hfX9 (the default) to ignore the claimed status of requests; hgjubh)r}r(hfX``True``h{}r(h]h]h~]h}]h]uhgjh]rhXTruerr}r(hfUhgjubahyhubhX to return only claimed builds, rr}r(hfX to return only claimed builds, hgjubh)r}r(hfX ``False``h{}r(h]h]h~]h}]h]uhgjh]rhXFalserr}r(hfUhgjubahyhubhX% to return only unclaimed builds, or rr}r(hfX% to return only unclaimed builds, or hgjubh)r}r(hfX ``"mine"``h{}r(h]h]h~]h}]h]uhgjh]rhX"mine"rr}r(hfUhgjubahyhubhXb to return only builds claimed by this master instance. A request is considered unclaimed if its rr}r(hfXb to return only builds claimed by this master instance. A request is considered unclaimed if its hgjubh)r}r (hfX``claimed_at``h{}r (h]h]h~]h}]h]uhgjh]r hX claimed_atr r }r(hfUhgjubahyhubhX9 column is either NULL or 0, and it is not complete. If rr}r(hfX9 column is either NULL or 0, and it is not complete. If hgjubh)r}r(hfX``bsid``h{}r(h]h]h~]h}]h]uhgjh]rhXbsidrr}r(hfUhgjubahyhubhXK is specified, then only build requests for that buildset will be returned.rr}r(hfXK is specified, then only build requests for that buildset will be returned.hgjubeubh)r}r(hfXmA build is considered completed if its ``complete`` column is 1; the ``complete_at`` column is not consulted.hgjhohrhyhh{}r(h]h]h~]h}]h]uhK}hhh]r(hX'A build is considered completed if its r r!}r"(hfX'A build is considered completed if its hgjubh)r#}r$(hfX ``complete``h{}r%(h]h]h~]h}]h]uhgjh]r&hXcompleter'r(}r)(hfUhgj#ubahyhubhX column is 1; the r*r+}r,(hfX column is 1; the hgjubh)r-}r.(hfX``complete_at``h{}r/(h]h]h~]h}]h]uhgjh]r0hX complete_atr1r2}r3(hfUhgj-ubahyhubhX column is not consulted.r4r5}r6(hfX column is not consulted.hgjubeubeubeubjc)r7}r8(hfUhgjhoNhyjfh{}r9(h}]h~]h]h]h]Uentries]r:(jiXWclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h!Utr;auhNhhh]ubj~)r<}r=(hfUhgjhoNhyjh{}r>(jjXpyr?h}]h~]h]h]h]jXmethodr@jj@uhNhhh]rA(j)rB}rC(hfX*claimBuildRequests(brids[, claimed_at=XX])hgj<hohrhyjh{}rD(h}]rEh!ajjh~]h]h]h]rFh!ajX2BuildRequestsConnectorComponent.claimBuildRequestsjjjuhKhhh]rG(j)rH}rI(hfXclaimBuildRequestshgjBhohrhyjh{}rJ(h]h]h~]h}]h]uhKhhh]rKhXclaimBuildRequestsrLrM}rN(hfUhgjHubaubj<)rO}rP(hfUhgjBhohrhyj?h{}rQ(h]h]h~]h}]h]uhKhhh]rR(jB)rS}rT(hfXbridsh{}rU(h]h]h~]h}]h]uhgjOh]rVhXbridsrWrX}rY(hfUhgjSubahyjJubcsphinx.addnodes desc_optional rZ)r[}r\(hfUh{}r](h]h]h~]h}]h]uhgjOh]r^jB)r_}r`(hfX claimed_at=XXh{}ra(h]h]h~]h}]h]uhgj[h]rbhX claimed_at=XXrcrd}re(hfUhgj_ubahyjJubahyU desc_optionalrfubeubeubj)rg}rh(hfUhgj<hohrhyjh{}ri(h]h]h~]h}]h]uhKhhh]rj(jO)rk}rl(hfUhgjghoNhyjRh{}rm(h]h]h~]h}]h]uhNhhh]rn(jU)ro}rp(hfUh{}rq(h]h]h~]h}]h]uhgjkh]rr(jZ)rs}rt(hfUh{}ru(h]h]h~]h}]h]uhgjoh]rvhX Parametersrwrx}ry(hfUhgjsubahyjbubjc)rz}r{(hfUh{}r|(h]h]h~]h}]h]uhgjoh]r}j~)r~}r(hfUh{}r(h]h]h~]h}]h]uhgjzh]r(j)r}r(hfUh{}r(h]h]h~]h}]h]uhgj~h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXbridsh{}r(h]h]h~]h}]h]uhgjh]rhXbridsrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXlistrU refdomainj?h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXlistrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXids of buildrequests to claimrr}r(hfXids of buildrequests to claimhgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgj~h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX claimed_ath{}r(h]h]h~]h}]h]uhgjh]rhX claimed_atrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXdatetimerU refdomainj?h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXdatetimerr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX$time at which the builds are claimedrr}r(hfX$time at which the builds are claimedhgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjkh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXDeferredrr}r(hfXDeferredhgjubahyhubahyj{ubehyj|ubjU)r}r(hfUhgjkhohrhyj|h{}r(h]h]h~]h}]h]uhKhhh]r(jZ)r}r(hfXraisesh{}r(h]h]h~]h}]h]uhgjh]rhXRaisesrr}r(hfUhgjubahyjbubjc)r}r(hfX:py:exc:`AlreadyClaimedError` h{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfX:py:exc:`AlreadyClaimedError`rhgjhohrhyhh{}r(h]h]h~]h}]h]uhKh]rj")r}r(hfjhgjhohrhyj&h{}r(UreftypeXexcj(j)XAlreadyClaimedErrorU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]rh)r}r(hfjh{}r(h]h]r(j4jXpy-excreh~]h}]h]uhgjh]rhXAlreadyClaimedErrorrr}r(hfUhgjubahyhubaubaubahyj{ubeubeubh)r}r(hfX/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.hgjghohrhyhh{}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 r r }r (hfXTry to "claim" the indicated build requests for this buildmaster instance. The resulting deferred will fire normally on success, or fail with hgjubj")r }r(hfX:py:exc:`AlreadyClaimedError`rhgjhohrhyj&h{}r(UreftypeXexcj(j)XAlreadyClaimedErrorU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]rh)r}r(hfjh{}r(h]h]r(j4jXpy-excreh~]h}]h]uhgj h]rhXAlreadyClaimedErrorrr}r(hfUhgjubahyhubaubhX if rr}r(hfX if hgjubjr)r}r (hfX*any*h{}r!(h]h]h~]h}]h]uhgjh]r"hXanyr#r$}r%(hfUhgjubahyjzubhXz of the build requests are already claimed by another master instance. In this case, none of the claims will take effect.r&r'}r((hfXz of the build requests are already claimed by another master instance. In this case, none of the claims will take effect.hgjubeubh)r)}r*(hfXCIf ``claimed_at`` is not given, then the current time will be used.hgjghohrhyhh{}r+(h]h]h~]h}]h]uhKhhh]r,(hXIf r-r.}r/(hfXIf hgj)ubh)r0}r1(hfX``claimed_at``h{}r2(h]h]h~]h}]h]uhgj)h]r3hX claimed_atr4r5}r6(hfUhgj0ubahyhubhX2 is not given, then the current time will be used.r7r8}r9(hfX2 is not given, then the current time will be used.hgj)ubeubh)r:}r;(hfXAs 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.hgjghohrhyhh{}r<(h]h]h~]h}]h]uhKhhh]r=(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 r>r?}r@(hfXsAs of 0.8.5, this method can no longer be used to re-claim build requests. All given ID's must be unclaimed. Use hgj:ubj")rA}rB(hfX:py:meth:`reclaimBuildRequests`rChgj:hohrhyj&h{}rD(UreftypeXmethj(j)XreclaimBuildRequestsU refdomainXpyrEh}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]rFh)rG}rH(hfjCh{}rI(h]h]rJ(j4jEXpy-methrKeh~]h}]h]uhgjAh]rLhXreclaimBuildRequestsrMrN}rO(hfUhgjGubahyhubaubhX to reclaim.rPrQ}rR(hfX to reclaim.hgj:ubeubjc)rS}rT(hfUhgjghohrhyjfh{}rU(h}]h~]h]h]h]jn]rV(jiXMySQL; limitationsUindex-2rWUtrXajsuhKhhh]ubhv)rY}rZ(hfUhgjghohrhyhzh{}r[(h]h]h~]h}]r\jWah]uhKhhh]ubjc)r]}r^(hfUhgjghohrhyjfh{}r_(h}]h~]h]h]h]jn]r`(jiXSQLite; limitationsUindex-3raUtrbajsuhKhhh]ubhv)rc}rd(hfUhgjghohrhyhzh{}re(h}]h~]h]h]h]hjauhKhhh]ubh)rf}rg(hfXHOn 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.hgjghohrht}hyhh{}rh(h]h]h~]h}]rijaah]uhNhhh}rjjajcsh]rkh)rl}rm(hfXHOn 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.hgjfhohrhyhh{}rn(h]h]h~]h}]h]uhKh]ro(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 rprq}rr(hfXOn 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 hgjlubj")rs}rt(hfX:py:exc:`AlreadyClaimedError`ruhgjlhohrhyj&h{}rv(UreftypeXexcj(j)XAlreadyClaimedErrorU refdomainXpyrwh}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]rxh)ry}rz(hfjuh{}r{(h]h]r|(j4jwXpy-excr}eh~]h}]h]uhgjsh]r~hXAlreadyClaimedErrorrr}r(hfUhgjyubahyhubaubhX is generated.rr}r(hfX is generated.hgjlubeubaubeubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXYreclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)hUUtrauhNhhh]ubj~)r}r(hfUhgjhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXreclaimBuildRequests(brids)hgjhohrhyjh{}r(h}]rhUajjh~]h]h]h]rhUajX4BuildRequestsConnectorComponent.reclaimBuildRequestsjjjuhKhhh]r(j)r}r(hfXreclaimBuildRequestshgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]rhXreclaimBuildRequestsrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhKhhh]rjB)r}r(hfXbridsh{}r(h]h]h~]h}]h]uhgjh]rhXbridsrr}r(hfUhgjubahyjJubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXbridsh{}r(h]h]h~]h}]h]uhgjh]rhXbridsrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXlistrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXlistrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXids of buildrequests to reclaimrr}r(hfXids of buildrequests to reclaimrhgjubehyhubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXDeferredrr}r(hfXDeferredrhgjubahyhubahyj{ubehyj|ubjU)r}r(hfUhgjhohrhyj|h{}r(h]h]h~]h}]h]uhKhhh]r(jZ)r}r(hfXraisesh{}r(h]h]h~]h}]h]uhgjh]rhXRaisesrr}r(hfUhgjubahyjbubjc)r}r(hfX:py:exc:`AlreadyClaimedError` h{}r(h]h]h~]h}]h]uhgjh]rh)r}r (hfX:py:exc:`AlreadyClaimedError`r hgjhohrhyhh{}r (h]h]h~]h}]h]uhKh]r j")r }r(hfj hgjhohrhyj&h{}r(UreftypeXexcj(j)XAlreadyClaimedErrorU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]rh)r}r(hfj h{}r(h]h]r(j4jXpy-excreh~]h}]h]uhgj h]rhXAlreadyClaimedErrorrr}r(hfUhgjubahyhubaubaubahyj{ubeubeubh)r}r(hfXjRe-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.hgjhohrhyhh{}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 rr }r!(hfXRe-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 hgjubj")r"}r#(hfX:py:exc:`AlreadyClaimedError`r$hgjhohrhyj&h{}r%(UreftypeXexcj(j)XAlreadyClaimedErrorU refdomainXpyr&h}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]r'h)r(}r)(hfj$h{}r*(h]h]r+(j4j&Xpy-excr,eh~]h}]h]uhgj"h]r-hXAlreadyClaimedErrorr.r/}r0(hfUhgj(ubahyhubaubhX if r1r2}r3(hfX if hgjubjr)r4}r5(hfX*any*h{}r6(h]h]h~]h}]h]uhgjh]r7hXanyr8r9}r:(hfUhgj4ubahyjzubhX 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=(hfX 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.hgjubeubeubeubjc)r>}r?(hfUhgjhohrhyjfh{}r@(h}]h~]h]h]h]Uentries]rA(jiXYunclaimBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)hPUtrBauhNhhh]ubj~)rC}rD(hfUhgjhohrhyjh{}rE(jjXpyrFh}]h~]h]h]h]jXmethodrGjjGuhNhhh]rH(j)rI}rJ(hfXunclaimBuildRequests(brids)hgjChohrhyjh{}rK(h}]rLhPajjh~]h]h]h]rMhPajX4BuildRequestsConnectorComponent.unclaimBuildRequestsjjjuhKhhh]rN(j)rO}rP(hfXunclaimBuildRequestshgjIhohrhyjh{}rQ(h]h]h~]h}]h]uhKhhh]rRhXunclaimBuildRequestsrSrT}rU(hfUhgjOubaubj<)rV}rW(hfUhgjIhohrhyj?h{}rX(h]h]h~]h}]h]uhKhhh]rYjB)rZ}r[(hfXbridsh{}r\(h]h]h~]h}]h]uhgjVh]r]hXbridsr^r_}r`(hfUhgjZubahyjJubaubeubj)ra}rb(hfUhgjChohrhyjh{}rc(h]h]h~]h}]h]uhKhhh]rd(jO)re}rf(hfUhgjahohrhyjRh{}rg(h]h]h~]h}]h]uhNhhh]rh(jU)ri}rj(hfUh{}rk(h]h]h~]h}]h]uhgjeh]rl(jZ)rm}rn(hfUh{}ro(h]h]h~]h}]h]uhgjih]rphX Parametersrqrr}rs(hfUhgjmubahyjbubjc)rt}ru(hfUh{}rv(h]h]h~]h}]h]uhgjih]rwh)rx}ry(hfUh{}rz(h]h]h~]h}]h]uhgjth]r{(jl)r|}r}(hfXbridsh{}r~(h]h]h~]h}]h]uhgjxh]rhXbridsrr}r(hfUhgj|ubahyjtubhX (rr}r(hfUhgjxubj")r}r(hfUh{}r(Ureftypej$U reftargetXlistrU refdomainjFh}]h~]U refexplicith]h]h]uhgjxh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXlistrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjxubhX -- rr}r(hfUhgjxubhXids of buildrequests to unclaimrr}r(hfXids of buildrequests to unclaimhgjxubehyhubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjeh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXDeferredrr}r(hfXDeferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXRelease 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.rhgjahohrhyhh{}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(hfjhgjubaubeubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXZcompleteBuildRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h$UtrauhNhhh]ubj~)r}r(hfUhgjhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfX7completeBuildRequests(brids, results[, complete_at=XX])hgjhohrhyjh{}r(h}]rh$ajjh~]h]h]h]rh$ajX5BuildRequestsConnectorComponent.completeBuildRequestsjjjuhKhhh]r(j)r}r(hfXcompleteBuildRequestshgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]rhXcompleteBuildRequestsrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhKhhh]r(jB)r}r(hfXbridsh{}r(h]h]h~]h}]h]uhgjh]rhXbridsrr}r(hfUhgjubahyjJubjB)r}r(hfXresultsh{}r(h]h]h~]h}]h]uhgjh]rhXresultsrr}r(hfUhgjubahyjJubjZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rjB)r}r(hfXcomplete_at=XXh{}r(h]h]h~]h}]h]uhgjh]rhXcomplete_at=XXrr}r(hfUhgjubahyjJubahyjfubeubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rj~)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(j)r}r (hfUh{}r (h]h]h~]h}]h]uhgjh]r h)r }r (hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXbridsh{}r(h]h]h~]h}]h]uhgj h]rhXbridsrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgj ubj")r}r(hfUh{}r(Ureftypej$U reftargetXintegerrU refdomainjh}]h~]U refexplicith]h]h]uhgj h]rjr)r}r (hfjh{}r!(h]h]h~]h}]h]uhgjh]r"hXintegerr#r$}r%(hfUhgjubahyjzubahyj&ubhX)r&}r'(hfUhgj ubhX -- r(r)}r*(hfUhgj ubhXbuild request IDs to completer+r,}r-(hfXbuild request IDs to completehgj ubehyhubahyjubj)r.}r/(hfUh{}r0(h]h]h~]h}]h]uhgjh]r1h)r2}r3(hfUh{}r4(h]h]h~]h}]h]uhgj.h]r5(jl)r6}r7(hfXresultsh{}r8(h]h]h~]h}]h]uhgj2h]r9hXresultsr:r;}r<(hfUhgj6ubahyjtubhX (r=r>}r?(hfUhgj2ubj")r@}rA(hfUh{}rB(Ureftypej$U reftargetXintegerrCU refdomainjh}]h~]U refexplicith]h]h]uhgj2h]rDjr)rE}rF(hfjCh{}rG(h]h]h~]h}]h]uhgj@h]rHhXintegerrIrJ}rK(hfUhgjEubahyjzubahyj&ubhX)rL}rM(hfUhgj2ubhX -- rNrO}rP(hfUhgj2ubhXinteger result coderQrR}rS(hfXinteger result codehgj2ubehyhubahyjubj)rT}rU(hfUh{}rV(h]h]h~]h}]h]uhgjh]rWh)rX}rY(hfUh{}rZ(h]h]h~]h}]h]uhgjTh]r[(jl)r\}r](hfX complete_ath{}r^(h]h]h~]h}]h]uhgjXh]r_hX complete_atr`ra}rb(hfUhgj\ubahyjtubhX (rcrd}re(hfUhgjXubj")rf}rg(hfUh{}rh(Ureftypej$U reftargetXdatetimeriU refdomainjh}]h~]U refexplicith]h]h]uhgjXh]rjjr)rk}rl(hfjih{}rm(h]h]h~]h}]h]uhgjfh]rnhXdatetimerorp}rq(hfUhgjkubahyjzubahyj&ubhX)rr}rs(hfUhgjXubhX -- rtru}rv(hfUhgjXubhX(time at which the buildset was completedrwrx}ry(hfX(time at which the buildset was completedhgjXubehyhubahyjubehyjubahyj{ubehyj|ubjU)rz}r{(hfUh{}r|(h]h]h~]h}]h]uhgjh]r}(jZ)r~}r(hfUh{}r(h]h]h~]h}]h]uhgjzh]rhXReturnsrr}r(hfUhgj~ubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjzh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXDeferredrr}r(hfXDeferredhgjubahyhubahyj{ubehyj|ubjU)r}r(hfUhgjhohrhyj|h{}r(h]h]h~]h}]h]uhKhhh]r(jZ)r}r(hfXraisesh{}r(h]h]h~]h}]h]uhgjh]rhXRaisesrr}r(hfUhgjubahyjbubjc)r}r(hfX:py:exc:`NotClaimedError` h{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfX:py:exc:`NotClaimedError`rhgjhohrhyhh{}r(h]h]h~]h}]h]uhKh]rj")r}r(hfjhgjhohrhyj&h{}r(UreftypeXexcj(j)XNotClaimedErrorU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]rh)r}r(hfjh{}r(h]h]r(j4jXpy-excreh~]h}]h]uhgjh]rhXNotClaimedErrorrr}r(hfUhgjubahyhubaubaubahyj{ubeubeubh)r}r(hfXComplete 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.hgjhohrhyhh{}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(hfXgComplete a set of build requests, all of which are owned by this master instance. This will fail with hgjubj")r}r(hfX:py:exc:`NotClaimedError`rhgjhohrhyj&h{}r(UreftypeXexcj(j)XNotClaimedErrorU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-jj.juhKh]rh)r}r(hfjh{}r(h]h]r(j4jXpy-excreh~]h}]h]uhgjh]rhXNotClaimedErrorrr}r(hfUhgjubahyhubaubhXB if the build request is already completed or does not exist. If rr}r(hfXB if the build request is already completed or does not exist. If hgjubh)r}r(hfX``complete_at``h{}r(h]h]h~]h}]h]uhgjh]rhX complete_atrr}r(hfUhgjubahyhubhX- is not given, the current time will be used.rr}r(hfX- is not given, the current time will be used.hgjubeubeubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiX[unclaimExpiredRequests() (buildbot.db.buildrequests.BuildRequestsConnectorComponent method)h3UtrauhNhhh]ubj~)r}r(hfUhgjhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXunclaimExpiredRequests(old)hgjhohrhyjh{}r(h}]rh3ajjh~]h]h]h]rh3ajX6BuildRequestsConnectorComponent.unclaimExpiredRequestsjjjuhKhhh]r(j)r}r(hfXunclaimExpiredRequestshgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]rhXunclaimExpiredRequestsrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhKhhh]rjB)r}r(hfXoldh{}r(h]h]h~]h}]h]uhgjh]rhXoldrr}r(hfUhgjubahyjJubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhKhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r }r (hfUh{}r (h]h]h~]h}]h]uhgjh]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hX Parametersr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jl)r }r (hfXoldh{}r (h]h]h~]h}]h]uhgj h]r hXoldr r }r (hfUhgj ubahyjtubhX (r r }r (hfUhgj ubj")r }r (hfUh{}r (Ureftypej$U reftargetXintr U refdomainjh}]h~]U refexplicith]h]h]uhgj h]r! jr)r" }r# (hfj h{}r$ (h]h]h~]h}]h]uhgj h]r% hXintr& r' }r( (hfUhgj" ubahyjzubahyj&ubhX)r) }r* (hfUhgj ubhX -- r+ r, }r- (hfUhgj ubhX7number of seconds after which a claim is considered oldr. r/ }r0 (hfX7number of seconds after which a claim is considered oldhgj ubehyhubahyj{ubehyj|ubjU)r1 }r2 (hfUh{}r3 (h]h]h~]h}]h]uhgjh]r4 (jZ)r5 }r6 (hfUh{}r7 (h]h]h~]h}]h]uhgj1 h]r8 hXReturnsr9 r: }r; (hfUhgj5 ubahyjbubjc)r< }r= (hfUh{}r> (h]h]h~]h}]h]uhgj1 h]r? h)r@ }rA (hfUh{}rB (h]h]h~]h}]h]uhgj< h]rC hXDeferredrD rE }rF (hfXDeferredhgj@ ubahyhubahyj{ubehyj|ubeubh)rG }rH (hfXkFind any incomplete claimed builds which are older than ``old`` seconds, and clear their claim information.hgjhohrhyhh{}rI (h]h]h~]h}]h]uhKhhh]rJ (hX8Find any incomplete claimed builds which are older than rK rL }rM (hfX8Find any incomplete claimed builds which are older than hgjG ubh)rN }rO (hfX``old``h{}rP (h]h]h~]h}]h]uhgjG h]rQ hXoldrR rS }rT (hfUhgjN ubahyhubhX, seconds, and clear their claim information.rU rV }rW (hfX, seconds, and clear their claim information.hgjG ubeubh)rX }rY (hfXThis 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.rZ hgjhohrhyhh{}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] r^ }r_ (hfjZ hgjX ubaubeubeubeubeubeubhh)r` }ra (hfUhgjDhohrhyhh{}rb (h]h]h~]h}]rc (Xmodule-buildbot.db.buildsrd Ubuildsre eh]rf h=auhKhhh]rg (h)rh }ri (hfXbuildsrj hgj` hohrhyhh{}rk (h]h]h~]h}]h]uhKhhh]rl hXbuildsrm rn }ro (hfjj hgjh ubaubjc)rp }rq (hfUhgj` hohrhyjfh{}rr (h}]h~]h]h]h]Uentries]rs (jiXbuildbot.db.builds (module)Xmodule-buildbot.db.buildsUtrt auhKhhh]ubjc)ru }rv (hfUhgj` hohrhyjfh{}rw (h}]h~]h]h]h]jn]rx (jpXBuilds; DB Connector ComponentUindex-4ry Utrz ajsuhKhhh]ubhv)r{ }r| (hfUhgj` hohrhyhzh{}r} (h]h]h~]h}]r~ jy ah]uhKhhh]ubjc)r }r (hfUhgj` hoNhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiX6BuildsConnectorComponent (class in buildbot.db.builds)h Utr auhNhhh]ubj~)r }r (hfUhgj` hoNhyjh{}r (jjXpyh}]h~]h]h]h]jXclassr jj uhNhhh]r (j)r }r (hfXBuildsConnectorComponentr hgj hohrhyjh{}r (h}]r h ajXbuildbot.db.buildsr h~]h]h]h]r h ajj jUjuhMhhh]r (j)r }r (hfXclass hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXclass r r }r (hfUhgj ubaubj)r }r (hfXbuildbot.db.builds.hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXbuildbot.db.builds.r r }r (hfUhgj ubaubj)r }r (hfj hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXBuildsConnectorComponentr r }r (hfUhgj ubaubeubj)r }r (hfUhgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r (h)r }r (hfX<This class handles a little bit of information about builds.r hgj hohrhyhh{}r (h]h]h~]h}]h]uhKhhh]r hX<This class handles a little bit of information about builds.r r }r (hfj hgj ubaubh)r }r (hfXThe 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.hgj hohrhyhh{}r (h]h]h~]h}]h]uhNhhh]r h)r }r (hfXThe 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 hgj hohrhyhh{}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 (hfj hgj ubaubaubh)r }r (hfX?An instance of this class is available at ``master.db.builds``.hgj hohrhyhh{}r (h]h]h~]h}]h]uhKhhh]r (hX*An instance of this class is available at r r }r (hfX*An instance of this class is available at hgj ubh)r }r (hfX``master.db.builds``h{}r (h]h]h~]h}]h]uhgj h]r hXmaster.db.buildsr r }r (hfUhgj ubahyhubhX.r }r (hfX.hgj ubeubjc)r }r (hfUhgj hohrhyjfh{}r (h}]h~]h]h]h]jn]r ((jiXbdictUindex-5r Utr (jiXbidj Utr ejsuhKhhh]ubhv)r }r (hfUhgj hohrhyhzh{}r (h}]h~]h]h]h]hj uhKhhh]ubh)r }r (hfXfBuilds are indexed by *bid* and their contents represented as *bdicts* (build dictionaries), with keyshgj hohrht}hyhh{}r (h]h]h~]h}]r j ah]uhKhhh}r j j sh]r (hXBuilds are indexed by r r }r (hfXBuilds are indexed by hgj ubjr)r }r (hfX*bid*h{}r (h]h]h~]h}]h]uhgj h]r hXbidr r }r (hfUhgj ubahyjzubhX# and their contents represented as r r }r (hfX# and their contents represented as hgj ubjr)r }r (hfX*bdicts*h{}r (h]h]h~]h}]h]uhgj h]r hXbdictsr r }r (hfUhgj ubahyjzubhX (build dictionaries), with keysr r }r (hfX (build dictionaries), with keyshgj ubeubj~)r }r (hfUhgj hohrhyjh{}r (jX*h}]h~]h]h]h]uhKhhh]r (j)r }r (hfX'``bid`` (the build ID, globally unique)r hgj hohrhyjh{}r (h]h]h~]h}]h]uhNhhh]r h)r }r (hfj hgj hohrhyhh{}r (h]h]h~]h}]h]uhKh]r (h)r }r (hfX``bid``h{}r (h]h]h~]h}]h]uhgj h]r hXbidr r }r (hfUhgj ubahyhubhX (the build ID, globally unique)r r }r (hfX (the build ID, globally unique)hgj ubeubaubj)r }r (hfXI``number`` (the build number, unique only within this master and builder)r hgj hohrhyjh{}r (h]h]h~]h}]h]uhNhhh]r h)r }r (hfj hgj hohrhyhh{}r (h]h]h~]h}]h]uhKh]r (h)r }r (hfX ``number``h{}r (h]h]h~]h}]h]uhgj h]r hXnumberr r }r (hfUhgj ubahyhubhX? (the build number, unique only within this master and builder)r r }r (hfX? (the build number, unique only within this master and builder)hgj ubeubaubj)r }r (hfX=``brid`` (the ID of the build request that caused this build)r! hgj hohrhyjh{}r" (h]h]h~]h}]h]uhNhhh]r# h)r$ }r% (hfj! hgj hohrhyhh{}r& (h]h]h~]h}]h]uhKh]r' (h)r( }r) (hfX``brid``h{}r* (h]h]h~]h}]h]uhgj$ h]r+ hXbridr, r- }r. (hfUhgj( ubahyhubhX5 (the ID of the build request that caused this build)r/ r0 }r1 (hfX5 (the ID of the build request that caused this build)hgj$ ubeubaubj)r2 }r3 (hfX``start_time``r4 hgj hohrhyjh{}r5 (h]h]h~]h}]h]uhNhhh]r6 h)r7 }r8 (hfj4 hgj2 hohrhyhh{}r9 (h]h]h~]h}]h]uhKh]r: h)r; }r< (hfj4 h{}r= (h]h]h~]h}]h]uhgj7 h]r> hX start_timer? r@ }rA (hfUhgj; ubahyhubaubaubj)rB }rC (hfX-``finish_time`` (datetime objects, or None). hgj hohrhyjh{}rD (h]h]h~]h}]h]uhNhhh]rE h)rF }rG (hfX,``finish_time`` (datetime objects, or None).hgjB hohrhyhh{}rH (h]h]h~]h}]h]uhKh]rI (h)rJ }rK (hfX``finish_time``h{}rL (h]h]h~]h}]h]uhgjF h]rM hX finish_timerN rO }rP (hfUhgjJ ubahyhubhX (datetime objects, or None).rQ rR }rS (hfX (datetime objects, or None).hgjF ubeubaubeubjc)rT }rU (hfUhgj hohrhyjfh{}rV (h}]h~]h]h]h]Uentries]rW (jiX?getBuild() (buildbot.db.builds.BuildsConnectorComponent method)h+UtrX auhNhhh]ubj~)rY }rZ (hfUhgj hohrhyjh{}r[ (jjXpyr\ h}]h~]h]h]h]jXmethodr] jj] uhNhhh]r^ (j)r_ }r` (hfX getBuild(bid)hgjY hohrhyjh{}ra (h}]rb h+ajj h~]h]h]h]rc h+ajX!BuildsConnectorComponent.getBuildjj juhKhhh]rd (j)re }rf (hfXgetBuildhgj_ hohrhyjh{}rg (h]h]h~]h}]h]uhKhhh]rh hXgetBuildri rj }rk (hfUhgje ubaubj<)rl }rm (hfUhgj_ hohrhyj?h{}rn (h]h]h~]h}]h]uhKhhh]ro jB)rp }rq (hfXbidh{}rr (h]h]h~]h}]h]uhgjl h]rs hXbidrt ru }rv (hfUhgjp ubahyjJubaubeubj)rw }rx (hfUhgjY hohrhyjh{}ry (h]h]h~]h}]h]uhKhhh]rz (jO)r{ }r| (hfUhgjw hohrhyjRh{}r} (h]h]h~]h}]h]uhNhhh]r~ (jU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj{ h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hX Parametersr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jl)r }r (hfXbidh{}r (h]h]h~]h}]h]uhgj h]r hXbidr r }r (hfUhgj ubahyjtubhX (r r }r (hfUhgj ubj")r }r (hfUh{}r (Ureftypej$U reftargetXintegerr U refdomainj\ h}]h~]U refexplicith]h]h]uhgj h]r jr)r }r (hfj h{}r (h]h]h~]h}]h]uhgj h]r hXintegerr r }r (hfUhgj ubahyjzubahyj&ubhX)r }r (hfUhgj ubhX -- r r }r (hfUhgj ubhXbuild idr r }r (hfXbuild idhgj ubehyhubahyj{ubehyj|ubjU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj{ h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hXReturnsr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (hXBuild dictionary as above or r r }r (hfXBuild dictionary as above or hgj ubh)r }r (hfX``None``h{}r (h]h]h~]h}]h]uhgj h]r hXNoner r }r (hfUhgj ubahyhubhX, via Deferredr r }r (hfX, via Deferredhgj ubehyhubahyj{ubehyj|ubeubh)r }r (hfX_Get a single build, in the format described above. Returns ``None`` if there is no such build.hgjw hohrhyhh{}r (h]h]h~]h}]h]uhKhhh]r (hX<Get a single build, in the format described above. Returns r r }r (hfX<Get a single build, in the format described above. Returns hgj ubh)r }r (hfX``None``h{}r (h]h]h~]h}]h]uhgj h]r hXNoner r }r (hfUhgj ubahyhubhX if there is no such build.r r }r (hfX if there is no such build.hgj ubeubeubeubjc)r }r (hfUhgj hohrhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiXJgetBuildsForRequest() (buildbot.db.builds.BuildsConnectorComponent method)hUtr auhNhhh]ubj~)r }r (hfUhgj hohrhyjh{}r (jjXpyh}]h~]h]h]h]jXmethodr jj uhNhhh]r (j)r }r (hfXgetBuildsForRequest(brid)hgj hohrhyjh{}r (h}]r hajj h~]h]h]h]r hajX,BuildsConnectorComponent.getBuildsForRequestjj juhMhhh]r (j)r }r (hfXgetBuildsForRequesthgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXgetBuildsForRequestr r }r (hfUhgj ubaubj<)r }r (hfUhgj hohrhyj?h{}r (h]h]h~]h}]h]uhMhhh]r jB)r }r (hfXbridh{}r (h]h]h~]h}]h]uhgj h]r hXbridr r }r (hfUhgj ubahyjJubaubeubj)r }r (hfUhgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r (jO)r }r (hfUhgj hohrhyjRh{}r (h]h]h~]h}]h]uhNhhh]r (jU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hX Parametersr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jl)r }r (hfXbridsh{}r (h]h]h~]h}]h]uhgj h]r! hXbridsr" r# }r$ (hfUhgj ubahyjtubhX -- r% r& }r' (hfUhgj ubhXlist of build request idsr( r) }r* (hfXlist of build request idshgj ubehyhubahyj{ubehyj|ubjU)r+ }r, (hfUh{}r- (h]h]h~]h}]h]uhgj h]r. (jZ)r/ }r0 (hfUh{}r1 (h]h]h~]h}]h]uhgj+ h]r2 hXReturnsr3 r4 }r5 (hfUhgj/ ubahyjbubjc)r6 }r7 (hfUh{}r8 (h]h]h~]h}]h]uhgj+ h]r9 h)r: }r; (hfUh{}r< (h]h]h~]h}]h]uhgj6 h]r= hX1List of build dictionaries as above, via Deferredr> r? }r@ (hfX1List of build dictionaries as above, via Deferredhgj: ubahyhubahyj{ubehyj|ubeubh)rA }rB (hfXGet a list of builds for the given build request. The resulting build dictionaries are in exactly the same format as for :py:meth:`getBuild`.hgj hohrhyhh{}rC (h]h]h~]h}]h]uhKhhh]rD (hXzGet a list of builds for the given build request. The resulting build dictionaries are in exactly the same format as for rE rF }rG (hfXzGet a list of builds for the given build request. The resulting build dictionaries are in exactly the same format as for hgjA ubj")rH }rI (hfX:py:meth:`getBuild`rJ hgjA hohrhyj&h{}rK (UreftypeXmethj(j)XgetBuildU refdomainXpyrL h}]h~]U refexplicith]h]h]j+j,j-j j.j uhKh]rM h)rN }rO (hfjJ h{}rP (h]h]rQ (j4jL Xpy-methrR eh~]h}]h]uhgjH h]rS hXgetBuildrT rU }rV (hfUhgjN ubahyhubaubhX.rW }rX (hfX.hgjA ubeubeubeubjc)rY }rZ (hfUhgj hohrhyjfh{}r[ (h}]h~]h]h]h]Uentries]r\ (jiX?addBuild() (buildbot.db.builds.BuildsConnectorComponent method)h0Utr] auhNhhh]ubj~)r^ }r_ (hfUhgj hohrhyjh{}r` (jjXpyh}]h~]h]h]h]jXmethodra jja uhNhhh]rb (j)rc }rd (hfXaddBuild(brid, number)hgj^ hohrhyjh{}re (h}]rf h0ajj h~]h]h]h]rg h0ajX!BuildsConnectorComponent.addBuildjj juhM hhh]rh (j)ri }rj (hfXaddBuildhgjc hohrhyjh{}rk (h]h]h~]h}]h]uhM hhh]rl hXaddBuildrm rn }ro (hfUhgji ubaubj<)rp }rq (hfUhgjc hohrhyj?h{}rr (h]h]h~]h}]h]uhM hhh]rs (jB)rt }ru (hfXbridh{}rv (h]h]h~]h}]h]uhgjp h]rw hXbridrx ry }rz (hfUhgjt ubahyjJubjB)r{ }r| (hfXnumberh{}r} (h]h]h~]h}]h]uhgjp h]r~ hXnumberr r }r (hfUhgj{ ubahyjJubeubeubj)r }r (hfUhgj^ hohrhyjh{}r (h]h]h~]h}]h]uhM hhh]r (jO)r }r (hfUhgj hohrhyjRh{}r (h]h]h~]h}]h]uhNhhh]r (jU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hX Parametersr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r j~)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (j)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jl)r }r (hfXbridh{}r (h]h]h~]h}]h]uhgj h]r hXbridr r }r (hfUhgj ubahyjtubhX -- r r }r (hfUhgj ubhXbuild request idr r }r (hfXbuild request idhgj ubehyhubahyjubj)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jl)r }r (hfXnumberh{}r (h]h]h~]h}]h]uhgj h]r hXnumberr r }r (hfUhgj ubahyjtubhX -- r r }r (hfUhgj ubhX build numberr r }r (hfX build numberhgj ubehyhubahyjubehyjubahyj{ubehyj|ubjU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hXReturnsr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hXbuild ID via Deferredr r }r (hfXbuild ID via Deferredhgj ubahyhubahyj{ubehyj|ubeubh)r }r (hfXJAdd a new build to the db, recorded as having started at the current time.r hgj hohrhyhh{}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 (hfj hgj ubaubeubeubjc)r }r (hfUhgj hohrhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiXCfinishBuilds() (buildbot.db.builds.BuildsConnectorComponent method)hUtr auhNhhh]ubj~)r }r (hfUhgj hohrhyjh{}r (jjXpyr h}]h~]h]h]h]jXmethodr jj uhNhhh]r (j)r }r (hfXfinishBuilds(bids)hgj hohrhyjh{}r (h}]r hajj h~]h]h]h]r hajX%BuildsConnectorComponent.finishBuildsjj juhMhhh]r (j)r }r (hfX finishBuildshgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hX finishBuildsr r }r (hfUhgj ubaubj<)r }r (hfUhgj hohrhyj?h{}r (h]h]h~]h}]h]uhMhhh]r jB)r }r (hfXbidsh{}r (h]h]h~]h}]h]uhgj h]r hXbidsr r }r (hfUhgj ubahyjJubaubeubj)r }r (hfUhgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r (jO)r }r (hfUhgj hohrhyjRh{}r (h]h]h~]h}]h]uhNhhh]r (jU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hX Parametersr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r! (h]h]h~]h}]h]uhgj h]r" (jl)r# }r$ (hfXbidsh{}r% (h]h]h~]h}]h]uhgj h]r& hXbidsr' r( }r) (hfUhgj# ubahyjtubhX (r* r+ }r, (hfUhgj ubj")r- }r. (hfUh{}r/ (Ureftypej$U reftargetXlistr0 U refdomainj h}]h~]U refexplicith]h]h]uhgj h]r1 jr)r2 }r3 (hfj0 h{}r4 (h]h]h~]h}]h]uhgj- h]r5 hXlistr6 r7 }r8 (hfUhgj2 ubahyjzubahyj&ubhX)r9 }r: (hfUhgj ubhX -- r; r< }r= (hfUhgj ubhX build idsr> r? }r@ (hfX build idshgj ubehyhubahyj{ubehyj|ubjU)rA }rB (hfUh{}rC (h]h]h~]h}]h]uhgj h]rD (jZ)rE }rF (hfUh{}rG (h]h]h~]h}]h]uhgjA h]rH hXReturnsrI rJ }rK (hfUhgjE ubahyjbubjc)rL }rM (hfUh{}rN (h]h]h~]h}]h]uhgjA h]rO h)rP }rQ (hfUh{}rR (h]h]h~]h}]h]uhgjL h]rS hXDeferredrT rU }rV (hfXDeferredhgjP ubahyhubahyj{ubehyj|ubeubh)rW }rX (hfXMark the given builds as finished, with ``finish_time`` set to the current time. This is done unconditionally, even if the builds are already finished.hgj hohrhyhh{}rY (h]h]h~]h}]h]uhMhhh]rZ (hX(Mark the given builds as finished, with r[ r\ }r] (hfX(Mark the given builds as finished, with hgjW ubh)r^ }r_ (hfX``finish_time``h{}r` (h]h]h~]h}]h]uhgjW h]ra hX finish_timerb rc }rd (hfUhgj^ ubahyhubhXa set to the current time. This is done unconditionally, even if the builds are already finished.re rf }rg (hfXa set to the current time. This is done unconditionally, even if the builds are already finished.hgjW ubeubeubeubeubeubeubhh)rh }ri (hfUhgjDhohrhyhh{}rj (h]h]h~]h}]rk (Xmodule-buildbot.db.buildsetsrl U buildsetsrm eh]rn hauhMhhh]ro (h)rp }rq (hfX buildsetsrr hgjh hohrhyhh{}rs (h]h]h~]h}]h]uhMhhh]rt hX buildsetsru rv }rw (hfjr hgjp ubaubjc)rx }ry (hfUhgjh hohrhyjfh{}rz (h}]h~]h]h]h]Uentries]r{ (jiXbuildbot.db.buildsets (module)Xmodule-buildbot.db.buildsetsUtr| auhMhhh]ubjc)r} }r~ (hfUhgjh hohrhyjfh{}r (h}]h~]h]h]h]jn]r (jpX!Buildsets; DB Connector ComponentUindex-6r Utr ajsuhMhhh]ubhv)r }r (hfUhgjh hohrhyhzh{}r (h]h]h~]h}]r j ah]uhMhhh]ubjc)r }r (hfUhgjh hoNhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiX<BuildsetsConnectorComponent (class in buildbot.db.buildsets)hEUtr auhNhhh]ubj~)r }r (hfUhgjh hoNhyjh{}r (jjXpyh}]h~]h]h]h]jXclassr jj uhNhhh]r (j)r }r (hfXBuildsetsConnectorComponentr hgj hohrhyjh{}r (h}]r hEajXbuildbot.db.buildsetsr h~]h]h]h]r hEajj jUjuhMhhh]r (j)r }r (hfXclass hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXclass r r }r (hfUhgj ubaubj)r }r (hfXbuildbot.db.buildsets.hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXbuildbot.db.buildsets.r r }r (hfUhgj ubaubj)r }r (hfj hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXBuildsetsConnectorComponentr r }r (hfUhgj ubaubeubj)r }r (hfUhgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r (h)r }r (hfXThis class handles getting buildsets into and out of the database. Buildsets combine multiple build requests that were triggered together.r hgj hohrhyhh{}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 (hfj hgj ubaubh)r }r (hfXBAn instance of this class is available at ``master.db.buildsets``.hgj hohrhyhh{}r (h]h]h~]h}]h]uhM!hhh]r (hX*An instance of this class is available at r r }r (hfX*An instance of this class is available at hgj ubh)r }r (hfX``master.db.buildsets``h{}r (h]h]h~]h}]h]uhgj h]r hXmaster.db.buildsetsr r }r (hfUhgj ubahyhubhX.r }r (hfX.hgj ubeubjc)r }r (hfUhgj hohrhyjfh{}r (h}]h~]h]h]h]jn]r ((jiXbsdictUindex-7r Utr (jiXbsidj Utr ejsuhM#hhh]ubhv)r }r (hfUhgj hohrhyhzh{}r (h}]h~]h]h]h]hj uhM$hhh]ubh)r }r (hfXnBuildsets are indexed by *bsid* and their contents represented as *bsdicts* (buildset dictionaries), with keyshgj hohrht}hyhh{}r (h]h]h~]h}]r j ah]uhM%hhh}r j j sh]r (hXBuildsets are indexed by r r }r (hfXBuildsets are indexed by hgj ubjr)r }r (hfX*bsid*h{}r (h]h]h~]h}]h]uhgj h]r hXbsidr r }r (hfUhgj ubahyjzubhX# and their contents represented as r r }r (hfX# and their contents represented as hgj ubjr)r }r (hfX *bsdicts*h{}r (h]h]h~]h}]h]uhgj h]r hXbsdictsr r }r (hfUhgj ubahyjzubhX# (buildset dictionaries), with keysr r }r (hfX# (buildset dictionaries), with keyshgj ubeubj~)r }r (hfUhgj hohrhyjh{}r (jX*h}]h~]h]h]h]uhM(hhh]r (j)r }r (hfX``bsid``r hgj hohrhyjh{}r (h]h]h~]h}]h]uhNhhh]r h)r }r (hfj hgj hohrhyhh{}r (h]h]h~]h}]h]uhM(h]r h)r }r (hfj h{}r (h]h]h~]h}]h]uhgj h]r hXbsidr r }r (hfUhgj ubahyhubaubaubj)r }r (hfXF``external_idstring`` (arbitrary string for mapping builds externally)r hgj hohrhyjh{}r (h]h]h~]h}]h]uhNhhh]r h)r }r (hfj hgj hohrhyhh{}r (h]h]h~]h}]h]uhM)h]r (h)r }r (hfX``external_idstring``h{}r (h]h]h~]h}]h]uhgj h]r hXexternal_idstringr r }r (hfUhgj ubahyhubhX1 (arbitrary string for mapping builds externally)r r }r (hfX1 (arbitrary string for mapping builds externally)hgj ubeubaubj)r }r (hfX7``reason`` (string; reason these builds were triggered)r hgj hohrhyjh{}r (h]h]h~]h}]h]uhNhhh]r h)r }r (hfj hgj hohrhyhh{}r (h]h]h~]h}]h]uhM*h]r (h)r! }r" (hfX ``reason``h{}r# (h]h]h~]h}]h]uhgj h]r$ hXreasonr% r& }r' (hfUhgj! ubahyhubhX- (string; reason these builds were triggered)r( r) }r* (hfX- (string; reason these builds were triggered)hgj ubeubaubj)r+ }r, (hfX9``sourcestampsetid`` (source stamp set for this buildset)r- hgj hohrhyjh{}r. (h]h]h~]h}]h]uhNhhh]r/ h)r0 }r1 (hfj- hgj+ hohrhyhh{}r2 (h]h]h~]h}]h]uhM+h]r3 (h)r4 }r5 (hfX``sourcestampsetid``h{}r6 (h]h]h~]h}]h]uhgj0 h]r7 hXsourcestampsetidr8 r9 }r: (hfUhgj4 ubahyhubhX% (source stamp set for this buildset)r; r< }r= (hfX% (source stamp set for this buildset)hgj0 ubeubaubj)r> }r? (hfXB``submitted_at`` (datetime object; time this buildset was created)r@ hgj hohrhyjh{}rA (h]h]h~]h}]h]uhNhhh]rB h)rC }rD (hfj@ hgj> hohrhyhh{}rE (h]h]h~]h}]h]uhM,h]rF (h)rG }rH (hfX``submitted_at``h{}rI (h]h]h~]h}]h]uhgjC h]rJ hX submitted_atrK rL }rM (hfUhgjG ubahyhubhX2 (datetime object; time this buildset was created)rN rO }rP (hfX2 (datetime object; time this buildset was created)hgjC ubeubaubj)rQ }rR (hfXP``complete`` (boolean; true if all of the builds for this buildset are complete)rS hgj hohrhyjh{}rT (h]h]h~]h}]h]uhNhhh]rU h)rV }rW (hfjS hgjQ hohrhyhh{}rX (h]h]h~]h}]h]uhM-h]rY (h)rZ }r[ (hfX ``complete``h{}r\ (h]h]h~]h}]h]uhgjV h]r] hXcompleter^ r_ }r` (hfUhgjZ ubahyhubhXD (boolean; true if all of the builds for this buildset are complete)ra rb }rc (hfXD (boolean; true if all of the builds for this buildset are complete)hgjV ubeubaubj)rd }re (hfXC``complete_at`` (datetime object; time this buildset was completed)rf hgj hohrhyjh{}rg (h]h]h~]h}]h]uhNhhh]rh h)ri }rj (hfjf hgjd hohrhyhh{}rk (h]h]h~]h}]h]uhM.h]rl (h)rm }rn (hfX``complete_at``h{}ro (h]h]h~]h}]h]uhgji h]rp hX complete_atrq rr }rs (hfUhgjm ubahyhubhX4 (datetime object; time this buildset was completed)rt ru }rv (hfX4 (datetime object; time this buildset was completed)hgji ubeubaubj)rw }rx (hfXO``results`` (aggregate result of this buildset; see :ref:`Build-Result-Codes`) hgj hohrhyjh{}ry (h]h]h~]h}]h]uhNhhh]rz h)r{ }r| (hfXN``results`` (aggregate result of this buildset; see :ref:`Build-Result-Codes`)hgjw hohrhyhh{}r} (h]h]h~]h}]h]uhM/h]r~ (h)r }r (hfX ``results``h{}r (h]h]h~]h}]h]uhgj{ h]r hXresultsr r }r (hfUhgj ubahyhubhX) (aggregate result of this buildset; see r r }r (hfX) (aggregate result of this buildset; see hgj{ ubj")r }r (hfX:ref:`Build-Result-Codes`r hgj{ hohrhyj&h{}r (UreftypeXrefj(j)Xbuild-result-codesU refdomainXstdr h}]h~]U refexplicith]h]h]j+j,uhM/h]r jr)r }r (hfj h{}r (h]h]r (j4j Xstd-refr eh~]h}]h]uhgj h]r hXBuild-Result-Codesr r }r (hfUhgj ubahyjzubaubhX)r }r (hfX)hgj{ ubeubaubeubjc)r }r (hfUhgj hohrhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiXHaddBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h4Utr auhNhhh]ubj~)r }r (hfUhgj hohrhyjh{}r (jjXpyr h}]h~]h]h]h]jXmethodr jj uhNhhh]r (j)r }r (hfXWaddBuildset(sourcestampsetid, reason, properties, builderNames, external_idstring=None)hgj hohrhyjh{}r (h}]r h4ajj h~]h]h]h]r h4ajX'BuildsetsConnectorComponent.addBuildsetjj juhMFhhh]r (j)r }r (hfX addBuildsethgj hohrhyjh{}r (h]h]h~]h}]h]uhMFhhh]r hX addBuildsetr r }r (hfUhgj ubaubj<)r }r (hfUhgj hohrhyj?h{}r (h]h]h~]h}]h]uhMFhhh]r (jB)r }r (hfXsourcestampsetidh{}r (h]h]h~]h}]h]uhgj h]r hXsourcestampsetidr r }r (hfUhgj ubahyjJubjB)r }r (hfXreasonh{}r (h]h]h~]h}]h]uhgj h]r hXreasonr r }r (hfUhgj ubahyjJubjB)r }r (hfX propertiesh{}r (h]h]h~]h}]h]uhgj h]r hX propertiesr r }r (hfUhgj ubahyjJubjB)r }r (hfX builderNamesh{}r (h]h]h~]h}]h]uhgj h]r hX builderNamesr r }r (hfUhgj ubahyjJubjB)r }r (hfXexternal_idstring=Noneh{}r (h]h]h~]h}]h]uhgj h]r hXexternal_idstring=Noner r }r (hfUhgj ubahyjJubeubeubj)r }r (hfUhgj hohrhyjh{}r (h]h]h~]h}]h]uhMFhhh]r (jO)r }r (hfUhgj hohrhyjRh{}r (h]h]h~]h}]h]uhNhhh]r (jU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hX Parametersr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r j~)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (j)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jl)r }r (hfXsourcestampsetidh{}r (h]h]h~]h}]h]uhgj h]r hXsourcestampsetidrr}r(hfUhgj ubahyjtubhX (rr}r(hfUhgj ubj")r}r(hfUh{}r(Ureftypej$U reftargetXintegerr U refdomainj h}]h~]U refexplicith]h]h]uhgj h]r jr)r }r (hfj h{}r (h]h]h~]h}]h]uhgjh]rhXintegerrr}r(hfUhgj ubahyjzubahyj&ubhX)r}r(hfUhgj ubhX -- rr}r(hfUhgj ubhX*id of the SourceStampSet for this buildsetrr}r(hfX*id of the SourceStampSet for this buildsethgj ubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgj h]rh)r}r(hfUh{}r (h]h]h~]h}]h]uhgjh]r!(jl)r"}r#(hfXreasonh{}r$(h]h]h~]h}]h]uhgjh]r%hXreasonr&r'}r((hfUhgj"ubahyjtubhX (r)r*}r+(hfUhgjubj")r,}r-(hfUh{}r.(Ureftypej$U reftargetXshort unicode stringr/U refdomainj h}]h~]U refexplicith]h]h]uhgjh]r0jr)r1}r2(hfj/h{}r3(h]h]h~]h}]h]uhgj,h]r4hXshort unicode stringr5r6}r7(hfUhgj1ubahyjzubahyj&ubhX)r8}r9(hfUhgjubhX -- r:r;}r<(hfUhgjubhXreason for this buildsetr=r>}r?(hfXreason for this buildsethgjubehyhubahyjubj)r@}rA(hfUh{}rB(h]h]h~]h}]h]uhgj h]rCh)rD}rE(hfUh{}rF(h]h]h~]h}]h]uhgj@h]rG(jl)rH}rI(hfX propertiesh{}rJ(h]h]h~]h}]h]uhgjDh]rKhX propertiesrLrM}rN(hfUhgjHubahyjtubhX (rOrP}rQ(hfUhgjDubj")rR}rS(hfUh{}rT(Ureftypej$U reftargetX6dictionary, where values are tuples of (value, source)rUU refdomainj h}]h~]U refexplicith]h]h]uhgjDh]rVjr)rW}rX(hfjUh{}rY(h]h]h~]h}]h]uhgjRh]rZhX6dictionary, where values are tuples of (value, source)r[r\}r](hfUhgjWubahyjzubahyj&ubhX)r^}r_(hfUhgjDubhX -- r`ra}rb(hfUhgjDubhXproperties for this buildsetrcrd}re(hfXproperties for this buildsethgjDubehyhubahyjubj)rf}rg(hfUh{}rh(h]h]h~]h}]h]uhgj h]rih)rj}rk(hfUh{}rl(h]h]h~]h}]h]uhgjfh]rm(jl)rn}ro(hfX builderNamesh{}rp(h]h]h~]h}]h]uhgjjh]rqhX builderNamesrrrs}rt(hfUhgjnubahyjtubhX (rurv}rw(hfUhgjjubj")rx}ry(hfUh{}rz(Ureftypej$U reftargetXlist of stringsr{U refdomainj h}]h~]U refexplicith]h]h]uhgjjh]r|jr)r}}r~(hfj{h{}r(h]h]h~]h}]h]uhgjxh]rhXlist of stringsrr}r(hfUhgj}ubahyjzubahyj&ubhX)r}r(hfUhgjjubhX -- rr}r(hfUhgjjubhX#builders specified by this buildsetrr}r(hfX#builders specified by this buildsethgjjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgj h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXexternal_idstringh{}r(h]h]h~]h}]h]uhgjh]rhXexternal_idstringrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainj h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX8external key to identify this buildset; defaults to Nonerr}r(hfX8external key to identify this buildset; defaults to Nonehgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgj h]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX0buildset ID and buildrequest IDs, via a Deferredrr}r(hfX0buildset ID and buildrequest IDs, via a Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXAdd 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.rhgj hohrhyhh{}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(hfjhgjubaubh)r}r(hfXThe 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.hgj hohrhyhh{}r(h]h]h~]h}]h]uhMChhh]r(hXThe return value is a tuple rr}r(hfXThe return value is a tuple hgjubh)r}r(hfX``(bsid, brids)``h{}r(h]h]h~]h}]h]uhgjh]rhX (bsid, brids)rr}r(hfUhgjubahyhubhX where rr}r(hfX where hgjubh)r}r(hfX``bsid``h{}r(h]h]h~]h}]h]uhgjh]rhXbsidrr}r(hfUhgjubahyhubhX! is the inserted buildset ID and rr}r(hfX! is the inserted buildset ID and hgjubh)r}r(hfX ``brids``h{}r(h]h]h~]h}]h]uhgjh]rhXbridsrr}r(hfUhgjubahyhubhX; is a dictionary mapping buildernames to build request IDs.rr}r(hfX; is a dictionary mapping buildernames to build request IDs.hgjubeubeubeubjc)r}r(hfUhgj hohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXMcompleteBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h7UtrauhNhhh]ubj~)r}r(hfUhgj hohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfX1completeBuildset(bsid, results[, complete_at=XX])hgjhohrhyjh{}r(h}]rh7ajj h~]h]h]h]rh7ajX,BuildsetsConnectorComponent.completeBuildsetjj juhMUhhh]r(j)r}r(hfXcompleteBuildsethgjhohrhyjh{}r(h]h]h~]h}]h]uhMUhhh]r hXcompleteBuildsetr r }r (hfUhgjubaubj<)r }r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMUhhh]r(jB)r}r(hfXbsidh{}r(h]h]h~]h}]h]uhgj h]rhXbsidrr}r(hfUhgjubahyjJubjB)r}r(hfXresultsh{}r(h]h]h~]h}]h]uhgj h]rhXresultsrr}r(hfUhgjubahyjJubjZ)r}r (hfUh{}r!(h]h]h~]h}]h]uhgj h]r"jB)r#}r$(hfXcomplete_at=XXh{}r%(h]h]h~]h}]h]uhgjh]r&hXcomplete_at=XXr'r(}r)(hfUhgj#ubahyjJubahyjfubeubeubj)r*}r+(hfUhgjhohrhyjh{}r,(h]h]h~]h}]h]uhMUhhh]r-(jO)r.}r/(hfUhgj*hohrhyjRh{}r0(h]h]h~]h}]h]uhNhhh]r1(jU)r2}r3(hfUh{}r4(h]h]h~]h}]h]uhgj.h]r5(jZ)r6}r7(hfUh{}r8(h]h]h~]h}]h]uhgj2h]r9hX Parametersr:r;}r<(hfUhgj6ubahyjbubjc)r=}r>(hfUh{}r?(h]h]h~]h}]h]uhgj2h]r@j~)rA}rB(hfUh{}rC(h]h]h~]h}]h]uhgj=h]rD(j)rE}rF(hfUh{}rG(h]h]h~]h}]h]uhgjAh]rHh)rI}rJ(hfUh{}rK(h]h]h~]h}]h]uhgjEh]rL(jl)rM}rN(hfXbsidh{}rO(h]h]h~]h}]h]uhgjIh]rPhXbsidrQrR}rS(hfUhgjMubahyjtubhX (rTrU}rV(hfUhgjIubj")rW}rX(hfUh{}rY(Ureftypej$U reftargetXintegerrZU refdomainjh}]h~]U refexplicith]h]h]uhgjIh]r[jr)r\}r](hfjZh{}r^(h]h]h~]h}]h]uhgjWh]r_hXintegerr`ra}rb(hfUhgj\ubahyjzubahyj&ubhX)rc}rd(hfUhgjIubhX -- rerf}rg(hfUhgjIubhXbuildset ID to completerhri}rj(hfXbuildset ID to completerkhgjIubehyhubahyjubj)rl}rm(hfUh{}rn(h]h]h~]h}]h]uhgjAh]roh)rp}rq(hfUh{}rr(h]h]h~]h}]h]uhgjlh]rs(jl)rt}ru(hfXresultsh{}rv(h]h]h~]h}]h]uhgjph]rwhXresultsrxry}rz(hfUhgjtubahyjtubhX (r{r|}r}(hfUhgjpubj")r~}r(hfUh{}r(Ureftypej$U reftargetXintegerrU refdomainjh}]h~]U refexplicith]h]h]uhgjph]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgj~h]rhXintegerrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjpubhX -- rr}r(hfUhgjpubhXinteger result coderr}r(hfXinteger result coderhgjpubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjAh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX complete_ath{}r(h]h]h~]h}]h]uhgjh]rhX complete_atrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXdatetimerU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXdatetimerr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXtime the buildset was completedrr}r(hfXtime the buildset was completedrhgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgj.h]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXDeferredrr}r(hfXDeferredrhgjubahyhubahyj{ubehyj|ubjU)r}r(hfUhgj.hohrhyj|h{}r(h]h]h~]h}]h]uhMOhhh]r(jZ)r}r(hfXraisesh{}r(h]h]h~]h}]h]uhgjh]rhXRaisesrr}r(hfUhgjubahyjbubjc)r}r(hfXI:py:exc:`KeyError` if the buildset does not exist or is already complete h{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfXH:py:exc:`KeyError` if the buildset does not exist or is already completehgjhohrhyhh{}r(h]h]h~]h}]h]uhMOh]r(j")r}r(hfX:py:exc:`KeyError`rhgjhohrhyj&h{}r(UreftypeXexcj(j)XKeyErrorU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-j j.j uhMOh]rh)r}r(hfjh{}r(h]h]r(j4jXpy-excreh~]h}]h]uhgjh]rhXKeyErrorrr}r(hfUhgjubahyhubaubhX6 if the buildset does not exist or is already completerr}r(hfX6 if the buildset does not exist or is already completehgjubeubahyj{ubeubeubh)r}r(hfXComplete a buildset, marking it with the given ``results`` and setting its ``completed_at`` to the current time, if the ``complete_at`` argument is omitted.hgj*hohrhyhh{}r(h]h]h~]h}]h]uhMRhhh]r(hX/Complete a buildset, marking it with the given rr}r(hfX/Complete a buildset, marking it with the given hgjubh)r}r(hfX ``results``h{}r(h]h]h~]h}]h]uhgjh]rhXresultsrr}r(hfUhgjubahyhubhX and setting its rr}r(hfX and setting its hgjubh)r}r(hfX``completed_at``h{}r (h]h]h~]h}]h]uhgjh]r hX completed_atr r }r (hfUhgjubahyhubhX to the current time, if the rr}r(hfX to the current time, if the hgjubh)r}r(hfX``complete_at``h{}r(h]h]h~]h}]h]uhgjh]rhX complete_atrr}r(hfUhgjubahyhubhX argument is omitted.rr}r(hfX argument is omitted.hgjubeubeubeubjc)r}r(hfUhgj hohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXHgetBuildset() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h UtrauhNhhh]ubj~)r }r!(hfUhgj hohrhyjh{}r"(jjXpyh}]h~]h]h]h]jXmethodr#jj#uhNhhh]r$(j)r%}r&(hfXgetBuildset(bsid)hgj hohrhyjh{}r'(h}]r(h ajj h~]h]h]h]r)h ajX'BuildsetsConnectorComponent.getBuildsetjj juhM`hhh]r*(j)r+}r,(hfX getBuildsethgj%hohrhyjh{}r-(h]h]h~]h}]h]uhM`hhh]r.hX getBuildsetr/r0}r1(hfUhgj+ubaubj<)r2}r3(hfUhgj%hohrhyj?h{}r4(h]h]h~]h}]h]uhM`hhh]r5jB)r6}r7(hfXbsidh{}r8(h]h]h~]h}]h]uhgj2h]r9hXbsidr:r;}r<(hfUhgj6ubahyjJubaubeubj)r=}r>(hfUhgj hohrhyjh{}r?(h]h]h~]h}]h]uhM`hhh]r@(jO)rA}rB(hfUhgj=hohrhyjRh{}rC(h]h]h~]h}]h]uhNhhh]rD(jU)rE}rF(hfUh{}rG(h]h]h~]h}]h]uhgjAh]rH(jZ)rI}rJ(hfUh{}rK(h]h]h~]h}]h]uhgjEh]rLhX ParametersrMrN}rO(hfUhgjIubahyjbubjc)rP}rQ(hfUh{}rR(h]h]h~]h}]h]uhgjEh]rSh)rT}rU(hfUh{}rV(h]h]h~]h}]h]uhgjPh]rW(jl)rX}rY(hfXbsidh{}rZ(h]h]h~]h}]h]uhgjTh]r[hXbsidr\r]}r^(hfUhgjXubahyjtubhX -- r_r`}ra(hfUhgjTubhX buildset IDrbrc}rd(hfX buildset IDhgjTubehyhubahyj{ubehyj|ubjU)re}rf(hfUh{}rg(h]h]h~]h}]h]uhgjAh]rh(jZ)ri}rj(hfUh{}rk(h]h]h~]h}]h]uhgjeh]rlhXReturnsrmrn}ro(hfUhgjiubahyjbubjc)rp}rq(hfUh{}rr(h]h]h~]h}]h]uhgjeh]rsh)rt}ru(hfUh{}rv(h]h]h~]h}]h]uhgjph]rw(hX bsdict, or rxry}rz(hfX bsdict, or hgjtubh)r{}r|(hfX``None``h{}r}(h]h]h~]h}]h]uhgjth]r~hXNonerr}r(hfUhgj{ubahyhubhX, via Deferredrr}r(hfX, via Deferredhgjtubehyhubahyj{ubehyj|ubeubh)r}r(hfXUGet a bsdict representing the given buildset, or ``None`` if no such buildset exists.hgj=hohrhyhh{}r(h]h]h~]h}]h]uhM[hhh]r(hX1Get a bsdict representing the given buildset, or rr}r(hfX1Get a bsdict representing the given buildset, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX if no such buildset exists.rr}r(hfX if no such buildset exists.hgjubeubh)r}r(hfXPNote that buildsets are not cached, as the values in the database are not fixed.rhgj=hohrhyhh{}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(hfjhgjubaubeubeubjc)r}r(hfUhgj hohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXIgetBuildsets() (buildbot.db.buildsets.BuildsetsConnectorComponent method)hUtrauhNhhh]ubj~)r}r(hfUhgj hohrhyjh{}r(jjXpyh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXgetBuildsets(complete=None)hgjhohrhyjh{}r(h}]rhajj h~]h]h]h]rhajX(BuildsetsConnectorComponent.getBuildsetsjj juhMihhh]r(j)r}r(hfX getBuildsetshgjhohrhyjh{}r(h]h]h~]h}]h]uhMihhh]rhX getBuildsetsrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMihhh]rjB)r}r(hfX complete=Noneh{}r(h]h]h~]h}]h]uhgjh]rhX complete=Nonerr}r(hfUhgjubahyjJubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhMihhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXcompleteh{}r(h]h]h~]h}]h]uhgjh]rhXcompleterr}r(hfUhgjubahyjtubhX -- rr}r(hfUhgjubhXXif true, return only complete buildsets; if false, return only incomplete buildsets; if rr}r(hfXXif true, return only complete buildsets; if false, return only incomplete buildsets; if hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX! or omitted, return all buildsetsrr}r(hfX! or omitted, return all buildsetshgjubehyhubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXlist of bsdicts, via Deferredrr}r(hfXlist of bsdicts, via Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r (hfX2Get a list of bsdicts matching the given criteria.r hgjhohrhyhh{}r (h]h]h~]h}]h]uhMhhhh]r hX2Get a list of bsdicts matching the given criteria.r r}r(hfj hgjubaubeubeubjc)r}r(hfUhgj hoNhyjfh{}r(h}]h~]h]h]h]Uentries]uhNhhh]ubj~)r}r(hfUhgj hoNhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfX7getRecentBuildsets(count, branch=None, repository=None,rhgjhohrhyjh{}r(h}]h~]h]h]h]juhMzhhh]rj)r}r(hfjhgjhohrhyjh{}r (h]h]h~]h}]h]uhMzhhh]r!hX7getRecentBuildsets(count, branch=None, repository=None,r"r#}r$(hfUhgjubaubaubj)r%}r&(hfXcomplete=None):r'hgjhohrhyjh{}r((h}]h~]h]h]h]juhMzhhh]r)j)r*}r+(hfj'hgj%hohrhyjh{}r,(h]h]h~]h}]h]uhMzhhh]r-hXcomplete=None):r.r/}r0(hfUhgj*ubaubaubj)r1}r2(hfUhgjhohrhyjh{}r3(h]h]h~]h}]h]uhMzhhh]r4jO)r5}r6(hfUhgj1hoNhyjRh{}r7(h]h]h~]h}]h]uhNhhh]r8(jU)r9}r:(hfUh{}r;(h]h]h~]h}]h]uhgj5h]r<(jZ)r=}r>(hfUh{}r?(h]h]h~]h}]h]uhgj9h]r@hX ParametersrArB}rC(hfUhgj=ubahyjbubjc)rD}rE(hfUh{}rF(h]h]h~]h}]h]uhgj9h]rGj~)rH}rI(hfUh{}rJ(h]h]h~]h}]h]uhgjDh]rK(j)rL}rM(hfUh{}rN(h]h]h~]h}]h]uhgjHh]rOh)rP}rQ(hfUh{}rR(h]h]h~]h}]h]uhgjLh]rS(jl)rT}rU(hfXcounth{}rV(h]h]h~]h}]h]uhgjPh]rWhXcountrXrY}rZ(hfUhgjTubahyjtubhX -- r[r\}r](hfUhgjPubhX(maximum number of buildsets to retrieve.r^r_}r`(hfX(maximum number of buildsets to retrieve.hgjPubehyhubahyjubj)ra}rb(hfUh{}rc(h]h]h~]h}]h]uhgjHh]rdh)re}rf(hfUh{}rg(h]h]h~]h}]h]uhgjah]rh(jl)ri}rj(hfXbranchh{}rk(h]h]h~]h}]h]uhgjeh]rlhXbranchrmrn}ro(hfUhgjiubahyjtubhX (rprq}rr(hfUhgjeubj")rs}rt(hfUh{}ru(Ureftypej$U reftargetXstringrvU refdomainjh}]h~]U refexplicith]h]h]uhgjeh]rwjr)rx}ry(hfjvh{}rz(h]h]h~]h}]h]uhgjsh]r{hXstringr|r}}r~(hfUhgjxubahyjzubahyj&ubhX)r}r(hfUhgjeubhX -- rr}r(hfUhgjeubhXZoptional branch name. If specified, only buildsets affecting such branch will be returned.rr}r(hfXZoptional branch name. If specified, only buildsets affecting such branch will be returned.hgjeubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjHh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX repositoryh{}r(h]h]h~]h}]h]uhgjh]rhX repositoryrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXstringrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXstringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXboptional repository name. If specified, only buildsets affecting such repository will be returned.rr}r(hfXboptional repository name. If specified, only buildsets affecting such repository will be returned.hgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjHh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXcompleteh{}r(h]h]h~]h}]h]uhgjh]rhXcompleterr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXBooleanrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXBooleanrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXXif true, return only complete buildsets; if false, return only incomplete buildsets; if rr}r(hfXXif true, return only complete buildsets; if false, return only incomplete buildsets; if hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX! or omitted, return all buildsetsrr}r(hfX! or omitted, return all buildsetshgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgj5h]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXlist of bsdicts, via Deferredrr}r(hfXlist of bsdicts, via Deferredhgjubahyhubahyj{ubehyj|ubeubaubeubjc)r}r(hfUhgj hohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXRgetBuildsetProperties() (buildbot.db.buildsets.BuildsetsConnectorComponent method)h8UtrauhNhhh]ubj~)r}r(hfUhgj hohrhyjh{}r(jjXpyh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfX!getBuildsetProperties(buildsetid)hgjhohrhyjh{}r(h}]rh8ajj h~]h]h]h]rh8ajX1BuildsetsConnectorComponent.getBuildsetPropertiesjj juhMhhh]r(j)r}r(hfXgetBuildsetPropertieshgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXgetBuildsetPropertiesrr}r (hfUhgjubaubj<)r }r (hfUhgjhohrhyj?h{}r (h]h]h~]h}]h]uhMhhh]r jB)r}r(hfX buildsetidh{}r(h]h]h~]h}]h]uhgj h]rhX buildsetidrr}r(hfUhgjubahyjJubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r (jZ)r!}r"(hfUh{}r#(h]h]h~]h}]h]uhgjh]r$hX Parametersr%r&}r'(hfUhgj!ubahyjbubjc)r(}r)(hfUh{}r*(h]h]h~]h}]h]uhgjh]r+h)r,}r-(hfUh{}r.(h]h]h~]h}]h]uhgj(h]r/(jl)r0}r1(hfX buildsetidh{}r2(h]h]h~]h}]h]uhgj,h]r3hX buildsetidr4r5}r6(hfUhgj0ubahyjtubhX -- r7r8}r9(hfUhgj,ubhX buildset IDr:r;}r<(hfX buildset IDhgj,ubehyhubahyj{ubehyj|ubjU)r=}r>(hfUh{}r?(h]h]h~]h}]h]uhgjh]r@(jZ)rA}rB(hfUh{}rC(h]h]h~]h}]h]uhgj=h]rDhXReturnsrErF}rG(hfUhgjAubahyjbubjc)rH}rI(hfUh{}rJ(h]h]h~]h}]h]uhgj=h]rKh)rL}rM(hfUh{}rN(h]h]h~]h}]h]uhgjHh]rO(hX$dictionary mapping property name to rPrQ}rR(hfX$dictionary mapping property name to hgjLubh)rS}rT(hfX``value, source``h{}rU(h]h]h~]h}]h]uhgjLh]rVhX value, sourcerWrX}rY(hfUhgjSubahyhubhX, via DeferredrZr[}r\(hfX, via DeferredhgjLubehyhubahyj{ubehyj|ubeubh)r]}r^(hfXcReturn the properties for a buildset, in the same format they were given to :py:meth:`addBuildset`.hgjhohrhyhh{}r_(h]h]h~]h}]h]uhMhhh]r`(hXLReturn the properties for a buildset, in the same format they were given to rarb}rc(hfXLReturn the properties for a buildset, in the same format they were given to hgj]ubj")rd}re(hfX:py:meth:`addBuildset`rfhgj]hohrhyj&h{}rg(UreftypeXmethj(j)X addBuildsetU refdomainXpyrhh}]h~]U refexplicith]h]h]j+j,j-j j.j uhMh]rih)rj}rk(hfjfh{}rl(h]h]rm(j4jhXpy-methrneh~]h}]h]uhgjdh]rohX addBuildsetrprq}rr(hfUhgjjubahyhubaubhX.rs}rt(hfX.hgj]ubeubh)ru}rv(hfXNote that this method does not distinguish a nonexistent buildset from a buildset with no properties, and returns ``{}`` in either case.hgjhohrhyhh{}rw(h]h]h~]h}]h]uhMhhh]rx(hXrNote that this method does not distinguish a nonexistent buildset from a buildset with no properties, and returns ryrz}r{(hfXrNote that this method does not distinguish a nonexistent buildset from a buildset with no properties, and returns hgjuubh)r|}r}(hfX``{}``h{}r~(h]h]h~]h}]h]uhgjuh]rhX{}rr}r(hfUhgj|ubahyhubhX in either case.rr}r(hfX in either case.hgjuubeubeubeubeubeubeubhh)r}r(hfUhgjDhohrhyhh{}r(h]h]h~]h}]r(Xmodule-buildbot.db.changesrUchangesreh]rh.auhMhhh]r(h)r}r(hfXchangesrhgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]rhXchangesrr}r(hfjhgjubaubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXbuildbot.db.changes (module)Xmodule-buildbot.db.changesUtrauhMhhh]ubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]jn]r(jpXChanges; DB Connector ComponentUindex-8rUtrajsuhMhhh]ubhv)r}r(hfUhgjhohrhyhzh{}r(h]h]h~]h}]rjah]uhMhhh]ubjc)r}r(hfUhgjhoNhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiX8ChangesConnectorComponent (class in buildbot.db.changes)h UtrauhNhhh]ubj~)r}r(hfUhgjhoNhyjh{}r(jjXpyh}]h~]h]h]h]jXclassrjjuhNhhh]r(j)r}r(hfXChangesConnectorComponentrhgjhohrhyjh{}r(h}]rh ajXbuildbot.db.changesrh~]h]h]h]rh ajjjUjuhMhhh]r(j)r}r(hfXclass hgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXclass rr}r(hfUhgjubaubj)r}r(hfXbuildbot.db.changes.hgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXbuildbot.db.changes.rr}r(hfUhgjubaubj)r}r(hfjhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXChangesConnectorComponentrr}r(hfUhgjubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]r(h)r}r(hfXoThis class handles changes in the buildbot database, including pulling information from the changes sub-tables.rhgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]rhXoThis class handles changes in the buildbot database, including pulling information from the changes sub-tables.rr}r(hfjhgjubaubh)r}r(hfX@An instance of this class is available at ``master.db.changes``.hgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]r(hX*An instance of this class is available at rr}r(hfX*An instance of this class is available at hgjubh)r}r(hfX``master.db.changes``h{}r(h]h]h~]h}]h]uhgjh]rhXmaster.db.changesrr}r(hfUhgjubahyhubhX.r}r(hfX.hgjubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]jn]r((jiXchdictUindex-9rUtr(jiXchangeidjUtrejsuhMhhh]ubhv)r}r(hfUhgjhohrhyhzh{}r(h}]h~]h]h]h]hjuhMhhh]ubh)r}r(hfXcChanges are indexed by *changeid*, and are represented by a *chdict*, which has the following keys:hgjhohrht}hyhh{}r(h]h]h~]h}]rjah]uhMhhh}rjjsh]r(hXChanges are indexed by rr}r(hfXChanges are indexed by hgjubjr)r}r(hfX *changeid*h{}r(h]h]h~]h}]h]uhgjh]rhXchangeidrr}r(hfUhgjubahyjzubhX, and are represented by a rr}r(hfX, and are represented by a hgjubjr)r}r(hfX*chdict*h{}r(h]h]h~]h}]h]uhgjh]rhXchdictr r }r (hfUhgjubahyjzubhX, which has the following keys:r r }r(hfX, which has the following keys:hgjubeubj~)r}r(hfUhgjhohrhyjh{}r(jX*h}]h~]h]h]h]uhMhhh]r(j)r}r(hfX$``changeid`` (the ID of this change)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX ``changeid``h{}r(h]h]h~]h}]h]uhgjh]rhXchangeidr r!}r"(hfUhgjubahyhubhX (the ID of this change)r#r$}r%(hfX (the ID of this change)hgjubeubaubj)r&}r'(hfX.``author`` (unicode; the author of the change)r(hgjhohrhyjh{}r)(h]h]h~]h}]h]uhNhhh]r*h)r+}r,(hfj(hgj&hohrhyhh{}r-(h]h]h~]h}]h]uhMh]r.(h)r/}r0(hfX ``author``h{}r1(h]h]h~]h}]h]uhgj+h]r2hXauthorr3r4}r5(hfUhgj/ubahyhubhX$ (unicode; the author of the change)r6r7}r8(hfX$ (unicode; the author of the change)hgj+ubeubaubj)r9}r:(hfX:``files`` (list of unicode; source-code filenames changed)r;hgjhohrhyjh{}r<(h]h]h~]h}]h]uhNhhh]r=h)r>}r?(hfj;hgj9hohrhyhh{}r@(h]h]h~]h}]h]uhMh]rA(h)rB}rC(hfX ``files``h{}rD(h]h]h~]h}]h]uhgj>h]rEhXfilesrFrG}rH(hfUhgjBubahyhubhX1 (list of unicode; source-code filenames changed)rIrJ}rK(hfX1 (list of unicode; source-code filenames changed)hgj>ubeubaubj)rL}rM(hfX%``comments`` (unicode; user comments)rNhgjhohrhyjh{}rO(h]h]h~]h}]h]uhNhhh]rPh)rQ}rR(hfjNhgjLhohrhyhh{}rS(h]h]h~]h}]h]uhMh]rT(h)rU}rV(hfX ``comments``h{}rW(h]h]h~]h}]h]uhgjQh]rXhXcommentsrYrZ}r[(hfUhgjUubahyhubhX (unicode; user comments)r\r]}r^(hfX (unicode; user comments)hgjQubeubaubj)r_}r`(hfX``is_dir`` (deprecated)rahgjhohrhyjh{}rb(h]h]h~]h}]h]uhNhhh]rch)rd}re(hfjahgj_hohrhyhh{}rf(h]h]h~]h}]h]uhMh]rg(h)rh}ri(hfX ``is_dir``h{}rj(h]h]h~]h}]h]uhgjdh]rkhXis_dirrlrm}rn(hfUhgjhubahyhubhX (deprecated)rorp}rq(hfX (deprecated)hgjdubeubaubj)rr}rs(hfXN``links`` (list of unicode; links for this change, e.g., to web views, review)hgjhohrhyjh{}rt(h]h]h~]h}]h]uhNhhh]ruh)rv}rw(hfXN``links`` (list of unicode; links for this change, e.g., to web views, review)hgjrhohrhyhh{}rx(h]h]h~]h}]h]uhMh]ry(h)rz}r{(hfX ``links``h{}r|(h]h]h~]h}]h]uhgjvh]r}hXlinksr~r}r(hfUhgjzubahyhubhXE (list of unicode; links for this change, e.g., to web views, review)rr}r(hfXE (list of unicode; links for this change, e.g., to web views, review)hgjvubeubaubj)r}r(hfXO``revision`` (unicode string; revision for this change, or ``None`` if unknown)hgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfXO``revision`` (unicode string; revision for this change, or ``None`` if unknown)hgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX ``revision``h{}r(h]h]h~]h}]h]uhgjh]rhXrevisionrr}r(hfUhgjubahyhubhX/ (unicode string; revision for this change, or rr}r(hfX/ (unicode string; revision for this change, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX if unknown)rr}r(hfX if unknown)hgjubeubaubj)r}r(hfX:``when_timestamp`` (datetime instance; time of the change)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX``when_timestamp``h{}r(h]h]h~]h}]h]uhgjh]rhXwhen_timestamprr}r(hfUhgjubahyhubhX( (datetime instance; time of the change)rr}r(hfX( (datetime instance; time of the change)hgjubeubaubj)r}r(hfX``branch`` (unicode string; branch on which the change took place, or ``None`` for the "default branch", whatever that might mean)hgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfX``branch`` (unicode string; branch on which the change took place, or ``None`` for the "default branch", whatever that might mean)hgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX ``branch``h{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyhubhX< (unicode string; branch on which the change took place, or rr}r(hfX< (unicode string; branch on which the change took place, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX4 for the "default branch", whatever that might mean)rr}r(hfX4 for the "default branch", whatever that might mean)hgjubeubaubj)r}r(hfXP``category`` (unicode string; user-defined category of this change, or ``None``)hgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfXP``category`` (unicode string; user-defined category of this change, or ``None``)hgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX ``category``h{}r(h]h]h~]h}]h]uhgjh]rhXcategoryrr}r(hfUhgjubahyhubhX; (unicode string; user-defined category of this change, or rr}r(hfX; (unicode string; user-defined category of this change, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX)r}r(hfX)hgjubeubaubj)r}r(hfX?``revlink`` (unicode string; link to a web view of this change)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX ``revlink``h{}r(h]h]h~]h}]h]uhgjh]rhXrevlinkrr}r(hfUhgjubahyhubhX4 (unicode string; link to a web view of this change)rr}r(hfX4 (unicode string; link to a web view of this change)hgjubeubaubj)r}r(hfXw``properties`` (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))hgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfXw``properties`` (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))hgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX``properties``h{}r(h]h]h~]h}]h]uhgjh]rhX propertiesr r }r (hfUhgjubahyhubhXi (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))r r }r(hfXi (user-specified properties for this change, represented as a dictionary mapping keys to (value, source))hgjubeubaubj)r}r(hfXF``repository`` (unicode string; repository where this change occurred)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMh]r(h)r}r(hfX``repository``h{}r(h]h]h~]h}]h]uhgjh]rhX repositoryrr}r(hfUhgjubahyhubhX8 (unicode string; repository where this change occurred)rr }r!(hfX8 (unicode string; repository where this change occurred)hgjubeubaubj)r"}r#(hfXT``project`` (unicode string; user-defined project to which this change corresponds) hgjhohrhyjh{}r$(h]h]h~]h}]h]uhNhhh]r%h)r&}r'(hfXS``project`` (unicode string; user-defined project to which this change corresponds)hgj"hohrhyhh{}r((h]h]h~]h}]h]uhMh]r)(h)r*}r+(hfX ``project``h{}r,(h]h]h~]h}]h]uhgj&h]r-hXprojectr.r/}r0(hfUhgj*ubahyhubhXH (unicode string; user-defined project to which this change corresponds)r1r2}r3(hfXH (unicode string; user-defined project to which this change corresponds)hgj&ubeubaubeubjc)r4}r5(hfUhgjhohrhyjfh{}r6(h}]h~]h]h]h]Uentries]r7(jiXBaddChange() (buildbot.db.changes.ChangesConnectorComponent method)h^Utr8auhNhhh]ubj~)r9}r:(hfUhgjhohrhyjh{}r;(jjXpyr<h}]h~]h]h]h]jXmethodr=jj=uhNhhh]r>(j)r?}r@(hfXaddChange(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)hgj9hohrhyjh{}rA(h}]rBh^ajjh~]h]h]h]rCh^ajX#ChangesConnectorComponent.addChangejjjuhMhhh]rD(j)rE}rF(hfX addChangehgj?hohrhyjh{}rG(h]h]h~]h}]h]uhMhhh]rHhX addChangerIrJ}rK(hfUhgjEubaubj<)rL}rM(hfUhgj?hohrhyj?h{}rN(h]h]h~]h}]h]uhMhhh]rO(jB)rP}rQ(hfX author=Noneh{}rR(h]h]h~]h}]h]uhgjLh]rShX author=NonerTrU}rV(hfUhgjPubahyjJubjB)rW}rX(hfX files=Noneh{}rY(h]h]h~]h}]h]uhgjLh]rZhX files=Noner[r\}r](hfUhgjWubahyjJubjB)r^}r_(hfX comments=Noneh{}r`(h]h]h~]h}]h]uhgjLh]rahX comments=Nonerbrc}rd(hfUhgj^ubahyjJubjB)re}rf(hfXis_dir=0h{}rg(h]h]h~]h}]h]uhgjLh]rhhXis_dir=0rirj}rk(hfUhgjeubahyjJubjB)rl}rm(hfX links=Noneh{}rn(h]h]h~]h}]h]uhgjLh]rohX links=Nonerprq}rr(hfUhgjlubahyjJubjB)rs}rt(hfX revision=Noneh{}ru(h]h]h~]h}]h]uhgjLh]rvhX revision=Nonerwrx}ry(hfUhgjsubahyjJubjB)rz}r{(hfXwhen_timestamp=Noneh{}r|(h]h]h~]h}]h]uhgjLh]r}hXwhen_timestamp=Noner~r}r(hfUhgjzubahyjJubjB)r}r(hfX branch=Noneh{}r(h]h]h~]h}]h]uhgjLh]rhX branch=Nonerr}r(hfUhgjubahyjJubjB)r}r(hfX category=Noneh{}r(h]h]h~]h}]h]uhgjLh]rhX category=Nonerr}r(hfUhgjubahyjJubjB)r}r(hfX revlink=''h{}r(h]h]h~]h}]h]uhgjLh]rhX revlink=''rr}r(hfUhgjubahyjJubjB)r}r(hfX properties={}h{}r(h]h]h~]h}]h]uhgjLh]rhX properties={}rr}r(hfUhgjubahyjJubjB)r}r(hfX repository=''h{}r(h]h]h~]h}]h]uhgjLh]rhX repository=''rr}r(hfUhgjubahyjJubjB)r}r(hfX project=''h{}r(h]h]h~]h}]h]uhgjLh]rhX project=''rr}r(hfUhgjubahyjJubjB)r}r(hfXuid=Noneh{}r(h]h]h~]h}]h]uhgjLh]rhXuid=Nonerr}r(hfUhgjubahyjJubeubeubj)r}r(hfUhgj9hohrhyjh{}r(h]h]h~]h}]h]uhMhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rj~)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(j)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXauthorh{}r(h]h]h~]h}]h]uhgjh]rhXauthorrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainj<h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXthe author of this changerr}r(hfXthe author of this changehgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXfilesh{}r(h]h]h~]h}]h]uhgjh]rhXfilesrr}r(hfUhgjubahyjtubhX -- rr}r(hfUhgjubhX%a list of filenames that were changedrr}r(hfX%a list of filenames that were changedhgjubehyhubahyjubj)r}r (hfUh{}r (h]h]h~]h}]h]uhgjh]r h)r }r (hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXcommentsh{}r(h]h]h~]h}]h]uhgj h]rhXcommentsrr}r(hfUhgjubahyjtubhX -- rr}r(hfUhgj ubhXuser comments on the changerr}r(hfXuser comments on the changehgj ubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r h)r!}r"(hfUh{}r#(h]h]h~]h}]h]uhgjh]r$(jl)r%}r&(hfXis_dirh{}r'(h]h]h~]h}]h]uhgj!h]r(hXis_dirr)r*}r+(hfUhgj%ubahyjtubhX -- r,r-}r.(hfUhgj!ubhX deprecatedr/r0}r1(hfX deprecatedhgj!ubehyhubahyjubj)r2}r3(hfUh{}r4(h]h]h~]h}]h]uhgjh]r5h)r6}r7(hfUh{}r8(h]h]h~]h}]h]uhgj2h]r9(jl)r:}r;(hfXlinksh{}r<(h]h]h~]h}]h]uhgj6h]r=hXlinksr>r?}r@(hfUhgj:ubahyjtubhX (rArB}rC(hfUhgj6ubj")rD}rE(hfUh{}rF(Ureftypej$U reftargetXlist of unicode stringsrGU refdomainj<h}]h~]U refexplicith]h]h]uhgj6h]rHjr)rI}rJ(hfjGh{}rK(h]h]h~]h}]h]uhgjDh]rLhXlist of unicode stringsrMrN}rO(hfUhgjIubahyjzubahyj&ubhX)rP}rQ(hfUhgj6ubhX -- rRrS}rT(hfUhgj6ubhXLa list of links related to this change, e.g., to web viewers or review pagesrUrV}rW(hfXLa list of links related to this change, e.g., to web viewers or review pageshgj6ubehyhubahyjubj)rX}rY(hfUh{}rZ(h]h]h~]h}]h]uhgjh]r[h)r\}r](hfUh{}r^(h]h]h~]h}]h]uhgjXh]r_(jl)r`}ra(hfXrevisionh{}rb(h]h]h~]h}]h]uhgj\h]rchXrevisionrdre}rf(hfUhgj`ubahyjtubhX (rgrh}ri(hfUhgj\ubj")rj}rk(hfUh{}rl(Ureftypej$U reftargetXunicode stringrmU refdomainj<h}]h~]U refexplicith]h]h]uhgj\h]rnjr)ro}rp(hfjmh{}rq(h]h]h~]h}]h]uhgjjh]rrhXunicode stringrsrt}ru(hfUhgjoubahyjzubahyj&ubhX)rv}rw(hfUhgj\ubhX -- rxry}rz(hfUhgj\ubhX'the revision identifier for this changer{r|}r}(hfX'the revision identifier for this changehgj\ubehyhubahyjubj)r~}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgj~h]r(jl)r}r(hfXwhen_timestamph{}r(h]h]h~]h}]h]uhgjh]rhXwhen_timestamprr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXdatetime instance or NonerU refdomainj<h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXdatetime instance or Nonerr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX6when this change occurred, or the current time if Nonerr}r(hfX6when this change occurred, or the current time if Nonehgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXbranchh{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainj<h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX*the branch on which this change took placerr}r(hfX*the branch on which this change took placehgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXcategoryh{}r(h]h]h~]h}]h]uhgjh]rhXcategoryrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainj<h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX:category for this change (arbitrary use by Buildbot users)rr}r(hfX:category for this change (arbitrary use by Buildbot users)hgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXrevlinkh{}r(h]h]h~]h}]h]uhgjh]rhXrevlinkrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainj<h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r (h]h]h~]h}]h]uhgjh]r hXunicode stringr r }r (hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX#link to a web view of this revisionrr}r(hfX#link to a web view of this revisionhgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX propertiesh{}r (h]h]h~]h}]h]uhgjh]r!hX propertiesr"r#}r$(hfUhgjubahyjtubhX (r%r&}r'(hfUhgjubj")r(}r)(hfUh{}r*(Ureftypej$U reftargetX dictionaryr+U refdomainj<h}]h~]U refexplicith]h]h]uhgjh]r,jr)r-}r.(hfj+h{}r/(h]h]h~]h}]h]uhgj(h]r0hX dictionaryr1r2}r3(hfUhgj-ubahyjzubahyj&ubhX)r4}r5(hfUhgjubhX -- r6r7}r8(hfUhgjubhXqproperties to set on this change, where values are tuples of (value, source). At the moment, the source must be r9r:}r;(hfXqproperties to set on this change, where values are tuples of (value, source). At the moment, the source must be hgjubh)r<}r=(hfX ``'Change'``h{}r>(h]h]h~]h}]h]uhgjh]r?hX'Change'r@rA}rB(hfUhgj<ubahyhubhX1, although this may be relaxed in later versions.rCrD}rE(hfX1, although this may be relaxed in later versions.hgjubehyhubahyjubj)rF}rG(hfUh{}rH(h]h]h~]h}]h]uhgjh]rIh)rJ}rK(hfUh{}rL(h]h]h~]h}]h]uhgjFh]rM(jl)rN}rO(hfX repositoryh{}rP(h]h]h~]h}]h]uhgjJh]rQhX repositoryrRrS}rT(hfUhgjNubahyjtubhX (rUrV}rW(hfUhgjJubj")rX}rY(hfUh{}rZ(Ureftypej$U reftargetXunicode stringr[U refdomainj<h}]h~]U refexplicith]h]h]uhgjJh]r\jr)r]}r^(hfj[h{}r_(h]h]h~]h}]h]uhgjXh]r`hXunicode stringrarb}rc(hfUhgj]ubahyjzubahyj&ubhX)rd}re(hfUhgjJubhX -- rfrg}rh(hfUhgjJubhX.the repository in which this change took placerirj}rk(hfX.the repository in which this change took placehgjJubehyhubahyjubj)rl}rm(hfUh{}rn(h]h]h~]h}]h]uhgjh]roh)rp}rq(hfUh{}rr(h]h]h~]h}]h]uhgjlh]rs(jl)rt}ru(hfXprojecth{}rv(h]h]h~]h}]h]uhgjph]rwhXprojectrxry}rz(hfUhgjtubahyjtubhX (r{r|}r}(hfUhgjpubj")r~}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainj<h}]h~]U refexplicith]h]h]uhgjph]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgj~h]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjpubhX -- rr}r(hfUhgjpubhX$the project this change is a part ofrr}r(hfX$the project this change is a part ofhgjpubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXuidh{}r(h]h]h~]h}]h]uhgjh]rhXuidrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXintegerrU refdomainj<h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXintegerrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX#uid generated for the change authorrr}r(hfX#uid generated for the change authorhgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXnew change's ID via Deferredrr}r(hfXnew change's ID via Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXAdd a Change with the given attributes to the database, returning the changeid via a Deferred. All arguments should be given as keyword arguments.rhgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]rhXAdd a Change with the given attributes to the database, returning the changeid via a Deferred. All arguments should be given as keyword arguments.rr}r(hfjhgjubaubh)r}r(hfXVThe ``project`` and ``repository`` arguments must be strings; ``None`` is not allowed.hgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]r(hXThe rr}r(hfXThe hgjubh)r}r(hfX ``project``h{}r(h]h]h~]h}]h]uhgjh]rhXprojectrr}r(hfUhgjubahyhubhX and rr}r(hfX and hgjubh)r}r(hfX``repository``h{}r(h]h]h~]h}]h]uhgjh]rhX repositoryrr}r(hfUhgjubahyhubhX arguments must be strings; rr}r(hfX arguments must be strings; hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX is not allowed.rr}r(hfX is not allowed.hgjubeubeubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXBgetChange() (buildbot.db.changes.ChangesConnectorComponent method)hVUtrauhNhhh]ubj~)r}r(hfUhgjhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfX#getChange(changeid, no_cache=False)hgjhohrhyjh{}r(h}]r hVajjh~]h]h]h]r hVajX#ChangesConnectorComponent.getChangejjjuhMhhh]r (j)r }r (hfX getChangehgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhX getChangerr}r(hfUhgj ubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMhhh]r(jB)r}r(hfXchangeidh{}r(h]h]h~]h}]h]uhgjh]rhXchangeidrr}r(hfUhgjubahyjJubjB)r}r(hfXno_cache=Falseh{}r (h]h]h~]h}]h]uhgjh]r!hXno_cache=Falser"r#}r$(hfUhgjubahyjJubeubeubj)r%}r&(hfUhgjhohrhyjh{}r'(h]h]h~]h}]h]uhMhhh]r((jO)r)}r*(hfUhgj%hohrhyjRh{}r+(h]h]h~]h}]h]uhNhhh]r,(jU)r-}r.(hfUh{}r/(h]h]h~]h}]h]uhgj)h]r0(jZ)r1}r2(hfUh{}r3(h]h]h~]h}]h]uhgj-h]r4hX Parametersr5r6}r7(hfUhgj1ubahyjbubjc)r8}r9(hfUh{}r:(h]h]h~]h}]h]uhgj-h]r;j~)r<}r=(hfUh{}r>(h]h]h~]h}]h]uhgj8h]r?(j)r@}rA(hfUh{}rB(h]h]h~]h}]h]uhgj<h]rCh)rD}rE(hfUh{}rF(h]h]h~]h}]h]uhgj@h]rG(jl)rH}rI(hfXchangeidh{}rJ(h]h]h~]h}]h]uhgjDh]rKhXchangeidrLrM}rN(hfUhgjHubahyjtubhX -- rOrP}rQ(hfUhgjDubhX&the id of the change instance to fetchrRrS}rT(hfX&the id of the change instance to fetchhgjDubehyhubahyjubj)rU}rV(hfUh{}rW(h]h]h~]h}]h]uhgj<h]rXh)rY}rZ(hfUh{}r[(h]h]h~]h}]h]uhgjUh]r\(jl)r]}r^(hfXno_cacheh{}r_(h]h]h~]h}]h]uhgjYh]r`hXno_cacherarb}rc(hfUhgj]ubahyjtubhX (rdre}rf(hfUhgjYubj")rg}rh(hfUh{}ri(Ureftypej$U reftargetXbooleanrjU refdomainjh}]h~]U refexplicith]h]h]uhgjYh]rkjr)rl}rm(hfjjh{}rn(h]h]h~]h}]h]uhgjgh]rohXbooleanrprq}rr(hfUhgjlubahyjzubahyj&ubhX)rs}rt(hfUhgjYubhX -- rurv}rw(hfUhgjYubhX+bypass cache and always fetch from databaserxry}rz(hfX+bypass cache and always fetch from databasehgjYubehyhubahyjubehyjubahyj{ubehyj|ubjU)r{}r|(hfUh{}r}(h]h]h~]h}]h]uhgj)h]r~(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgj{h]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgj{h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXchdict via Deferredrr}r(hfXchdict via Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXUGet a change dictionary for the given changeid, or ``None`` if no such change exists.hgj%hohrhyhh{}r(h]h]h~]h}]h]uhMhhh]r(hX3Get a change dictionary for the given changeid, or rr}r(hfX3Get a change dictionary for the given changeid, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX if no such change exists.rr}r(hfX if no such change exists.hgjubeubeubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXFgetChangeUids() (buildbot.db.changes.ChangesConnectorComponent method)hUtrauhNhhh]ubj~)r}r(hfUhgjhohrhyjh{}r(jjXpyh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXgetChangeUids(changeid)hgjhohrhyjh{}r(h}]rhajjh~]h]h]h]rhajX'ChangesConnectorComponent.getChangeUidsjjjuhMhhh]r(j)r}r(hfX getChangeUidshgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhX getChangeUidsrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMhhh]rjB)r}r(hfXchangeidh{}r(h]h]h~]h}]h]uhgjh]rhXchangeidrr}r(hfUhgjubahyjJubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXchangeidh{}r(h]h]h~]h}]h]uhgjh]rhXchangeidrr}r(hfUhgjubahyjtubhX -- rr}r(hfUhgjubhX&the id of the change instance to fetchrr}r(hfX&the id of the change instance to fetchhgjubehyhubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXlist of uids via Deferredrr}r(hfXlist of uids via Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfX3Get the userids associated with the given changeid.rhgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]rhX3Get the userids associated with the given changeid.rr}r (hfjhgjubaubeubeubjc)r }r (hfUhgjhoNhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiXIgetRecentChanges() (buildbot.db.changes.ChangesConnectorComponent method)hUtrauhNhhh]ubj~)r}r(hfUhgjhoNhyjh{}r(jjXpyh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXgetRecentChanges(count)hgjhohrhyjh{}r(h}]rhajjh~]h]h]h]rhajX*ChangesConnectorComponent.getRecentChangesjjjuhMhhh]r(j)r}r(hfXgetRecentChangeshgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXgetRecentChangesrr}r (hfUhgjubaubj<)r!}r"(hfUhgjhohrhyj?h{}r#(h]h]h~]h}]h]uhMhhh]r$jB)r%}r&(hfXcounth{}r'(h]h]h~]h}]h]uhgj!h]r(hXcountr)r*}r+(hfUhgj%ubahyjJubaubeubj)r,}r-(hfUhgjhohrhyjh{}r.(h]h]h~]h}]h]uhMhhh]r/(jO)r0}r1(hfUhgj,hoNhyjRh{}r2(h]h]h~]h}]h]uhNhhh]r3(jU)r4}r5(hfUh{}r6(h]h]h~]h}]h]uhgj0h]r7(jZ)r8}r9(hfUh{}r:(h]h]h~]h}]h]uhgj4h]r;hX Parametersr<r=}r>(hfUhgj8ubahyjbubjc)r?}r@(hfUh{}rA(h]h]h~]h}]h]uhgj4h]rBh)rC}rD(hfUh{}rE(h]h]h~]h}]h]uhgj?h]rF(jl)rG}rH(hfXcounth{}rI(h]h]h~]h}]h]uhgjCh]rJhXcountrKrL}rM(hfUhgjGubahyjtubhX -- rNrO}rP(hfUhgjCubhX%maximum number of instances to returnrQrR}rS(hfX%maximum number of instances to returnhgjCubehyhubahyj{ubehyj|ubjU)rT}rU(hfUh{}rV(h]h]h~]h}]h]uhgj0h]rW(jZ)rX}rY(hfUh{}rZ(h]h]h~]h}]h]uhgjTh]r[hXReturnsr\r]}r^(hfUhgjXubahyjbubjc)r_}r`(hfUh{}ra(h]h]h~]h}]h]uhgjTh]rbh)rc}rd(hfUh{}re(h]h]h~]h}]h]uhgj_h]rfhX6list of dictionaries via Deferred, ordered by changeidrgrh}ri(hfX6list of dictionaries via Deferred, ordered by changeidhgjcubahyhubahyj{ubehyj|ubeubh)rj}rk(hfXvGet a list of the ``count`` most recent changes, represented as dictionaries; returns fewer if that many do not exist.hgj,hohrhyhh{}rl(h]h]h~]h}]h]uhMhhh]rm(hXGet a list of the rnro}rp(hfXGet a list of the hgjjubh)rq}rr(hfX ``count``h{}rs(h]h]h~]h}]h]uhgjjh]rthXcountrurv}rw(hfUhgjqubahyhubhX[ most recent changes, represented as dictionaries; returns fewer if that many do not exist.rxry}rz(hfX[ most recent changes, represented as dictionaries; returns fewer if that many do not exist.hgjjubeubh)r{}r|(hfXFor 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.hgj,hohrhyhh{}r}(h]h]h~]h}]h]uhNhhh]r~h)r}r(hfXFor 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.hgj{hohrhyhh{}r(h]h]h~]h}]h]uhMh]r(hXPFor this function, "recent" is determined by the order of the changeids, not by rr}r(hfXPFor this function, "recent" is determined by the order of the changeids, not by hgjubh)r}r(hfX``when_timestamp``h{}r(h]h]h~]h}]h]uhgjh]rhXwhen_timestamprr}r(hfUhgjubahyhubhX. 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(hfX. 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.hgjubeubaubeubeubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXJgetLatestChangeid() (buildbot.db.changes.ChangesConnectorComponent method)h'UtrauhNhhh]ubj~)r}r(hfUhgjhohrhyjh{}r(jjXpyh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXgetLatestChangeid()hgjhohrhyjh{}r(h}]rh'ajjh~]h]h]h]rh'ajX+ChangesConnectorComponent.getLatestChangeidjjjuhMhhh]r(j)r}r(hfXgetLatestChangeidhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXgetLatestChangeidrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMhhh]ubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]rjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXchangeid via Deferredrr}r(hfXchangeid via Deferredhgjubahyhubahyj{ubehyj|ubaubh)r}r(hfXTGet the most-recently-assigned changeid, or ``None`` if there are no changes at all.hgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]r(hX,Get the most-recently-assigned changeid, or rr}r(hfX,Get the most-recently-assigned changeid, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX if there are no changes at all.rr}r(hfX if there are no changes at all.hgjubeubeubeubeubeubeubhh)r}r(hfUhgjDhohrhyhh{}r(h]h]h~]h}]r(Xmodule-buildbot.db.schedulersrU schedulersreh]rhSauhMhhh]r(h)r}r(hfX schedulersrhgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]rhX schedulersrr}r(hfjhgjubaubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXbuildbot.db.schedulers (module)Xmodule-buildbot.db.schedulersUtrauhMhhh]ubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]jn]r(jpX"Schedulers; DB Connector ComponentUindex-10rUtrajsuhMhhh]ubhv)r}r(hfUhgjhohrhyhzh{}r(h]h]h~]h}]rjah]uhMhhh]ubjc)r}r(hfUhgjhoNhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiX>SchedulersConnectorComponent (class in buildbot.db.schedulers)hCUtrauhNhhh]ubj~)r}r(hfUhgjhoNhyjh{}r(jjXpyh}]h~]h]h]h]jXclassrjjuhNhhh]r(j)r}r(hfXSchedulersConnectorComponentrhgjhohrhyjh{}r(h}]rhCajXbuildbot.db.schedulersrh~]h]h]h]rhCajjjUjuhM<hhh]r (j)r }r (hfXclass hgjhohrhyjh{}r (h]h]h~]h}]h]uhM<hhh]r hXclass rr}r(hfUhgj ubaubj)r}r(hfXbuildbot.db.schedulers.hgjhohrhyjh{}r(h]h]h~]h}]h]uhM<hhh]rhXbuildbot.db.schedulers.rr}r(hfUhgjubaubj)r}r(hfjhgjhohrhyjh{}r(h]h]h~]h}]h]uhM<hhh]rhXSchedulersConnectorComponentrr}r(hfUhgjubaubeubj)r}r (hfUhgjhohrhyjh{}r!(h]h]h~]h}]h]uhM<hhh]r"(h)r#}r$(hfXyThis class manages the state of the Buildbot schedulers. This state includes classifications of as-yet un-built changes.r%hgjhohrhyhh{}r&(h]h]h~]h}]h]uhM hhh]r'hXyThis class manages the state of the Buildbot schedulers. This state includes classifications of as-yet un-built changes.r(r)}r*(hfj%hgj#ubaubh)r+}r,(hfX@An instance of this class is available at ``master.db.changes``.hgjhohrhyhh{}r-(h]h]h~]h}]h]uhM hhh]r.(hX*An instance of this class is available at r/r0}r1(hfX*An instance of this class is available at hgj+ubh)r2}r3(hfX``master.db.changes``h{}r4(h]h]h~]h}]h]uhgj+h]r5hXmaster.db.changesr6r7}r8(hfUhgj2ubahyhubhX.r9}r:(hfX.hgj+ubeubjc)r;}r<(hfUhgjhohrhyjfh{}r=(h}]h~]h]h]h]jn]r>(jiXobjectidUindex-11r?Utr@ajsuhMhhh]ubhv)rA}rB(hfUhgjhohrhyhzh{}rC(h}]h~]h]h]h]hj?uhMhhh]ubh)rD}rE(hfXXSchedulers are identified by a their objectid - see :py:class:`StateConnectorComponent`.hgjhohrht}hyhh{}rF(h]h]h~]h}]rGj?ah]uhMhhh}rHj?jAsh]rI(hX4Schedulers are identified by a their objectid - see rJrK}rL(hfX4Schedulers are identified by a their objectid - see hgjDubj")rM}rN(hfX#:py:class:`StateConnectorComponent`rOhgjDhohrhyj&h{}rP(UreftypeXclassj(j)XStateConnectorComponentU refdomainXpyrQh}]h~]U refexplicith]h]h]j+j,j-jj.juhMh]rRh)rS}rT(hfjOh{}rU(h]h]rV(j4jQXpy-classrWeh~]h}]h]uhgjMh]rXhXStateConnectorComponentrYrZ}r[(hfUhgjSubahyhubaubhX.r\}r](hfX.hgjDubeubjc)r^}r_(hfUhgjhohrhyjfh{}r`(h}]h~]h]h]h]Uentries]ra(jiXNclassifyChanges() (buildbot.db.schedulers.SchedulersConnectorComponent method)hUtrbauhNhhh]ubj~)rc}rd(hfUhgjhohrhyjh{}re(jjXpyrfh}]h~]h]h]h]jXmethodrgjjguhNhhh]rh(j)ri}rj(hfX*classifyChanges(objectid, classifications)hgjchohrhyjh{}rk(h}]rlhajjh~]h]h]h]rmhajX,SchedulersConnectorComponent.classifyChangesjjjuhM"hhh]rn(j)ro}rp(hfXclassifyChangeshgjihohrhyjh{}rq(h]h]h~]h}]h]uhM"hhh]rrhXclassifyChangesrsrt}ru(hfUhgjoubaubj<)rv}rw(hfUhgjihohrhyj?h{}rx(h]h]h~]h}]h]uhM"hhh]ry(jB)rz}r{(hfXobjectidh{}r|(h]h]h~]h}]h]uhgjvh]r}hXobjectidr~r}r(hfUhgjzubahyjJubjB)r}r(hfXclassificationsh{}r(h]h]h~]h}]h]uhgjvh]rhXclassificationsrr}r(hfUhgjubahyjJubeubeubj)r}r(hfUhgjchohrhyjh{}r(h]h]h~]h}]h]uhM"hhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rj~)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(j)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXobjectidh{}r(h]h]h~]h}]h]uhgjh]rhXobjectidrr}r(hfUhgjubahyjtubhX -- rr}r(hfUhgjubhX!scheduler classifying the changesrr}r(hfX!scheduler classifying the changesrhgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXclassificationsh{}r(h]h]h~]h}]h]uhgjh]rhXclassificationsrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetX dictionaryrU refdomainjfh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhX dictionaryrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXtmapping of changeid to boolean, where the boolean is true if the change is important, and false if it is unimportantrr}r(hfXtmapping of changeid to boolean, where the boolean is true if the change is important, and false if it is unimportantrhgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXDeferredrr}r(hfXDeferredrhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXoRecord 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`.hgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]r(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 rr}r(hfXIRecord 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 hgjubj")r}r(hfX%:py:meth:`flushChangeClassifications`rhgjhohrhyj&h{}r(UreftypeXmethj(j)XflushChangeClassificationsU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-jj.juhMh]rh)r}r(hfjh{}r(h]h]r(j4jXpy-methreh~]h}]h]uhgjh]r hXflushChangeClassificationsr r }r (hfUhgjubahyhubaubhX.r }r(hfX.hgjubeubeubeubcdocutils.nodes comment r)r}r(hfX_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.hgjhohrhyUcommentrh{}r(U xml:spacerUpreserverh}]h~]h]h]h]uhM+hhh]rhX_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.rr}r(hfUhgjubaubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXWgetChangeClassifications() (buildbot.db.schedulers.SchedulersConnectorComponent method)hDUtrauhNhhh]ubj~)r}r (hfUhgjhohrhyjh{}r!(jjXpyr"h}]h~]h]h]h]jXmethodr#jj#uhNhhh]r$(j)r%}r&(hfX,getChangeClassifications(objectid[, branch])hgjhohrhyjh{}r'(h}]r(hDajjh~]h]h]h]r)hDajX5SchedulersConnectorComponent.getChangeClassificationsjjjuhM;hhh]r*(j)r+}r,(hfXgetChangeClassificationshgj%hohrhyjh{}r-(h]h]h~]h}]h]uhM;hhh]r.hXgetChangeClassificationsr/r0}r1(hfUhgj+ubaubj<)r2}r3(hfUhgj%hohrhyj?h{}r4(h]h]h~]h}]h]uhM;hhh]r5(jB)r6}r7(hfXobjectidh{}r8(h]h]h~]h}]h]uhgj2h]r9hXobjectidr:r;}r<(hfUhgj6ubahyjJubjZ)r=}r>(hfUh{}r?(h]h]h~]h}]h]uhgj2h]r@jB)rA}rB(hfXbranchh{}rC(h]h]h~]h}]h]uhgj=h]rDhXbranchrErF}rG(hfUhgjAubahyjJubahyjfubeubeubj)rH}rI(hfUhgjhohrhyjh{}rJ(h]h]h~]h}]h]uhM;hhh]rK(jO)rL}rM(hfUhgjHhohrhyjRh{}rN(h]h]h~]h}]h]uhNhhh]rO(jU)rP}rQ(hfUh{}rR(h]h]h~]h}]h]uhgjLh]rS(jZ)rT}rU(hfUh{}rV(h]h]h~]h}]h]uhgjPh]rWhX ParametersrXrY}rZ(hfUhgjTubahyjbubjc)r[}r\(hfUh{}r](h]h]h~]h}]h]uhgjPh]r^j~)r_}r`(hfUh{}ra(h]h]h~]h}]h]uhgj[h]rb(j)rc}rd(hfUh{}re(h]h]h~]h}]h]uhgj_h]rfh)rg}rh(hfUh{}ri(h]h]h~]h}]h]uhgjch]rj(jl)rk}rl(hfXobjectidh{}rm(h]h]h~]h}]h]uhgjgh]rnhXobjectidrorp}rq(hfUhgjkubahyjtubhX (rrrs}rt(hfUhgjgubj")ru}rv(hfUh{}rw(Ureftypej$U reftargetXintegerrxU refdomainj"h}]h~]U refexplicith]h]h]uhgjgh]ryjr)rz}r{(hfjxh{}r|(h]h]h~]h}]h]uhgjuh]r}hXintegerr~r}r(hfUhgjzubahyjzubahyj&ubhX)r}r(hfUhgjgubhX -- rr}r(hfUhgjgubhX scheduler to look up changes forrr}r(hfX scheduler to look up changes forhgjgubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgj_h]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXbranchh{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetX#string or None (for default branch)rU refdomainj"h}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhX#string or None (for default branch)rr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX,(optional) limit to changes with this branchrr}r(hfX,(optional) limit to changes with this branchhgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjLh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXdictionary via Deferredrr}r(hfXdictionary via Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXReturn the classifications made by this scheduler, in the form of a dictionary mapping changeid to a boolean, just as supplied to :py:meth:`classifyChanges`.hgjHhohrhyhh{}r(h]h]h~]h}]h]uhM4hhh]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(hfXReturn the classifications made by this scheduler, in the form of a dictionary mapping changeid to a boolean, just as supplied to hgjubj")r}r(hfX:py:meth:`classifyChanges`rhgjhohrhyj&h{}r(UreftypeXmethj(j)XclassifyChangesU refdomainXpyrh}]h~]U refexplicith]h]h]j+j,j-jj.juhM4h]rh)r}r(hfjh{}r(h]h]r(j4jXpy-methreh~]h}]h]uhgjh]rhXclassifyChangesrr}r(hfUhgjubahyhubaubhX.r}r(hfX.hgjubeubh)r}r(hfXIf ``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.hgjHhohrhyhh{}r(h]h]h~]h}]h]uhM8hhh]r(hXIf rr}r(hfXIf hgjubh)r}r(hfX ``branch``h{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyhubhXU is specified, then only changes on that branch will be given. Note that specifying rr}r(hfXU is specified, then only changes on that branch will be given. Note that specifying hgjubh)r}r(hfX``branch=None``h{}r(h]h]h~]h}]h]uhgjh]rhX branch=Nonerr}r(hfUhgjubahyhubhXN requests changes for the default branch, and is not the same as omitting the rr}r(hfXN requests changes for the default branch, and is not the same as omitting the hgjubh)r}r(hfX ``branch``h{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyhubhX argument altogether.rr}r(hfX argument altogether.hgjubeubeubeubeubeubeubhh)r}r(hfUhgjDhohrhyhh{}r(h]h]h~]h}]r(Xmodule-buildbot.db.sourcestampsrU sourcestampsreh]rh?auhM>hhh]r (h)r }r (hfX sourcestampsr hgjhohrhyhh{}r (h]h]h~]h}]h]uhM>hhh]rhX sourcestampsrr}r(hfj hgj ubaubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiX!buildbot.db.sourcestamps (module)Xmodule-buildbot.db.sourcestampsUtrauhMAhhh]ubjc)r}r(hfUhgjhohrhyjfh{}r(h}]h~]h]h]h]jn]r(jpX$SourceStamps; DB Connector ComponentUindex-12rUtrajsuhMBhhh]ubhv)r}r(hfUhgjhohrhyhzh{}r(h]h]h~]h}]r jah]uhMChhh]ubjc)r!}r"(hfUhgjhoNhyjfh{}r#(h}]h~]h]h]h]Uentries]r$(jiXBSourceStampsConnectorComponent (class in buildbot.db.sourcestamps)h*Utr%auhNhhh]ubj~)r&}r'(hfUhgjhoNhyjh{}r((jjXpyh}]h~]h]h]h]jXclassr)jj)uhNhhh]r*(j)r+}r,(hfXSourceStampsConnectorComponentr-hgj&hohrhyjh{}r.(h}]r/h*ajXbuildbot.db.sourcestampsr0h~]h]h]h]r1h*ajj-jUjuhMhhh]r2(j)r3}r4(hfXclass hgj+hohrhyjh{}r5(h]h]h~]h}]h]uhMhhh]r6hXclass r7r8}r9(hfUhgj3ubaubj)r:}r;(hfXbuildbot.db.sourcestamps.hgj+hohrhyjh{}r<(h]h]h~]h}]h]uhMhhh]r=hXbuildbot.db.sourcestamps.r>r?}r@(hfUhgj:ubaubj)rA}rB(hfj-hgj+hohrhyjh{}rC(h]h]h~]h}]h]uhMhhh]rDhXSourceStampsConnectorComponentrErF}rG(hfUhgjAubaubeubj)rH}rI(hfUhgj&hohrhyjh{}rJ(h]h]h~]h}]h]uhMhhh]rK(h)rL}rM(hfXThis 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.rNhgjHhohrhyhh{}rO(h]h]h~]h}]h]uhMFhhh]rPhXThis 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.rQrR}rS(hfjNhgjLubaubh)rT}rU(hfXEAn instance of this class is available at ``master.db.sourcestamps``.hgjHhohrhyhh{}rV(h]h]h~]h}]h]uhMKhhh]rW(hX*An instance of this class is available at rXrY}rZ(hfX*An instance of this class is available at hgjTubh)r[}r\(hfX``master.db.sourcestamps``h{}r](h]h]h~]h}]h]uhgjTh]r^hXmaster.db.sourcestampsr_r`}ra(hfUhgj[ubahyhubhX.rb}rc(hfX.hgjTubeubjc)rd}re(hfUhgjHhohrhyjfh{}rf(h}]h~]h]h]h]jn]rg((jiXssidUindex-13rhUtri(jiXssdictjhUtrjejsuhMMhhh]ubhv)rk}rl(hfUhgjHhohrhyhzh{}rm(h}]h~]h]h]h]hjhuhMNhhh]ubh)rn}ro(hfX]Source stamps are identified by a *ssid*, and represented internally as a *ssdict*, with keyshgjHhohrht}hyhh{}rp(h]h]h~]h}]rqjhah]uhMOhhh}rrjhjksh]rs(hX"Source stamps are identified by a rtru}rv(hfX"Source stamps are identified by a hgjnubjr)rw}rx(hfX*ssid*h{}ry(h]h]h~]h}]h]uhgjnh]rzhXssidr{r|}r}(hfUhgjwubahyjzubhX", and represented internally as a r~r}r(hfX", and represented internally as a hgjnubjr)r}r(hfX*ssdict*h{}r(h]h]h~]h}]h]uhgjnh]rhXssdictrr}r(hfUhgjubahyjzubhX , with keysrr}r(hfX , with keyshgjnubeubj~)r}r(hfUhgjHhohrhyjh{}r(jX*h}]h~]h]h]h]uhMQhhh]r(j)r}r(hfX``ssid``rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMQh]rh)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXssidrr}r(hfUhgjubahyhubaubaubj)r}r(hfX;``sourcestampsetid`` (set to which the sourcestamp belongs)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMRh]r(h)r}r(hfX``sourcestampsetid``h{}r(h]h]h~]h}]h]uhgjh]rhXsourcestampsetidrr}r(hfUhgjubahyhubhX' (set to which the sourcestamp belongs)rr}r(hfX' (set to which the sourcestamp belongs)hgjubeubaubj)r}r(hfX3``branch`` (branch, or ``None`` for default branch)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMSh]r(h)r}r(hfX ``branch``h{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyhubhX (branch, or rr}r(hfX (branch, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX for default branch)rr}r(hfX for default branch)hgjubeubaubj)r}r(hfXs``revision`` (revision, or ``None`` to indicate the latest revision, in which case this is a relative source stamp)hgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfXs``revision`` (revision, or ``None`` to indicate the latest revision, in which case this is a relative source stamp)hgjhohrhyhh{}r(h]h]h~]h}]h]uhMTh]r(h)r}r(hfX ``revision``h{}r(h]h]h~]h}]h]uhgjh]rhXrevisionrr}r(hfUhgjubahyhubhX (revision, or rr}r(hfX (revision, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhXP to indicate the latest revision, in which case this is a relative source stamp)rr}r(hfXP to indicate the latest revision, in which case this is a relative source stamp)hgjubeubaubj)r}r(hfX/``patch_body`` (body of the patch, or ``None``)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhMVh]r(h)r}r(hfX``patch_body``h{}r(h]h]h~]h}]h]uhgjh]rhX patch_bodyrr}r(hfUhgjubahyhubhX (body of the patch, or rr}r(hfX (body of the patch, or hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX)r}r(hfX)hgjubeubaubj)r}r(hfXE``patch_level`` (directory stripping level of the patch, or ``None``)r hgjhohrhyjh{}r (h]h]h~]h}]h]uhNhhh]r h)r }r (hfj hgjhohrhyhh{}r(h]h]h~]h}]h]uhMWh]r(h)r}r(hfX``patch_level``h{}r(h]h]h~]h}]h]uhgj h]rhX patch_levelrr}r(hfUhgjubahyhubhX- (directory stripping level of the patch, or rr}r(hfX- (directory stripping level of the patch, or hgj ubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgj h]rhXNonerr}r (hfUhgjubahyhubhX)r!}r"(hfX)hgj ubeubaubj)r#}r$(hfXH``patch_subdir`` (subdirectory in which to apply the patch, or ``None``)r%hgjhohrhyjh{}r&(h]h]h~]h}]h]uhNhhh]r'h)r(}r)(hfj%hgj#hohrhyhh{}r*(h]h]h~]h}]h]uhMXh]r+(h)r,}r-(hfX``patch_subdir``h{}r.(h]h]h~]h}]h]uhgj(h]r/hX patch_subdirr0r1}r2(hfUhgj,ubahyhubhX/ (subdirectory in which to apply the patch, or r3r4}r5(hfX/ (subdirectory in which to apply the patch, or hgj(ubh)r6}r7(hfX``None``h{}r8(h]h]h~]h}]h]uhgj(h]r9hXNoner:r;}r<(hfUhgj6ubahyhubhX)r=}r>(hfX)hgj(ubeubaubj)r?}r@(hfX3``patch_author`` (author of the patch, or ``None``)rAhgjhohrhyjh{}rB(h]h]h~]h}]h]uhNhhh]rCh)rD}rE(hfjAhgj?hohrhyhh{}rF(h]h]h~]h}]h]uhMYh]rG(h)rH}rI(hfX``patch_author``h{}rJ(h]h]h~]h}]h]uhgjDh]rKhX patch_authorrLrM}rN(hfUhgjHubahyhubhX (author of the patch, or rOrP}rQ(hfX (author of the patch, or hgjDubh)rR}rS(hfX``None``h{}rT(h]h]h~]h}]h]uhgjDh]rUhXNonerVrW}rX(hfUhgjRubahyhubhX)rY}rZ(hfX)hgjDubeubaubj)r[}r\(hfX6``patch_comment`` (comment for the patch, or ``None``)r]hgjhohrhyjh{}r^(h]h]h~]h}]h]uhNhhh]r_h)r`}ra(hfj]hgj[hohrhyhh{}rb(h]h]h~]h}]h]uhMZh]rc(h)rd}re(hfX``patch_comment``h{}rf(h]h]h~]h}]h]uhgj`h]rghX patch_commentrhri}rj(hfUhgjdubahyhubhX (comment for the patch, or rkrl}rm(hfX (comment for the patch, or hgj`ubh)rn}ro(hfX``None``h{}rp(h]h]h~]h}]h]uhgj`h]rqhXNonerrrs}rt(hfUhgjnubahyhubhX)ru}rv(hfX)hgj`ubeubaubj)rw}rx(hfXA``repository`` (repository containing the source; never ``None``)ryhgjhohrhyjh{}rz(h]h]h~]h}]h]uhNhhh]r{h)r|}r}(hfjyhgjwhohrhyhh{}r~(h]h]h~]h}]h]uhM[h]r(h)r}r(hfX``repository``h{}r(h]h]h~]h}]h]uhgj|h]rhX repositoryrr}r(hfUhgjubahyhubhX* (repository containing the source; never rr}r(hfX* (repository containing the source; never hgj|ubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgj|h]rhXNonerr}r(hfUhgjubahyhubhX)r}r(hfX)hgj|ubeubaubj)r}r(hfX8``project`` (project this source is for; never ``None``)rhgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfjhgjhohrhyhh{}r(h]h]h~]h}]h]uhM\h]r(h)r}r(hfX ``project``h{}r(h]h]h~]h}]h]uhgjh]rhXprojectrr}r(hfUhgjubahyhubhX$ (project this source is for; never rr}r(hfX$ (project this source is for; never hgjubh)r}r(hfX``None``h{}r(h]h]h~]h}]h]uhgjh]rhXNonerr}r(hfUhgjubahyhubhX)r}r(hfX)hgjubeubaubj)r}r(hfXH``changeids`` (list of changes, by id, that generated this sourcestamp) hgjhohrhyjh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfXG``changeids`` (list of changes, by id, that generated this sourcestamp)hgjhohrhyhh{}r(h]h]h~]h}]h]uhM]h]r(h)r}r(hfX ``changeids``h{}r(h]h]h~]h}]h]uhgjh]rhX changeidsrr}r(hfUhgjubahyhubhX: (list of changes, by id, that generated this sourcestamp)rr}r(hfX: (list of changes, by id, that generated this sourcestamp)hgjubeubaubeubh)r}r(hfXPresently, 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.hgjHhohrhyhh{}r(h]h]h~]h}]h]uhNhhh]rh)r}r(hfXPresently, 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.rhgjhohrhyhh{}r(h]h]h~]h}]h]uhM`h]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(hfjhgjubaubaubjc)r}r(hfUhgjHhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXQaddSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)hYUtrauhNhhh]ubj~)r}r(hfUhgjHhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXaddSourceStamp(branch, revision, repository, project, patch_body=None, patch_level=0, patch_author="", patch_comment="", patch_subdir=None, changeids=[])hgjhohrhyjh{}r(h}]rhYajj0h~]h]h]h]rhYajX-SourceStampsConnectorComponent.addSourceStampjj-juhMhhh]r(j)r}r(hfXaddSourceStamphgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXaddSourceStamprr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMhhh]r(jB)r}r(hfXbranchh{}r(h]h]h~]h}]h]uhgjh]rhXbranchrr}r(hfUhgjubahyjJubjB)r}r(hfXrevisionh{}r(h]h]h~]h}]h]uhgjh]rhXrevisionrr}r(hfUhgjubahyjJubjB)r}r(hfX repositoryh{}r(h]h]h~]h}]h]uhgjh]rhX repositoryrr}r(hfUhgjubahyjJubjB)r}r(hfXprojecth{}r(h]h]h~]h}]h]uhgjh]rhXprojectrr}r(hfUhgjubahyjJubjB)r}r(hfXpatch_body=Noneh{}r(h]h]h~]h}]h]uhgjh]rhXpatch_body=Noner r }r (hfUhgjubahyjJubjB)r }r (hfX patch_level=0h{}r(h]h]h~]h}]h]uhgjh]rhX patch_level=0rr}r(hfUhgj ubahyjJubjB)r}r(hfXpatch_author=""h{}r(h]h]h~]h}]h]uhgjh]rhXpatch_author=""rr}r(hfUhgjubahyjJubjB)r}r(hfXpatch_comment=""h{}r(h]h]h~]h}]h]uhgjh]rhXpatch_comment=""rr}r (hfUhgjubahyjJubjB)r!}r"(hfXpatch_subdir=Noneh{}r#(h]h]h~]h}]h]uhgjh]r$hXpatch_subdir=Noner%r&}r'(hfUhgj!ubahyjJubjB)r(}r)(hfX changeids=h{}r*(h]h]h~]h}]h]uhgjh]r+hX changeids=r,r-}r.(hfUhgj(ubahyjJubjZ)r/}r0(hfUh{}r1(h]h]h~]h}]h]uhgjh]hyjfubeubeubj)r2}r3(hfUhgjhohrhyjh{}r4(h]h]h~]h}]h]uhMhhh]r5(jO)r6}r7(hfUhgj2hohrhyjRh{}r8(h]h]h~]h}]h]uhNhhh]r9(jU)r:}r;(hfUh{}r<(h]h]h~]h}]h]uhgj6h]r=(jZ)r>}r?(hfUh{}r@(h]h]h~]h}]h]uhgj:h]rAhX ParametersrBrC}rD(hfUhgj>ubahyjbubjc)rE}rF(hfUh{}rG(h]h]h~]h}]h]uhgj:h]rHj~)rI}rJ(hfUh{}rK(h]h]h~]h}]h]uhgjEh]rL(j)rM}rN(hfUh{}rO(h]h]h~]h}]h]uhgjIh]rPh)rQ}rR(hfUh{}rS(h]h]h~]h}]h]uhgjMh]rT(jl)rU}rV(hfXbranchh{}rW(h]h]h~]h}]h]uhgjQh]rXhXbranchrYrZ}r[(hfUhgjUubahyjtubhX (r\r]}r^(hfUhgjQubj")r_}r`(hfUh{}ra(Ureftypej$U reftargetXunicode stringrbU refdomainjh}]h~]U refexplicith]h]h]uhgjQh]rcjr)rd}re(hfjbh{}rf(h]h]h~]h}]h]uhgj_h]rghXunicode stringrhri}rj(hfUhgjdubahyjzubahyj&ubhX)rk}rl(hfUhgjQubhX -- rmrn}ro(hfUhgjQubehyhubahyjubj)rp}rq(hfUh{}rr(h]h]h~]h}]h]uhgjIh]rsh)rt}ru(hfUh{}rv(h]h]h~]h}]h]uhgjph]rw(jl)rx}ry(hfXrevisionh{}rz(h]h]h~]h}]h]uhgjth]r{hXrevisionr|r}}r~(hfUhgjxubahyjtubhX (rr}r(hfUhgjtubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainjh}]h~]U refexplicith]h]h]uhgjth]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjtubhX -- rr}r(hfUhgjtubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjIh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX repositoryh{}r(h]h]h~]h}]h]uhgjh]rhX repositoryrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjIh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXprojecth{}r(h]h]h~]h}]h]uhgjh]rhXprojectrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXstringrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXstringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjIh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX patch_bodyh{}r(h]h]h~]h}]h]uhgjh]rhX patch_bodyrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXstringrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXstringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhX (optional)rr}r(hfX (optional)hgjubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjIh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX patch_levelh{}r (h]h]h~]h}]h]uhgjh]r hX patch_levelr r }r (hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXintrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXintrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr }r!(hfUhgjubhX (optional)r"r#}r$(hfX (optional)hgjubehyhubahyjubj)r%}r&(hfUh{}r'(h]h]h~]h}]h]uhgjIh]r(h)r)}r*(hfUh{}r+(h]h]h~]h}]h]uhgj%h]r,(jl)r-}r.(hfX patch_authorh{}r/(h]h]h~]h}]h]uhgj)h]r0hX patch_authorr1r2}r3(hfUhgj-ubahyjtubhX (r4r5}r6(hfUhgj)ubj")r7}r8(hfUh{}r9(Ureftypej$U reftargetXunicode stringr:U refdomainjh}]h~]U refexplicith]h]h]uhgj)h]r;jr)r<}r=(hfj:h{}r>(h]h]h~]h}]h]uhgj7h]r?hXunicode stringr@rA}rB(hfUhgj<ubahyjzubahyj&ubhX)rC}rD(hfUhgj)ubhX -- rErF}rG(hfUhgj)ubhX (optional)rHrI}rJ(hfX (optional)hgj)ubehyhubahyjubj)rK}rL(hfUh{}rM(h]h]h~]h}]h]uhgjIh]rNh)rO}rP(hfUh{}rQ(h]h]h~]h}]h]uhgjKh]rR(jl)rS}rT(hfX patch_commenth{}rU(h]h]h~]h}]h]uhgjOh]rVhX patch_commentrWrX}rY(hfUhgjSubahyjtubhX (rZr[}r\(hfUhgjOubj")r]}r^(hfUh{}r_(Ureftypej$U reftargetXunicode stringr`U refdomainjh}]h~]U refexplicith]h]h]uhgjOh]rajr)rb}rc(hfj`h{}rd(h]h]h~]h}]h]uhgj]h]rehXunicode stringrfrg}rh(hfUhgjbubahyjzubahyj&ubhX)ri}rj(hfUhgjOubhX -- rkrl}rm(hfUhgjOubhX (optional)rnro}rp(hfX (optional)hgjOubehyhubahyjubj)rq}rr(hfUh{}rs(h]h]h~]h}]h]uhgjIh]rth)ru}rv(hfUh{}rw(h]h]h~]h}]h]uhgjqh]rx(jl)ry}rz(hfX patch_subdirh{}r{(h]h]h~]h}]h]uhgjuh]r|hX patch_subdirr}r~}r(hfUhgjyubahyjtubhX (rr}r(hfUhgjuubj")r}r(hfUh{}r(Ureftypej$U reftargetXunicode stringrU refdomainjh}]h~]U refexplicith]h]h]uhgjuh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXunicode stringrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjuubhX -- rr}r(hfUhgjuubhX (optional)rr}r(hfX (optional)hgjuubehyhubahyjubj)r}r(hfUh{}r(h]h]h~]h}]h]uhgjIh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfX changeidsh{}r(h]h]h~]h}]h]uhgjh]rhX changeidsrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetX list of intsrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhX list of intsrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubehyhubahyjubehyjubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgj6h]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXssid, via Deferredrr}r(hfXssid, via Deferredhgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXCreate 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.rhgj2hohrhyhh{}r(h]h]h~]h}]h]uhM|hhh]rhXCreate 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.rr}r(hfjhgjubaubeubeubjc)r}r(hfUhgjHhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXQgetSourceStamp() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)h@UtrauhNhhh]ubj~)r}r(hfUhgjHhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfXgetSourceStamp(ssid)hgjhohrhyjh{}r(h}]rh@ajj0h~]h]h]h]rh@ajX-SourceStampsConnectorComponent.getSourceStampjj-juhMhhh]r(j)r}r(hfXgetSourceStamphgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXgetSourceStamprr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMhhh]rjB)r}r(hfXssidh{}r(h]h]h~]h}]h]uhgjh]rhXssidrr}r(hfUhgjubahyjJubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r (h]h]h~]h}]h]uhgjh]r hX Parametersr r }r (hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rj~)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(j)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXssidh{}r (h]h]h~]h}]h]uhgjh]r!hXssidr"r#}r$(hfUhgjubahyjtubhX -- r%r&}r'(hfUhgjubhXsourcestamp to getr(r)}r*(hfXsourcestamp to gethgjubehyhubahyjubj)r+}r,(hfUh{}r-(h]h]h~]h}]h]uhgjh]r.h)r/}r0(hfUh{}r1(h]h]h~]h}]h]uhgj+h]r2(jl)r3}r4(hfXno_cacheh{}r5(h]h]h~]h}]h]uhgj/h]r6hXno_cacher7r8}r9(hfUhgj3ubahyjtubhX (r:r;}r<(hfUhgj/ubj")r=}r>(hfUh{}r?(Ureftypej$U reftargetXbooleanr@U refdomainjh}]h~]U refexplicith]h]h]uhgj/h]rAjr)rB}rC(hfj@h{}rD(h]h]h~]h}]h]uhgj=h]rEhXbooleanrFrG}rH(hfUhgjBubahyjzubahyj&ubhX)rI}rJ(hfUhgj/ubhX -- rKrL}rM(hfUhgj/ubhX+bypass cache and always fetch from databaserNrO}rP(hfX+bypass cache and always fetch from databasehgj/ubehyhubahyjubehyjubahyj{ubehyj|ubjU)rQ}rR(hfUh{}rS(h]h]h~]h}]h]uhgjh]rT(jZ)rU}rV(hfUh{}rW(h]h]h~]h}]h]uhgjQh]rXhXReturnsrYrZ}r[(hfUhgjUubahyjbubjc)r\}r](hfUh{}r^(h]h]h~]h}]h]uhgjQh]r_h)r`}ra(hfUh{}rb(h]h]h~]h}]h]uhgj\h]rc(hX ssdict, or rdre}rf(hfX ssdict, or hgj`ubh)rg}rh(hfX``None``h{}ri(h]h]h~]h}]h]uhgj`h]rjhXNonerkrl}rm(hfUhgjgubahyhubhX, via Deferredrnro}rp(hfX, via Deferredhgj`ubehyhubahyj{ubehyj|ubeubh)rq}rr(hfX^Get an ssdict representing the given source stamp, or ``None`` if no such source stamp exists.hgjhohrhyhh{}rs(h]h]h~]h}]h]uhMhhh]rt(hX6Get an ssdict representing the given source stamp, or rurv}rw(hfX6Get an ssdict representing the given source stamp, or hgjqubh)rx}ry(hfX``None``h{}rz(h]h]h~]h}]h]uhgjqh]r{hXNoner|r}}r~(hfUhgjxubahyhubhX if no such source stamp exists.rr}r(hfX if no such source stamp exists.hgjqubeubeubeubjc)r}r(hfUhgjHhohrhyjfh{}r(h}]h~]h]h]h]Uentries]r(jiXRgetSourceStamps() (buildbot.db.sourcestamps.SourceStampsConnectorComponent method)hHUtrauhNhhh]ubj~)r}r(hfUhgjHhohrhyjh{}r(jjXpyrh}]h~]h]h]h]jXmethodrjjuhNhhh]r(j)r}r(hfX!getSourceStamps(sourcestampsetid)hgjhohrhyjh{}r(h}]rhHajj0h~]h]h]h]rhHajX.SourceStampsConnectorComponent.getSourceStampsjj-juhMhhh]r(j)r}r(hfXgetSourceStampshgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]rhXgetSourceStampsrr}r(hfUhgjubaubj<)r}r(hfUhgjhohrhyj?h{}r(h]h]h~]h}]h]uhMhhh]rjB)r}r(hfXsourcestampsetidh{}r(h]h]h~]h}]h]uhgjh]rhXsourcestampsetidrr}r(hfUhgjubahyjJubaubeubj)r}r(hfUhgjhohrhyjh{}r(h]h]h~]h}]h]uhMhhh]r(jO)r}r(hfUhgjhohrhyjRh{}r(h]h]h~]h}]h]uhNhhh]r(jU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhX Parametersrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jl)r}r(hfXsourcestampsetidh{}r(h]h]h~]h}]h]uhgjh]rhXsourcestampsetidrr}r(hfUhgjubahyjtubhX (rr}r(hfUhgjubj")r}r(hfUh{}r(Ureftypej$U reftargetXintegerrU refdomainjh}]h~]U refexplicith]h]h]uhgjh]rjr)r}r(hfjh{}r(h]h]h~]h}]h]uhgjh]rhXintegerrr}r(hfUhgjubahyjzubahyj&ubhX)r}r(hfUhgjubhX -- rr}r(hfUhgjubhXGidentification of the set, all returned sourcestamps belong to this setrr}r(hfXGidentification of the set, all returned sourcestamps belong to this sethgjubehyhubahyj{ubehyj|ubjU)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]r(jZ)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXReturnsrr}r(hfUhgjubahyjbubjc)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rh)r}r(hfUh{}r(h]h]h~]h}]h]uhgjh]rhXsslist of ssdictrr}r(hfXsslist of ssdicthgjubahyhubahyj{ubehyj|ubeubh)r}r(hfXGet 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.rhgjhohrhyhh{}r(h]h]h~]h}]h]uhMhhh]rhXGet 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.rr}r(hfjhgjubaubeubeubeubeubeubhh)r}r(hfUhgjDhohrhyhh{}r(h]h]h~]h}]r(X"module-buildbot.db.sourcestampsetsr Usourcestampsetr eh]r h&auhMhhh]r (h)r }r (hfXsourcestampsetr hgjhohrhyhh{}r (h]h]h~]h}]h]uhMhhh]r hXsourcestampsetr r }r (hfj hgj ubaubjc)r }r (hfUhgjhohrhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiX$buildbot.db.sourcestampsets (module)X"module-buildbot.db.sourcestampsetsUtr auhMhhh]ubjc)r }r (hfUhgjhohrhyjfh{}r (h}]h~]h]h]h]jn]r (jpX'SourceStampSets; DB Connector ComponentUindex-14r Utr ajsuhMhhh]ubhv)r }r (hfUhgjhohrhyhzh{}r (h]h]h~]h}]r j ah]uhMhhh]ubjc)r }r (hfUhgjhoNhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiXHSourceStampSetsConnectorComponent (class in buildbot.db.sourcestampsets)hUtr auhNhhh]ubj~)r }r! (hfUhgjhoNhyjh{}r" (jjXpyh}]h~]h]h]h]jXclassr# jj# uhNhhh]r$ (j)r% }r& (hfX!SourceStampSetsConnectorComponentr' hgj hohrhyjh{}r( (h}]r) hajXbuildbot.db.sourcestampsetsr* h~]h]h]h]r+ hajj' jUjuhMhhh]r, (j)r- }r. (hfXclass hgj% hohrhyjh{}r/ (h]h]h~]h}]h]uhMhhh]r0 hXclass r1 r2 }r3 (hfUhgj- ubaubj)r4 }r5 (hfXbuildbot.db.sourcestampsets.hgj% hohrhyjh{}r6 (h]h]h~]h}]h]uhMhhh]r7 hXbuildbot.db.sourcestampsets.r8 r9 }r: (hfUhgj4 ubaubj)r; }r< (hfj' hgj% hohrhyjh{}r= (h]h]h~]h}]h]uhMhhh]r> hX!SourceStampSetsConnectorComponentr? r@ }rA (hfUhgj; ubaubeubj)rB }rC (hfUhgj hohrhyjh{}rD (h]h]h~]h}]h]uhMhhh]rE (h)rF }rG (hfXThis class is responsible for adding new sourcestampsets to the database. Build sets link to sourcestamp sets, via their (set) id's.rH hgjB hohrhyhh{}rI (h]h]h~]h}]h]uhMhhh]rJ hXThis class is responsible for adding new sourcestampsets to the database. Build sets link to sourcestamp sets, via their (set) id's.rK rL }rM (hfjH hgjF ubaubh)rN }rO (hfXHAn instance of this class is available at ``master.db.sourcestampsets``.hgjB hohrhyhh{}rP (h]h]h~]h}]h]uhMhhh]rQ (hX*An instance of this class is available at rR rS }rT (hfX*An instance of this class is available at hgjN ubh)rU }rV (hfX``master.db.sourcestampsets``h{}rW (h]h]h~]h}]h]uhgjN h]rX hXmaster.db.sourcestampsetsrY rZ }r[ (hfUhgjU ubahyhubhX.r\ }r] (hfX.hgjN ubeubh)r^ }r_ (hfX6Sourcestamp sets are identified by a sourcestampsetid.r` hgjB hohrhyhh{}ra (h]h]h~]h}]h]uhMhhh]rb hX6Sourcestamp sets are identified by a sourcestampsetid.rc rd }re (hfj` hgj^ ubaubjc)rf }rg (hfUhgjB hohrhyjfh{}rh (h}]h~]h]h]h]Uentries]ri (jiXZaddSourceStampSet() (buildbot.db.sourcestampsets.SourceStampSetsConnectorComponent method)hUtrj auhNhhh]ubj~)rk }rl (hfUhgjB hohrhyjh{}rm (jjXpyh}]h~]h]h]h]jXmethodrn jjn uhNhhh]ro (j)rp }rq (hfXaddSourceStampSet()hgjk hohrhyjh{}rr (h}]rs hajj* h~]h]h]h]rt hajX3SourceStampSetsConnectorComponent.addSourceStampSetjj' juhMhhh]ru (j)rv }rw (hfXaddSourceStampSethgjp hohrhyjh{}rx (h]h]h~]h}]h]uhMhhh]ry hXaddSourceStampSetrz r{ }r| (hfUhgjv ubaubj<)r} }r~ (hfUhgjp hohrhyj?h{}r (h]h]h~]h}]h]uhMhhh]ubeubj)r }r (hfUhgjk hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r (jO)r }r (hfUhgj hohrhyjRh{}r (h]h]h~]h}]h]uhNhhh]r jU)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r (jZ)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hXReturnsr r }r (hfUhgj ubahyjbubjc)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r h)r }r (hfUh{}r (h]h]h~]h}]h]uhgj h]r hX-new sourcestampsetid as integer, via Deferredr r }r (hfX-new sourcestampsetid as integer, via Deferredhgj ubahyhubahyj{ubehyj|ubaubh)r }r (hfXAdd 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 hgj hohrhyhh{}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 (hfj hgj ubaubeubeubeubeubeubhh)r }r (hfUhgjDhohrhyhh{}r (h]h]h~]h}]r (Xmodule-buildbot.db.stater Ustater eh]r h"auhMhhh]r (h)r }r (hfXstater hgj hohrhyhh{}r (h]h]h~]h}]h]uhMhhh]r hXstater r }r (hfj hgj ubaubjc)r }r (hfUhgj hohrhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiXbuildbot.db.state (module)Xmodule-buildbot.db.stateUtr auhMhhh]ubjc)r }r (hfUhgj hohrhyjfh{}r (h}]h~]h]h]h]jn]r (jpXState; DB Connector ComponentUindex-15r Utr ajsuhMhhh]ubhv)r }r (hfUhgj hohrhyhzh{}r (h]h]h~]h}]r j ah]uhMhhh]ubjc)r }r (hfUhgj hoNhyjfh{}r (h}]h~]h]h]h]Uentries]r (jiX4StateConnectorComponent (class in buildbot.db.state)h(Utr auhNhhh]ubj~)r }r (hfUhgj hoNhyjh{}r (jjXpyh}]h~]h]h]h]jXclassr jj uhNhhh]r (j)r }r (hfXStateConnectorComponentr hgj hohrhyjh{}r (h}]r h(ajXbuildbot.db.stater h~]h]h]h]r h(ajj jUjuhMhhh]r (j)r }r (hfXclass hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXclass r r }r (hfUhgj ubaubj)r }r (hfXbuildbot.db.state.hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXbuildbot.db.state.r r }r (hfUhgj ubaubj)r }r (hfj hgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r hXStateConnectorComponentr r }r (hfUhgj ubaubeubj)r }r (hfUhgj hohrhyjh{}r (h]h]h~]h}]h]uhMhhh]r (h)r }r (hfXThis 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.r hgj hohrhyhh{}r (h]h]h~]h}]h]uhMhhh]r 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.r r }r (hfj hgj ubaubh)r }r (hfX2Objects 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.hgj hohrhyhh{}r (h]h]h~]h}]h]uhMhhh]r (hXbObjects are identified by their (user-visible) name and their class. This allows, for example, a r r }r (hfXbObjects are identified by their (user-visible) name and their class. This allows, for example, a hgj ubh)r }r!(hfX``nightly_smoketest``h{}r!(h]h]h~]h}]h]uhgj h]r!hXnightly_smoketestr!r!}r!(hfUhgj ubahyhubhX object of class r!r!}r!(hfX object of class hgj ubh)r !}r !(hfX``NightlyScheduler``h{}r !(h]h]h~]h}]h]uhgj h]r !hXNightlySchedulerr !r!}r!(hfUhgj !ubahyhubhX 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!r!}r!(hfX to maintain its state even if it moves between masters, but avoids cross-contaminating state between different classes of objects with the same name.hgj ubeubh)r!}r!(hfXNote 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.r!hgj hohrhyhh{}r!(h]h]h~]h}]h]uhMhhh]r!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.r!r!}r!(hfj!hgj!ubaubh)r!}r!(hfX>An instance of this class is available at ``master.db.state``.hgj hohrhyhh{}r!(h]h]h~]h}]h]uhMhhh]r!(hX*An instance of this class is available at r!r !}r!!(hfX*An instance of this class is available at hgj!ubh)r"!}r#!(hfX``master.db.state``h{}r$!(h]h]h~]h}]h]uhgj!h]r%!hXmaster.db.stater&!r'!}r(!(hfUhgj"!ubahyhubhX.r)!}r*!(hfX.hgj!ubeubjc)r+!}r,!(hfUhgj hohrhyjfh{}r-!(h}]h~]h]h]h]jn]r.!((jiXobjectidUindex-16r/!Utr0!(jiXobjdictj/!Utr1!ejsuhMhhh]ubhv)r2!}r3!(hfUhgj hohrhyhzh{}r4!(h}]h~]h]h]h]hj/!uhMhhh]ubh)r5!}r6!(hfX%Objects are identified by *objectid*.hgj hohrht}hyhh{}r7!(h]h]h~]h}]r8!j/!ah]uhMhhh}r9!j/!j2!sh]r:!(hXObjects are identified by r;!r!}r?!(hfX *objectid*h{}r@!(h]h]h~]h}]h]uhgj5!h]rA!hXobjectidrB!rC!}rD!(hfUhgj>!ubahyjzubhX.rE!}rF!(hfX.hgj5!ubeubjc)rG!}rH!(hfUhgj hohrhyjfh{}rI!(h}]h~]h]h]h]Uentries]rJ!(jiX@getObjectId() (buildbot.db.state.StateConnectorComponent method)hGUtrK!auhNhhh]ubj~)rL!}rM!(hfUhgj hohrhyjh{}rN!(jjXpyh}]h~]h]h]h]jXmethodrO!jjO!uhNhhh]rP!(j)rQ!}rR!(hfXgetObjectId(name, class_name)hgjL!hohrhyjh{}rS!(h}]rT!hGajj h~]h]h]h]rU!hGajX#StateConnectorComponent.getObjectIdjj juhMhhh]rV!(j)rW!}rX!(hfX getObjectIdhgjQ!hohrhyjh{}rY!(h]h]h~]h}]h]uhMhhh]rZ!hX getObjectIdr[!r\!}r]!(hfUhgjW!ubaubj<)r^!}r_!(hfUhgjQ!hohrhyj?h{}r`!(h]h]h~]h}]h]uhMhhh]ra!(jB)rb!}rc!(hfXnameh{}rd!(h]h]h~]h}]h]uhgj^!h]re!hXnamerf!rg!}rh!(hfUhgjb!ubahyjJubjB)ri!}rj!(hfX class_nameh{}rk!(h]h]h~]h}]h]uhgj^!h]rl!hX class_namerm!rn!}ro!(hfUhgji!ubahyjJubeubeubj)rp!}rq!(hfUhgjL!hohrhyjh{}rr!(h]h]h~]h}]h]uhMhhh]rs!(jO)rt!}ru!(hfUhgjp!hohrhyjRh{}rv!(h]h]h~]h}]h]uhNhhh]rw!(jU)rx!}ry!(hfUh{}rz!(h]h]h~]h}]h]uhgjt!h]r{!(jZ)r|!}r}!(hfUh{}r~!(h]h]h~]h}]h]uhgjx!h]r!hX Parametersr!r!}r!(hfUhgj|!ubahyjbubjc)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgjx!h]r!j~)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!(j)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!h)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!(jl)r!}r!(hfXnameh{}r!(h]h]h~]h}]h]uhgj!h]r!hXnamer!r!}r!(hfUhgj!ubahyjtubhX -- r!r!}r!(hfUhgj!ubhXname of the objectr!r!}r!(hfXname of the objectr!hgj!ubehyhubahyjubj)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!h)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!(jl)r!}r!(hfX class_nameh{}r!(h]h]h~]h}]h]uhgj!h]r!hX class_namer!r!}r!(hfUhgj!ubahyjtubhX -- r!r!}r!(hfUhgj!ubhXobject class namer!r!}r!(hfXobject class namer!hgj!ubehyhubahyjubehyjubahyj{ubehyj|ubjU)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgjt!h]r!(jZ)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!hXReturnsr!r!}r!(hfUhgj!ubahyjbubjc)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!h)r!}r!(hfUh{}r!(h]h]h~]h}]h]uhgj!h]r!hXthe objectid, via a Deferred.r!r!}r!(hfXthe objectid, via a Deferred.r!hgj!ubahyhubahyj{ubehyj|ubeubh)r!}r!(hfXGet 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!hgjp!hohrhyhh{}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!(hfj!hgj!ubaubeubeubjc)r!}r!(hfUhgj hohrhyjfh{}r!(h}]h~]h]h]h]Uentries]r!(jiX=getState() (buildbot.db.state.StateConnectorComponent method)hFUtr!auhNhhh]ubj~)r!}r!(hfUhgj hohrhyjh{}r!(jjXpyr!h}]h~]h]h]h]jXmethodr!jj!uhNhhh]r!(j)r!}r!(hfX#getState(objectid, name[, default])hgj!hohrhyjh{}r!(h}]r!hFajj h~]h]h]h]r!hFajX StateConnectorComponent.getStatejj juhMhhh]r!(j)r!}r!(hfXgetStatehgj!hohrhyjh{}r!(h]h]h~]h}]h]uhMhhh]r!hXgetStater!r!}r!(hfUhgj!ubaubj<)r!}r!(hfUhgj!hohrhyj?h{}r!(h]h]h~]h}]h]uhMhhh]r!(jB)r!}r!(hfXobjectidh{}r!(h]h]h~]h}]h]uhgj!h]r!hXobjectidr!r!}r!(hfUhgj!ubahyjJubjB)r!}r!(hfXnameh{}r!(h]h]h~]h}]h]uhgj!h]r!hXnamer!r!}r!(hfUhgj!ubahyjJubjZ)r"}r"(hfUh{}r"(h]h]h~]h}]h]uhgj!h]r"jB)r"}r"(hfXdefaulth{}r"(h]h]h~]h}]h]uhgj"h]r"hXdefaultr"r "}r "(hfUhgj"ubahyjJubahyjfubeubeubj)r "}r "(hfUhgj!hohrhyjh{}r "(h]h]h~]h}]h]uhMhhh]r"(jO)r"}r"(hfUhgj "hohrhyjRh{}r"(h]h]h~]h}]h]uhNhhh]r"(jU)r"}r"(hfUh{}r"(h]h]h~]h}]h]uhgj"h]r"(jZ)r"}r"(hfUh{}r"(h]h]h~]h}]h]uhgj"h]r"hX Parametersr"r"}r"(hfUhgj"ubahyjbubjc)r"}r"(hfUh{}r "(h]h]h~]h}]h]uhgj"h]r!"j~)r""}r#"(hfUh{}r$"(h]h]h~]h}]h]uhgj"h]r%"(j)r&"}r'"(hfUh{}r("(h]h]h~]h}]h]uhgj""h]r)"h)r*"}r+"(hfUh{}r,"(h]h]h~]h}]h]uhgj&"h]r-"(jl)r."}r/"(hfXobjectidh{}r0"(h]h]h~]h}]h]uhgj*"h]r1"hXobjectidr2"r3"}r4"(hfUhgj."ubahyjtubhX -- r5"r6"}r7"(hfUhgj*"ubhX-objectid on which the state should be checkedr8"r9"}r:"(hfX-objectid on which the state should be checkedhgj*"ubehyhubahyjubj)r;"}r<"(hfUh{}r="(h]h]h~]h}]h]uhgj""h]r>"h)r?"}r@"(hfUh{}rA"(h]h]h~]h}]h]uhgj;"h]rB"(jl)rC"}rD"(hfXnameh{}rE"(h]h]h~]h}]h]uhgj?"h]rF"hXnamerG"rH"}rI"(hfUhgjC"ubahyjtubhX -- rJ"rK"}rL"(hfUhgj?"ubhXname of the value to retrieverM"rN"}rO"(hfXname of the value to retrievehgj?"ubehyhubahyjubj)rP"}rQ"(hfUh{}rR"(h]h]h~]h}]h]uhgj""h]rS"h)rT"}rU"(hfUh{}rV"(h]h]h~]h}]h]uhgjP"h]rW"(jl)rX"}rY"(hfXdefaulth{}rZ"(h]h]h~]h}]h]uhgjT"h]r["hXdefaultr\"r]"}r^"(hfUhgjX"ubahyjtubhX -- r_"r`"}ra"(hfUhgjT"ubhX4(optional) value to return if C{name} is not presentrb"rc"}rd"(hfX4(optional) value to return if C{name} is not presenthgjT"ubehyhubahyjubehyjubahyj{ubehyj|ubjU)re"}rf"(hfUh{}rg"(h]h]h~]h}]h]uhgj"h]rh"(jZ)ri"}rj"(hfUh{}rk"(h]h]h~]h}]h]uhgje"h]rl"hXReturnsrm"rn"}ro"(hfUhgji"ubahyjbubjc)rp"}rq"(hfUh{}rr"(h]h]h~]h}]h]uhgje"h]rs"h)rt"}ru"(hfUh{}rv"(h]h]h~]h}]h]uhgjp"h]rw"hXstate value via a Deferredrx"ry"}rz"(hfXstate value via a Deferredhgjt"ubahyhubahyj{ubehyj|ubjU)r{"}r|"(hfUh{}r}"(h]h]h~]h}]h]uhgj"h]r~"(jZ)r"}r"(hfUh{}r"(h]h]h~]h}]h]uhgj{"h]r"(hXRaisesr"r"}r"(hfUhgj"ubhX r"}r"(hfUhgj"ubj")r"}r"(hfUh{}r"(UreftypeUexcr"U reftargetXKeyErrorr"U refdomainj!h}]h~]U refexplicith]h]h]uhgj"h]r"hXKeyErrorr"r"}r"(hfj"hgj"ubahyj&ubehyjbubjc)r"}r"(hfUh{}r"(h]h]h~]h}]h]uhgj{"h]r"h)r"}r"(hfUh{}r"(h]h]h~]h}]h]uhgj"h]r"(hXif r"r"}r"(hfXif hgj"ubh)r"}r"(hfX``name``h{}r"(h]h]h~]h}]h]uhgj"h]r"hXnamer"r"}r"(hfUhgj"ubahyhubhX' is not present and no default is givenr"r"}r"(hfX' is not present and no default is givenhgj"ubehyhubahyj{ubehyj|ubjU)r"}r"(hfUhgj"hohrhyj|h{}r"(h]h]h~]h}]h]uhMhhh]r"(jZ)r"}r"(hfXraisesh{}r"(h]h]h~]h}]h]uhgj"h]r"hXRaisesr"r"}r"(hfUhgj"ubahyjbubjc)r"}r"(hfX TypeError if JSON parsing fails h{}r"(h]h]h~]h}]h]uhgj"h]r"h)r"}r"(hfXTypeError if JSON parsing failsr"hgj"hohrhyhh{}r"(h]h]h~]h}]h]uhMh]r"hXTypeError if JSON parsing failsr"r"}r"(hfj"hgj"ubaubahyj{ubeubeubh)r"}r"(hfXIGet the state value for key ``name`` for the object with id ``objectid``.hgj "hohrhyhh{}r"(h]h]h~]h}]h]uhMhhh]r"(hXGet the state value for key r"r"}r"(hfXGet the state value for key hgj"ubh)r"}r"(hfX``name``h{}r"(h]h]h~]h}]h]uhgj"h]r"hXnamer"r"}r"(hfUhgj"ubahyhubhX for the object with id r"r"}r"(hfX for the object with id hgj"ubh)r"}r"(hfX ``objectid``h{}r"(h]h]h~]h}]h]uhgj"h]r"hXobjectidr"r"}r"(hfUhgj"ubahyhubhX.r"}r"(hfX.hgj"ubeubeubeubjc)r"}r"(hfUhgj hohrhyjfh{}r"(h}]h~]h]h]h]Uentries]r"(jiX=setState() (buildbot.db.state.StateConnectorComponent method)h[Utr"auhNhhh]ubj~)r"}r"(hfUhgj hohrhyjh{}r"(jjXpyr"h}]h~]h]h]h]jXmethodr"jj"uhNhhh]r"(j)r"}r"(hfXsetState(objectid, name, value)hgj"hohrhyjh{}r"(h}]r"h[ajj h~]h]h]h]r"h[ajX StateConnectorComponent.setStatejj juhMhhh]r"(j)r"}r"(hfXsetStatehgj"hohrhyjh{}r"(h]h]h~]h}]h]uhMhhh]r"hXsetStater"r"}r"(hfUhgj"ubaubj<)r"}r"(hfUhgj"hohrhyj?h{}r"(h]h]h~]h}]h]uhMhhh]r"(jB)r"}r"(hfXobjectidh{}r"(h]h]h~]h}]h]uhgj"h]r"hXobjectidr"r"}r"(hfUhgj"ubahyjJubjB)r"}r"(hfXnameh{}r"(h]h]h~]h}]h]uhgj"h]r"hXnamer"r"}r#(hfUhgj"ubahyjJubjB)r#}r#(hfXvalueh{}r#(h]h]h~]h}]h]uhgj"h]r#hXvaluer#r#}r#(hfUhgj#ubahyjJubeubeubj)r#}r #(hfUhgj"hohrhyjh{}r #(h]h]h~]h}]h]uhMhhh]r #(jO)r #}r #(hfUhgj#hohrhyjRh{}r#(h]h]h~]h}]h]uhNhhh]r#(jU)r#}r#(hfUh{}r#(h]h]h~]h}]h]uhgj #h]r#(jZ)r#}r#(hfUh{}r#(h]h]h~]h}]h]uhgj#h]r#hX Parametersr#r#}r#(hfUhgj#ubahyjbubjc)r#}r#(hfUh{}r#(h]h]h~]h}]h]uhgj#h]r#j~)r#}r #(hfUh{}r!#(h]h]h~]h}]h]uhgj#h]r"#(j)r##}r$#(hfUh{}r%#(h]h]h~]h}]h]uhgj#h]r&#h)r'#}r(#(hfUh{}r)#(h]h]h~]h}]h]uhgj##h]r*#(jl)r+#}r,#(hfXobjectidh{}r-#(h]h]h~]h}]h]uhgj'#h]r.#hXobjectidr/#r0#}r1#(hfUhgj+#ubahyjtubhX -- r2#r3#}r4#(hfUhgj'#ubhX2the objectid for which the state should be changedr5#r6#}r7#(hfX2the objectid for which the state should be changedhgj'#ubehyhubahyjubj)r8#}r9#(hfUh{}r:#(h]h]h~]h}]h]uhgj#h]r;#h)r<#}r=#(hfUh{}r>#(h]h]h~]h}]h]uhgj8#h]r?#(jl)r@#}rA#(hfXnameh{}rB#(h]h]h~]h}]h]uhgj<#h]rC#hXnamerD#rE#}rF#(hfUhgj@#ubahyjtubhX -- rG#rH#}rI#(hfUhgj<#ubhXthe name of the value to changerJ#rK#}rL#(hfXthe name of the value to changehgj<#ubehyhubahyjubj)rM#}rN#(hfUh{}rO#(h]h]h~]h}]h]uhgj#h]rP#h)rQ#}rR#(hfUh{}rS#(h]h]h~]h}]h]uhgjM#h]rT#(jl)rU#}rV#(hfXvalueh{}rW#(h]h]h~]h}]h]uhgjQ#h]rX#hXvaluerY#rZ#}r[#(hfUhgjU#ubahyjtubhX (r\#r]#}r^#(hfUhgjQ#ubj")r_#}r`#(hfUh{}ra#(Ureftypej$U reftargetXJSON-able valuerb#U refdomainj"h}]h~]U refexplicith]h]h]uhgjQ#h]rc#jr)rd#}re#(hfjb#h{}rf#(h]h]h~]h}]h]uhgj_#h]rg#hXJSON-able valuerh#ri#}rj#(hfUhgjd#ubahyjzubahyj&ubhX)rk#}rl#(hfUhgjQ#ubhX -- rm#rn#}ro#(hfUhgjQ#ubhXthe value to setrp#rq#}rr#(hfXthe value to sethgjQ#ubehyhubahyjubj)rs#}rt#(hfUh{}ru#(h]h]h~]h}]h]uhgj#h]rv#h)rw#}rx#(hfUh{}ry#(h]h]h~]h}]h]uhgjs#h]rz#(jl)r{#}r|#(hfXreturnsh{}r}#(h]h]h~]h}]h]uhgjw#h]r~#hXreturnsr#r#}r#(hfUhgj{#ubahyjtubhX -- r#r#}r#(hfUhgjw#ubhXDeferredr#r#}r#(hfXDeferredhgjw#ubehyhubahyjubehyjubahyj{ubehyj|ubjU)r#}r#(hfUhgj #hohrhyj|h{}r#(h]h]h~]h}]h]uhMhhh]r#(jZ)r#}r#(hfXraisesh{}r#(h]h]h~]h}]h]uhgj#h]r#hXRaisesr#r#}r#(hfUhgj#ubahyjbubjc)r#}r#(hfX!TypeError if JSONification fails h{}r#(h]h]h~]h}]h]uhgj#h]r#h)r#}r#(hfX TypeError if JSONification failsr#hgj#hohrhyhh{}r#(h]h]h~]h}]h]uhMh]r#hX TypeError if JSONification failsr#r#}r#(hfj#hgj#ubaubahyj{ubeubeubh)r#}r#(hfXeSet the state value for ``name`` for the object with id ``objectid``, overwriting any existing value.hgj#hohrhyhh{}r#(h]h]h~]h}]h]uhMhhh]r#(hXSet the state value for r#r#}r#(hfXSet the state value for hgj#ubh)r#}r#(hfX``name``h{}r#(h]h]h~]h}]h]uhgj#h]r#hXnamer#r#}r#(hfUhgj#ubahyhubhX for the object with id r#r#}r#(hfX for the object with id hgj#ubh)r#}r#(hfX ``objectid``h{}r#(h]h]h~]h}]h]uhgj#h]r#hXobjectidr#r#}r#(hfUhgj#ubahyhubhX!, overwriting any existing value.r#r#}r#(hfX!, overwriting any existing value.hgj#ubeubeubeubeubeubeubhh)r#}r#(hfUhgjDhohrhyhh{}r#(h]h]h~]h}]r#(Xmodule-buildbot.db.usersr#Uusersr#eh]r#hOauhMhhh]r#(h)r#}r#(hfXusersr#hgj#hohrhyhh{}r#(h]h]h~]h}]h]uhMhhh]r#hXusersr#r#}r#(hfj#hgj#ubaubjc)r#}r#(hfUhgj#hohrhyjfh{}r#(h}]h~]h]h]h]Uentries]r#(jiXbuildbot.db.users (module)Xmodule-buildbot.db.usersUtr#auhMhhh]ubjc)r#}r#(hfUhgj#hohrhyjfh{}r#(h}]h~]h]h]h]jn]r#(jpXUsers; DB Connector ComponentUindex-17r#Utr#ajsuhMhhh]ubhv)r#}r#(hfUhgj#hohrhyhzh{}r#(h]h]h~]h}]r#j#ah]uhMhhh]ubjc)r#}r#(hfUhgj#hoNhyjfh{}r#(h}]h~]h]h]h]Uentries]r#(jiX4UsersConnectorComponent (class in buildbot.db.users)hLUtr#auhNhhh]ubj~)r#}r#(hfUhgj#hoNhyjh{}r#(jjXpyh}]h~]h]h]h]jXclassr#jj#uhNhhh]r#(j)r#}r#(hfXUsersConnectorComponentr#hgj#hohrhyjh{}r#(h}]r#hLajXbuildbot.db.usersr#h~]h]h]h]r#hLajj#jUjuhM_hhh]r#(j)r#}r#(hfXclass hgj#hohrhyjh{}r#(h]h]h~]h}]h]uhM_hhh]r#hXclass r#r#}r#(hfUhgj#ubaubj)r#}r#(hfXbuildbot.db.users.hgj#hohrhyjh{}r#(h]h]h~]h}]h]uhM_hhh]r#hXbuildbot.db.users.r#r#}r#(hfUhgj#ubaubj)r#}r#(hfj#hgj#hohrhyjh{}r#(h]h]h~]h}]h]uhM_hhh]r#hXUsersConnectorComponentr#r#}r#(hfUhgj#ubaubeubj)r$}r$(hfUhgj#hohrhyjh{}r$(h]h]h~]h}]h]uhM_hhh]r$(h)r$}r$(hfXThis class handles Buildbot's notion of users. Buildbot tracks the usual information about users -- username and password, plus a display name.r$hgj$hohrhyhh{}r$(h]h]h~]h}]h]uhMhhh]r$hXThis class handles Buildbot's notion of users. Buildbot tracks the usual information about users -- username and password, plus a display name.r $r $}r $(hfj$hgj$ubaubh)r $}r $(hfXThe 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.hgj$hohrhyhh{}r$(h]h]h~]h}]h]uhMhhh]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$(hfXThe more complicated task is to recognize each user across multiple interfaces with Buildbot. For example, a user may be identified as 'djmitche' in Subversion, hgj $ubj)r$}r$(hfX'dustin@v.igoro.ush{}r$(UrefuriXmailto:'dustin@v.igoro.ush}]h~]h]h]h]uhgj $h]r$hX'dustin@v.igoro.usr$r$}r$(hfUhgj$ubahyj ubhXt' in Git, and 'dustin' on IRC. To support this functionality, each user as a set of attributes, keyed by type. The r$r$}r$(hfXt' in Git, and 'dustin' on IRC. To support this functionality, each user as a set of attributes, keyed by type. The hgj $ubj")r$}r$(hfX:py:meth:`findUserByAttr`r$hgj $hohrhyj&h{}r $(UreftypeXmethj(j)XfindUserByAttrU refdomainXpyr!$h}]h~]U refexplicith]h]h]j+j,j-j#j.j#uhMh]r"$h)r#$}r$$(hfj$h{}r%$(h]h]r&$(j4j!$Xpy-methr'$eh~]h}]h]uhgj$h]r($hXfindUserByAttrr)$r*$}r+$(hfUhgj#$ubahyhubaubhX] method uses these attributes to match users, adding a new user if no matching user is found.r,$r-$}r.$(hfX] method uses these attributes to match users, adding a new user if no matching user is found.hgj $ubeubh)r/$}r0$(hfXiUsers are identified canonically by *uid*, and are represented by *usdicts* (user dictionaries) with keyshgj$hohrhyhh{}r1$(h]h]h~]h}]h]uhMhhh]r2$(hX$Users are identified canonically by r3$r4$}r5$(hfX$Users are identified canonically by hgj/$ubjr)r6$}r7$(hfX*uid*h{}r8$(h]h]h~]h}]h]uhgj/$h]r9$hXuidr:$r;$}r<$(hfUhgj6$ubahyjzubhX, and are represented by r=$r>$}r?$(hfX, and are represented by hgj/$ubjr)r@$}rA$(hfX *usdicts*h{}rB$(h]h]h~]h}]h]uhgj/$h]rC$hXusdictsrD$rE$}rF$(hfUhgj@$ubahyjzubhX (user dictionaries) with keysrG$rH$}rI$(hfX (user dictionaries) with keyshgj/$ubeubj~)rJ$}rK$(hfUhgj$hohrhyjh{}rL$(jX*h}]h~]h]h]h]uhMhhh]rM$(j)rN$}rO$(hfX``uid``rP$hgjJ$hohrhyjh{}rQ$(h]h]h~]h}]h]uhNhhh]rR$h)rS$}rT$(hfjP$hgjN$hohrhyhh{}rU$(h]h]h~]h}]h]uhMh]rV$h)rW$}rX$(hfjP$h{}rY$(h]h]h~]h}]h]uhgjS$h]rZ$hXuidr[$r\$}r]$(hfUhgjW$ubahyhubaubaubj)r^$}r_$(hfX*``identifier`` (display name for the user)r`$hgjJ$hohrhyjh{}ra$(h]h]h~]h}]h]uhNhhh]rb$h)rc$}rd$(hfj`$hgj^$hohrhyhh{}re$(h]h]h~]h}]h]uhMh]rf$(h)rg$}rh$(hfX``identifier``h{}ri$(h]h]h~]h}]h]uhgjc$h]rj$hX identifierrk$rl$}rm$(hfUhgjg$ubahyhubhX (display name for the user)rn$ro$}rp$(hfX (display name for the user)hgjc$ubeubaubj)rq$}rr$(hfX)``bb_username`` (buildbot login username)rs$hgjJ$hohrhyjh{}rt$(h]h]h~]h}]h]uhNhhh]ru$h)rv$}rw$(hfjs$hgjq$hohrhyhh{}rx$(h]h]h~]h}]h]uhMh]ry$(h)rz$}r{$(hfX``bb_username``h{}r|$(h]h]h~]h}]h]uhgjv$h]r}$hX bb_usernamer~$r$}r$(hfUhgjz$ubahyhubhX (buildbot login username)r$r$}r$(hfX (buildbot login username)hgjv$ubeubaubj)r$}r$(hfX(``bb_password`` (hashed login password) hgjJ$hohrhyjh{}r$(h]h]h~]h}]h]uhNhhh]r$h)r$}r$(hfX'``bb_password`` (hashed login password)hgj$hohrhyhh{}r$(h]h]h~]h}]h]uhMh]r$(h)r$}r$(hfX``bb_password``h{}r$(h]h]h~]h}]h]uhgj$h]r$hX bb_passwordr$r$}r$(hfUhgj$ubahyhubhX (hashed login password)r$r$}r$(hfX (hashed login password)hgj$ubeubaubeubh)r$}r$(hfXtAll attributes are also included in the dictionary, keyed by type. Types colliding with the keys above are ignored.r$hgj$hohrhyhh{}r$(h]h]h~]h}]h]uhMhhh]r$hXtAll attributes are also included in the dictionary, keyed by type. Types colliding with the keys above are ignored.r$r$}r$(hfj$hgj$ubaubjc)r$}r$(hfUhgj$hohrhyjfh{}r$(h}]h~]h]h]h]Uentries]r$(jiXCfindUserByAttr() (buildbot.db.users.UsersConnectorComponent method)hZUtr$auhNhhh]ubj~)r$}r$(hfUhgj$hohrhyjh{}r$(jjXpyh}]h~]h]h]h]jXmethodr$jj$uhNhhh]r$(j)r$}r$(hfX0findUserByAttr(identifier, attr_type, attr_data)hgj$hohrhyjh{}r$(h}]r$hZajj#h~]h]h]h]r$hZajX&UsersConnectorComponent.findUserByAttrjj#juhMhhh]r$(j)r$}r$(hfXfindUserByAttrhgj$hohrhyjh{}r$(h]h]h~]h}]h]uhMhhh]r$hXfindUserByAttrr$r$}r$(hfUhgj$ubaubj<)r$}r$(hfUhgj$hohrhyj?h{}r$(h]h]h~]h}]h]uhMhhh]r$(jB)r$}r$(hfX identifierh{}r$(h]h]h~]h}]h]uhgj$h]r$hX identifierr$r$}r$(hfUhgj$ubahyjJubjB)r$}r$(hfX attr_typeh{}r$(h]h]h~]h}]h]uhgj$h]r$hX attr_typer$r$}r$(hfUhgj$ubahyjJubjB)r$}r$(hfX attr_datah{}r$(h]h]h~]h}]h]uhgj$h]r$hX attr_datar$r$}r$(hfUhgj$ubahyjJubeubeubj)r$}r$(hfUhgj$hohrhyjh{}r$(h]h]h~]h}]h]uhMhhh]r$(jO)r$}r$(hfUhgj$hohrhyjRh{}r$(h]h]h~]h}]h]uhNhhh]r$(jU)r$}r$(hfUh{}r$(h]h]h~]h}]h]uhgj$h]r$(jZ)r$}r$(hfUh{}r$(h]h]h~]h}]h]uhgj$h]r$hX Parametersr$r$}r$(hfUhgj$ubahyjbubjc)r$}r$(hfUh{}r$(h]h]h~]h}]h]uhgj$h]r$j~)r$}r$(hfUh{}r$(h]h]h~]h}]h]uhgj$h]r$(j)r$}r$(hfUh{}r$(h]h]h~]h}]h]uhgj$h]r$h)r$}r$(hfUh{}r$(h]h]h~]h}]h]uhgj$h]r$(jl)r$}r$(hfX identifierh{}r$(h]h]h~]h}]h]uhgj$h]r$hX identifierr$r$}r$(hfUhgj$ubahyjtubhX -- r$r$}r$(hfUhgj$ubhX identifier to use for a new userr$r$}r$(hfX identifier to use for a new userhgj$ubehyhubahyjubj)r$}r$(hfUh{}r%(h]h]h~]h}]h]uhgj$h]r%h)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj$h]r%(jl)r%}r%(hfX attr_typeh{}r%(h]h]h~]h}]h]uhgj%h]r %hX attr_typer %r %}r %(hfUhgj%ubahyjtubhX -- r %r%}r%(hfUhgj%ubhX'attribute type to search for and/or addr%r%}r%(hfX'attribute type to search for and/or addhgj%ubehyhubahyjubj)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj$h]r%h)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%(jl)r%}r%(hfX attr_datah{}r%(h]h]h~]h}]h]uhgj%h]r%hX attr_datar%r %}r!%(hfUhgj%ubahyjtubhX -- r"%r#%}r$%(hfUhgj%ubhXattribute data to addr%%r&%}r'%(hfXattribute data to addhgj%ubehyhubahyjubehyjubahyj{ubehyj|ubjU)r(%}r)%(hfUh{}r*%(h]h]h~]h}]h]uhgj$h]r+%(jZ)r,%}r-%(hfUh{}r.%(h]h]h~]h}]h]uhgj(%h]r/%hXReturnsr0%r1%}r2%(hfUhgj,%ubahyjbubjc)r3%}r4%(hfUh{}r5%(h]h]h~]h}]h]uhgj(%h]r6%h)r7%}r8%(hfUh{}r9%(h]h]h~]h}]h]uhgj3%h]r:%hXuserid via Deferredr;%r<%}r=%(hfXuserid via Deferredhgj7%ubahyhubahyj{ubehyj|ubeubh)r>%}r?%(hfXEGet an existing user, or add a new one, based on the given attribute.r@%hgj$hohrhyhh{}rA%(h]h]h~]h}]h]uhMhhh]rB%hXEGet an existing user, or add a new one, based on the given attribute.rC%rD%}rE%(hfj@%hgj>%ubaubh)rF%}rG%(hfXoThis method is intended for use by other components of Buildbot to search for a user with the given attributes.rH%hgj$hohrhyhh{}rI%(h]h]h~]h}]h]uhMhhh]rJ%hXoThis method is intended for use by other components of Buildbot to search for a user with the given attributes.rK%rL%}rM%(hfjH%hgjF%ubaubh)rN%}rO%(hfXNote 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.hgj$hohrhyhh{}rP%(h]h]h~]h}]h]uhMhhh]rQ%(hX Note that rR%rS%}rT%(hfX Note that hgjN%ubh)rU%}rV%(hfX``identifier``h{}rW%(h]h]h~]h}]h]uhgjN%h]rX%hX identifierrY%rZ%}r[%(hfUhgjU%ubahyhubhX is r\%r]%}r^%(hfX is hgjN%ubjr)r_%}r`%(hfX*not*h{}ra%(h]h]h~]h}]h]uhgjN%h]rb%hXnotrc%rd%}re%(hfUhgj_%ubahyjzubhX 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.rf%rg%}rh%(hfX 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.hgjN%ubeubh)ri%}rj%(hfXLFor future compatibility, always use keyword parameters to call this method.rk%hgj$hohrhyhh{}rl%(h]h]h~]h}]h]uhMhhh]rm%hXLFor future compatibility, always use keyword parameters to call this method.rn%ro%}rp%(hfjk%hgji%ubaubeubeubjc)rq%}rr%(hfUhgj$hohrhyjfh{}rs%(h}]h~]h]h]h]Uentries]rt%(jiX<getUser() (buildbot.db.users.UsersConnectorComponent method)hUtru%auhNhhh]ubj~)rv%}rw%(hfUhgj$hohrhyjh{}rx%(jjXpyry%h}]h~]h]h]h]jXmethodrz%jjz%uhNhhh]r{%(j)r|%}r}%(hfX getUser(uid)hgjv%hohrhyjh{}r~%(h}]r%hajj#h~]h]h]h]r%hajXUsersConnectorComponent.getUserjj#juhM'hhh]r%(j)r%}r%(hfXgetUserhgj|%hohrhyjh{}r%(h]h]h~]h}]h]uhM'hhh]r%hXgetUserr%r%}r%(hfUhgj%ubaubj<)r%}r%(hfUhgj|%hohrhyj?h{}r%(h]h]h~]h}]h]uhM'hhh]r%jB)r%}r%(hfXuidh{}r%(h]h]h~]h}]h]uhgj%h]r%hXuidr%r%}r%(hfUhgj%ubahyjJubaubeubj)r%}r%(hfUhgjv%hohrhyjh{}r%(h]h]h~]h}]h]uhM'hhh]r%(jO)r%}r%(hfUhgj%hohrhyjRh{}r%(h]h]h~]h}]h]uhNhhh]r%(jU)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%(jZ)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%hX Parametersr%r%}r%(hfUhgj%ubahyjbubjc)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%j~)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%(j)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%h)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%(jl)r%}r%(hfXuidh{}r%(h]h]h~]h}]h]uhgj%h]r%hXuidr%r%}r%(hfUhgj%ubahyjtubhX -- r%r%}r%(hfUhgj%ubhXuser id to look upr%r%}r%(hfXuser id to look uphgj%ubehyhubahyjubj)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%h)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%(jl)r%}r%(hfXno_cacheh{}r%(h]h]h~]h}]h]uhgj%h]r%hXno_cacher%r%}r%(hfUhgj%ubahyjtubhX (r%r%}r%(hfUhgj%ubj")r%}r%(hfUh{}r%(Ureftypej$U reftargetXbooleanr%U refdomainjy%h}]h~]U refexplicith]h]h]uhgj%h]r%jr)r%}r%(hfj%h{}r%(h]h]h~]h}]h]uhgj%h]r%hXbooleanr%r%}r%(hfUhgj%ubahyjzubahyj&ubhX)r%}r%(hfUhgj%ubhX -- r%r%}r%(hfUhgj%ubhX+bypass cache and always fetch from databaser%r%}r%(hfX+bypass cache and always fetch from databasehgj%ubehyhubahyjubehyjubahyj{ubehyj|ubjU)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%(jZ)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%hXReturnsr%r%}r%(hfUhgj%ubahyjbubjc)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%h)r%}r%(hfUh{}r%(h]h]h~]h}]h]uhgj%h]r%hXusdict via Deferredr%r%}r%(hfXusdict via Deferredhgj%ubahyhubahyj{ubehyj|ubeubh)r&}r&(hfXJGet a usdict for the given user, or ``None`` if no matching user is found.hgj%hohrhyhh{}r&(h]h]h~]h}]h]uhM%hhh]r&(hX$Get a usdict for the given user, or r&r&}r&(hfX$Get a usdict for the given user, or hgj&ubh)r&}r&(hfX``None``h{}r &(h]h]h~]h}]h]uhgj&h]r &hXNoner &r &}r &(hfUhgj&ubahyhubhX if no matching user is found.r&r&}r&(hfX if no matching user is found.hgj&ubeubeubeubjc)r&}r&(hfUhgj$hohrhyjfh{}r&(h}]h~]h]h]h]Uentries]r&(jiXFgetUserByUsername() (buildbot.db.users.UsersConnectorComponent method)hUtr&auhNhhh]ubj~)r&}r&(hfUhgj$hohrhyjh{}r&(jjXpyr&h}]h~]h]h]h]jXmethodr&jj&uhNhhh]r&(j)r&}r&(hfXgetUserByUsername(username)hgj&hohrhyjh{}r&(h}]r&hajj#h~]h]h]h]r &hajX)UsersConnectorComponent.getUserByUsernamejj#juhM0hhh]r!&(j)r"&}r#&(hfXgetUserByUsernamehgj&hohrhyjh{}r$&(h]h]h~]h}]h]uhM0hhh]r%&hXgetUserByUsernamer&&r'&}r(&(hfUhgj"&ubaubj<)r)&}r*&(hfUhgj&hohrhyj?h{}r+&(h]h]h~]h}]h]uhM0hhh]r,&jB)r-&}r.&(hfXusernameh{}r/&(h]h]h~]h}]h]uhgj)&h]r0&hXusernamer1&r2&}r3&(hfUhgj-&ubahyjJubaubeubj)r4&}r5&(hfUhgj&hohrhyjh{}r6&(h]h]h~]h}]h]uhM0hhh]r7&(jO)r8&}r9&(hfUhgj4&hohrhyjRh{}r:&(h]h]h~]h}]h]uhNhhh]r;&(jU)r<&}r=&(hfUh{}r>&(h]h]h~]h}]h]uhgj8&h]r?&(jZ)r@&}rA&(hfUh{}rB&(h]h]h~]h}]h]uhgj<&h]rC&hX ParametersrD&rE&}rF&(hfUhgj@&ubahyjbubjc)rG&}rH&(hfUh{}rI&(h]h]h~]h}]h]uhgj<&h]rJ&h)rK&}rL&(hfUh{}rM&(h]h]h~]h}]h]uhgjG&h]rN&(jl)rO&}rP&(hfXusernameh{}rQ&(h]h]h~]h}]h]uhgjK&h]rR&hXusernamerS&rT&}rU&(hfUhgjO&ubahyjtubhX (rV&rW&}rX&(hfUhgjK&ubj")rY&}rZ&(hfUh{}r[&(Ureftypej$U reftargetXstringr\&U refdomainj&h}]h~]U refexplicith]h]h]uhgjK&h]r]&jr)r^&}r_&(hfj\&h{}r`&(h]h]h~]h}]h]uhgjY&h]ra&hXstringrb&rc&}rd&(hfUhgj^&ubahyjzubahyj&ubhX)re&}rf&(hfUhgjK&ubhX -- rg&rh&}ri&(hfUhgjK&ubhX$username portion of user credentialsrj&rk&}rl&(hfX$username portion of user credentialshgjK&ubehyhubahyj{ubehyj|ubjU)rm&}rn&(hfUh{}ro&(h]h]h~]h}]h]uhgj8&h]rp&(jZ)rq&}rr&(hfUh{}rs&(h]h]h~]h}]h]uhgjm&h]rt&hXReturnsru&rv&}rw&(hfUhgjq&ubahyjbubjc)rx&}ry&(hfUh{}rz&(h]h]h~]h}]h]uhgjm&h]r{&h)r|&}r}&(hfUh{}r~&(h]h]h~]h}]h]uhgjx&h]r&hXusdict or None via deferredr&r&}r&(hfXusdict or None via deferredhgj|&ubahyhubahyj{ubehyj|ubeubh)r&}r&(hfXfLooks up the user with the bb_username, returning the usdict or ``None`` if no matching user is found.hgj4&hohrhyhh{}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&(hfX@Looks up the user with the bb_username, returning the usdict or hgj&ubh)r&}r&(hfX``None``h{}r&(h]h]h~]h}]h]uhgj&h]r&hXNoner&r&}r&(hfUhgj&ubahyhubhX if no matching user is found.r&r&}r&(hfX if no matching user is found.hgj&ubeubeubeubjc)r&}r&(hfUhgj$hohrhyjfh{}r&(h}]h~]h]h]h]Uentries]r&(jiX=getUsers() (buildbot.db.users.UsersConnectorComponent method)h;Utr&auhNhhh]ubj~)r&}r&(hfUhgj$hohrhyjh{}r&(jjXpyh}]h~]h]h]h]jXmethodr&jj&uhNhhh]r&(j)r&}r&(hfX getUsers()hgj&hohrhyjh{}r&(h}]r&h;ajj#h~]h]h]h]r&h;ajX UsersConnectorComponent.getUsersjj#juhM7hhh]r&(j)r&}r&(hfXgetUsershgj&hohrhyjh{}r&(h]h]h~]h}]h]uhM7hhh]r&hXgetUsersr&r&}r&(hfUhgj&ubaubj<)r&}r&(hfUhgj&hohrhyj?h{}r&(h]h]h~]h}]h]uhM7hhh]ubeubj)r&}r&(hfUhgj&hohrhyjh{}r&(h]h]h~]h}]h]uhM7hhh]r&(jO)r&}r&(hfUhgj&hohrhyjRh{}r&(h]h]h~]h}]h]uhNhhh]r&jU)r&}r&(hfUh{}r&(h]h]h~]h}]h]uhgj&h]r&(jZ)r&}r&(hfUh{}r&(h]h]h~]h}]h]uhgj&h]r&hXReturnsr&r&}r&(hfUhgj&ubahyjbubjc)r&}r&(hfUh{}r&(h]h]h~]h}]h]uhgj&h]r&h)r&}r&(hfUh{}r&(h]h]h~]h}]h]uhgj&h]r&hX$list of partial usdicts via Deferredr&r&}r&(hfX$list of partial usdicts via Deferredhgj&ubahyhubahyj{ubehyj|ubaubh)r&}r&(hfXgGet the entire list of users. User attributes are not included, so the results are not full userdicts.r&hgj&hohrhyhh{}r&(h]h]h~]h}]h]uhM5hhh]r&hXgGet the entire list of users. User attributes are not included, so the results are not full userdicts.r&r&}r&(hfj&hgj&ubaubeubeubjc)r&}r&(hfUhgj$hohrhyjfh{}r&(h}]h~]h]h]h]Uentries]r&(jiX?updateUser() (buildbot.db.users.UsersConnectorComponent method)hIUtr&auhNhhh]ubj~)r&}r&(hfUhgj$hohrhyjh{}r&(jjXpyr&h}]h~]h]h]h]jXmethodr&jj&uhNhhh]r&(j)r&}r&(hfXiupdateUser(uid=None, identifier=None, bb_username=None, bb_password=None, attr_type=None, attr_data=None)hgj&hohrhyjh{}r&(h}]r&hIajj#h~]h]h]h]r&hIajX"UsersConnectorComponent.updateUserjj#juhMNhhh]r&(j)r&}r&(hfX updateUserhgj&hohrhyjh{}r&(h]h]h~]h}]h]uhMNhhh]r&hX updateUserr&r&}r&(hfUhgj&ubaubj<)r&}r&(hfUhgj&hohrhyj?h{}r&(h]h]h~]h}]h]uhMNhhh]r&(jB)r&}r&(hfXuid=Noneh{}r&(h]h]h~]h}]h]uhgj&h]r&hXuid=Noner&r&}r&(hfUhgj&ubahyjJubjB)r&}r&(hfXidentifier=Noneh{}r&(h]h]h~]h}]h]uhgj&h]r&hXidentifier=Noner&r&}r&(hfUhgj&ubahyjJubjB)r&}r&(hfXbb_username=Noneh{}r'(h]h]h~]h}]h]uhgj&h]r'hXbb_username=Noner'r'}r'(hfUhgj&ubahyjJubjB)r'}r'(hfXbb_password=Noneh{}r'(h]h]h~]h}]h]uhgj&h]r'hXbb_password=Noner 'r '}r '(hfUhgj'ubahyjJubjB)r '}r '(hfXattr_type=Noneh{}r'(h]h]h~]h}]h]uhgj&h]r'hXattr_type=Noner'r'}r'(hfUhgj 'ubahyjJubjB)r'}r'(hfXattr_data=Noneh{}r'(h]h]h~]h}]h]uhgj&h]r'hXattr_data=Noner'r'}r'(hfUhgj'ubahyjJubeubeubj)r'}r'(hfUhgj&hohrhyjh{}r'(h]h]h~]h}]h]uhMNhhh]r'(jO)r'}r'(hfUhgj'hohrhyjRh{}r '(h]h]h~]h}]h]uhNhhh]r!'(jU)r"'}r#'(hfUh{}r$'(h]h]h~]h}]h]uhgj'h]r%'(jZ)r&'}r''(hfUh{}r('(h]h]h~]h}]h]uhgj"'h]r)'hX Parametersr*'r+'}r,'(hfUhgj&'ubahyjbubjc)r-'}r.'(hfUh{}r/'(h]h]h~]h}]h]uhgj"'h]r0'j~)r1'}r2'(hfUh{}r3'(h]h]h~]h}]h]uhgj-'h]r4'(j)r5'}r6'(hfUh{}r7'(h]h]h~]h}]h]uhgj1'h]r8'h)r9'}r:'(hfUh{}r;'(h]h]h~]h}]h]uhgj5'h]r<'(jl)r='}r>'(hfXuidh{}r?'(h]h]h~]h}]h]uhgj9'h]r@'hXuidrA'rB'}rC'(hfUhgj='ubahyjtubhX (rD'rE'}rF'(hfUhgj9'ubj")rG'}rH'(hfUh{}rI'(Ureftypej$U reftargetXintrJ'U refdomainj&h}]h~]U refexplicith]h]h]uhgj9'h]rK'jr)rL'}rM'(hfjJ'h{}rN'(h]h]h~]h}]h]uhgjG'h]rO'hXintrP'rQ'}rR'(hfUhgjL'ubahyjzubahyj&ubhX)rS'}rT'(hfUhgj9'ubhX -- rU'rV'}rW'(hfUhgj9'ubhXthe user to changerX'rY'}rZ'(hfXthe user to changehgj9'ubehyhubahyjubj)r['}r\'(hfUh{}r]'(h]h]h~]h}]h]uhgj1'h]r^'h)r_'}r`'(hfUh{}ra'(h]h]h~]h}]h]uhgj['h]rb'(jl)rc'}rd'(hfX identifierh{}re'(h]h]h~]h}]h]uhgj_'h]rf'hX identifierrg'rh'}ri'(hfUhgjc'ubahyjtubhX (rj'rk'}rl'(hfUhgj_'ubj")rm'}rn'(hfUh{}ro'(Ureftypej$U reftargetXstringrp'U refdomainj&h}]h~]U refexplicith]h]h]uhgj_'h]rq'jr)rr'}rs'(hfjp'h{}rt'(h]h]h~]h}]h]uhgjm'h]ru'hXstringrv'rw'}rx'(hfUhgjr'ubahyjzubahyj&ubhX)ry'}rz'(hfUhgj_'ubhX -- r{'r|'}r}'(hfUhgj_'ubhX'(optional) new identifier for this userr~'r'}r'(hfX'(optional) new identifier for this userhgj_'ubehyhubahyjubj)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj1'h]r'h)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj'h]r'(jl)r'}r'(hfX bb_usernameh{}r'(h]h]h~]h}]h]uhgj'h]r'hX bb_usernamer'r'}r'(hfUhgj'ubahyjtubhX (r'r'}r'(hfUhgj'ubj")r'}r'(hfUh{}r'(Ureftypej$U reftargetXstringr'U refdomainj&h}]h~]U refexplicith]h]h]uhgj'h]r'jr)r'}r'(hfj'h{}r'(h]h]h~]h}]h]uhgj'h]r'hXstringr'r'}r'(hfUhgj'ubahyjzubahyj&ubhX)r'}r'(hfUhgj'ubhX -- r'r'}r'(hfUhgj'ubhX (optional) new buildbot usernamer'r'}r'(hfX (optional) new buildbot usernamehgj'ubehyhubahyjubj)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj1'h]r'h)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj'h]r'(jl)r'}r'(hfX bb_passwordh{}r'(h]h]h~]h}]h]uhgj'h]r'hX bb_passwordr'r'}r'(hfUhgj'ubahyjtubhX (r'r'}r'(hfUhgj'ubj")r'}r'(hfUh{}r'(Ureftypej$U reftargetXstringr'U refdomainj&h}]h~]U refexplicith]h]h]uhgj'h]r'jr)r'}r'(hfj'h{}r'(h]h]h~]h}]h]uhgj'h]r'hXstringr'r'}r'(hfUhgj'ubahyjzubahyj&ubhX)r'}r'(hfUhgj'ubhX -- r'r'}r'(hfUhgj'ubhX'(optional) new hashed buildbot passwordr'r'}r'(hfX'(optional) new hashed buildbot passwordhgj'ubehyhubahyjubj)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj1'h]r'h)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj'h]r'(jl)r'}r'(hfX attr_typeh{}r'(h]h]h~]h}]h]uhgj'h]r'hX attr_typer'r'}r'(hfUhgj'ubahyjtubhX (r'r'}r'(hfUhgj'ubj")r'}r'(hfUh{}r'(Ureftypej$U reftargetXstringr'U refdomainj&h}]h~]U refexplicith]h]h]uhgj'h]r'jr)r'}r'(hfj'h{}r'(h]h]h~]h}]h]uhgj'h]r'hXstringr'r'}r'(hfUhgj'ubahyjzubahyj&ubhX)r'}r'(hfUhgj'ubhX -- r'r'}r'(hfUhgj'ubhX#(optional) attribute type to updater'r'}r'(hfX#(optional) attribute type to updatehgj'ubehyhubahyjubj)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj1'h]r'h)r'}r'(hfUh{}r'(h]h]h~]h}]h]uhgj'h]r'(jl)r'}r'(hfX attr_datah{}r'(h]h]h~]h}]h]uhgj'h]r'hX attr_datar'r(}r((hfUhgj'ubahyjtubhX (r(r(}r((hfUhgj'ubj")r(}r((hfUh{}r((Ureftypej$U reftargetXstringr(U refdomainj&h}]h~]U refexplicith]h]h]uhgj'h]r (jr)r (}r ((hfj(h{}r ((h]h]h~]h}]h]uhgj(h]r (hXstringr(r(}r((hfUhgj (ubahyjzubahyj&ubhX)r(}r((hfUhgj'ubhX -- r(r(}r((hfUhgj'ubhX(optional) value for r(r(}r((hfX(optional) value for hgj'ubh)r(}r((hfX ``attr_type``h{}r((h]h]h~]h}]h]uhgj'h]r(hX attr_typer(r(}r((hfUhgj(ubahyhubehyhubahyjubehyjubahyj{ubehyj|ubjU)r (}r!((hfUh{}r"((h]h]h~]h}]h]uhgj'h]r#((jZ)r$(}r%((hfUh{}r&((h]h]h~]h}]h]uhgj (h]r'(hXReturnsr((r)(}r*((hfUhgj$(ubahyjbubjc)r+(}r,((hfUh{}r-((h]h]h~]h}]h]uhgj (h]r.(h)r/(}r0((hfUh{}r1((h]h]h~]h}]h]uhgj+(h]r2(hXDeferredr3(r4(}r5((hfXDeferredhgj/(ubahyhubahyj{ubehyj|ubeubh)r6(}r7((hfXUpdate information about the given user. Only the specified attributes are updated. If no user with the given uid exists, the method will return silently.r8(hgj'hohrhyhh{}r9((h]h]h~]h}]h]uhMHhhh]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=((hfj8(hgj6(ubaubh)r>(}r?((hfXtNote that ``bb_password`` must be given if ``bb_username`` appears; similarly, ``attr_type`` requires ``attr_data``.hgj'hohrhyhh{}r@((h]h]h~]h}]h]uhMLhhh]rA((hX Note that rB(rC(}rD((hfX Note that hgj>(ubh)rE(}rF((hfX``bb_password``h{}rG((h]h]h~]h}]h]uhgj>(h]rH(hX bb_passwordrI(rJ(}rK((hfUhgjE(ubahyhubhX must be given if rL(rM(}rN((hfX must be given if hgj>(ubh)rO(}rP((hfX``bb_username``h{}rQ((h]h]h~]h}]h]uhgj>(h]rR(hX bb_usernamerS(rT(}rU((hfUhgjO(ubahyhubhX appears; similarly, rV(rW(}rX((hfX appears; similarly, hgj>(ubh)rY(}rZ((hfX ``attr_type``h{}r[((h]h]h~]h}]h]uhgj>(h]r\(hX attr_typer](r^(}r_((hfUhgjY(ubahyhubhX requires r`(ra(}rb((hfX requires hgj>(ubh)rc(}rd((hfX ``attr_data``h{}re((h]h]h~]h}]h]uhgj>(h]rf(hX attr_datarg(rh(}ri((hfUhgjc(ubahyhubhX.rj(}rk((hfX.hgj>(ubeubeubeubjc)rl(}rm((hfUhgj$hohrhyjfh{}rn((h}]h~]h]h]h]Uentries]ro((jiX?removeUser() (buildbot.db.users.UsersConnectorComponent method)h5Utrp(auhNhhh]ubj~)rq(}rr((hfUhgj$hohrhyjh{}rs((jjXpyrt(h}]h~]h]h]h]jXmethodru(jju(uhNhhh]rv((j)rw(}rx((hfXremoveUser(uid)hgjq(hohrhyjh{}ry((h}]rz(h5ajj#h~]h]h]h]r{(h5ajX"UsersConnectorComponent.removeUserjj#juhMWhhh]r|((j)r}(}r~((hfX removeUserhgjw(hohrhyjh{}r((h]h]h~]h}]h]uhMWhhh]r(hX removeUserr(r(}r((hfUhgj}(ubaubj<)r(}r((hfUhgjw(hohrhyj?h{}r((h]h]h~]h}]h]uhMWhhh]r(jB)r(}r((hfXuidh{}r((h]h]h~]h}]h]uhgj(h]r(hXuidr(r(}r((hfUhgj(ubahyjJubaubeubj)r(}r((hfUhgjq(hohrhyjh{}r((h]h]h~]h}]h]uhMWhhh]r((jO)r(}r((hfUhgj(hohrhyjRh{}r((h]h]h~]h}]h]uhNhhh]r((jU)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r((jZ)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r(hX Parametersr(r(}r((hfUhgj(ubahyjbubjc)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r(h)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r((jl)r(}r((hfXuidh{}r((h]h]h~]h}]h]uhgj(h]r(hXuidr(r(}r((hfUhgj(ubahyjtubhX (r(r(}r((hfUhgj(ubj")r(}r((hfUh{}r((Ureftypej$U reftargetXintr(U refdomainjt(h}]h~]U refexplicith]h]h]uhgj(h]r(jr)r(}r((hfj(h{}r((h]h]h~]h}]h]uhgj(h]r(hXintr(r(}r((hfUhgj(ubahyjzubahyj&ubhX)r(}r((hfUhgj(ubhX -- r(r(}r((hfUhgj(ubhXthe user to remover(r(}r((hfXthe user to removehgj(ubehyhubahyj{ubehyj|ubjU)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r((jZ)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r(hXReturnsr(r(}r((hfUhgj(ubahyjbubjc)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r(h)r(}r((hfUh{}r((h]h]h~]h}]h]uhgj(h]r(hXDeferredr(r(}r((hfXDeferredhgj(ubahyhubahyj{ubehyj|ubeubh)r(}r((hfXtRemove the user with the given uid from the database. This will remove the user from any associated tables as well.r(hgj(hohrhyhh{}r((h]h]h~]h}]h]uhMUhhh]r(hXtRemove the user with the given uid from the database. This will remove the user from any associated tables as well.r(r(}r((hfj(hgj(ubaubeubeubjc)r(}r((hfUhgj$hohrhyjfh{}r((h}]h~]h]h]h]Uentries]r((jiXDidentifierToUid() (buildbot.db.users.UsersConnectorComponent method)hNUtr(auhNhhh]ubj~)r(}r((hfUhgj$hohrhyjh{}r((jjXpyr(h}]h~]h]h]h]jXmethodr(jj(uhNhhh]r((j)r(}r((hfXidentifierToUid(identifier)hgj(hohrhyjh{}r((h}]r(hNajj#h~]h]h]h]r(hNajX'UsersConnectorComponent.identifierToUidjj#juhM^hhh]r((j)r(}r((hfXidentifierToUidhgj(hohrhyjh{}r((h]h]h~]h}]h]uhM^hhh]r(hXidentifierToUidr(r(}r((hfUhgj(ubaubj<)r(}r((hfUhgj(hohrhyj?h{}r)(h]h]h~]h}]h]uhM^hhh]r)jB)r)}r)(hfX identifierh{}r)(h]h]h~]h}]h]uhgj(h]r)hX identifierr)r)}r)(hfUhgj)ubahyjJubaubeubj)r )}r )(hfUhgj(hohrhyjh{}r )(h]h]h~]h}]h]uhM^hhh]r )(jO)r )}r)(hfUhgj )hohrhyjRh{}r)(h]h]h~]h}]h]uhNhhh]r)(jU)r)}r)(hfUh{}r)(h]h]h~]h}]h]uhgj )h]r)(jZ)r)}r)(hfUh{}r)(h]h]h~]h}]h]uhgj)h]r)hX Parametersr)r)}r)(hfUhgj)ubahyjbubjc)r)}r)(hfUh{}r)(h]h]h~]h}]h]uhgj)h]r)h)r )}r!)(hfUh{}r")(h]h]h~]h}]h]uhgj)h]r#)(jl)r$)}r%)(hfX identifierh{}r&)(h]h]h~]h}]h]uhgj )h]r')hX identifierr()r))}r*)(hfUhgj$)ubahyjtubhX (r+)r,)}r-)(hfUhgj )ubj")r.)}r/)(hfUh{}r0)(Ureftypej$U reftargetXstringr1)U refdomainj(h}]h~]U refexplicith]h]h]uhgj )h]r2)jr)r3)}r4)(hfj1)h{}r5)(h]h]h~]h}]h]uhgj.)h]r6)hXstringr7)r8)}r9)(hfUhgj3)ubahyjzubahyj&ubhX)r:)}r;)(hfUhgj )ubhX -- r<)r=)}r>)(hfUhgj )ubhXidentifier to search forr?)r@)}rA)(hfXidentifier to search forhgj )ubehyhubahyj{ubehyj|ubjU)rB)}rC)(hfUh{}rD)(h]h]h~]h}]h]uhgj )h]rE)(jZ)rF)}rG)(hfUh{}rH)(h]h]h~]h}]h]uhgjB)h]rI)hXReturnsrJ)rK)}rL)(hfUhgjF)ubahyjbubjc)rM)}rN)(hfUh{}rO)(h]h]h~]h}]h]uhgjB)h]rP)h)rQ)}rR)(hfUh{}rS)(h]h]h~]h}]h]uhgjM)h]rT)(hXuid or rU)rV)}rW)(hfXuid or hgjQ)ubh)rX)}rY)(hfX``None``h{}rZ)(h]h]h~]h}]h]uhgjQ)h]r[)hXNoner\)r])}r^)(hfUhgjX)ubahyhubhX, via Deferredr_)r`)}ra)(hfX, via DeferredhgjQ)ubehyhubahyj{ubehyj|ubeubh)rb)}rc)(hfX4Fetch a uid for the given identifier, if one exists.rd)hgj )hohrhyhh{}re)(h]h]h~]h}]h]uhM^hhh]rf)hX4Fetch a uid for the given identifier, if one exists.rg)rh)}ri)(hfjd)hgjb)ubaubeubeubeubeubeubeubhkhh)rj)}rk)(hfUhghmhohrht}rl)hhv)rm)}rn)(hfX".. _Modifying-the-Database-Schema:hghh)ro)}rp)(hfUhghkhohrhyhh{}rq)(h]h]h~]h}]rr)Utestsrs)ah]rt)hauhM2hhh]ru)(h)rv)}rw)(hfXTestsrx)hgjo)hohrhyhh{}ry)(h]h]h~]h}]h]uhM2hhh]rz)hXTestsr{)r|)}r})(hfjx)hgjv)ubaubh)r~)}r)(hfXKIt goes without saying that any new connector methods must be fully tested!r)hgjo)hohrhyhh{}r)(h]h]h~]h}]h]uhM4hhh]r)hXKIt goes without saying that any new connector methods must be fully tested!r)r)}r)(hfj)hgj~)ubaubh)r)}r)(hfXYou 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.hgjo)hohrhyhh{}r)(h]h]h~]h}]h]uhM6hhh]r)(hX\You will also want to add an in-memory implementation of the methods to the fake classes in r)r)}r)(hfX\You will also want to add an in-memory implementation of the methods to the fake classes in hgj)ubh)r)}r)(hfX'``master/buildbot/test/fake/fakedb.py``h{}r)(h]h]h~]h}]h]uhgj)h]r)hX#master/buildbot/test/fake/fakedb.pyr)r)}r)(hfUhgj)ubahyhubhXx. Non-DB Buildbot code is tested using these fake implementations in order to isolate that code from the database code.r)r)}r)(hfXx. Non-DB Buildbot code is tested using these fake implementations in order to isolate that code from the database code.hgj)ubeubjm)eubhohrhyhzh{}r)(h}]h~]h]h]h]hUmodifying-the-database-schemar)uhM;hhh]ubshyhh{}r)(h]h]h~]h}]r)(j)Uid2r)eh]r)(h heuhM>hhh}r)j)jm)sh]r)(h)r)}r)(hfXModifying the Database Schemar)hgjj)hohrhyhh{}r)(h]h]h~]h}]h]uhM>hhh]r)hXModifying the Database Schemar)r)}r)(hfj)hgj)ubaubh)r)}r)(hfXChanges 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.hgjj)hohrhyhh{}r)(h]h]h~]h}]h]uhM@hhh]r)(hXOChanges to the schema are accomplished through migration scripts, supported by r)r)}r)(hfXOChanges to the schema are accomplished through migration scripts, supported by hgj)ubj)r)}r)(hfXD`SQLAlchemy-Migrate `_h{}r)(UnameXSQLAlchemy-MigratejX,http://code.google.com/p/sqlalchemy-migrate/r)h}]h~]h]h]h]uhgj)h]r)hXSQLAlchemy-Migrater)r)}r)(hfUhgj)ubahyj ubhv)r)}r)(hfX/ j Khgj)hyhzh{}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)(hfX. In fact, even new databases are created with the migration scripts -- a new database is a migrated version of an empty database.hgj)ubeubh)r)}r)(hfXThe 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.hgjj)hohrhyhh{}r)(h]h]h~]h}]h]uhMEhhh]r)(hX9The schema is tracked by a version number, stored in the r)r)}r)(hfX9The schema is tracked by a version number, stored in the hgj)ubh)r)}r)(hfX``migrate_version``h{}r)(h]h]h~]h}]h]uhgj)h]r)hXmigrate_versionr)r)}r)(hfUhgj)ubahyhubhX 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)(hfX 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.hgj)ubeubh)r)}r)(hfXTo 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)hgjj)hohrhyhh{}r)(h]h]h~]h}]h]uhMJhhh]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)(hfj)hgj)ubaubh)r)}r)(hfXCreate 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.hgjj)hohrhyhh{}r)(h]h]h~]h}]h]uhMNhhh]r)(hXCreate a new script in r)r)}r)(hfXCreate a new script in hgj)ubj)r)}r)(hfUh{}r)(Ureftitler)X#master/buildbot/db/migrate/versionsr)jXThttps://github.com/buildbot/buildbot/blob/master/master/buildbot/db/migrate/versionsh}]h~]h]h]h]uhgj)h]r)h)r)}r)(hfj)h{}r)(h]h]h~]h}]h]uhgj)h]r)hX#master/buildbot/db/migrate/versionsr)r)}r)(hfUhgj)ubahyhubahyj ubhXM, following the numbering scheme already present. The script should have an r)r)}r)(hfXM, following the numbering scheme already present. The script should have an hgj)ubh)r)}r)(hfX ``update``h{}r)(h]h]h~]h}]h]uhgj)h]r)hXupdater)r)}r)(hfUhgj)ubahyhubhXO 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.r)r)}r)(hfXO 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.hgj)ubeubh)r)}r)(hfXNext, 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.hgjj)hohrhyhh{}r)(h]h]h~]h}]h]uhMVhhh]r)(hX Next, modify r)r)}r*(hfX Next, modify hgj)ubj)r*}r*(hfUh{}r*(j)Xmaster/buildbot/db/model.pyr*jXLhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/db/model.pyh}]h~]h]h]h]uhgj)h]r*h)r*}r*(hfj*h{}r*(h]h]h~]h}]h]uhgj*h]r *hXmaster/buildbot/db/model.pyr *r *}r *(hfUhgj*ubahyhubahyj ubhXP 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.r *r*}r*(hfXP 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.hgj)ubeubh)r*}r*(hfX|Also, adjust the fake database table definitions in :bb:src:`master/buildbot/test/fake/fakedb.py` according to your changes.hgjj)hohrhyhh{}r*(h]h]h~]h}]h]uhM]hhh]r*(hX4Also, adjust the fake database table definitions in r*r*}r*(hfX4Also, adjust the fake database table definitions in hgj*ubj)r*}r*(hfUh{}r*(j)X#master/buildbot/test/fake/fakedb.pyr*jXThttps://github.com/buildbot/buildbot/blob/master/master/buildbot/test/fake/fakedb.pyh}]h~]h]h]h]uhgj*h]r*h)r*}r*(hfj*h{}r*(h]h]h~]h}]h]uhgj*h]r*hX#master/buildbot/test/fake/fakedb.pyr *r!*}r"*(hfUhgj*ubahyhubahyj ubhX according to your changes.r#*r$*}r%*(hfX according to your changes.hgj*ubeubh)r&*}r'*(hfXYour 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`.hgjj)hohrhyhh{}r(*(h]h]h~]h}]h]uhM`hhh]r)*(hX<Your upgrade script should have unit tests. The classes in r**r+*}r,*(hfX<Your upgrade script should have unit tests. The classes in hgj&*ubj)r-*}r.*(hfUh{}r/*(j)X&master/buildbot/test/util/migration.pyr0*jXWhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/test/util/migration.pyh}]h~]h]h]h]uhgj&*h]r1*h)r2*}r3*(hfj0*h{}r4*(h]h]h~]h}]h]uhgj-*h]r5*hX&master/buildbot/test/util/migration.pyr6*r7*}r8*(hfUhgj2*ubahyhubahyj ubhXD make this straightforward. Unit test scripts should be named e.g., r9*r:*}r;*(hfXD make this straightforward. Unit test scripts should be named e.g., hgj&*ubh)r<*}r=*(hfUh{}r>*(h}]h~]h]h]r?*Xfiler@*aUrolej@*h]uhgj&*h]rA*hX:test_db_migrate_versions_015_remove_bad_master_objectid.pyrB*rC*}rD*(hfX:test_db_migrate_versions_015_remove_bad_master_objectid.pyhgj<*ubahyhubhX.rE*}rF*(hfX.hgj&*ubeubh)rG*}rH*(hfX0The :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`.hgjj)hohrhyhh{}rI*(h]h]h~]h}]h]uhMehhh]rJ*(hXThe rK*rL*}rM*(hfXThe hgjG*ubh)rN*}rO*(hfUh{}rP*(h}]h~]h]h]rQ*XfilerR*aUrolejR*h]uhgjG*h]rS*hX0master/buildbot/test/integration/test_upgrade.pyrT*rU*}rV*(hfX0master/buildbot/test/integration/test_upgrade.pyhgjN*ubahyhubhX 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 rW*rX*}rY*(hfX 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 hgjG*ubh)rZ*}r[*(hfX``implied_indexes``h{}r\*(h]h]h~]h}]h]uhgjG*h]r]*hXimplied_indexesr^*r_*}r`*(hfUhgjZ*ubahyhubhX in ra*rb*}rc*(hfX in hgjG*ubh)rd*}re*(hfUh{}rf*(h}]h~]h]h]rg*Xfilerh*aUrolejh*h]uhgjG*h]ri*hXmaster/buidlbot/db/model.pyrj*rk*}rl*(hfXmaster/buidlbot/db/model.pyhgjd*ubahyhubhX.rm*}rn*(hfX.hgjG*ubeubeubhh)ro*}rp*(hfUhghmhohrhyhh{}rq*(h]h]h~]h}]rr*Udatabase-compatibility-notesrs*ah]rt*hMauhMlhhh]ru*(h)rv*}rw*(hfXDatabase Compatibility Notesrx*hgjo*hohrhyhh{}ry*(h]h]h~]h}]h]uhMlhhh]rz*hXDatabase Compatibility Notesr{*r|*}r}*(hfjx*hgjv*ubaubh)r~*}r*(hfX;Or: "If you thought any database worked right, think again"r*hgjo*hohrhyhh{}r*(h]h]h~]h}]h]uhMnhhh]r*hX;Or: "If you thought any database worked right, think again"r*r*}r*(hfj*hgj~*ubaubh)r*}r*(hfXBecause 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*hgjo*hohrhyhh{}r*(h]h]h~]h}]h]uhMphhh]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*(hfj*hgj*ubaubh)r*}r*(hfXIn 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*hgjo*hohrhyhh{}r*(h]h]h~]h}]h]uhMthhh]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*(hfj*hgj*ubaubh)r*}r*(hfX~The metabuildbot tests Buildbot against all supported databases, so most compatibility errors will be caught before a release.r*hgjo*hohrhyhh{}r*(h]h]h~]h}]h]uhMyhhh]r*hX~The metabuildbot tests Buildbot against all supported databases, so most compatibility errors will be caught before a release.r*r*}r*(hfj*hgj*ubaubhh)r*}r*(hfUhgjo*hohrhyhh{}r*(h]h]h~]h}]r*Uindex-length-in-mysqlr*ah]r*hauhM}hhh]r*(h)r*}r*(hfXIndex Length in MySQLr*hgj*hohrhyhh{}r*(h]h]h~]h}]h]uhM}hhh]r*hXIndex Length in MySQLr*r*}r*(hfj*hgj*ubaubjc)r*}r*(hfUhgj*hohrhyjfh{}r*(h}]h~]h]h]h]jn]r*(jiXMySQL; limitationsUindex-18r*Utr*ajsuhMhhh]ubhv)r*}r*(hfUhgj*hohrhyhzh{}r*(h}]h~]h]h]h]hj*uhMhhh]ubh)r*}r*(hfXMySQL 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.hgj*hohrht}hyhh{}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*(hfXMySQL 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 hgj*ubj)r*}r*(hfXo`"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 utf8jX%http://bugs.mysql.com/bug.php?id=4541r*h}]h~]h]h]h]uhgj*h]r*hXD"Specified key was too long; max key length is 1000 bytes" with utf8r*r*}r*(hfUhgj*ubahyj ubhv)r*}r*(hfX( j Khgj*hyhzh{}r*(Urefurij*h}]r*UAspecified-key-was-too-long-max-key-length-is-1000-bytes-with-utf8r*ah~]h]h]h]r*hQauh]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*(hfX. While this makes sense for indexes used for record lookup, it limits the ability to use unique indexes to prevent duplicate rows.hgj*ubeubh)r*}r*(hfXInnoDB has even more severe restrictions on key lengths, which is why the MySQL implementation requires a MyISAM storage engine.r*hgj*hohrhyhh{}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*(hfj*hgj*ubaubeubhh)r*}r*(hfUhgjo*hohrhyhh{}r*(h]h]h~]h}]r*Utransactions-in-mysqlr*ah]r*h-auhMhhh]r*(h)r*}r*(hfXTransactions in MySQLr*hgj*hohrhyhh{}r*(h]h]h~]h}]h]uhMhhh]r*hXTransactions in MySQLr*r*}r*(hfj*hgj*ubaubjc)r*}r*(hfUhgj*hohrhyjfh{}r*(h}]h~]h]h]h]jn]r*(jiXMySQL; limitationsUindex-19r*Utr*ajsuhMhhh]ubhv)r*}r*(hfUhgj*hohrhyhzh{}r*(h}]h~]h]h]h]hj*uhMhhh]ubh)r*}r*(hfXUnfortunately, 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.hgj*hohrht}hyhh{}r*(h]h]h~]h}]r*j*ah]uhMhhh}r*j*j*sh]r*(hXWUnfortunately, use of the MyISAM storage engine precludes real transactions in MySQL. r*r*}r*(hfXWUnfortunately, use of the MyISAM storage engine precludes real transactions in MySQL. hgj*ubh)r*}r*(hfX``transaction.commit()``h{}r*(h]h]h~]h}]h]uhgj*h]r*hXtransaction.commit()r*r*}r*(hfUhgj*ubahyhubhX and r+r+}r+(hfX and hgj*ubh)r+}r+(hfX``transaction.rollback()``h{}r+(h]h]h~]h}]h]uhgj*h]r+hXtransaction.rollback()r+r+}r +(hfUhgj+ubahyhubhX are essentially no-ops: modifications to data in the database are visible to other users immediately, and are not reverted in a rollback.r +r +}r +(hfX are essentially no-ops: modifications to data in the database are visible to other users immediately, and are not reverted in a rollback.hgj*ubeubeubhh)r +}r+(hfUhgjo*hohrhyhh{}r+(h]h]h~]h}]r+U)referential-integrity-in-sqlite-and-mysqlr+ah]r+h#auhMhhh]r+(h)r+}r+(hfX)Referential Integrity in SQLite and MySQLr+hgj +hohrhyhh{}r+(h]h]h~]h}]h]uhMhhh]r+hX)Referential Integrity in SQLite and MySQLr+r+}r+(hfj+hgj+ubaubjc)r+}r+(hfUhgj +hohrhyjfh{}r+(h}]h~]h]h]h]jn]r+(jiXSQLite; limitationsUindex-20r +Utr!+ajsuhMhhh]ubhv)r"+}r#+(hfUhgj +hohrhyhzh{}r$+(h]h]h~]h}]r%+j +ah]uhMhhh]ubjc)r&+}r'+(hfUhgj +hohrhyjfh{}r(+(h}]h~]h]h]h]jn]r)+(jiXMySQL; limitationsUindex-21r*+Utr++ajsuhMhhh]ubhv)r,+}r-+(hfUhgj +hohrhyhzh{}r.+(h}]h~]h]h]h]hj*+uhMhhh]ubh)r/+}r0+(hfXNeither 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.r1+hgj +hohrht}hyhh{}r2+(h]h]h~]h}]r3+j*+ah]uhMhhh}r4+j*+j,+sh]r5+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.r6+r7+}r8+(hfj1+hgj/+ubaubeubhh)r9+}r:+(hfUhgjo*hohrhyhh{}r;+(h]h]h~]h}]r<+Usubqueries-in-mysqlr=+ah]r>+h auhMhhh]r?+(h)r@+}rA+(hfXSubqueries in MySQLrB+hgj9+hohrhyhh{}rC+(h]h]h~]h}]h]uhMhhh]rD+hXSubqueries in MySQLrE+rF+}rG+(hfjB+hgj@+ubaubjc)rH+}rI+(hfUhgj9+hohrhyjfh{}rJ+(h}]h~]h]h]h]jn]rK+(jiXMySQL; limitationsUindex-22rL+UtrM+ajsuhMhhh]ubhv)rN+}rO+(hfUhgj9+hohrhyhzh{}rP+(h}]h~]h]h]h]hjL+uhMhhh]ubh)rQ+}rR+(hfXMySQL'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.rS+hgj9+hohrht}hyhh{}rT+(h]h]h~]h}]rU+jL+ah]uhMhhh}rV+jL+jN+sh]rW+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.rX+rY+}rZ+(hfjS+hgjQ+ubaubh)r[+}r\+(hfXIf this weakness has a significant performance impact, it would be acceptable to conditionalize use of the subquery on the database dialect.r]+hgj9+hohrhyhh{}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`+ra+}rb+(hfj]+hgj[+ubaubeubeubeubhohrhyhh{}rc+(h]h]h~]h}]rd+U"writing-database-connector-methodsre+ah]rf+hTauhMahhh]rg+(h)rh+}ri+(hfX"Writing Database Connector Methodsrj+hghkhohrhyhh{}rk+(h]h]h~]h}]h]uhMahhh]rl+hX"Writing Database Connector Methodsrm+rn+}ro+(hfjj+hgjh+ubaubh)rp+}rq+(hfX<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.rr+hghkhohrhyhh{}rs+(h]h]h~]h}]h]uhMchhh]rt+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.ru+rv+}rw+(hfjr+hgjp+ubaubcdocutils.nodes warning rx+)ry+}rz+(hfXIt'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!hghkhohrhyUwarningr{+h{}r|+(h]h]h~]h}]h]uhNhhh]r}+h)r~+}r+(hfXIt'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+hgjy+hohrhyhh{}r+(h]h]h~]h}]h]uhMkh]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+(hfj+hgj~+ubaubaubhh)r+}r+(hfUhghkhohrhyhh{}r+(h]h]h~]h}]r+(Xmodule-buildbot.db.connectorr+Uthe-db-connector-and-componentsr+eh]r+h9auhMphhh]r+(h)r+}r+(hfXThe DB Connector and Componentsr+hgj+hohrhyhh{}r+(h]h]h~]h}]h]uhMphhh]r+hXThe DB Connector and Componentsr+r+}r+(hfj+hgj+ubaubjc)r+}r+(hfUhgj+hohrhyjfh{}r+(h}]h~]h]h]h]Uentries]r+(jiXbuildbot.db.connector (module)Xmodule-buildbot.db.connectorUtr+auhMshhh]ubjc)r+}r+(hfUhgj+hohrhyjfh{}r+(h}]h~]h]h]h]Uentries]r+(jiX,DBConnector (class in buildbot.db.connector)h1Utr+auhNhhh]ubj~)r+}r+(hfUhgj+hohrhyjh{}r+(jjXpyh}]h~]h]h]h]jXclassr+jj+uhNhhh]r+(j)r+}r+(hfX DBConnectorr+hgj+hohrhyjh{}r+(h}]r+h1ajXbuildbot.db.connectorr+h~]h]h]h]r+h1ajj+jUjuhM}hhh]r+(j)r+}r+(hfXclass hgj+hohrhyjh{}r+(h]h]h~]h}]h]uhM}hhh]r+hXclass r+r+}r+(hfUhgj+ubaubj)r+}r+(hfXbuildbot.db.connector.hgj+hohrhyjh{}r+(h]h]h~]h}]h]uhM}hhh]r+hXbuildbot.db.connector.r+r+}r+(hfUhgj+ubaubj)r+}r+(hfj+hgj+hohrhyjh{}r+(h]h]h~]h}]h]uhM}hhh]r+hX DBConnectorr+r+}r+(hfUhgj+ubaubeubj)r+}r+(hfUhgj+hohrhyjh{}r+(h]h]h~]h}]h]uhM}hhh]r+(h)r+}r+(hfXThe root of the database connectors, ``master.db``, is a :class:`~buildbot.db.connector.DBConnector` instance. Its main purpose is to hold reference to each of the connector components, but it also handles timed cleanup tasks.hgj+hohrhyhh{}r+(h]h]h~]h}]h]uhMvhhh]r+(hX%The root of the database connectors, r+r+}r+(hfX%The root of the database connectors, hgj+ubh)r+}r+(hfX ``master.db``h{}r+(h]h]h~]h}]h]uhgj+h]r+hX master.dbr+r+}r+(hfUhgj+ubahyhubhX, is a r+r+}r+(hfX, is a hgj+ubj")r+}r+(hfX+:class:`~buildbot.db.connector.DBConnector`r+hgj+hohrhyj&h{}r+(UreftypeXclassj(j)X!buildbot.db.connector.DBConnectorU refdomainXpyr+h}]h~]U refexplicith]h]h]j+j,j-j+j.j+uhMvh]r+h)r+}r+(hfj+h{}r+(h]h]r+(j4j+Xpy-classr+eh~]h}]h]uhgj+h]r+hX DBConnectorr+r+}r+(hfUhgj+ubahyhubaubhX instance. Its main purpose is to hold reference to each of the connector components, but it also handles timed cleanup tasks.r+r+}r+(hfX instance. Its main purpose is to hold reference to each of the connector components, but it also handles timed cleanup tasks.hgj+ubeubh)r+}r+(hfXxIf you are adding a new connector component, import its module and create an instance of it in this class's constructor.r+hgj+hohrhyhh{}r+(h]h]h~]h}]h]uhM{hhh]r+hXxIf you are adding a new connector component, import its module and create an instance of it in this class's constructor.r+r+}r+(hfj+hgj+ubaubeubeubhv)r+}r+(hfUhgj+hohrhyhzh{}r+(h]h}]r+Xmodule-buildbot.db.baser+ah~]Uismodh]h]uhMhhh]ubjc)r+}r+(hfUhgj+hohrhyjfh{}r+(h}]h~]h]h]h]Uentries]r+(jiXbuildbot.db.base (module)Xmodule-buildbot.db.baseUtr+auhMhhh]ubjc)r+}r+(hfUhgj+hoNhyjfh{}r+(h}]h~]h]h]h]Uentries]r+(jiX0DBConnectorComponent (class in buildbot.db.base)hKUtr+auhNhhh]ubj~)r,}r,(hfUhgj+hoNhyjh{}r,(jjXpyh}]h~]h]h]h]jXclassr,jj,uhNhhh]r,(j)r,}r,(hfXDBConnectorComponentr,hgj,hohrhyjh{}r,(h}]r ,hKajXbuildbot.db.baser ,h~]h]h]h]r ,hKajj,jUjuhMhhh]r ,(j)r ,}r,(hfXclass hgj,hohrhyjh{}r,(h]h]h~]h}]h]uhMhhh]r,hXclass r,r,}r,(hfUhgj ,ubaubj)r,}r,(hfXbuildbot.db.base.hgj,hohrhyjh{}r,(h]h]h~]h}]h]uhMhhh]r,hXbuildbot.db.base.r,r,}r,(hfUhgj,ubaubj)r,}r,(hfj,hgj,hohrhyjh{}r,(h]h]h~]h}]h]uhMhhh]r,hXDBConnectorComponentr,r ,}r!,(hfUhgj,ubaubeubj)r",}r#,(hfUhgj,hohrhyjh{}r$,(h]h]h~]h}]h]uhMhhh]r%,(h)r&,}r',(hfX0This is the base class for connector components.r(,hgj",hohrhyhh{}r),(h]h]h~]h}]h]uhMhhh]r*,hX0This is the base class for connector components.r+,r,,}r-,(hfj(,hgj&,ubaubh)r.,}r/,(hfXOThere should be no need to override the constructor defined by this base class.r0,hgj",hohrhyhh{}r1,(h]h]h~]h}]h]uhMhhh]r2,hXOThere should be no need to override the constructor defined by this base class.r3,r4,}r5,(hfj0,hgj.,ubaubjc)r6,}r7,(hfUhgj",hohrhyjfh{}r8,(h}]h~]h]h]h]Uentries]r9,(jiX4db (buildbot.db.base.DBConnectorComponent attribute)hAUtr:,auhNhhh]ubj~)r;,}r<,(hfUhgj",hohrhyjh{}r=,(jjXpyh}]h~]h]h]h]jX attributer>,jj>,uhNhhh]r?,(j)r@,}rA,(hfXdbrB,hgj;,hohrhyjh{}rC,(h}]rD,hAajj ,h~]h]h]h]rE,hAajXDBConnectorComponent.dbjj,juhMhhh]rF,j)rG,}rH,(hfjB,hgj@,hohrhyjh{}rI,(h]h]h~]h}]h]uhMhhh]rJ,hXdbrK,rL,}rM,(hfUhgjG,ubaubaubj)rN,}rO,(hfUhgj;,hohrhyjh{}rP,(h]h]h~]h}]h]uhMhhh]rQ,h)rR,}rS,(hfXA 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``.hgjN,hohrhyhh{}rT,(h]h]h~]h}]h]uhMhhh]rU,(hXA reference to the rV,rW,}rX,(hfXA reference to the hgjR,ubj")rY,}rZ,(hfX+:class:`~buildbot.db.connector.DBConnector`r[,hgjR,hohrhyj&h{}r\,(UreftypeXclassj(j)X!buildbot.db.connector.DBConnectorU refdomainXpyr],h}]h~]U refexplicith]h]h]j+j,j-j,j.j ,uhMh]r^,h)r_,}r`,(hfj[,h{}ra,(h]h]rb,(j4j],Xpy-classrc,eh~]h}]h]uhgjY,h]rd,hX DBConnectorre,rf,}rg,(hfUhgj_,ubahyhubaubhX-, so that connector components can use e.g., rh,ri,}rj,(hfX-, so that connector components can use e.g., hgjR,ubh)rk,}rl,(hfX``self.db.pool``h{}rm,(h]h]h~]h}]h]uhgjR,h]rn,hX self.db.poolro,rp,}rq,(hfUhgjk,ubahyhubhX or rr,rs,}rt,(hfX or hgjR,ubh)ru,}rv,(hfX``self.db.model``h{}rw,(h]h]h~]h}]h]uhgjR,h]rx,hX self.db.modelry,rz,}r{,(hfUhgju,ubahyhubhXb. In the unusual case that a connector component needs access to the master, the easiest path is r|,r},}r~,(hfXb. In the unusual case that a connector component needs access to the master, the easiest path is hgjR,ubh)r,}r,(hfX``self.db.master``h{}r,(h]h]h~]h}]h]uhgjR,h]r,hXself.db.masterr,r,}r,(hfUhgj,ubahyhubhX.r,}r,(hfX.hgjR,ubeubaubeubeubeubeubhihh)r,}r,(hfUhghkhohrhyhh{}r,(h]h]h~]h}]r,(Xmodule-buildbot.db.modelr,Udatabase-schemar,eh]r,h6auhMhhh]r,(h)r,}r,(hfXDatabase Schemar,hgj,hohrhyhh{}r,(h]h]h~]h}]h]uhMhhh]r,hXDatabase Schemar,r,}r,(hfj,hgj,ubaubjc)r,}r,(hfUhgj,hohrhyjfh{}r,(h}]h~]h]h]h]Uentries]r,(jiXbuildbot.db.model (module)Xmodule-buildbot.db.modelUtr,auhMhhh]ubh)r,}r,(hfXDatabase connector methods access the database through SQLAlchemy, which requires access to Python objects representing the database tables. That is handled through the model.r,hgj,hohrhyhh{}r,(h]h]h~]h}]h]uhMhhh]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,(hfj,hgj,ubaubjc)r,}r,(hfUhgj,hoNhyjfh{}r,(h}]h~]h]h]h]Uentries]r,(jiX"Model (class in buildbot.db.model)h]Utr,auhNhhh]ubj~)r,}r,(hfUhgj,hoNhyjh{}r,(jjXpyh}]h~]h]h]h]jXclassr,jj,uhNhhh]r,(j)r,}r,(hfXModelr,hgj,hohrhyjh{}r,(h}]r,h]ajXbuildbot.db.modelr,h~]h]h]h]r,h]ajj,jUjuhMhhh]r,(j)r,}r,(hfXclass hgj,hohrhyjh{}r,(h]h]h~]h}]h]uhMhhh]r,hXclass r,r,}r,(hfUhgj,ubaubj)r,}r,(hfXbuildbot.db.model.hgj,hohrhyjh{}r,(h]h]h~]h}]h]uhMhhh]r,hXbuildbot.db.model.r,r,}r,(hfUhgj,ubaubj)r,}r,(hfj,hgj,hohrhyjh{}r,(h]h]h~]h}]h]uhMhhh]r,hXModelr,r,}r,(hfUhgj,ubaubeubj)r,}r,(hfUhgj,hohrhyjh{}r,(h]h]h~]h}]h]uhMhhh]r,(h)r,}r,(hfXThis 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.hgj,hohrhyhh{}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,(hfXpThis class contains the canonical description of the buildbot schema, It is presented in the form of SQLAlchemy hgj,ubj")r,}r,(hfX3:class:`Table `r,hgj,hohrhyj&h{}r,(UreftypeXclassj(j)X"sqlalchemy:sqlalchemy.schema.TableU refdomainXpyr,h}]h~]U refexplicith]h]h]j+j,j-j,j.j,uhMh]r,h)r,}r,(hfj,h{}r,(h]h]r,(j4j,Xpy-classr,eh~]h}]h]uhgj,h]r,hXTabler,r,}r,(hfUhgj,ubahyhubaubhXG instances, as class variables. At runtime, the model is available at r,r,}r,(hfXG instances, as class variables. At runtime, the model is available at hgj,ubh)r,}r,(hfX``master.db.model``h{}r,(h]h]h~]h}]h]uhgj,h]r,hXmaster.db.modelr,r,}r,(hfUhgj,ubahyhubhX, so for example the r,r,}r,(hfX, so for example the hgj,ubh)r,}r,(hfX``buildrequests``h{}r,(h]h]h~]h}]h]uhgj,h]r,hX buildrequestsr,r,}r,(hfUhgj,ubahyhubhX table can be referred to as r,r,}r,(hfX table can be referred to as hgj,ubh)r,}r,(hfX!``master.db.model.buildrequests``h{}r,(h]h]h~]h}]h]uhgj,h]r-hXmaster.db.model.buildrequestsr-r-}r-(hfUhgj,ubahyhubhX#, and columns are available in its r-r-}r-(hfX#, and columns are available in its hgj,ubh)r-}r-(hfX``c``h{}r -(h]h]h~]h}]h]uhgj,h]r -hXcr -}r -(hfUhgj-ubahyhubhX attribute.r -r-}r-(hfX attribute.hgj,ubeubh)r-}r-(hfXThe source file, :bb:src:`master/buildbot/db/model.py`, contains comments describing each table; that information is not replicated in this documentation.hgj,hohrhyhh{}r-(h]h]h~]h}]h]uhMhhh]r-(hXThe source file, r-r-}r-(hfXThe source file, hgj-ubj)r-}r-(hfUh{}r-(j)Xmaster/buildbot/db/model.pyr-jXLhttps://github.com/buildbot/buildbot/blob/master/master/buildbot/db/model.pyh}]h~]h]h]h]uhgj-h]r-h)r-}r-(hfj-h{}r-(h]h]h~]h}]h]uhgj-h]r-hXmaster/buildbot/db/model.pyr -r!-}r"-(hfUhgj-ubahyhubahyj ubhXd, contains comments describing each table; that information is not replicated in this documentation.r#-r$-}r%-(hfXd, contains comments describing each table; that information is not replicated in this documentation.hgj-ubeubh)r&-}r'-(hfXNote that the model is not used for new installations or upgrades of the Buildbot database. See :ref:`Modifying-the-Database-Schema` for more information.hgj,hohrhyhh{}r(-(h]h]h~]h}]h]uhMhhh]r)-(hXaNote that the model is not used for new installations or upgrades of the Buildbot database. See r*-r+-}r,-(hfXaNote that the model is not used for new installations or upgrades of the Buildbot database. See hgj&-ubj")r--}r.-(hfX$:ref:`Modifying-the-Database-Schema`r/-hgj&-hohrhyj&h{}r0-(UreftypeXrefj(j)Xmodifying-the-database-schemaU refdomainXstdr1-h}]h~]U refexplicith]h]h]j+j,uhMh]r2-jr)r3-}r4-(hfj/-h{}r5-(h]h]r6-(j4j1-Xstd-refr7-eh~]h}]h]uhgj--h]r8-hXModifying-the-Database-Schemar9-r:-}r;-(hfUhgj3-ubahyjzubaubhX for more information.r<-r=-}r>-(hfX for more information.hgj&-ubeubjc)r?-}r@-(hfUhgj,hohrhyjfh{}rA-(h}]h~]h]h]h]Uentries]rB-(jiX,metadata (buildbot.db.model.Model attribute)hUtrC-auhNhhh]ubj~)rD-}rE-(hfUhgj,hohrhyjh{}rF-(jjXpyh}]h~]h]h]h]jX attributerG-jjG-uhNhhh]rH-(j)rI-}rJ-(hfXmetadatarK-hgjD-hohrhyjh{}rL-(h}]rM-hajj,h~]h]h]h]rN-hajXModel.metadatajj,juhMhhh]rO-j)rP-}rQ-(hfjK-hgjI-hohrhyjh{}rR-(h]h]h~]h}]h]uhMhhh]rS-hXmetadatarT-rU-}rV-(hfUhgjP-ubaubaubj)rW-}rX-(hfUhgjD-hohrhyjh{}rY-(h]h]h~]h}]h]uhMhhh]rZ-h)r[-}r\-(hfXThe 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.hgjW-hohrhyhh{}r]-(h]h]h~]h}]h]uhMhhh]r^-(hXThe model object also has a r_-r`-}ra-(hfXThe model object also has a hgj[-ubh)rb-}rc-(hfX ``metadata``h{}rd-(h]h]h~]h}]h]uhgj[-h]re-hXmetadatarf-rg-}rh-(hfUhgjb-ubahyhubhX attribute containing a ri-rj-}rk-(hfX attribute containing a hgj[-ubj")rl-}rm-(hfX9:class:`MetaData `rn-hgj[-hohrhyj&h{}ro-(UreftypeXclassj(j)X%sqlalchemy:sqlalchemy.schema.MetaDataU refdomainXpyrp-h}]h~]U refexplicith]h]h]j+j,j-j,j.j,uhMh]rq-h)rr-}rs-(hfjn-h{}rt-(h]h]ru-(j4jp-Xpy-classrv-eh~]h}]h]uhgjl-h]rw-hXMetaDatarx-ry-}rz-(hfUhgjr-ubahyhubaubhXl instance. Connector methods should not need to access this object. The metadata is not bound to an engine.r{-r|-}r}-(hfXl instance. Connector methods should not need to access this object. The metadata is not bound to an engine.hgj[-ubeubaubeubh)r~-}r-(hfXHThe :py:class:`Model` class also defines some migration-related methods:r-hgj,hohrhyhh{}r-(h]h]h~]h}]h]uhMhhh]r-(hXThe r-r-}r-(hfXThe hgj~-ubj")r-}r-(hfX:py:class:`Model`r-hgj~-hohrhyj&h{}r-(UreftypeXclassj(j)XModelU refdomainXpyr-h}]h~]U refexplicith]h]h]j+j,j-j,j.j,uhMh]r-h)r-}r-(hfj-h{}r-(h]h]r-(j4j-Xpy-classr-eh~]h}]h]uhgj-h]r-hXModelr-r-}r-(hfUhgj-ubahyhubaubhX3 class also defines some migration-related methods:r-r-}r-(hfX3 class also defines some migration-related methods:hgj~-ubeubjc)r-}r-(hfUhgj,hohrhyjfh{}r-(h}]h~]h]h]h]Uentries]r-(jiX-is_current() (buildbot.db.model.Model method)h%Utr-auhNhhh]ubj~)r-}r-(hfUhgj,hohrhyjh{}r-(jjXpyh}]h~]h]h]h]jXmethodr-jj-uhNhhh]r-(j)r-}r-(hfX is_current()hgj-hohrhyjh{}r-(h}]r-h%ajj,h~]h]h]h]r-h%ajXModel.is_currentjj,juhMhhh]r-(j)r-}r-(hfX is_currenthgj-hohrhyjh{}r-(h]h]h~]h}]h]uhMhhh]r-hX is_currentr-r-}r-(hfUhgj-ubaubj<)r-}r-(hfUhgj-hohrhyj?h{}r-(h]h]h~]h}]h]uhMhhh]ubeubj)r-}r-(hfUhgj-hohrhyjh{}r-(h]h]h~]h}]h]uhMhhh]r-(jO)r-}r-(hfUhgj-hohrhyjRh{}r-(h]h]h~]h}]h]uhNhhh]r-jU)r-}r-(hfUh{}r-(h]h]h~]h}]h]uhgj-h]r-(jZ)r-}r-(hfUh{}r-(h]h]h~]h}]h]uhgj-h]r-hXReturnsr-r-}r-(hfUhgj-ubahyjbubjc)r-}r-(hfUh{}r-(h]h]h~]h}]h]uhgj-h]r-h)r-}r-(hfUh{}r-(h]h]h~]h}]h]uhgj-h]r-hXboolean via Deferredr-r-}r-(hfXboolean via Deferredhgj-ubahyhubahyj{ubehyj|ubaubh)r-}r-(hfX:Returns true if the current database's version is current.r-hgj-hohrhyhh{}r-(h]h]h~]h}]h]uhMhhh]r-hX:Returns true if the current database's version is current.r-r-}r-(hfj-hgj-ubaubeubeubjc)r-}r-(hfUhgj,hohrhyjfh{}r-(h}]h~]h]h]h]Uentries]r-(jiX*upgrade() (buildbot.db.model.Model method)hWUtr-auhNhhh]ubj~)r-}r-(hfUhgj,hohrhyjh{}r-(jjXpyh}]h~]h]h]h]jXmethodr-jj-uhNhhh]r-(j)r-}r-(hfX upgrade()r-hgj-hohrhyjh{}r-(h}]r-hWajj,h~]h]h]h]r-hWajX Model.upgradejj,juhMhhh]r-(j)r-}r-(hfXupgradehgj-hohrhyjh{}r-(h]h]h~]h}]h]uhMhhh]r-hXupgrader-r-}r-(hfUhgj-ubaubj<)r-}r-(hfUhgj-hohrhyj?h{}r-(h]h]h~]h}]h]uhMhhh]ubeubj)r-}r-(hfUhgj-hohrhyjh{}r-(h]h]h~]h}]h]uhMhhh]r-(jO)r-}r-(hfUhgj-hohrhyjRh{}r-(h]h]h~]h}]h]uhNhhh]r-jU)r-}r-(hfUh{}r-(h]h]h~]h}]h]uhgj-h]r-(jZ)r-}r.(hfUh{}r.(h]h]h~]h}]h]uhgj-h]r.hXReturnsr.r.}r.(hfUhgj-ubahyjbubjc)r.}r.(hfUh{}r.(h]h]h~]h}]h]uhgj-h]r .h)r .}r .(hfUh{}r .(h]h]h~]h}]h]uhgj.h]r .hXDeferredr.r.}r.(hfXDeferredr.hgj .ubahyhubahyj{ubehyj|ubaubh)r.}r.(hfX8Upgrades the database to the most recent schema version.r.hgj-hohrhyhh{}r.(h]h]h~]h}]h]uhMhhh]r.hX8Upgrades the database to the most recent schema version.r.r.}r.(hfj.hgj.ubaubeubeubeubeubeubhh)r.}r.(hfUhghkhohrhyhh{}r.(h]h]h~]h}]r.Ucachingr.ah]r.h\auhMhhh]r .(h)r!.}r".(hfXCachingr#.hgj.hohrhyhh{}r$.(h]h]h~]h}]h]uhMhhh]r%.hXCachingr&.r'.}r(.(hfj#.hgj!.ubaubh)r).}r*.(hfXConnector 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:hgj.hohrhyhh{}r+.(h]h]h~]h}]h]uhM hhh]r,.(hXdConnector component methods that get an object based on an ID are good candidates for caching. The r-.r..}r/.(hfXdConnector component methods that get an object based on an ID are good candidates for caching. The hgj).ubj")r0.}r1.(hfX :func:`~buildbot.db.base.cached`r2.hgj).hohrhyj&h{}r3.(UreftypeXfuncj(j)Xbuildbot.db.base.cachedU refdomainXpyr4.h}]h~]U refexplicith]h]h]j+j,j-Nj.Xbuildbot.db.baser5.uhM h]r6.h)r7.}r8.(hfj2.h{}r9.(h]h]r:.(j4j4.Xpy-funcr;.eh~]h}]h]uhgj0.h]r<.hXcachedr=.r>.}r?.(hfUhgj7.ubahyhubaubhX decorator makes this automatic:r@.rA.}rB.(hfX decorator makes this automatic:hgj).ubeubjc)rC.}rD.(hfUhgj.hohrhyjfh{}rE.(h}]h~]h]h]h]Uentries]rF.(jiX%cached() (in module buildbot.db.base)h>UtrG.auhNhhh]ubj~)rH.}rI.(hfUhgj.hohrhyjh{}rJ.(jjXpyh}]h~]h]h]h]jXfunctionrK.jjK.uhNhhh]rL.(j)rM.}rN.(hfXcached(cachename)rO.hgjH.hohrhyjh{}rP.(h}]rQ.h>ajj5.h~]h]h]h]rR.h>ajXcachedrS.jUjuhMhhh]rT.(j)rU.}rV.(hfXbuildbot.db.base.hgjM.hohrhyjh{}rW.(h]h]h~]h}]h]uhMhhh]rX.hXbuildbot.db.base.rY.rZ.}r[.(hfUhgjU.ubaubj)r\.}r].(hfjS.hgjM.hohrhyjh{}r^.(h]h]h~]h}]h]uhMhhh]r_.hXcachedr`.ra.}rb.(hfUhgj\.ubaubj<)rc.}rd.(hfUhgjM.hohrhyj?h{}re.(h]h]h~]h}]h]uhMhhh]rf.jB)rg.}rh.(hfX cachenameh{}ri.(h]h]h~]h}]h]uhgjc.h]rj.hX cachenamerk.rl.}rm.(hfUhgjg.ubahyjJubaubeubj)rn.}ro.(hfUhgjH.hohrhyjh{}rp.(h]h]h~]h}]h]uhMhhh]rq.(jO)rr.}rs.(hfUhgjn.hohrhyjRh{}rt.(h]h]h~]h}]h]uhNhhh]ru.jU)rv.}rw.(hfUh{}rx.(h]h]h~]h}]h]uhgjr.h]ry.(jZ)rz.}r{.(hfUh{}r|.(h]h]h~]h}]h]uhgjv.h]r}.hX Parametersr~.r.}r.(hfUhgjz.ubahyjbubjc)r.}r.(hfUh{}r.(h]h]h~]h}]h]uhgjv.h]r.h)r.}r.(hfUh{}r.(h]h]h~]h}]h]uhgj.h]r.(jl)r.}r.(hfX cache_nameh{}r.(h]h]h~]h}]h]uhgj.h]r.hX cache_namer.r.}r.(hfUhgj.ubahyjtubhX -- r.r.}r.(hfUhgj.ubhXname of the cache to user.r.}r.(hfXname of the cache to user.hgj.ubehyhubahyj{ubehyj|ubaubh)r.}r.(hfXA 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.r.hgjn.hohrhyhh{}r.(h]h]h~]h}]h]uhMhhh]r.hXA 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.r.r.}r.(hfj.hgj.ubaubh)r.}r.(hfXThe 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.hgjn.hohrhyhh{}r.(h]h]h~]h}]h]uhMhhh]r.(hXdThe wrapped function must take one argument (the key); the wrapper will take a key plus an optional r.r.}r.(hfXdThe wrapped function must take one argument (the key); the wrapper will take a key plus an optional hgj.ubh)r.}r.(hfX ``no_cache``h{}r.(h]h]h~]h}]h]uhgj.h]r.hXno_cacher.r.}r.(hfUhgj.ubahyhubhXh argument which, if true, will cause it to invoke the underlying method even if the key is in the cache.r.r.}r.(hfXh argument which, if true, will cause it to invoke the underlying method even if the key is in the cache.hgj.ubeubh)r.}r.(hfXfThe resulting method will have a ``cache`` attribute which can be used to access the underlying cache.hgjn.hohrhyhh{}r.(h]h]h~]h}]h]uhMhhh]r.(hX!The resulting method will have a r.r.}r.(hfX!The resulting method will have a hgj.ubh)r.}r.(hfX ``cache``h{}r.(h]h]h~]h}]h]uhgj.h]r.hXcacher.r.}r.(hfUhgj.ubahyhubhX< attribute which can be used to access the underlying cache.r.r.}r.(hfX< attribute which can be used to access the underlying cache.hgj.ubeubeubeubh)r.}r.(hfXIn 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::hgj.hohrhyhh{}r.(h]h]h~]h}]h]uhMhhh]r.(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 r.r.}r.(hfXIn 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 hgj.ubh)r.}r.(hfX``dict``h{}r.(h]h]h~]h}]h]uhgj.h]r.hXdictr.r.}r.(hfUhgj.ubahyhubhX0. The whole assembly looks something like this:r.r.}r.(hfX0. The whole assembly looks something like this:hgj.ubeubcdocutils.nodes literal_block r.)r.}r.(hfX2class 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)hgj.hohrhyU literal_blockr.h{}r.(jjh}]h~]h]h]h]uhM$hhh]r.hX2class 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.r.}r.(hfUhgj.ubaubeubjo)eubhohrhyhh{}r.(h]h]h~]h}]r.(Xmodule-buildbot.db.poolr.Udirect-database-accessr.eh]r.hauhMhhh]r.(h)r.}r.(hfXDirect Database Accessr.hghihohrhyhh{}r.(h]h]h~]h}]h]uhMhhh]r.hXDirect Database Accessr.r.}r.(hfj.hgj.ubaubjc)r.}r.(hfUhghihohrhyjfh{}r.(h}]h~]h]h]h]Uentries]r.(jiXbuildbot.db.pool (module)Xmodule-buildbot.db.poolUtr.auhMhhh]ubh)r.}r.(hfXThe 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.hghihohrhyhh{}r.(h]h]h~]h}]h]uhMhhh]r.(hXThe connectors all use r.r.}r.(hfXThe connectors all use hgj.ubj)r.}r.(hfX>`SQLAlchemy Core `_h{}r.(UnameXSQLAlchemy CorejX)http://www.sqlalchemy.org/docs/index.htmlr.h}]h~]h]h]h]uhgj.h]r.hXSQLAlchemy Corer.r.}r.(hfUhgj.ubahyj ubhv)r.}r.(hfX, j Khgj.hyhzh{}r.(Urefurij.h}]r/Uid1r/ah~]h]r/Xsqlalchemy corer/ah]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 r/r/}r/(hfX 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 hgj.ubj")r/}r/(hfX:class:`~buildbot.db.pool.Pool`r /hgj.hohrhyj&h{}r /(UreftypeXclassj(j)Xbuildbot.db.pool.PoolU refdomainXpyr /h}]h~]U refexplicith]h]h]j+j,j-Nj.Xbuildbot.db.poolr /uhMh]r /h)r/}r/(hfj /h{}r/(h]h]r/(j4j /Xpy-classr/eh~]h}]h]uhgj/h]r/hXPoolr/r/}r/(hfUhgj/ubahyhubaubhX! class takes care of the details.r/r/}r/(hfX! class takes care of the details.hgj.ubeubh)r/}r/(hfX*A connector method should look like this::r/hghihohrhyhh{}r/(h]h]h~]h}]h]uhMhhh]r/hX)A connector method should look like this:r/r /}r!/(hfX)A connector method should look like this:hgj/ubaubj.)r"/}r#/(hfXdef 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)hghihohrhyj.h{}r$/(jjh}]h~]h]h]h]uhMhhh]r%/hXdef 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)r&/r'/}r(/(hfUhgj"/ubaubh)r)/}r*/(hfXPicking 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``.hghihohrhyhh{}r+/(h]h]h~]h}]h]uhMhhh]r,/(hXDPicking that apart, the body of the method defines a function named r-/r./}r//(hfXDPicking that apart, the body of the method defines a function named hgj)/ubh)r0/}r1/(hfX``thd``h{}r2/(h]h]h~]h}]h]uhgj)/h]r3/hXthdr4/r5/}r6/(hfUhgj0/ubahyhubhX taking one argument, a r7/r8/}r9/(hfX taking one argument, a hgj)/ubj")r:/}r;/(hfXB:class:`Connection `r/h}]h~]U refexplicith]h]h]j+j,j-Nj.j /uhMh]r?/h)r@/}rA/(hfj/Xpy-classrD/eh~]h}]h]uhgj:/h]rE/hX ConnectionrF/rG/}rH/(hfUhgj@/ubahyhubaubhX object. It then calls rI/rJ/}rK/(hfX object. It then calls hgj)/ubh)rL/}rM/(hfX``self.db.pool.do``h{}rN/(h]h]h~]h}]h]uhgj)/h]rO/hXself.db.pool.dorP/rQ/}rR/(hfUhgjL/ubahyhubhX, passing the rS/rT/}rU/(hfX, passing the hgj)/ubh)rV/}rW/(hfX``thd``h{}rX/(h]h]h~]h}]h]uhgj)/h]rY/hXthdrZ/r[/}r\/(hfUhgjV/ubahyhubhXl function. This function is called in a thread, and can make blocking calls to SQLAlchemy as desired. The r]/r^/}r_/(hfXl function. This function is called in a thread, and can make blocking calls to SQLAlchemy as desired. The hgj)/ubh)r`/}ra/(hfX``do``h{}rb/(h]h]h~]h}]h]uhgj)/h]rc/hXdord/re/}rf/(hfUhgj`/ubahyhubhXG method will return a Deferred that will fire with the return value of rg/rh/}ri/(hfXG method will return a Deferred that will fire with the return value of hgj)/ubh)rj/}rk/(hfX``thd``h{}rl/(h]h]h~]h}]h]uhgj)/h]rm/hXthdrn/ro/}rp/(hfUhgjj/ubahyhubhX:, or with a failure representing any exceptions raised by rq/rr/}rs/(hfX:, or with a failure representing any exceptions raised by hgj)/ubh)rt/}ru/(hfX``thd``h{}rv/(h]h]h~]h}]h]uhgj)/h]rw/hXthdrx/ry/}rz/(hfUhgjt/ubahyhubhX.r{/}r|/(hfX.hgj)/ubeubh)r}/}r~/(hfXThe 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.hghihohrhyhh{}r/(h]h]h~]h}]h]uhMhhh]r/(hXThe return value of r/r/}r/(hfXThe return value of hgj}/ubh)r/}r/(hfX``thd``h{}r/(h]h]h~]h}]h]uhgj}/h]r/hXthdr/r/}r/(hfUhgj/ubahyhubhX7 must not be an SQLAlchemy object - in particular, any r/r/}r/(hfX7 must not be an SQLAlchemy object - in particular, any hgj}/ubj")r/}r/(hfXD:class:`ResultProxy `r/hgj}/hohrhyj&h{}r/(UreftypeXclassj(j)X-sqlalchemy:sqlalchemy.engine.base.ResultProxyU refdomainXpyr/h}]h~]U refexplicith]h]h]j+j,j-Nj.j /uhMh]r/h)r/}r/(hfj/h{}r/(h]h]r/(j4j/Xpy-classr/eh~]h}]h]uhgj/h]r/hX ResultProxyr/r/}r/(hfUhgj/ubahyhubaubhXU objects must be parsed into lists or other data structures before they are returned.r/r/}r/(hfXU objects must be parsed into lists or other data structures before they are returned.hgj}/ubeubjx+)r/}r/(hfXAs 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.hghihohrhyj{+h{}r/(h]h]h~]h}]h]uhNhhh]r/h)r/}r/(hfXAs 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.hgj/hohrhyhh{}r/(h]h]h~]h}]h]uhMh]r/(hX As the name r/r/}r/(hfX As the name hgj/ubh)r/}r/(hfX``thd``h{}r/(h]h]h~]h}]h]uhgj/h]r/hXthdr/r/}r/(hfUhgj/ubahyhubhX 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.r/r/}r/(hfX 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.hgj/ubeubaubh)r/}r/(hfXQueries 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``.hghihohrhyhh{}r/(h]h]h~]h}]h]uhMhhh]r/(hXWQueries can be constructed using any of the SQLAlchemy core methods, using tables from r/r/}r/(hfXWQueries can be constructed using any of the SQLAlchemy core methods, using tables from hgj/ubj")r/}r/(hfX!:class:`~buildbot.db.model.Model`r/hgj/hohrhyj&h{}r/(UreftypeXclassj(j)Xbuildbot.db.model.ModelU refdomainXpyr/h}]h~]U refexplicith]h]h]j+j,j-Nj.j /uhMh]r/h)r/}r/(hfj/h{}r/(h]h]r/(j4j/Xpy-classr/eh~]h}]h]uhgj/h]r/hXModelr/r/}r/(hfUhgj/ubahyhubaubhX+, and executed with the connection object, r/r/}r/(hfX+, and executed with the connection object, hgj/ubh)r/}r/(hfX``conn``h{}r/(h]h]h~]h}]h]uhgj/h]r/hXconnr/r/}r/(hfUhgj/ubahyhubhX.r/}r/(hfX.hgj/ubeubjc)r/}r/(hfUhghihoNhyjfh{}r/(h}]h~]h]h]h]Uentries]r/(jiX(DBThreadPool (class in buildbot.db.pool)hRUtr/auhNhhh]ubj~)r/}r/(hfUhghihoNhyjh{}r/(jjXpyh}]h~]h]h]h]jXclassr/jj/uhNhhh]r/(j)r/}r/(hfX DBThreadPoolr/hgj/hohrhyjh{}r/(h}]r/hRajj /h~]h]h]h]r/hRajj/jUjuhMhhh]r/(j)r/}r/(hfXclass hgj/hohrhyjh{}r/(h]h]h~]h}]h]uhMhhh]r/hXclass r/r/}r/(hfUhgj/ubaubj)r/}r/(hfXbuildbot.db.pool.hgj/hohrhyjh{}r/(h]h]h~]h}]h]uhMhhh]r/hXbuildbot.db.pool.r/r/}r/(hfUhgj/ubaubj)r/}r/(hfj/hgj/hohrhyjh{}r/(h]h]h~]h}]h]uhMhhh]r/hX DBThreadPoolr/r/}r/(hfUhgj/ubaubeubj)r/}r/(hfUhgj/hohrhyjh{}r/(h]h]h~]h}]h]uhMhhh]r0(jc)r0}r0(hfUhgj/hohrhyjfh{}r0(h}]h~]h]h]h]Uentries]r0(jiX+do() (buildbot.db.pool.DBThreadPool method)hUtr0auhNhhh]ubj~)r0}r0(hfUhgj/hohrhyjh{}r0(jjXpyh}]h~]h]h]h]jXmethodr 0jj 0uhNhhh]r 0(j)r 0}r 0(hfXdo(callable, ...)hgj0hohrhyjh{}r 0(h}]r0hajj /h~]h]h]h]r0hajXDBThreadPool.dojj/juhMhhh]r0(j)r0}r0(hfXdohgj 0hohrhyjh{}r0(h]h]h~]h}]h]uhMhhh]r0hXdor0r0}r0(hfUhgj0ubaubj<)r0}r0(hfUhgj 0hohrhyj?h{}r0(h]h]h~]h}]h]uhMhhh]r0(jB)r0}r0(hfXcallableh{}r0(h]h]h~]h}]h]uhgj0h]r0hXcallabler 0r!0}r"0(hfUhgj0ubahyjJubjB)r#0}r$0(hfX...h{}r%0(h]h]h~]h}]h]uhgj0h]r&0hX...r'0r(0}r)0(hfUhgj#0ubahyjJubeubeubj)r*0}r+0(hfUhgj0hohrhyjh{}r,0(h]h]h~]h}]h]uhMhhh]r-0(jO)r.0}r/0(hfUhgj*0hohrhyjRh{}r00(h]h]h~]h}]h]uhNhhh]r10jU)r20}r30(hfUh{}r40(h]h]h~]h}]h]uhgj.0h]r50(jZ)r60}r70(hfUh{}r80(h]h]h~]h}]h]uhgj20h]r90hXReturnsr:0r;0}r<0(hfUhgj60ubahyjbubjc)r=0}r>0(hfUh{}r?0(h]h]h~]h}]h]uhgj20h]r@0h)rA0}rB0(hfUh{}rC0(h]h]h~]h}]h]uhgj=0h]rD0hXDeferredrE0rF0}rG0(hfXDeferredrH0hgjA0ubahyhubahyj{ubehyj|ubaubh)rI0}rJ0(hfXCall ``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.hgj*0hohrhyhh{}rK0(h]h]h~]h}]h]uhMhhh]rL0(hXCall rM0rN0}rO0(hfXCall hgjI0ubh)rP0}rQ0(hfX ``callable``h{}rR0(h]h]h~]h}]h]uhgjI0h]rS0hXcallablerT0rU0}rV0(hfUhgjP0ubahyhubhX in a thread, with a rW0rX0}rY0(hfX in a thread, with a hgjI0ubj")rZ0}r[0(hfXB:class:`Connection `r\0hgjI0hohrhyj&h{}r]0(UreftypeXclassj(j)X,sqlalchemy:sqlalchemy.engine.base.ConnectionU refdomainXpyr^0h}]h~]U refexplicith]h]h]j+j,j-j/j.j /uhMh]r_0h)r`0}ra0(hfj\0h{}rb0(h]h]rc0(j4j^0Xpy-classrd0eh~]h}]h]uhgjZ0h]re0hX Connectionrf0rg0}rh0(hfUhgj`0ubahyhubaubhX 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.ri0rj0}rk0(hfX 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.hgjI0ubeubh)rl0}rm0(hfXJAny additional positional or keyword arguments are passed to ``callable``.hgj*0hohrhyhh{}rn0(h]h]h~]h}]h]uhMhhh]ro0(hX=Any additional positional or keyword arguments are passed to rp0rq0}rr0(hfX=Any additional positional or keyword arguments are passed to hgjl0ubh)rs0}rt0(hfX ``callable``h{}ru0(h]h]h~]h}]h]uhgjl0h]rv0hXcallablerw0rx0}ry0(hfUhgjs0ubahyhubhX.rz0}r{0(hfX.hgjl0ubeubeubeubjc)r|0}r}0(hfUhgj/hohrhyjfh{}r~0(h}]h~]h]h]h]Uentries]r0(jiX7do_with_engine() (buildbot.db.pool.DBThreadPool method)h` object as first argument.hgj0hohrhyhh{}r0(h]h]h~]h}]h]uhMhhh]r0(hX Similar to r0r0}r0(hfX Similar to hgj0ubj")r0}r0(hfX :meth:`do`r0hgj0hohrhyj&h{}r0(UreftypeXmethj(j)XdoU refdomainXpyr0h}]h~]U refexplicith]h]h]j+j,j-j/j.j /uhMh]r0h)r0}r0(hfj0h{}r0(h]h]r0(j4j0Xpy-methr0eh~]h}]h]uhgj0h]r0hXdor0r0}r0(hfUhgj0ubahyhubaubhX, call r0r0}r0(hfX, call hgj0ubh)r0}r0(hfX ``callable``h{}r0(h]h]h~]h}]h]uhgj0h]r0hXcallabler0r0}r0(hfUhgj0ubahyhubhX in a thread, but with an r0r0}r0(hfX in a thread, but with an hgj0ubj")r0}r0(hfX::class:`Engine `r0hgj0hohrhyj&h{}r0(UreftypeXclassj(j)X(sqlalchemy:sqlalchemy.engine.base.EngineU refdomainXpyr0h}]h~]U refexplicith]h]h]j+j,j-j/j.j /uhMh]r0h)r0}r0(hfj0h{}r0(h]h]r0(j4j0Xpy-classr0eh~]h}]h]uhgj0h]r0hXEnginer0r0}r0(hfUhgj0ubahyhubaubhX object as first argument.r0r0}r0(hfX object as first argument.hgj0ubeubh)r0}r0(hfX]This method is only used for schema manipulation, and should not be used in a running master.r0hgj0hohrhyhh{}r0(h]h]h~]h}]h]uhMhhh]r0hX]This method is only used for schema manipulation, and should not be used in a running master.r0r0}r0(hfj0hgj0ubaubeubeubeubeubeubhohrhyUsystem_messager1h{}r1(h]UlevelKh}]h~]r1j/aUsourcehrh]h]UlineKUtypeUINFOr1uhMhhh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhghdh]r1hX2Duplicate explicit target name: "sqlalchemy core".r 1r 1}r 1(hfUhgj1ubahyhubaubhc)r 1}r 1(hfUhgjj)hohrhyj1h{}r1(h]UlevelKh}]h~]r1j)aUsourcehrh]h]UlineKUtypej1uhMChhh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj 1h]r1hX5Duplicate explicit target name: "sqlalchemy-migrate".r1r1}r1(hfUhgj1ubahyhubaubeUcurrent_sourcer1NU decorationr1NUautofootnote_startr1KUnameidsr1}r1(hhhhhjm h h h j)h j=+h jXh h hjs)hhhj)hhhj*hhhhhhhhhjHhhhhhhhhhj.hhhhhhh h h!h!h"j h#j+h$h$h%h%h&j h'h'h(h(h)j7h*h*h+h+h,hh-j*h.jh/jh0h0h1h1h2h2h3h3h4h4h5h5h6j,h7h7h8h8h9j+h:jh;h;hh>h?jh@h@hAhAhBhhChChDhDhEhEhFhFhGhGhHhHhIhIhJhJhKhKhLhLhMjs*hNhNhOj#hPhPhQj*hRhRhSjhTje+hUhUhVhVhWhWhXhhYhYhZhZh[h[h\j.h]h]h^h^uh]r1(hwhmehfUU transformerr1NU footnote_refsr1}r 1Urefnamesr!1}r"1Usymbol_footnotesr#1]r$1Uautofootnote_refsr%1]r&1Usymbol_footnote_refsr'1]r(1U citationsr)1]r*1hhU current_liner+1NUtransform_messagesr,1]r-1(hc)r.1}r/1(hfUh{}r01(h]UlevelKh}]h~]Usourcehrh]h]UlineKUtypej1uh]r11h)r21}r31(hfUh{}r41(h]h]h~]h}]h]uhgj.1h]r51hX8Hyperlink target "developer-database" is not referenced.r61r71}r81(hfUhgj21ubahyhubahyj1ubhc)r91}r:1(hfUh{}r;1(h]UlevelKh}]h~]Usourcehrh]h]UlineK8Utypej1uh]r<1h)r=1}r>1(hfUh{}r?1(h]h]h~]h}]h]uhgj91h]r@1hX-Hyperlink target "index-0" is not referenced.rA1rB1}rC1(hfUhgj=1ubahyhubahyj1ubhc)rD1}rE1(hfUh{}rF1(h]UlevelKh}]h~]Usourcehrh]h]UlineKLUtypej1uh]rG1h)rH1}rI1(hfUh{}rJ1(h]h]h~]h}]h]uhgjD1h]rK1hX-Hyperlink target "index-1" is not referenced.rL1rM1}rN1(hfUhgjH1ubahyhubahyj1ubhc)rO1}rP1(hfUh{}rQ1(h]UlevelKh}]h~]Usourcehrh]h]UlineKUtypej1uh]rR1h)rS1}rT1(hfUh{}rU1(h]h]h~]h}]h]uhgjO1h]rV1hX-Hyperlink target "index-2" is not referenced.rW1rX1}rY1(hfUhgjS1ubahyhubahyj1ubhc)rZ1}r[1(hfUh{}r\1(h]UlevelKh}]h~]Usourcehrh]h]UlineKUtypej1uh]r]1h)r^1}r_1(hfUh{}r`1(h]h]h~]h}]h]uhgjZ1h]ra1hX-Hyperlink target "index-3" is not referenced.rb1rc1}rd1(hfUhgj^1ubahyhubahyj1ubhc)re1}rf1(hfUh{}rg1(h]UlevelKh}]h~]Usourcehrh]h]UlineKUtypej1uh]rh1h)ri1}rj1(hfUh{}rk1(h]h]h~]h}]h]uhgje1h]rl1hX-Hyperlink target "index-4" is not referenced.rm1rn1}ro1(hfUhgji1ubahyhubahyj1ubhc)rp1}rq1(hfUh{}rr1(h]UlevelKh}]h~]Usourcehrh]h]UlineKUtypej1uh]rs1h)rt1}ru1(hfUh{}rv1(h]h]h~]h}]h]uhgjp1h]rw1hX-Hyperlink target "index-5" is not referenced.rx1ry1}rz1(hfUhgjt1ubahyhubahyj1ubhc)r{1}r|1(hfUh{}r}1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r~1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj{1h]r1hX-Hyperlink target "index-6" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineM$Utypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX-Hyperlink target "index-7" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX-Hyperlink target "index-8" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX-Hyperlink target "index-9" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-10" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-11" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMCUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-12" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMNUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-13" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-14" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-15" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-16" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r1(hfUh{}r1(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r1h)r1}r1(hfUh{}r1(h]h]h~]h}]h]uhgj1h]r1hX.Hyperlink target "index-17" is not referenced.r1r1}r1(hfUhgj1ubahyhubahyj1ubhc)r1}r2(hfUh{}r2(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r2h)r2}r2(hfUh{}r2(h]h]h~]h}]h]uhgj1h]r2hX=Hyperlink target "module-buildbot.db.base" is not referenced.r2r2}r 2(hfUhgj2ubahyhubahyj1ubhc)r 2}r 2(hfUh{}r 2(h]UlevelKh}]h~]Usourcehrh]h]UlineM;Utypej1uh]r 2h)r2}r2(hfUh{}r2(h]h]h~]h}]h]uhgj 2h]r2hXCHyperlink target "modifying-the-database-schema" is not referenced.r2r2}r2(hfUhgj2ubahyhubahyj1ubhc)r2}r2(hfUh{}r2(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r2h)r2}r2(hfUh{}r2(h]h]h~]h}]h]uhgj2h]r2hX.Hyperlink target "index-18" is not referenced.r2r2}r2(hfUhgj2ubahyhubahyj1ubhc)r 2}r!2(hfUh{}r"2(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r#2h)r$2}r%2(hfUh{}r&2(h]h]h~]h}]h]uhgj 2h]r'2hX.Hyperlink target "index-19" is not referenced.r(2r)2}r*2(hfUhgj$2ubahyhubahyj1ubhc)r+2}r,2(hfUh{}r-2(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r.2h)r/2}r02(hfUh{}r12(h]h]h~]h}]h]uhgj+2h]r22hX.Hyperlink target "index-20" is not referenced.r32r42}r52(hfUhgj/2ubahyhubahyj1ubhc)r62}r72(hfUh{}r82(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]r92h)r:2}r;2(hfUh{}r<2(h]h]h~]h}]h]uhgj62h]r=2hX.Hyperlink target "index-21" is not referenced.r>2r?2}r@2(hfUhgj:2ubahyhubahyj1ubhc)rA2}rB2(hfUh{}rC2(h]UlevelKh}]h~]Usourcehrh]h]UlineMUtypej1uh]rD2h)rE2}rF2(hfUh{}rG2(h]h]h~]h}]h]uhgjA2h]rH2hX.Hyperlink target "index-22" is not referenced.rI2rJ2}rK2(hfUhgjE2ubahyhubahyj1ubeUreporterrL2NUid_startrM2KU autofootnotesrN2]rO2U citation_refsrP2}rQ2Uindirect_targetsrR2]rS2UsettingsrT2(cdocutils.frontend Values rU2orV2}rW2(Ufootnote_backlinksrX2KUrecord_dependenciesrY2NU rfc_base_urlrZ2Uhttp://tools.ietf.org/html/r[2U tracebackr\2Upep_referencesr]2NUstrip_commentsr^2NU toc_backlinksr_2Uentryr`2U language_codera2Uenrb2U datestamprc2NU report_levelrd2KU _destinationre2NU halt_levelrf2KU strip_classesrg2NhNUerror_encoding_error_handlerrh2Ubackslashreplaceri2Udebugrj2NUembed_stylesheetrk2Uoutput_encoding_error_handlerrl2Ustrictrm2U sectnum_xformrn2KUdump_transformsro2NU docinfo_xformrp2KUwarning_streamrq2NUpep_file_url_templaterr2Upep-%04drs2Uexit_status_levelrt2KUconfigru2NUstrict_visitorrv2NUcloak_email_addressesrw2Utrim_footnote_reference_spacerx2Uenvry2NUdump_pseudo_xmlrz2NUexpose_internalsr{2NUsectsubtitle_xformr|2U source_linkr}2NUrfc_referencesr~2NUoutput_encodingr2Uutf-8r2U source_urlr2NUinput_encodingr2U utf-8-sigr2U_disable_configr2NU id_prefixr2UU tab_widthr2KUerror_encodingr2UUTF-8r2U_sourcer2US/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/database.rstr2Ugettext_compactr2U generatorr2NUdump_internalsr2NU smart_quotesr2U pep_base_urlr2Uhttp://www.python.org/dev/peps/r2Usyntax_highlightr2Ulongr2Uinput_encoding_error_handlerr2jm2Uauto_id_prefixr2Uidr2Udoctitle_xformr2Ustrip_elements_with_classesr2NU _config_filesr2]Ufile_insertion_enabledr2U raw_enabledr2KU dump_settingsr2NubUsymbol_footnote_startr2KUidsr2}r2(h jhj&j)jj)jm jh j,hv)r2}r2(hfUhgj,hohrhyhzh{}r2(h]h}]r2j,ah~]Uismodh]h]uhMhhh]ubhjI-j)j)j/j.j#hv)r2}r2(hfUhgj#hohrhyhzh{}r2(h]h}]r2j#ah~]Uismodh]h]uhMhhh]ubj j jXjShhh j je+hkjs)jo)j hv)r2}r2(hfUhgj hohrhyhzh{}r2(h]h}]r2j ah~]Uismodh]h]uhMhhh]ubjWhv)r2}r2(hfUhgjShohrhyhzh{}r2(h]h}]r2jWah~]Uismodh]h]uhK6hhh]ubj)jj)j,j,hjp hjhj|%j*+j/+j +j"+hjhj% j+j+h3jjL+jQ+hj jhv)r2}r2(hfUhgjhohrhyhzh{}r2(h]h}]r2jah~]Uismodh]h]uhMAhhh]ubhjhjhjihjj+j+jl hv)r2}r2(hfUhgjh hohrhyhzh{}r2(h]h}]r2jl ah~]Uismodh]h]uhMhhh]ubhj h j%h!jBj*j*j*j*j/!j5!j#j#j j j j jjjhjnjjj?jDjy j{ j j j j j j jqjtjcjijWjYjajfjjjjh$jh%j-j jh'jh(j j+hv)r2}r2(hfUhgj+hohrhyhzh{}r2(h]h}]r2j+ah~]Uismodh]h]uhMshhh]ubj7j3h*j+h+j_ j*j*hhmjjh0jc h1j+h2jjHjDjhv)r2}r2(hfUhgjhohrhyhzh{}r2(h]h}]r2jah~]Uismodh]h]uhMhhh]ubh4j j hv)r2}r2(hfUhgjhohrhyhzh{}r2(h]h}]r2j ah~]Uismodh]h]uhMhhh]ubh5jw(js*jo*h7jh8jjjjj h;j&j=+j9+j*j*hjM.jjh@jhAj@,hj 0hCjhDj%hEj hFj!hGjQ!hHjj+j +hjhIj&hJj/j.hv)r2}r2(hfUhghihohrhyhzh{}r2(h]h}]r2j.ah~]Uismodh]h]uhMhhh]ubhKj,hLj#hNj(j#j#hPjIj.hihRj/jhv)r2}r2(hfUhgjhohrhyhzh{}r2(h]h}]r2jah~]Uismodh]h]uhMhhh]ubjjhUjhVjhWj-jd hv)r2}r2(hfUhgj` hohrhyhzh{}r2(h]h}]r2jd ah~]Uismodh]h]uhKhhh]ubhhmhYjhZj$h[j"j*j*j.j.h]j,h^j?uUsubstitution_namesr2}r2hyhh{}r2(h]h}]h~]Usourcehrh]h]uU footnotesr2]r2Urefidsr2}r2(j*+]r2j,+aj*]r2j*aj*]r2j*aj/!]r2j2!ajL+]r2jN+aj)]r2jm)ajh]r2jkaj?]r2jAaj ]r2j ah]r2hwaj ]r2j ajc]r2jfaja]r2jcaj]r2jauub.PKJtD3003buildbot-v0.8.8/.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.8/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.8/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.PKJtD8Rdd1buildbot-v0.8.8/.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.8/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,XmBuildbot follows `PEP8 `_ regarding the formatting of symbol names.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.qvqw}qx(h,X* regarding the formatting of symbol names.h-h[ubeubhZ)qy}qz(h,XThe single exception in naming of functions and methods. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, Buildbot methods should do the same. 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``. This point is not applied very consistently in Buildbot, but let's try to be consistent in new code.h-hLh.h1h3h]h5}q{(h7]h8]h9]h:]h<]uh>K h?hh']q|(hHX8The single exception in naming of functions and methods. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, Buildbot methods should do the same. 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,X8The single exception in naming of functions and methods. Because Buildbot uses Twisted so heavily, and Twisted uses interCaps, Buildbot methods should do the same. 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-hubah3hubhHXf. This point is not applied very consistently in Buildbot, but let's try to be consistent in new code.qq}q(h,Xf. This point is not applied very consistently in Buildbot, but let's try to be consistent in new code.h-hyubeubeubh))q}q(h,Uh-h*h.h1h3h4h5}q(h7]h8]h9]h:]qhah<]qh auh>Kh?hh']q(hA)q}q(h,XTwisted Idiomsqh-hh.h1h3hEh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXTwisted Idiomsqq}q(h,hh-hubaubhZ)q}q(h,XwProgramming with Twisted Python can be daunting. But sticking to a few well-defined patterns can help avoid surprises.qh-hh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXwProgramming with Twisted Python can be daunting. But sticking to a few well-defined patterns can help avoid surprises.qq}q(h,hh-hubaubh))q}q(h,Uh-hh.h1h3h4h5}q(h7]h8]h9]h:]qhah<]qhauh>Kh?hh']q(hA)q}q(h,XPrefer to Return Deferredsqh-hh.h1h3hEh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXPrefer to Return Deferredsqq}q(h,hh-hubaubhZ)q}q(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!qh-hh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXIf 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!qq}q(h,hh-hubaubeubh))q}q(h,Uh-hh.h1h3h4h5}q(h7]h8]h9]h:]qh"ah<]qh auh>Kh?hh']q(hA)q}q(h,XHelpful Twisted Classesqh-hh.h1h3hEh5}q(h7]h8]h9]h:]h<]uh>Kh?hh']qhHXHelpful Twisted Classesqͅq}q(h,hh-hubaubhZ)q}q(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.qh-hh.h1h3h]h5}q(h7]h8]h9]h:]h<]uh>K!h?hh']qhHXTwisted has some useful, but little-known classes. Brief descriptions follow, but you should consult the API documentation or source code for the full details.qՅq}q(h,hh-hubaubcdocutils.nodes definition_list q)q}q(h,Uh-hh.h1h3Udefinition_listqh5}q(h7]h8]h9]h:]h<]uh>Nh?hh']q(cdocutils.nodes definition_list_item q)q}q(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-hh.h1h3Udefinition_list_itemqh5}q(h7]h8]h9]h:]h<]uh>K(h']q(cdocutils.nodes term q)q}q(h,X*:class:`twisted.internet.task.LoopingCall`qh-hh.h1h3Utermqh5}q(h7]h8]h9]h:]h<]uh>K(h']qcsphinx.addnodes pending_xref q)q}q(h,hh-hh.h1h3U pending_xrefqh5}q(UreftypeXclassUrefwarnqU reftargetqX!twisted.internet.task.LoopingCallU refdomainXpyqh:]h9]U refexplicith7]h8]h<]UrefdocqXdeveloper/styleqUpy:classqNU py:moduleqNuh>K(h']qh)q}q(h,hh5}q(h7]h8]q(UxrefqhXpy-classqeh9]h:]h<]uh-hh']qhHX!twisted.internet.task.LoopingCallqr}r(h,Uh-hubah3hubaubaubcdocutils.nodes definition r)r}r(h,Uh5}r(h7]h8]h9]h:]h<]uh-hh']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.r h-jh.h1h3h]h5}r (h7]h8]h9]h:]h<]uh>K&h']r hHXCalls 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.r r }r(h,j h-jubaubah3U definitionrubeubh)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-hh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>K,h?hh']r(h)r}r(h,X2:class:`twisted.application.internet.TimerService`rh-jh.h1h3hh5}r(h7]h8]h9]h:]h<]uh>K,h']rh)r}r(h,jh-jh.h1h3hh5}r(UreftypeXclasshhX)twisted.application.internet.TimerServiceU refdomainXpyrh:]h9]U refexplicith7]h8]h<]hhhNhNuh>K,h']rh)r}r(h,jh5}r (h7]h8]r!(hjXpy-classr"eh9]h:]h<]uh-jh']r#hHX)twisted.application.internet.TimerServicer$r%}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-j'h.h1h3h]h5}r-(h7]h8]h9]h:]h<]uh>K+h']r.(hHX Similar to r/r0}r1(h,X Similar to h-j+ubh)r2}r3(h,X``t.i.t.LoopingCall``h5}r4(h7]h8]h9]h:]h<]uh-j+h']r5hHXt.i.t.LoopingCallr6r7}r8(h,Uh-j2ubah3hubhHX, 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 r9r:}r;(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)r<}r=(h,X``t.i.t.LoopingCall``h5}r>(h7]h8]h9]h:]h<]uh-j+h']r?hHXt.i.t.LoopingCallr@rA}rB(h,Uh-j<ubah3hubhHX.rC}rD(h,X.h-j+ubeubah3jubeubeubeubh))rE}rF(h,Uh-hh.h1h3h4h5}rG(h7]h8]h9]h:]rHhah<]rIh auh>K/h?hh']rJ(hA)rK}rL(h,XSequences of OperationsrMh-jEh.h1h3hEh5}rN(h7]h8]h9]h:]h<]uh>K/h?hh']rOhHXSequences of OperationsrPrQ}rR(h,jMh-jKubaubhZ)rS}rT(h,XkEspecially in Buildbot, we're often faced with executing a sequence of operations, many of which may block.rUh-jEh.h1h3h]h5}rV(h7]h8]h9]h:]h<]uh>K1h?hh']rWhHXkEspecially in Buildbot, we're often faced with executing a sequence of operations, many of which may block.rXrY}rZ(h,jUh-jSubaubhZ)r[}r\(h,XIn all cases where this occurs, there is a danger of pre-emption, so exercise the same caution you would if writing a threaded application.r]h-jEh.h1h3h]h5}r^(h7]h8]h9]h:]h<]uh>K4h?hh']r_hHXIn all cases where this occurs, there is a danger of pre-emption, so exercise the same caution you would if writing a threaded application.r`ra}rb(h,j]h-j[ubaubhZ)rc}rd(h,XrFor simple cases, you can use nested callback functions. For more complex cases, deferredGenerator is appropriate.reh-jEh.h1h3h]h5}rf(h7]h8]h9]h:]h<]uh>K7h?hh']rghHXrFor simple cases, you can use nested callback functions. For more complex cases, deferredGenerator is appropriate.rhri}rj(h,jeh-jcubaubh))rk}rl(h,Uh-jEh.h1h3h4h5}rm(h7]h8]h9]h:]rnhah<]rohauh>K:h?hh']rp(hA)rq}rr(h,XNested Callbacksrsh-jkh.h1h3hEh5}rt(h7]h8]h9]h:]h<]uh>K:h?hh']ruhHXNested Callbacksrvrw}rx(h,jsh-jqubaubhZ)ry}rz(h,XgFirst, an admonition: do not create extra class methods that represent the continuations of the first::r{h-jkh.h1h3h]h5}r|(h7]h8]h9]h:]h<]uh>KK>h?hh']rhHXdef myMethod(self): d = ... d.addCallback(self._myMethod_2) # BAD! def _myMethod_2(self, res): # BAD! # ...rr}r(h,Uh-jubaubhZ)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-jkh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>KDh?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-jubaubj)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-jkh.h1h3jh5}r(jjh:]h9]h7]h8]h<]uh>KIh?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-jkh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>K[h?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-jubeubj)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-jkh.h1h3jh5}r(jjh:]h9]h7]h8]h<]uh>K_h?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-jkh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kdh?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-jkh.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>Kih']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-jEh.h1h3h4h5}r(h7]h8]h9]h:]rhah<]rhauh>Knh?hh']r(hA)r}r(h,XinlineCallbacksrh-jh.h1h3hEh5}r(h7]h8]h9]h:]h<]uh>Knh?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>Kph?hh']r (h)r }r (h,X/:class:`twisted.internet.defer.inlineCallbacks`r h-jh.h1h3hh5}r (UreftypeXclasshhX&twisted.internet.defer.inlineCallbacksU refdomainXpyrh:]h9]U refexplicith7]h8]h<]hhhNhNuh>Kph']rh)r}r(h,j h5}r(h7]h8]r(hjXpy-classreh9]h:]h<]uh-j h']rhHX&twisted.internet.defer.inlineCallbacksrr}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-jubeubj)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.h1h3jh5}r(jjh:]h9]h7]h8]h<]uh>Kuh?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()r r!}r"(h,Uh-jubaubhZ)r#}r$(h,XThe key points to notice here:r%h-jh.h1h3h]h5}r&(h7]h8]h9]h:]h<]uh>Kh?hh']r'hHXThe key points to notice here:r(r)}r*(h,j%h-j#ubaubcdocutils.nodes bullet_list r+)r,}r-(h,Uh-jh.h1h3U bullet_listr.h5}r/(Ubulletr0X*h:]h9]h7]h8]h<]uh>Kh?hh']r1(cdocutils.nodes list_item r2)r3}r4(h,X=Always import ``defer`` as a module, not the names within it.r5h-j,h.h1h3U list_itemr6h5}r7(h7]h8]h9]h:]h<]uh>Nh?hh']r8hZ)r9}r:(h,j5h-j3h.h1h3h]h5}r;(h7]h8]h9]h:]h<]uh>Kh']r<(hHXAlways import r=r>}r?(h,XAlways import h-j9ubh)r@}rA(h,X ``defer``h5}rB(h7]h8]h9]h:]h<]uh-j9h']rChHXdeferrDrE}rF(h,Uh-j@ubah3hubhHX& as a module, not the names within it.rGrH}rI(h,X& as a module, not the names within it.h-j9ubeubaubj2)rJ}rK(h,X.Use the decorator form of ``inlineCallbacks``.rLh-j,h.h1h3j6h5}rM(h7]h8]h9]h:]h<]uh>Nh?hh']rNhZ)rO}rP(h,jLh-jJh.h1h3h]h5}rQ(h7]h8]h9]h:]h<]uh>Kh']rR(hHXUse the decorator form of rSrT}rU(h,XUse the decorator form of h-jOubh)rV}rW(h,X``inlineCallbacks``h5}rX(h7]h8]h9]h:]h<]uh-jOh']rYhHXinlineCallbacksrZr[}r\(h,Uh-jVubah3hubhHX.r]}r^(h,X.h-jOubeubaubj2)r_}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-j,h.h1h3j6h5}ra(h7]h8]h9]h:]h<]uh>Nh?hh']rbhZ)rc}rd(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.h1h3h]h5}re(h7]h8]h9]h:]h<]uh>Kh']rf(hHXIn most cases, the result of a rgrh}ri(h,XIn most cases, the result of a h-jcubh)rj}rk(h,X ``yield``h5}rl(h7]h8]h9]h:]h<]uh-jch']rmhHXyieldrnro}rp(h,Uh-jjubah3hubhHX 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.rqrr}rs(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-jcubeubaubj2)rt}ru(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.h1h3j6h5}rv(h7]h8]h9]h:]h<]uh>Nh?hh']rwhZ)rx}ry(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-jth.h1h3h]h5}rz(h7]h8]h9]h:]h<]uh>Kh']r{(hHXNPython does not permit returning a value from a generator, so statements like r|r}}r~(h,XNPython does not permit returning a value from a generator, so statements like h-jxubh)r}r(h,X``return xval + y``h5}r(h7]h8]h9]h:]h<]uh-jxh']rhHXreturn xval + yrr}r(h,Uh-jubah3hubhHX, are invalid. Instead, yield the result of rr}r(h,X, are invalid. Instead, yield the result of h-jxubh)r}r(h,X``defer.returnValue``h5}r(h7]h8]h9]h:]h<]uh-jxh']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-jxubh)r}r(h,X ``return``h5}r(h7]h8]h9]h:]h<]uh-jxh']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-jxubeubaubeubhZ)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-jEh.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(j0X*h:]h9]h7]h8]h<]uh>Kh?hh']r(j2)r}r(h,X/:py:class:`twisted.internet.defer.DeferredLock`rh-jh.h1h3j6h5}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']rh)r}r(h,jh-jh.h1h3hh5}r(UreftypeXclasshhX#twisted.internet.defer.DeferredLockU refdomainXpyrh:]h9]U refexplicith7]h8]h<]hhhNhNuh>Kh']rh)r}r(h,jh5}r(h7]h8]r(hjXpy-classreh9]h:]h<]uh-jh']rhHX#twisted.internet.defer.DeferredLockrr}r(h,Uh-jubah3hubaubaubaubj2)r}r(h,X,:py:func:`buildbot.util.misc.deferredLocked`rh-jh.h1h3j6h5}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']rh)r}r(h,jh-jh.h1h3hh5}r(UreftypeXfunchhX!buildbot.util.misc.deferredLockedU refdomainXpyrh:]h9]U refexplicith7]h8]h<]hhhNhNuh>Kh']rh)r}r(h,jh5}r (h7]h8]r (hjXpy-funcr eh9]h:]h<]uh-jh']r hHX!buildbot.util.misc.deferredLockedr r}r(h,Uh-jubah3hubaubaubaubj2)r}r(h,X3:py:func:`buildbot.util.misc.SerializedInvocation` h-jh.h1h3j6h5}r(h7]h8]h9]h:]h<]uh>Nh?hh']rhZ)r}r(h,X2:py:func:`buildbot.util.misc.SerializedInvocation`rh-jh.h1h3h]h5}r(h7]h8]h9]h:]h<]uh>Kh']rh)r}r(h,jh-jh.h1h3hh5}r(UreftypeXfunchhX'buildbot.util.misc.SerializedInvocationU refdomainXpyrh:]h9]U refexplicith7]h8]h<]hhhNhNuh>Kh']rh)r}r(h,jh5}r (h7]h8]r!(hjXpy-funcr"eh9]h:]h<]uh-jh']r#hHX'buildbot.util.misc.SerializedInvocationr$r%}r&(h,Uh-jubah3hubaubaubaubeubeubeubh))r'}r((h,Uh-hh.h1h3h4h5}r)(h7]h8]h9]h:]r*h$ah<]r+hauh>Kh?hh']r,(hA)r-}r.(h,XJoining Sequencesr/h-j'h.h1h3hEh5}r0(h7]h8]h9]h:]h<]uh>Kh?hh']r1hHXJoining Sequencesr2r3}r4(h,j/h-j-ubaubhZ)r5}r6(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-j'h.h1h3h]h5}r7(h7]h8]h9]h:]h<]uh>Kh?hh']r8(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 r9r:}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 h-j5ubhc)r<}r=(h,Xi`DeferredList `_h5}r>(UnameX DeferredListhgXWhttp://twistedmatrix.com/documents/current/api/twisted.internet.defer.DeferredList.htmlr?h:]h9]h7]h8]h<]uh-j5h']r@hHX DeferredListrArB}rC(h,Uh-j<ubah3hmubhn)rD}rE(h,XZ hqKh-j5h3hrh5}rF(Urefurij?h:]rGh!ah9]h7]h8]h<]rHh auh']ubeubj)rI}rJ(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-j'h.h1h3jh5}rK(jjh:]h9]h7]h8]h<]uh>Kh?hh']rLhHXdef 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 drMrN}rO(h,Uh-jIubaubhZ)rP}rQ(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-j'h.h1h3h]h5}rR(h7]h8]h9]h:]h<]uh>Kh?hh']rS(hHX*Here the deferred list will wait for both rTrU}rV(h,X*Here the deferred list will wait for both h-jPubh)rW}rX(h,X``rev_parse_d``h5}rY(h7]h8]h9]h:]h<]uh-jPh']rZhHX rev_parse_dr[r\}r](h,Uh-jWubah3hubhHX and r^r_}r`(h,X and h-jPubh)ra}rb(h,X ``log_d``h5}rc(h7]h8]h9]h:]h<]uh-jPh']rdhHXlog_drerf}rg(h,Uh-jaubah3hubhHXQ to fire, or for one of them to fail. You may attach callbacks and errbacks to a rhri}rj(h,XQ to fire, or for one of them to fail. You may attach callbacks and errbacks to a h-jPubh)rk}rl(h,X``DeferredList``h5}rm(h7]h8]h9]h:]h<]uh-jPh']rnhHX DeferredListrorp}rq(h,Uh-jkubah3hubhHX just as for a deferred.rrrs}rt(h,X just as for a deferred.h-jPubeubeubeubeubah,UU transformerruNU footnote_refsrv}rwUrefnamesrx}ryUsymbol_footnotesrz]r{Uautofootnote_refsr|]r}Usymbol_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_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.8/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]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hjh"hh$j'hjkhhh&h*h jh!jDh#hohhhjEh%hLuUsubstitution_namesr}rh3h?h5}r(h7]h:]h9]Usourceh1h8]h<]uU footnotesr]rUrefidsr}rub.PKJtDjj3buildbot-v0.8.8/.doctrees/developer/metrics.doctreecdocutils.nodes document q)q}q(U nametypesq}q(XmetricsqXmetric watchersqNX metric eventsqNXmetric handlersq NXmetric helpersq NuUsubstitution_defsq }q Uparse_messagesq ]qcdocutils.nodes system_message q)q}q(U rawsourceqUUparentqcdocutils.nodes section q)q}q(hUU referencedqKhhUsourceqcdocutils.nodes reprunicode qXR/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/metrics.rstqq}qbUexpect_referenced_by_nameq}qhcdocutils.nodes target q)q }q!(hX .. _Metrics:hhhhUtagnameq"Utargetq#U attributesq$}q%(Uidsq&]Ubackrefsq']Udupnamesq(]Uclassesq)]Unamesq*]Urefidq+Umetricsq,uUlineq-KUdocumentq.hUchildrenq/]ubsh"Usectionq0h$}q1(h(]q2Xmetricsq3ah)]h']h&]q4(h,Uid1q5eh*]q6hauh-Kh.hUexpect_referenced_by_idq7}q8h,h sh/]q9(cdocutils.nodes title q:)q;}q<(hXMetricsq=hhhhh"Utitleq>h$}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.8/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.PKJtDq:buildbot-v0.8.8/.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.8/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 valueshjubeh-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]uhj h:]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:]rcdocutils.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.}r/(hXmasterh/}r0(h3]h4]h2]h1]h5]uhj*h:]r1hLXmasterr2r3}r4(hUhj.ubah-jubhLX -- r5r6}r7(hUhj*ubhLXthe r8r9}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:]r@h)rA}rB(hj=h/}rC(h3]h4]rD(hj?Xpy-classrEeh2]h1]h5]uhj;h:]rFhLX BuildMasterrGrH}rI(hUhjAubah-jubaubhLX instancerJrK}rL(hX instancehj*ubeh-hTubah-U list_itemrMubj%)rN}rO(hUh/}rP(h3]h4]h2]h1]h5]uhj!h:]rQhP)rR}rS(hUh/}rT(h3]h4]h2]h1]h5]uhjNh:]rU(j)rV}rW(hX propertiesh/}rX(h3]h4]h2]h1]h5]uhjRh:]rYhLX propertiesrZr[}r\(hUhjVubah-jubhLX -- r]r^}r_(hUhjRubhLXa dictionary of propertiesr`ra}rb(hXa dictionary of propertiesrchjRubeh-hTubah-jMubj%)rd}re(hUh/}rf(h3]h4]h2]h1]h5]uhj!h:]rghP)rh}ri(hUh/}rj(h3]h4]h2]h1]h5]uhjdh:]rk(j)rl}rm(hXchangesh/}rn(h3]h4]h2]h1]h5]uhjhh:]rohLXchangesrprq}rr(hUhjlubah-jubhLX -- rsrt}ru(hUhjhubhLXTa list of changeids that will be used to build the SourceStamp for the forced buildsrvrw}rx(hXTa list of changeids that will be used to build the SourceStamp for the forced buildsryhjhubeh-hTubah-jMubj%)rz}r{(hUh/}r|(h3]h4]h2]h1]h5]uhj!h:]r}hP)r~}r(hUh/}r(h3]h4]h2]h1]h5]uhjzh:]r(j)r}r(hX sourcestampsh/}r(h3]h4]h2]h1]h5]uhj~h:]rhLX sourcestampsrr}r(hUhjubah-jubhLX -- rr}r(hUhj~ubhLXxthe 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.rhj~ubeh-hTubah-jMubj%)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-jMubeh-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&hjh#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.hLXlabelr/r0}r1(hUhj+ubaubaubh)r2}r3(hUhjh#h&h-hh/}r4(h3]h4]h2]h1]h5]uh8KKh9hh:]r5hP)r6}r7(hXWThe label of the parameter, as displayed to the user. This value can contain raw HTML.r8hj2h#h&h-hTh/}r9(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=(hj8hj6ubaubaubeubhv)r>}r?(hUh/}r@(h1]h2]h3]h4]h5]Uentries]rA(h|X?fullName() (buildbot.schedulers.forceshed.BaseParameter method)h UtrBauhjh:]h-hyubh)rC}rD(hUhjh-hh/}rE(hhXpyh1]h2]h3]h4]h5]hXmethodrFhjFuh9hh:]rG(h)rH}rI(hXfullNamerJhjCh#h&h-hh/}rK(h1]rLh ahhh2]h3]h4]h5]rMh ahXBaseParameter.fullNamehhhuh8KRh9hh:]rN(h)rO}rP(hjJhjHh#h&h-hh/}rQ(h3]h4]h2]h1]h5]uh8KRh9hh:]rRhLXfullNamerSrT}rU(hUhjOubaubh)rV}rW(hUhjHh#h&h-hh/}rX(h3]h4]h2]h1]h5]uh8KRh9hh:]ubeubh)rY}rZ(hUhjCh#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.hjYh#h&h-hTh/}r_(h3]h4]h2]h1]h5]uh8KNh9hh:]r`(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 rarb}rc(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)rd}re(hX`name`h/}rf(h3]h4]h2]h1]h5]uhj]h:]rghLXnamerhri}rj(hUhjdubah-j?ubhLX and the parent's rkrl}rm(hX and the parent's hj]ubj7)rn}ro(hX`name`h/}rp(h3]h4]h2]h1]h5]uhj]h:]rqhLXnamerrrs}rt(hUhjnubah-j?ubhLXB (in the case of nested parameters). This field is not modifiable.rurv}rw(hXB (in the case of nested parameters). This field is not modifiable.hj]ubeubaubeubhv)rx}ry(hUh/}rz(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 attributerhjuh9hh:]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.}r/(hXregexr0hj)h#h&h-hh/}r1(h1]r2hahhh2]h3]h4]h5]r3hahXBaseParameter.regexhhhuh8Knh9hh:]r4h)r5}r6(hj0hj.h#h&h-hh/}r7(h3]h4]h2]h1]h5]uh8Knh9hh:]r8hLXregexr9r:}r;(hUhj5ubaubaubh)r<}r=(hUhj)h#h&h-hh/}r>(h3]h4]h2]h1]h5]uh8Knh9hh:]r?hP)r@}rA(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.rBhj<h#h&h-hTh/}rC(h3]h4]h2]h1]h5]uh8Kkh9hh:]rDhLXA 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.rErF}rG(hjBhj@ubaubaubeubhv)rH}rI(hUh/}rJ(h1]h2]h3]h4]h5]Uentries]rK(h|XFparse_from_args() (buildbot.schedulers.forceshed.BaseParameter method)hUtrLauhjh:]h-hyubh)rM}rN(hUhjh-hh/}rO(hhXpyh1]h2]h3]h4]h5]hXmethodrPhjPuh9hh:]rQ(h)rR}rS(hXparse_from_args(l)hjMh#h&h-hh/}rT(h1]rUhahhh2]h3]h4]h5]rVhahXBaseParameter.parse_from_argshhhuh8Kth9hh:]rW(h)rX}rY(hXparse_from_argshjRh#h&h-hh/}rZ(h3]h4]h2]h1]h5]uh8Kth9hh:]r[hLXparse_from_argsr\r]}r^(hUhjXubaubh)r_}r`(hUhjRh#h&h-hh/}ra(h3]h4]h2]h1]h5]uh8Kth9hh:]rbh)rc}rd(hXlh/}re(h3]h4]h2]h1]h5]uhj_h:]rfhLXlrg}rh(hUhjcubah-hubaubeubh)ri}rj(hUhjMh#h&h-hh/}rk(h3]h4]h2]h1]h5]uh8Kth9hh:]rlhP)rm}rn(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 argumenthjih#h&h-hTh/}ro(h3]h4]h2]h1]h5]uh8Kqh9hh:]rp(hLXereturn the list of object corresponding to the list or string passed default function will just call rqrr}rs(hXereturn the list of object corresponding to the list or string passed default function will just call hjmubh)rt}ru(hX:py:func:`parse_from_arg`rvhjmh#h&h-hh/}rw(UreftypeXfunchhXparse_from_argU refdomainXpyrxh1]h2]U refexplicith3]h4]h5]hhhhhhuh8Kqh:]ryh)rz}r{(hjvh/}r|(h3]h4]r}(hjxXpy-funcr~eh2]h1]h5]uhjth:]rhLXparse_from_argrr}r(hUhjzubah-jubaubhLX with the first argumentrr}r(hX with the first argumenthjmubeubaubeubhv)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:spacer Upreserverh1]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 rr }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.r/}r0(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.r1r2}r3(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_messager4h/}r5(h3]UlevelKh1]h2]r6h@aUsourceh&h4]h5]UlineKUtypeUINFOr7uh8Kh9hh:]r8hP)r9}r:(hUh/}r;(h3]h4]h2]h1]h5]uhhh:]r<hLX1Duplicate implicit target name: "forcescheduler".r=r>}r?(hUhj9ubah-hTubaubaUcurrent_sourcer@NU decorationrANUautofootnote_startrBKUnameidsrC}rD(hhhhhhh h^h h h h h h h h hhhhhh7hhhhhhhhhjuh:]rE(cdocutils.nodes comment rF)rG}rH(hX -*- rst -*-hhh#h&h-UcommentrIh/}rJ(j jh1]h2]h3]h4]h5]uh8Kh9hh:]rKhLX -*- rst -*-rLrM}rN(hUhjGubaubh+h ehUU transformerrONU footnote_refsrP}rQUrefnamesrR}rSUsymbol_footnotesrT]rUUautofootnote_refsrV]rWUsymbol_footnote_refsrX]rYU citationsrZ]r[h9hU current_liner\NUtransform_messagesr]]r^(h)r_}r`(hUh/}ra(h3]UlevelKh1]h2]Usourceh&h4]h5]UlineKUtypej7uh:]rbhP)rc}rd(hUh/}re(h3]h4]h2]h1]h5]uhj_h:]rfhLX4Hyperlink target "forcescheduler" is not referenced.rgrh}ri(hUhjcubah-hTubah-j4ubh)rj}rk(hUh/}rl(h3]UlevelKh1]h2]Usourceh&h4]h5]UlineKUtypej7uh:]rmhP)rn}ro(hUh/}rp(h3]h4]h2]h1]h5]uhjjh:]rqhLXJHyperlink target "module-buildbot.schedulers.forceshed" is not referenced.rrrs}rt(hUhjnubah-hTubah-j4ubeUreporterruNUid_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_sourcerUY/var/build/user_builds/buildbot/checkouts/v0.8.8/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 jHhjRhjh7h hjRhjhj hhuUsubstitution_namesr}rh-h9h/}r(h3]h1]h2]Usourceh&h4]h5]uU footnotesr]rUrefidsr}rh7]rh+asub.PKJtD4~Z+d+d:buildbot-v0.8.8/.doctrees/developer/cls-buildsteps.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X;buildbot.process.buildstep.LoggingBuildStep.evaluateCommandqX.buildbot.process.buildstep.BuildStep.startStepqX4buildbot.process.buildstep.LoggingBuildStep.getText2qX+buildbot.process.buildstep.BuildStep.addLogq X buildstepsq NX-buildbot.process.buildstep.BuildStep.setBuildq X/buildbot.process.buildstep.BuildStep.buildslaveq X3buildbot.process.buildstep.BuildStep.addLogObserverq X$buildbot.process.buildstep.BuildStepqX*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.slaveVersionIsOlderThanqXloggingbuildstepqNX.buildbot.process.buildstep.BuildStep.alwaysRunqX/buildbot.process.buildstep.BuildStep.runCommandqX*buildbot.process.buildstep.BuildStep.locksqX buildstepqNX0buildbot.process.buildstep.BuildStep.setProgressqX6buildbot.process.buildstep.BuildStep.setDefaultWorkdirqX)buildbot.process.buildstep.BuildStep.nameq X1buildbot.process.buildstep.BuildStep.slaveVersionq!X-buildbot.process.buildstep.BuildStep.doStepIfq"X*buildbot.process.buildstep.BuildStep.startq#X3buildbot.process.buildstep.BuildStep.addCompleteLogq$X-buildbot.process.buildstep.BuildStep.finishedq%X*buildbot.process.buildstep.BuildStep.buildq&X3buildbot.process.buildstep.LoggingBuildStep.getTextq'X+buildbot.process.buildstep.BuildStep.failedq(X.buildbot.process.buildstep.BuildStep.interruptq)X4buildbot.process.buildstep.LoggingBuildStep.logfilesq*X2buildbot.process.buildstep.BuildStep.setupProgressq+X/buildbot.process.buildstep.BuildStep.addHTMLLogq,X3buildbot.process.buildstep.BuildStep.flunkOnFailureq-X;buildbot.process.buildstep.LoggingBuildStep.commandCompleteq.X0buildbot.process.buildstep.BuildStep.step_statusq/X9buildbot.process.buildstep.LoggingBuildStep.createSummaryq0X1buildbot.process.buildstep.BuildStep.getSlaveNameq1X+buildbot.process.buildstep.BuildStep.getLogq2X4buildbot.process.buildstep.BuildStep.progressMetricsq3X-buildbot.process.buildstep.BuildStep.progressq4X2buildbot.process.buildstep.BuildStep.setBuildSlaveq5X4buildbot.process.buildstep.BuildStep.flunkOnWarningsq6X,buildbot.process.buildstep.BuildStep.stoppedq7X2buildbot.process.buildstep.BuildStep.haltOnFailureq8X2buildbot.process.buildstep.BuildStep.setStepStatusq9X/buildbot.process.buildstep.BuildStep.hideStepIfq:uUsubstitution_defsq;}qUcurrent_sourceq?NU decorationq@NUautofootnote_startqAKUnameidsqB}qC(hhhhhhh h h U buildstepsqDh h h h h h hhhhhhhhhhhhhhhhhU exceptionsqEhhhhhUloggingbuildstepqFhhhhhhhU buildstepqGhhhhh 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.h.h/h/h0h0h1h1h2h2h3h3h4h4h5h5h6h6h7h7h8h8h9h9h:h:uUchildrenqH]qIcdocutils.nodes section qJ)qK}qL(U rawsourceqMUUparentqNhUsourceqOcdocutils.nodes reprunicode qPXY/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/cls-buildsteps.rstqQqR}qSbUtagnameqTUsectionqUU attributesqV}qW(UdupnamesqX]UclassesqY]UbackrefsqZ]Uidsq[]q\(X!module-buildbot.process.buildstepq]hDeUnamesq^]q_h auUlineq`KUdocumentqahhH]qb(cdocutils.nodes title qc)qd}qe(hMX BuildStepsqfhNhKhOhRhTUtitleqghV}qh(hX]hY]hZ]h[]h^]uh`KhahhH]qicdocutils.nodes Text qjX BuildStepsqkql}qm(hMhfhNhdubaubcsphinx.addnodes index qn)qo}qp(hMUhNhKhOhRhTUindexqqhV}qr(h[]hZ]hX]hY]h^]Uentries]qs(UsingleqtX#buildbot.process.buildstep (module)X!module-buildbot.process.buildstepUtquauh`KhahhH]ubcdocutils.nodes paragraph qv)qw}qx(hMXThere 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`.hNhKhOhRhTU paragraphqyhV}qz(hX]hY]hZ]h[]h^]uh`KhahhH]q{(hjXThere 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 q|q}}q~(hMXThere 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 hNhwubcsphinx.addnodes pending_xref q)q}q(hMX:doc:`../manual/cfg-buildsteps`qhNhwhOhRhTU pending_xrefqhV}q(UreftypeXdocqUrefwarnqU reftargetqX../manual/cfg-buildstepsU refdomainUh[]hZ]U refexplicithX]hY]h^]UrefdocqXdeveloper/cls-buildstepsquh`KhH]qcdocutils.nodes literal q)q}q(hMhhV}q(hX]hY]q(UxrefqhehZ]h[]h^]uhNhhH]qhjX../manual/cfg-buildstepsqq}q(hMUhNhubahTUliteralqubaubhjX.q}q(hMX.hNhwubeubhJ)q}q(hMUhNhKhOhRhThUhV}q(hX]hY]hZ]h[]qhGah^]qhauh`K hahhH]q(hc)q}q(hMX BuildStepqhNhhOhRhThghV}q(hX]hY]hZ]h[]h^]uh`K hahhH]qhjX BuildStepqq}q(hMhhNhubaubhn)q}q(hMUhNhhONhThqhV}q(h[]hZ]hX]hY]h^]Uentries]q(htX/BuildStep (class in buildbot.process.buildstep)hUtqauh`NhahhH]ubcsphinx.addnodes desc q)q}q(hMUhNhhONhTUdescqhV}q(UnoindexqUdomainqXpyh[]hZ]hX]hY]h^]UobjtypeqXclassqUdesctypeqhuh`NhahhH]q(csphinx.addnodes desc_signature q)q}q(hMXBuildStep(name, locks, haltOnFailure, flunkOnWarnings, flunkOnFailure, warnOnWarnings, warnOnFailure, alwaysRun, progressMetrics, useProgress, doStepIf, hideStepIf)hNhhOhRhTUdesc_signatureqhV}q(h[]qhaUmoduleqXbuildbot.process.buildstepqhZ]hX]hY]h^]qhaUfullnameqX BuildStepqUclassqUUfirstq‰uh`MHhahhH]q(csphinx.addnodes desc_annotation q)q}q(hMXclass hNhhOhRhTUdesc_annotationqhV}q(hX]hY]hZ]h[]h^]uh`MHhahhH]qhjXclass qʅq}q(hMUhNhubaubcsphinx.addnodes desc_addname q)q}q(hMXbuildbot.process.buildstep.hNhhOhRhTU desc_addnameqhV}q(hX]hY]hZ]h[]h^]uh`MHhahhH]qhjXbuildbot.process.buildstep.qӅq}q(hMUhNhubaubcsphinx.addnodes desc_name q)q}q(hMhhNhhOhRhTU desc_nameqhV}q(hX]hY]hZ]h[]h^]uh`MHhahhH]qhjX BuildStepq܅q}q(hMUhNhubaubcsphinx.addnodes desc_parameterlist q)q}q(hMUhNhhOhRhTUdesc_parameterlistqhV}q(hX]hY]hZ]h[]h^]uh`MHhahhH]q(csphinx.addnodes desc_parameter q)q}q(hMXnamehV}q(hX]hY]hZ]h[]h^]uhNhhH]qhjXnameqꅁq}q(hMUhNhubahTUdesc_parameterqubh)q}q(hMXlockshV}q(hX]hY]hZ]h[]h^]uhNhhH]qhjXlocksqq}q(hMUhNhubahThubh)q}q(hMX haltOnFailurehV}q(hX]hY]hZ]h[]h^]uhNhhH]qhjX haltOnFailureqq}q(hMUhNhubahThubh)q}q(hMXflunkOnWarningshV}q(hX]hY]hZ]h[]h^]uhNhhH]qhjXflunkOnWarningsrr}r(hMUhNhubahThubh)r}r(hMXflunkOnFailurehV}r(hX]hY]hZ]h[]h^]uhNhhH]rhjXflunkOnFailurerr}r (hMUhNjubahThubh)r }r (hMXwarnOnWarningshV}r (hX]hY]hZ]h[]h^]uhNhhH]r hjXwarnOnWarningsrr}r(hMUhNj ubahThubh)r}r(hMX warnOnFailurehV}r(hX]hY]hZ]h[]h^]uhNhhH]rhjX warnOnFailurerr}r(hMUhNjubahThubh)r}r(hMX alwaysRunhV}r(hX]hY]hZ]h[]h^]uhNhhH]rhjX alwaysRunrr}r(hMUhNjubahThubh)r}r (hMXprogressMetricshV}r!(hX]hY]hZ]h[]h^]uhNhhH]r"hjXprogressMetricsr#r$}r%(hMUhNjubahThubh)r&}r'(hMX useProgresshV}r((hX]hY]hZ]h[]h^]uhNhhH]r)hjX useProgressr*r+}r,(hMUhNj&ubahThubh)r-}r.(hMXdoStepIfhV}r/(hX]hY]hZ]h[]h^]uhNhhH]r0hjXdoStepIfr1r2}r3(hMUhNj-ubahThubh)r4}r5(hMX hideStepIfhV}r6(hX]hY]hZ]h[]h^]uhNhhH]r7hjX hideStepIfr8r9}r:(hMUhNj4ubahThubeubeubcsphinx.addnodes desc_content r;)r<}r=(hMUhNhhOhRhTU desc_contentr>hV}r?(hX]hY]hZ]h[]h^]uh`MHhahhH]r@(hv)rA}rB(hMXAll constructor arguments must be given as keyword arguments. Each constructor parameter is copied to the corresponding attribute.rChNj<hOhRhThyhV}rD(hX]hY]hZ]h[]h^]uh`KhahhH]rEhjXAll constructor arguments must be given as keyword arguments. Each constructor parameter is copied to the corresponding attribute.rFrG}rH(hMjChNjAubaubhn)rI}rJ(hMUhNj<hOhRhThqhV}rK(h[]hZ]hX]hY]h^]Uentries]rL(htX5name (buildbot.process.buildstep.BuildStep attribute)h UtrMauh`NhahhH]ubh)rN}rO(hMUhNj<hOhRhThhV}rP(hhXpyh[]hZ]hX]hY]h^]hX attributerQhjQuh`NhahhH]rR(h)rS}rT(hMXnamerUhNjNhOhRhThhV}rV(h[]rWh ahhhZ]hX]hY]h^]rXh ahXBuildStep.namehhh‰uh`KhahhH]rYh)rZ}r[(hMjUhNjShOhRhThhV}r\(hX]hY]hZ]h[]h^]uh`KhahhH]r]hjXnamer^r_}r`(hMUhNjZubaubaubj;)ra}rb(hMUhNjNhOhRhTj>hV}rc(hX]hY]hZ]h[]h^]uh`KhahhH]rdhv)re}rf(hMXThe name of the step.rghNjahOhRhThyhV}rh(hX]hY]hZ]h[]h^]uh`KhahhH]rihjXThe name of the step.rjrk}rl(hMjghNjeubaubaubeubhn)rm}rn(hMUhNj<hOhRhThqhV}ro(h[]hZ]hX]hY]h^]Uentries]rp(htX6locks (buildbot.process.buildstep.BuildStep attribute)hUtrqauh`NhahhH]ubh)rr}rs(hMUhNj<hOhRhThhV}rt(hhXpyh[]hZ]hX]hY]h^]hX attributeruhjuuh`NhahhH]rv(h)rw}rx(hMXlocksryhNjrhOhRhThhV}rz(h[]r{hahhhZ]hX]hY]h^]r|hahXBuildStep.lockshhh‰uh`KhahhH]r}h)r~}r(hMjyhNjwhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhjXlocksrr}r(hMUhNj~ubaubaubj;)r}r(hMUhNjrhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhv)r}r(hMX3List of locks for this step; see :ref:`Interlocks`.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]r(hjX!List of locks for this step; see rr}r(hMX!List of locks for this step; see hNjubh)r}r(hMX:ref:`Interlocks`rhNjhOhRhThhV}r(UreftypeXrefhhX interlocksU refdomainXstdrh[]hZ]U refexplicithX]hY]h^]hhuh`KhH]rcdocutils.nodes emphasis r)r}r(hMjhV}r(hX]hY]r(hjXstd-refrehZ]h[]h^]uhNjhH]rhjX Interlocksrr}r(hMUhNjubahTUemphasisrubaubhjX.r}r(hMX.hNjubeubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX@progressMetrics (buildbot.process.buildstep.BuildStep attribute)h3Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXprogressMetricsrhNjhOhRhThhV}r(h[]rh3ahhhZ]hX]hY]h^]rh3ahXBuildStep.progressMetricshhh‰uh`KhahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhjXprogressMetricsrr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhv)r}r(hMXList 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 therhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhjXList 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 therr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX<useProgress (buildbot.process.buildstep.BuildStep attribute)hUtrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMX useProgressrhNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahXBuildStep.useProgresshhh‰uh`K"hahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`K"hahhH]rhjX useProgressrr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K"hahhH]rhv)r}r(hMXIf 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.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`K hahhH]rhjXIf 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.rr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX9doStepIf (buildbot.process.buildstep.BuildStep attribute)h"Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXdoStepIfrhNjhOhRhThhV}r(h[]rh"ahhhZ]hX]hY]h^]rh"ahXBuildStep.doStepIfhhh‰uh`K'hahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`K'hahhH]rhjXdoStepIfrr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K'hahhH]rhv)r}r(hMXyA callable or bool to determine whether this step should be executed. See :ref:`Buildstep-Common-Parameters` for details.hNjhOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`K%hahhH]r (hjXJA callable or bool to determine whether this step should be executed. See r r }r (hMXJA callable or bool to determine whether this step should be executed. See hNjubh)r}r(hMX":ref:`Buildstep-Common-Parameters`rhNjhOhRhThhV}r(UreftypeXrefhhXbuildstep-common-parametersU refdomainXstdrh[]hZ]U refexplicithX]hY]h^]hhuh`K%hH]rj)r}r(hMjhV}r(hX]hY]r(hjXstd-refrehZ]h[]h^]uhNjhH]rhjXBuildstep-Common-Parametersrr}r(hMUhNjubahTjubaubhjX for details.rr}r(hMX for details.hNjubeubaubeubhn)r }r!(hMUhNj<hOhRhThqhV}r"(h[]hZ]hX]hY]h^]Uentries]r#(htX;hideStepIf (buildbot.process.buildstep.BuildStep attribute)h:Utr$auh`NhahhH]ubh)r%}r&(hMUhNj<hOhRhThhV}r'(hhXpyh[]hZ]hX]hY]h^]hX attributer(hj(uh`NhahhH]r)(h)r*}r+(hMX hideStepIfr,hNj%hOhRhThhV}r-(h[]r.h:ahhhZ]hX]hY]h^]r/h:ahXBuildStep.hideStepIfhhh‰uh`K,hahhH]r0h)r1}r2(hMj,hNj*hOhRhThhV}r3(hX]hY]hZ]h[]h^]uh`K,hahhH]r4hjX hideStepIfr5r6}r7(hMUhNj1ubaubaubj;)r8}r9(hMUhNj%hOhRhTj>hV}r:(hX]hY]hZ]h[]h^]uh`K,hahhH]r;hv)r<}r=(hMXA 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.hNj8hOhRhThyhV}r>(hX]hY]hZ]h[]h^]uh`K*hahhH]r?(hjXpA callable or bool to determine whether this step should be shown in the waterfall and build details pages. See r@rA}rB(hMXpA callable or bool to determine whether this step should be shown in the waterfall and build details pages. See hNj<ubh)rC}rD(hMX":ref:`Buildstep-Common-Parameters`rEhNj<hOhRhThhV}rF(UreftypeXrefhhXbuildstep-common-parametersU refdomainXstdrGh[]hZ]U refexplicithX]hY]h^]hhuh`K*hH]rHj)rI}rJ(hMjEhV}rK(hX]hY]rL(hjGXstd-refrMehZ]h[]h^]uhNjChH]rNhjXBuildstep-Common-ParametersrOrP}rQ(hMUhNjIubahTjubaubhjX for details.rRrS}rT(hMX for details.hNj<ubeubaubeubhv)rU}rV(hMXEThe following attributes affect the behavior of the containing build:rWhNj<hOhRhThyhV}rX(hX]hY]hZ]h[]h^]uh`K-hahhH]rYhjXEThe following attributes affect the behavior of the containing build:rZr[}r\(hMjWhNjUubaubhn)r]}r^(hMUhNj<hOhRhThqhV}r_(h[]hZ]hX]hY]h^]Uentries]r`(htX>haltOnFailure (buildbot.process.buildstep.BuildStep attribute)h8Utraauh`NhahhH]ubh)rb}rc(hMUhNj<hOhRhThhV}rd(hhXpyh[]hZ]hX]hY]h^]hX attributerehjeuh`NhahhH]rf(h)rg}rh(hMX haltOnFailurerihNjbhOhRhThhV}rj(h[]rkh8ahhhZ]hX]hY]h^]rlh8ahXBuildStep.haltOnFailurehhh‰uh`K2hahhH]rmh)rn}ro(hMjihNjghOhRhThhV}rp(hX]hY]hZ]h[]h^]uh`K2hahhH]rqhjX haltOnFailurerrrs}rt(hMUhNjnubaubaubj;)ru}rv(hMUhNjbhOhRhTj>hV}rw(hX]hY]hZ]h[]h^]uh`K2hahhH]rxhv)ry}rz(hMX{If true, the build will halt on a failure of this step, and not execute subsequent tests (except those with ``alwaysRun``).hNjuhOhRhThyhV}r{(hX]hY]hZ]h[]h^]uh`K1hahhH]r|(hjXlIf true, the build will halt on a failure of this step, and not execute subsequent tests (except those with r}r~}r(hMXlIf true, the build will halt on a failure of this step, and not execute subsequent tests (except those with hNjyubh)r}r(hMX ``alwaysRun``hV}r(hX]hY]hZ]h[]h^]uhNjyhH]rhjX alwaysRunrr}r(hMUhNjubahThubhjX).rr}r(hMX).hNjyubeubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX@flunkOnWarnings (buildbot.process.buildstep.BuildStep attribute)h6Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXflunkOnWarningsrhNjhOhRhThhV}r(h[]rh6ahhhZ]hX]hY]h^]rh6ahXBuildStep.flunkOnWarningshhh‰uh`K6hahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`K6hahhH]rhjXflunkOnWarningsrr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K6hahhH]rhv)r}r(hMXOIf true, the build will be marked as a failure if this step ends with warnings.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`K5hahhH]rhjXOIf true, the build will be marked as a failure if this step ends with warnings.rr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX?flunkOnFailure (buildbot.process.buildstep.BuildStep attribute)h-Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXflunkOnFailurerhNjhOhRhThhV}r(h[]rh-ahhhZ]hX]hY]h^]rh-ahXBuildStep.flunkOnFailurehhh‰uh`K:hahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`K:hahhH]rhjXflunkOnFailurerr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K:hahhH]rhv)r}r(hMXBIf true, the build will be marked as a failure if this step fails.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`K9hahhH]rhjXBIf true, the build will be marked as a failure if this step fails.rr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX?warnOnWarnings (buildbot.process.buildstep.BuildStep attribute)hUtrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXwarnOnWarningsrhNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahXBuildStep.warnOnWarningshhh‰uh`K>hahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`K>hahhH]rhjXwarnOnWarningsrr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K>hahhH]rhv)r}r(hMXYIf true, the build will be marked as warnings, or worse, if this step ends with warnings.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`K=hahhH]rhjXYIf true, the build will be marked as warnings, or worse, if this step ends with warnings.rr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX>warnOnFailure (buildbot.process.buildstep.BuildStep attribute)hUtrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMX warnOnFailurerhNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahXBuildStep.warnOnFailurehhh‰uh`KBhahhH]rh)r}r(hMjhNjhOhRhThhV}r (hX]hY]hZ]h[]h^]uh`KBhahhH]r hjX warnOnFailurer r }r (hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KBhahhH]rhv)r}r(hMXLIf true, the build will be marked as warnings, or worse, if this step fails.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KAhahhH]rhjXLIf true, the build will be marked as warnings, or worse, if this step fails.rr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX:alwaysRun (buildbot.process.buildstep.BuildStep attribute)hUtrauh`NhahhH]ubh)r}r (hMUhNj<hOhRhThhV}r!(hhXpyh[]hZ]hX]hY]h^]hX attributer"hj"uh`NhahhH]r#(h)r$}r%(hMX alwaysRunr&hNjhOhRhThhV}r'(h[]r(hahhhZ]hX]hY]h^]r)hahXBuildStep.alwaysRunhhh‰uh`KFhahhH]r*h)r+}r,(hMj&hNj$hOhRhThhV}r-(hX]hY]hZ]h[]h^]uh`KFhahhH]r.hjX alwaysRunr/r0}r1(hMUhNj+ubaubaubj;)r2}r3(hMUhNjhOhRhTj>hV}r4(hX]hY]hZ]h[]h^]uh`KFhahhH]r5hv)r6}r7(hMXZIf true, the step will run even if a previous step halts the build with ``haltOnFailure``.hNj2hOhRhThyhV}r8(hX]hY]hZ]h[]h^]uh`KEhahhH]r9(hjXHIf true, the step will run even if a previous step halts the build with r:r;}r<(hMXHIf true, the step will run even if a previous step halts the build with hNj6ubh)r=}r>(hMX``haltOnFailure``hV}r?(hX]hY]hZ]h[]h^]uhNj6hH]r@hjX haltOnFailurerArB}rC(hMUhNj=ubahThubhjX.rD}rE(hMX.hNj6ubeubaubeubhv)rF}rG(hMXA 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.rHhNj<hOhRhThyhV}rI(hX]hY]hZ]h[]h^]uh`KGhahhH]rJhjXA 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.rKrL}rM(hMjHhNjFubaubhn)rN}rO(hMUhNj<hOhRhThqhV}rP(h[]hZ]hX]hY]h^]Uentries]rQ(htX8setBuild() (buildbot.process.buildstep.BuildStep method)h UtrRauh`NhahhH]ubh)rS}rT(hMUhNj<hOhRhThhV}rU(hhXpyh[]hZ]hX]hY]h^]hXmethodrVhjVuh`NhahhH]rW(h)rX}rY(hMXsetBuild(build)hNjShOhRhThhV}rZ(h[]r[h ahhhZ]hX]hY]h^]r\h ahXBuildStep.setBuildhhh‰uh`KQhahhH]r](h)r^}r_(hMXsetBuildhNjXhOhRhThhV}r`(hX]hY]hZ]h[]h^]uh`KQhahhH]rahjXsetBuildrbrc}rd(hMUhNj^ubaubh)re}rf(hMUhNjXhOhRhThhV}rg(hX]hY]hZ]h[]h^]uh`KQhahhH]rhh)ri}rj(hMXbuildhV}rk(hX]hY]hZ]h[]h^]uhNjehH]rlhjXbuildrmrn}ro(hMUhNjiubahThubaubeubj;)rp}rq(hMUhNjShOhRhTj>hV}rr(hX]hY]hZ]h[]h^]uh`KQhahhH]rs(cdocutils.nodes field_list rt)ru}rv(hMUhNjphOhRhTU field_listrwhV}rx(hX]hY]hZ]h[]h^]uh`NhahhH]rycdocutils.nodes field rz)r{}r|(hMUhV}r}(hX]hY]hZ]h[]h^]uhNjuhH]r~(cdocutils.nodes field_name r)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNj{hH]rhjX Parametersrr}r(hMUhNjubahTU field_namerubcdocutils.nodes field_body r)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNj{hH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(cdocutils.nodes strong r)r}r(hMXbuildhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXbuildrr}r(hMUhNjubahTUstrongrubhjX -- rr}r(hMUhNjubhjXthe rr}r(hMXthe hNjubh)r}r(hMX&:class:`~buildbot.process.build.Build`rhNjhOhRhThhV}r(UreftypeXclasshhXbuildbot.process.build.BuildU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhUpy:classrhU py:modulerhuh`KLhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-classrehZ]h[]h^]uhNjhH]rhjXBuildrr}r(hMUhNjubahThubaubhjX instance controlling this step.rr}r(hMX instance controlling this step.hNjubehThyubahTU field_bodyrubehTUfieldrubaubhv)r}r(hMXThis 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.hNjphOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KNhahhH]r(hjXThis 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 rr}r(hMXThis 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 hNjubh)r}r(hMX :attr:`build`rhNjhOhRhThhV}r(UreftypeXattrhhXbuildU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KNhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-attrrehZ]h[]h^]uhNjhH]rhjXbuildrr}r(hMUhNjubahThubaubhjX attribute.rr}r(hMX attribute.hNjubeubeubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX6build (buildbot.process.buildstep.BuildStep attribute)h&Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXbuildrhNjhOhRhThhV}r(h[]rh&ahhhZ]hX]hY]h^]rh&ahXBuildStep.buildhhh‰uh`KUhahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KUhahhH]rhjXbuildrr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KUhahhH]rhv)r}r(hMX'The build object controlling this step.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KThahhH]rhjX'The build object controlling this step.rr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX=setBuildSlave() (buildbot.process.buildstep.BuildStep method)h5Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXsetBuildSlave(build)hNjhOhRhThhV}r(h[]rh5ahhhZ]hX]hY]h^]rh5ahXBuildStep.setBuildSlavehhh‰uh`K\hahhH]r(h)r}r(hMX setBuildSlavehNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`K\hahhH]rhjX setBuildSlaverr}r (hMUhNjubaubh)r }r (hMUhNjhOhRhThhV}r (hX]hY]hZ]h[]h^]uh`K\hahhH]r h)r}r(hMXbuildhV}r(hX]hY]hZ]h[]h^]uhNj hH]rhjXbuildrr}r(hMUhNjubahThubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K\hahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r (j)r!}r"(hMUhV}r#(hX]hY]hZ]h[]h^]uhNjhH]r$hjX Parametersr%r&}r'(hMUhNj!ubahTjubj)r(}r)(hMUhV}r*(hX]hY]hZ]h[]h^]uhNjhH]r+hv)r,}r-(hMUhV}r.(hX]hY]hZ]h[]h^]uhNj(hH]r/(j)r0}r1(hMXbuildhV}r2(hX]hY]hZ]h[]h^]uhNj,hH]r3hjXbuildr4r5}r6(hMUhNj0ubahTjubhjX -- r7r8}r9(hMUhNj,ubhjXthe r:r;}r<(hMXthe hNj,ubh)r=}r>(hMX(:class:`~buildbot.buildslave.BuildSlave`r?hNj,hOhRhThhV}r@(UreftypeXclasshhXbuildbot.buildslave.BuildSlaveU refdomainXpyrAh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KXhH]rBh)rC}rD(hMj?hV}rE(hX]hY]rF(hjAXpy-classrGehZ]h[]h^]uhNj=hH]rHhjX BuildSlaverIrJ}rK(hMUhNjCubahThubaubhjX& instance on which this step will run.rLrM}rN(hMX& instance on which this step will run.hNj,ubehThyubahTjubehTjubaubhv)rO}rP(hMXSimilarly, this method is called with the build slave that will run this step. The default implementation sets the :attr:`buildslave` attribute.hNjhOhRhThyhV}rQ(hX]hY]hZ]h[]h^]uh`KZhahhH]rR(hjXsSimilarly, this method is called with the build slave that will run this step. The default implementation sets the rSrT}rU(hMXsSimilarly, this method is called with the build slave that will run this step. The default implementation sets the hNjOubh)rV}rW(hMX:attr:`buildslave`rXhNjOhOhRhThhV}rY(UreftypeXattrhhX buildslaveU refdomainXpyrZh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KZhH]r[h)r\}r](hMjXhV}r^(hX]hY]r_(hjZXpy-attrr`ehZ]h[]h^]uhNjVhH]rahjX buildslaverbrc}rd(hMUhNj\ubahThubaubhjX attribute.rerf}rg(hMX attribute.hNjOubeubeubeubhn)rh}ri(hMUhNj<hOhRhThqhV}rj(h[]hZ]hX]hY]h^]Uentries]rk(htX;buildslave (buildbot.process.buildstep.BuildStep attribute)h Utrlauh`NhahhH]ubh)rm}rn(hMUhNj<hOhRhThhV}ro(hhXpyh[]hZ]hX]hY]h^]hX attributerphjpuh`NhahhH]rq(h)rr}rs(hMX buildslaverthNjmhOhRhThhV}ru(h[]rvh ahhhZ]hX]hY]h^]rwh ahXBuildStep.buildslavehhh‰uh`K`hahhH]rxh)ry}rz(hMjthNjrhOhRhThhV}r{(hX]hY]hZ]h[]h^]uh`K`hahhH]r|hjX buildslaver}r~}r(hMUhNjyubaubaubj;)r}r(hMUhNjmhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K`hahhH]rhv)r}r(hMX(The build slave that will run this step.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`K_hahhH]rhjX(The build slave that will run this step.rr}r(hMjhNjubaubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htXAsetDefaultWorkdir() (buildbot.process.buildstep.BuildStep method)hUtrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXsetDefaultWorkdir(workdir)hNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahXBuildStep.setDefaultWorkdirhhh‰uh`KghahhH]r(h)r}r(hMXsetDefaultWorkdirhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KghahhH]rhjXsetDefaultWorkdirrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KghahhH]rh)r}r(hMXworkdirhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXworkdirrr}r(hMUhNjubahThubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KghahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXworkdirhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXworkdirrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjX#the default workdir, from the buildrr}r(hMX#the default workdir, from the buildhNjubehThyubahTjubehTjubaubhv)r}r(hMXThis 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.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KehahhH]rhjXThis 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.rr}r(hMjhNjubaubeubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX=setStepStatus() (buildbot.process.buildstep.BuildStep method)h9Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXsetStepStatus(status)hNjhOhRhThhV}r(h[]rh9ahhhZ]hX]hY]h^]rh9ahXBuildStep.setStepStatushhh‰uh`KohahhH]r(h)r}r(hMX setStepStatushNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KohahhH]rhjX setStepStatusrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KohahhH]rh)r}r(hMXstatushV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXstatusrr}r(hMUhNjubahThubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KohahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r (hMUhV}r (hX]hY]hZ]h[]h^]uhNjhH]r (j)r }r (hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNj ubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXstatushV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXstatusrr }r!(hMUhNjubahTjubhjX (r"r#}r$(hMUhNjubh)r%}r&(hMX3:class:`~buildbot.status.buildstep.BuildStepStatus`r'hNjhOhRhThhV}r((UreftypeXclasshhX)buildbot.status.buildstep.BuildStepStatusU refdomainXpyr)h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KkhH]r*h)r+}r,(hMj'hV}r-(hX]hY]r.(hj)Xpy-classr/ehZ]h[]h^]uhNj%hH]r0hjXBuildStepStatusr1r2}r3(hMUhNj+ubahThubaubhjX)r4}r5(hMUhNjubhjX -- r6r7}r8(hMUhNjubhjX step statusr9r:}r;(hMX step statushNjubehThyubahTjubehTjubaubhv)r<}r=(hMXThis method is called to set the status instance to which the step should report. The default implementation sets :attr:`step_status`.hNjhOhRhThyhV}r>(hX]hY]hZ]h[]h^]uh`KmhahhH]r?(hjXrThis method is called to set the status instance to which the step should report. The default implementation sets r@rA}rB(hMXrThis method is called to set the status instance to which the step should report. The default implementation sets hNj<ubh)rC}rD(hMX:attr:`step_status`rEhNj<hOhRhThhV}rF(UreftypeXattrhhX step_statusU refdomainXpyrGh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KmhH]rHh)rI}rJ(hMjEhV}rK(hX]hY]rL(hjGXpy-attrrMehZ]h[]h^]uhNjChH]rNhjX step_statusrOrP}rQ(hMUhNjIubahThubaubhjX.rR}rS(hMX.hNj<ubeubeubeubhn)rT}rU(hMUhNj<hOhRhThqhV}rV(h[]hZ]hX]hY]h^]Uentries]rW(htX<step_status (buildbot.process.buildstep.BuildStep attribute)h/UtrXauh`NhahhH]ubh)rY}rZ(hMUhNj<hOhRhThhV}r[(hhXpyh[]hZ]hX]hY]h^]hX attributer\hj\uh`NhahhH]r](h)r^}r_(hMX step_statusr`hNjYhOhRhThhV}ra(h[]rbh/ahhhZ]hX]hY]h^]rch/ahXBuildStep.step_statushhh‰uh`KshahhH]rdh)re}rf(hMj`hNj^hOhRhThhV}rg(hX]hY]hZ]h[]h^]uh`KshahhH]rhhjX step_statusrirj}rk(hMUhNjeubaubaubj;)rl}rm(hMUhNjYhOhRhTj>hV}rn(hX]hY]hZ]h[]h^]uh`KshahhH]rohv)rp}rq(hMX`The :class:`~buildbot.status.buildstep.BuildStepStatus` object tracking the status of this step.hNjlhOhRhThyhV}rr(hX]hY]hZ]h[]h^]uh`KrhahhH]rs(hjXThe rtru}rv(hMXThe hNjpubh)rw}rx(hMX3:class:`~buildbot.status.buildstep.BuildStepStatus`ryhNjphOhRhThhV}rz(UreftypeXclasshhX)buildbot.status.buildstep.BuildStepStatusU refdomainXpyr{h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KrhH]r|h)r}}r~(hMjyhV}r(hX]hY]r(hj{Xpy-classrehZ]h[]h^]uhNjwhH]rhjXBuildStepStatusrr}r(hMUhNj}ubahThubaubhjX) object tracking the status of this step.rr}r(hMX) object tracking the status of this step.hNjpubeubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX=setupProgress() (buildbot.process.buildstep.BuildStep method)h+Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXsetupProgress()hNjhOhRhThhV}r(h[]rh+ahhhZ]hX]hY]h^]rh+ahXBuildStep.setupProgresshhh‰uh`KyhahhH]r(h)r}r(hMX setupProgresshNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KyhahhH]rhjX setupProgressrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KyhahhH]ubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KyhahhH]rhv)r}r(hMXThis 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.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KvhahhH]r(hjXThis 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(hMXThis 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 hNjubh)r}r(hMX:attr:`useProgress`rhNjhOhRhThhV}r(UreftypeXattrhhX useProgressU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KvhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-attrrehZ]h[]h^]uhNjhH]rhjX useProgressrr}r(hMUhNjubahThubaubhjX9 set. There is rarely any reason to override this method.rr}r(hMX9 set. There is rarely any reason to override this method.hNjubeubaubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX9progress (buildbot.process.buildstep.BuildStep attribute)h4Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXprogressrhNjhOhRhThhV}r(h[]rh4ahhhZ]hX]hY]h^]rh4ahXBuildStep.progresshhh‰uh`K}hahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`K}hahhH]rhjXprogressrr}r(hMUhNjubaubaubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`K}hahhH]rhv)r}r(hMXzIf the step is tracking progress, this is a :class:`~buildbot.status.progress.StepProgress` instance performing that task.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`K|hahhH]r(hjX,If the step is tracking progress, this is a rr}r(hMX,If the step is tracking progress, this is a hNjubh)r}r(hMX/:class:`~buildbot.status.progress.StepProgress`rhNjhOhRhThhV}r(UreftypeXclasshhX%buildbot.status.progress.StepProgressU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`K|hH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-classrehZ]h[]h^]uhNjhH]rhjX StepProgressrr}r(hMUhNjubahThubaubhjX instance performing that task.rr}r(hMX instance performing that task.hNjubeubaubeubhv)r}r(hMXQExecution of the step itself is governed by the following methods and attributes.rhNj<hOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`K~hahhH]rhjXQExecution of the step itself is governed by the following methods and attributes.rr}r(hMjhNjubaubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX9startStep() (buildbot.process.buildstep.BuildStep method)hUtrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXstartStep(remote)hNjhOhRhThhV}r (h[]r hahhhZ]hX]hY]h^]r hahXBuildStep.startStephhh‰uh`KhahhH]r (h)r }r(hMX startStephNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhjX startSteprr}r(hMUhNj ubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rh)r}r(hMXremotehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXremoterr}r(hMUhNjubahThubaubeubj;)r}r (hMUhNjhOhRhTj>hV}r!(hX]hY]hZ]h[]h^]uh`KhahhH]r"(jt)r#}r$(hMUhNjhOhRhTjwhV}r%(hX]hY]hZ]h[]h^]uh`NhahhH]r&(jz)r'}r((hMUhV}r)(hX]hY]hZ]h[]h^]uhNj#hH]r*(j)r+}r,(hMUhV}r-(hX]hY]hZ]h[]h^]uhNj'hH]r.hjX Parametersr/r0}r1(hMUhNj+ubahTjubj)r2}r3(hMUhV}r4(hX]hY]hZ]h[]h^]uhNj'hH]r5hv)r6}r7(hMUhV}r8(hX]hY]hZ]h[]h^]uhNj2hH]r9(j)r:}r;(hMXremotehV}r<(hX]hY]hZ]h[]h^]uhNj6hH]r=hjXremoter>r?}r@(hMUhNj:ubahTjubhjX -- rArB}rC(hMUhNj6ubhjX%a remote reference to the slave-side rDrE}rF(hMX%a remote reference to the slave-side hNj6ubh)rG}rH(hMX%:class:`~buildslave.bot.SlaveBuilder`rIhNj6hOhRhThhV}rJ(UreftypeXclasshhXbuildslave.bot.SlaveBuilderU refdomainXpyrKh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rLh)rM}rN(hMjIhV}rO(hX]hY]rP(hjKXpy-classrQehZ]h[]h^]uhNjGhH]rRhjX SlaveBuilderrSrT}rU(hMUhNjMubahThubaubhjX instancerVrW}rX(hMX instancehNj6ubehThyubahTjubehTjubjz)rY}rZ(hMUhV}r[(hX]hY]hZ]h[]h^]uhNj#hH]r\(j)r]}r^(hMUhV}r_(hX]hY]hZ]h[]h^]uhNjYhH]r`hjXReturnsrarb}rc(hMUhNj]ubahTjubj)rd}re(hMUhV}rf(hX]hY]hZ]h[]h^]uhNjYhH]rghv)rh}ri(hMUhV}rj(hX]hY]hZ]h[]h^]uhNjdhH]rkhjXDeferredrlrm}rn(hMXDeferredhNjhubahThyubahTjubehTjubeubhv)ro}rp(hMXBegin the step. This is the build's interface to step execution. Subclasses should override :meth:`start` to implement custom behaviors.hNjhOhRhThyhV}rq(hX]hY]hZ]h[]h^]uh`KhahhH]rr(hjX\Begin the step. This is the build's interface to step execution. Subclasses should override rsrt}ru(hMX\Begin the step. This is the build's interface to step execution. Subclasses should override hNjoubh)rv}rw(hMX :meth:`start`rxhNjohOhRhThhV}ry(UreftypeXmethhhXstartU refdomainXpyrzh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r{h)r|}r}(hMjxhV}r~(hX]hY]r(hjzXpy-methrehZ]h[]h^]uhNjvhH]rhjXstartrr}r(hMUhNj|ubahThubaubhjX to implement custom behaviors.rr}r(hMX to implement custom behaviors.hNjoubeubhv)r}r(hMX}The method returns a Deferred that fires when the step finishes. It fires with a tuple of ``(result, [extra text])``, where ``result`` is one of the constants from :mod:`buildbot.status.builder`. The extra text is a list of short strings which should be appended to the Build's text results. For example, a test step may add ``17 failures`` to the Build's status by this mechanism.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]r(hjXZThe method returns a Deferred that fires when the step finishes. It fires with a tuple of rr}r(hMXZThe method returns a Deferred that fires when the step finishes. It fires with a tuple of hNjubh)r}r(hMX``(result, [extra text])``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX(result, [extra text])rr}r(hMUhNjubahThubhjX, where rr}r(hMX, where hNjubh)r}r(hMX ``result``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXresultrr}r(hMUhNjubahThubhjX is one of the constants from rr}r(hMX is one of the constants from hNjubh)r}r(hMX:mod:`buildbot.status.builder`rhNjhOhRhThhV}r(UreftypeXmodhhXbuildbot.status.builderU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-modrehZ]h[]h^]uhNjhH]rhjXbuildbot.status.builderrr}r(hMUhNjubahThubaubhjX. The extra text is a list of short strings which should be appended to the Build's text results. For example, a test step may add rr}r(hMX. The extra text is a list of short strings which should be appended to the Build's text results. For example, a test step may add hNjubh)r}r(hMX``17 failures``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX 17 failuresrr}r(hMUhNjubahThubhjX) to the Build's status by this mechanism.rr}r(hMX) to the Build's status by this mechanism.hNjubeubhv)r}r(hMXThe deferred will errback if the step encounters an exception, including an exception on the slave side (or if the slave goes away altogether). Normal build/test failures will *not* cause an errback.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]r(hjXThe deferred will errback if the step encounters an exception, including an exception on the slave side (or if the slave goes away altogether). Normal build/test failures will rr}r(hMXThe deferred will errback if the step encounters an exception, including an exception on the slave side (or if the slave goes away altogether). Normal build/test failures will hNjubj)r}r(hMX*not*hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXnotrr}r(hMUhNjubahTjubhjX cause an errback.rr}r(hMX cause an errback.hNjubeubeubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX5start() (buildbot.process.buildstep.BuildStep method)h#Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXstart()hNjhOhRhThhV}r(h[]rh#ahhhZ]hX]hY]h^]rh#ahXBuildStep.starthhh‰uh`KhahhH]r(h)r}r(hMXstarthNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhjXstartrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]ubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`KhahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXReturnsrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(h)r}r(hMX``None``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXNoner r }r (hMUhNjubahThubhjX or r r }r(hMX or hNjubh)r}r(hMX(:data:`~buildbot.status.results.SKIPPED`rhNjhOhRhThhV}r(UreftypeXdatahhXbuildbot.status.results.SKIPPEDU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-datarehZ]h[]h^]uhNjhH]rhjXSKIPPEDrr}r(hMUhNjubahThubaubhjX, optionally via a Deferred.rr}r (hMX, optionally via a Deferred.hNjubehThyubahTjubehTjubaubhv)r!}r"(hMXBegin the step. Subclasses should override this method to do local processing, fire off remote commands, etc. The parent method raises :exc:`NotImplementedError`.hNjhOhRhThyhV}r#(hX]hY]hZ]h[]h^]uh`KhahhH]r$(hjXBegin the step. Subclasses should override this method to do local processing, fire off remote commands, etc. The parent method raises r%r&}r'(hMXBegin the step. Subclasses should override this method to do local processing, fire off remote commands, etc. The parent method raises hNj!ubh)r(}r)(hMX:exc:`NotImplementedError`r*hNj!hOhRhThhV}r+(UreftypeXexchhXNotImplementedErrorU refdomainXpyr,h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r-h)r.}r/(hMj*hV}r0(hX]hY]r1(hj,Xpy-excr2ehZ]h[]h^]uhNj(hH]r3hjXNotImplementedErrorr4r5}r6(hMUhNj.ubahThubaubhjX.r7}r8(hMX.hNj!ubeubhv)r9}r:(hMXWhen the step is done, it should call :meth:`finished`, with a result -- a constant from :mod:`buildbot.status.results`. The result will be handed off to the :class:`~buildbot.process.build.Build`.hNjhOhRhThyhV}r;(hX]hY]hZ]h[]h^]uh`KhahhH]r<(hjX&When the step is done, it should call r=r>}r?(hMX&When the step is done, it should call hNj9ubh)r@}rA(hMX:meth:`finished`rBhNj9hOhRhThhV}rC(UreftypeXmethhhXfinishedU refdomainXpyrDh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rEh)rF}rG(hMjBhV}rH(hX]hY]rI(hjDXpy-methrJehZ]h[]h^]uhNj@hH]rKhjXfinishedrLrM}rN(hMUhNjFubahThubaubhjX#, with a result -- a constant from rOrP}rQ(hMX#, with a result -- a constant from hNj9ubh)rR}rS(hMX:mod:`buildbot.status.results`rThNj9hOhRhThhV}rU(UreftypeXmodhhXbuildbot.status.resultsU refdomainXpyrVh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rWh)rX}rY(hMjThV}rZ(hX]hY]r[(hjVXpy-modr\ehZ]h[]h^]uhNjRhH]r]hjXbuildbot.status.resultsr^r_}r`(hMUhNjXubahThubaubhjX'. The result will be handed off to the rarb}rc(hMX'. The result will be handed off to the hNj9ubh)rd}re(hMX&:class:`~buildbot.process.build.Build`rfhNj9hOhRhThhV}rg(UreftypeXclasshhXbuildbot.process.build.BuildU refdomainXpyrhh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rih)rj}rk(hMjfhV}rl(hX]hY]rm(hjhXpy-classrnehZ]h[]h^]uhNjdhH]rohjXBuildrprq}rr(hMUhNjjubahThubaubhjX.rs}rt(hMX.hNj9ubeubhv)ru}rv(hMXIf the step encounters an exception, it should call :meth:`failed` with a Failure object. This method automatically fails the whole build with an exception. A common idiom is to add :meth:`failed` as an errback on a Deferred::hNjhOhRhThyhV}rw(hX]hY]hZ]h[]h^]uh`KhahhH]rx(hjX4If the step encounters an exception, it should call ryrz}r{(hMX4If the step encounters an exception, it should call hNjuubh)r|}r}(hMX:meth:`failed`r~hNjuhOhRhThhV}r(UreftypeXmethhhXfailedU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMj~hV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNj|hH]rhjXfailedrr}r(hMUhNjubahThubaubhjXt with a Failure object. This method automatically fails the whole build with an exception. A common idiom is to add rr}r(hMXt with a Failure object. This method automatically fails the whole build with an exception. A common idiom is to add hNjuubh)r}r(hMX:meth:`failed`rhNjuhOhRhThhV}r(UreftypeXmethhhXfailedU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXfailedrr}r(hMUhNjubahThubaubhjX as an errback on a Deferred:rr}r(hMX as an errback on a Deferred:hNjuubeubcdocutils.nodes literal_block r)r}r(hMXcmd = RemoteCommand(args) d = self.runCommand(cmd) def suceed(_): self.finished(results.SUCCESS) d.addCallback(succeed) d.addErrback(self.failed)hNjhOhRhTU literal_blockrhV}r(U xml:spacerUpreserverh[]hZ]hX]hY]h^]uh`KhahhH]rhjXcmd = RemoteCommand(args) d = self.runCommand(cmd) def suceed(_): self.finished(results.SUCCESS) d.addCallback(succeed) d.addErrback(self.failed)rr}r(hMUhNjubaubhv)r}r(hMXIf 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.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]r(hjX0If the step decides it does not need to be run, rr}r(hMX0If the step decides it does not need to be run, hNjubh)r}r(hMX :meth:`start`rhNjhOhRhThhV}r(UreftypeXmethhhXstartU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXstartrr}r(hMUhNjubahThubaubhjX can return the constant rr}r(hMX can return the constant hNjubh)r}r(hMX(:data:`~buildbot.status.results.SKIPPED`rhNjhOhRhThhV}r(UreftypeXdatahhXbuildbot.status.results.SKIPPEDU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-datarehZ]h[]h^]uhNjhH]rhjXSKIPPEDrr}r(hMUhNjubahThubaubhjX,. In this case, it is not necessary to call rr}r(hMX,. In this case, it is not necessary to call hNjubh)r}r(hMX:meth:`finished`rhNjhOhRhThhV}r(UreftypeXmethhhXfinishedU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXfinishedrr}r(hMUhNjubahThubaubhjX directly.rr}r(hMX directly.hNjubeubeubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX8finished() (buildbot.process.buildstep.BuildStep method)h%Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXfinished(results)hNjhOhRhThhV}r(h[]rh%ahhhZ]hX]hY]h^]rh%ahXBuildStep.finishedhhh‰uh`KhahhH]r(h)r}r(hMXfinishedhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rhjXfinishedrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]rh)r}r(hMXresultshV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXresultsrr}r (hMUhNjubahThubaubeubj;)r }r (hMUhNjhOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (jt)r}r(hMUhNj hOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r hv)r!}r"(hMUhV}r#(hX]hY]hZ]h[]h^]uhNjhH]r$(j)r%}r&(hMXresultshV}r'(hX]hY]hZ]h[]h^]uhNj!hH]r(hjXresultsr)r*}r+(hMUhNj%ubahTjubhjX -- r,r-}r.(hMUhNj!ubhjXa constant from r/r0}r1(hMXa constant from hNj!ubh)r2}r3(hMX:mod:`~buildbot.status.results`r4hNj!hOhRhThhV}r5(UreftypeXmodhhXbuildbot.status.resultsU refdomainXpyr6h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r7h)r8}r9(hMj4hV}r:(hX]hY]r;(hj6Xpy-modr<ehZ]h[]h^]uhNj2hH]r=hjXresultsr>r?}r@(hMUhNj8ubahThubaubehThyubahTjubehTjubaubhv)rA}rB(hMXA 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.rChNj hOhRhThyhV}rD(hX]hY]hZ]h[]h^]uh`KhahhH]rEhjXA 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.rFrG}rH(hMjChNjAubaubeubeubhn)rI}rJ(hMUhNj<hOhRhThqhV}rK(h[]hZ]hX]hY]h^]Uentries]rL(htX6failed() (buildbot.process.buildstep.BuildStep method)h(UtrMauh`NhahhH]ubh)rN}rO(hMUhNj<hOhRhThhV}rP(hhXpyh[]hZ]hX]hY]h^]hXmethodrQhjQuh`NhahhH]rR(h)rS}rT(hMXfailed(failure)hNjNhOhRhThhV}rU(h[]rVh(ahhhZ]hX]hY]h^]rWh(ahXBuildStep.failedhhh‰uh`KhahhH]rX(h)rY}rZ(hMXfailedhNjShOhRhThhV}r[(hX]hY]hZ]h[]h^]uh`KhahhH]r\hjXfailedr]r^}r_(hMUhNjYubaubh)r`}ra(hMUhNjShOhRhThhV}rb(hX]hY]hZ]h[]h^]uh`KhahhH]rch)rd}re(hMXfailurehV}rf(hX]hY]hZ]h[]h^]uhNj`hH]rghjXfailurerhri}rj(hMUhNjdubahThubaubeubj;)rk}rl(hMUhNjNhOhRhTj>hV}rm(hX]hY]hZ]h[]h^]uh`KhahhH]rn(jt)ro}rp(hMUhNjkhOhRhTjwhV}rq(hX]hY]hZ]h[]h^]uh`NhahhH]rrjz)rs}rt(hMUhV}ru(hX]hY]hZ]h[]h^]uhNjohH]rv(j)rw}rx(hMUhV}ry(hX]hY]hZ]h[]h^]uhNjshH]rzhjX Parametersr{r|}r}(hMUhNjwubahTjubj)r~}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjshH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNj~hH]r(j)r}r(hMXfailurehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXfailurerr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXa rr}r(hMXa hNjubh)r}r(hMX(:class:`~twisted.python.failure.Failure`rhNjhOhRhThhV}r(UreftypeXclasshhXtwisted.python.failure.FailureU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-classrehZ]h[]h^]uhNjhH]rhjXFailurerr}r(hMUhNjubahThubaubhjX instancerr}r(hMX instancehNjubehThyubahTjubehTjubaubhv)r}r(hMXSimilar to :meth:`finished`, this method indicates that the step is finished, but handles exceptions with appropriate logging and diagnostics.hNjkhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]r(hjX Similar to rr}r(hMX Similar to hNjubh)r}r(hMX:meth:`finished`rhNjhOhRhThhV}r(UreftypeXmethhhXfinishedU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXfinishedrr}r(hMUhNjubahThubaubhjXs, this method indicates that the step is finished, but handles exceptions with appropriate logging and diagnostics.rr}r(hMXs, this method indicates that the step is finished, but handles exceptions with appropriate logging and diagnostics.hNjubeubhv)r}r(hMXThis 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.hNjkhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`KhahhH]r(hjXThis method handles rr}r(hMXThis method handles hNjubh)r}r(hMX:exc:`BuildStepFailed`rhNjhOhRhThhV}r(UreftypeXexchhXBuildStepFailedU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-excrehZ]h[]h^]uhNjhH]rhjXBuildStepFailedrr}r(hMUhNjubahThubaubhjX specially, by calling rr}r(hMX specially, by calling hNjubh)r}r(hMX``finished(FAILURE)``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXfinished(FAILURE)rr}r(hMUhNjubahThubhjXr. This provides subclasses with a shortcut to stop execution of a step by raising this failure in a context where rr}r(hMXr. This provides subclasses with a shortcut to stop execution of a step by raising this failure in a context where hNjubh)r}r(hMX:meth:`failed`rhNjhOhRhThhV}r(UreftypeXmethhhXfailedU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXfailedrr}r(hMUhNjubahThubaubhjX will catch it.rr}r(hMX will catch it.hNjubeubeubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX9interrupt() (buildbot.process.buildstep.BuildStep method)h)Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXinterrupt(reason)hNjhOhRhThhV}r(h[]r h)ahhhZ]hX]hY]h^]r h)ahXBuildStep.interrupthhh‰uh`KhahhH]r (h)r }r (hMX interrupthNjhOhRhThhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjX interruptr r }r (hMUhNj ubaubh)r }r (hMUhNjhOhRhThhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r h)r }r (hMXreasonhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXreasonr r }r (hMUhNj ubahThubaubeubj;)r }r (hMUhNjhOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (jt)r }r (hMUhNj hOhRhTjwhV}r (hX]hY]hZ]h[]h^]uh`NhahhH]r jz)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r! }r" (hMUhV}r# (hX]hY]hZ]h[]h^]uhNj hH]r$ hjX Parametersr% r& }r' (hMUhNj! ubahTjubj)r( }r) (hMUhV}r* (hX]hY]hZ]h[]h^]uhNj hH]r+ hv)r, }r- (hMUhV}r. (hX]hY]hZ]h[]h^]uhNj( hH]r/ (j)r0 }r1 (hMXreasonhV}r2 (hX]hY]hZ]h[]h^]uhNj, hH]r3 hjXreasonr4 r5 }r6 (hMUhNj0 ubahTjubhjX (r7 r8 }r9 (hMUhNj, ubhjX string or r: r; }r< (hMX string or hNj, ubh)r= }r> (hMX(:class:`~twisted.python.failure.Failure`r? hNj, hOhRhThhV}r@ (UreftypeXclasshhXtwisted.python.failure.FailureU refdomainXpyrA h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rB h)rC }rD (hMj? hV}rE (hX]hY]rF (hjA Xpy-classrG ehZ]h[]h^]uhNj= hH]rH hjXFailurerI rJ }rK (hMUhNjC ubahThubaubhjX)rL }rM (hMUhNj, ubhjX -- rN rO }rP (hMUhNj, ubhjXwhy the build was interruptedrQ rR }rS (hMXwhy the build was interruptedhNj, ubehThyubahTjubehTjubaubhv)rT }rU (hMXThis 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`.hNj hOhRhThyhV}rV (hX]hY]hZ]h[]h^]uh`KhahhH]rW (hjXThis 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 rX rY }rZ (hMXThis 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 hNjT ubh)r[ }r\ (hMX:meth:`finished`r] hNjT hOhRhThhV}r^ (UreftypeXmethhhXfinishedU refdomainXpyr_ h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r` h)ra }rb (hMj] hV}rc (hX]hY]rd (hj_ Xpy-methre ehZ]h[]h^]uhNj[ hH]rf hjXfinishedrg rh }ri (hMUhNja ubahThubaubhjX or rj rk }rl (hMX or hNjT ubh)rm }rn (hMX:meth:`failed`ro hNjT hOhRhThhV}rp (UreftypeXmethhhXfailedU refdomainXpyrq h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]rr h)rs }rt (hMjo hV}ru (hX]hY]rv (hjq Xpy-methrw ehZ]h[]h^]uhNjm hH]rx hjXfailedry rz }r{ (hMUhNjs ubahThubaubhjX.r| }r} (hMX.hNjT ubeubhv)r~ }r (hMXThe ``reason`` parameter can be a string or, when a slave is lost during step processing, a :exc:`~twisted.internet.error.ConnectionLost` failure.hNj hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (hjXThe r r }r (hMXThe hNj~ ubh)r }r (hMX ``reason``hV}r (hX]hY]hZ]h[]h^]uhNj~ hH]r hjXreasonr r }r (hMUhNj ubahThubhjXN parameter can be a string or, when a slave is lost during step processing, a r r }r (hMXN parameter can be a string or, when a slave is lost during step processing, a hNj~ ubh)r }r (hMX-:exc:`~twisted.internet.error.ConnectionLost`r hNj~ hOhRhThhV}r (UreftypeXexchhX%twisted.internet.error.ConnectionLostU refdomainXpyr h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r h)r }r (hMj hV}r (hX]hY]r (hj Xpy-excr ehZ]h[]h^]uhNj hH]r hjXConnectionLostr r }r (hMUhNj ubahThubaubhjX failure.r r }r (hMX failure.hNj~ ubeubhv)r }r (hMXmThe parent method handles any pending lock operations, and should be called by implementations in subclasses.r hNj hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjXmThe parent method handles any pending lock operations, and should be called by implementations in subclasses.r r }r (hMj hNj ubaubeubeubhn)r }r (hMUhNj<hOhRhThqhV}r (h[]hZ]hX]hY]h^]Uentries]r (htX8stopped (buildbot.process.buildstep.BuildStep attribute)h7Utr auh`NhahhH]ubh)r }r (hMUhNj<hOhRhThhV}r (hhXpyh[]hZ]hX]hY]h^]hX attributer hj uh`NhahhH]r (h)r }r (hMXstoppedr hNj hOhRhThhV}r (h[]r h7ahhhZ]hX]hY]h^]r h7ahXBuildStep.stoppedhhh‰uh`KhahhH]r h)r }r (hMj hNj hOhRhThhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjXstoppedr r }r (hMUhNj ubaubaubj;)r }r (hMUhNj hOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hv)r }r (hMX_If false, then the step is running. If true, the step is not running, or has been interrupted.r hNj hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjX_If false, then the step is running. If true, the step is not running, or has been interrupted.r r }r (hMj hNj ubaubaubeubhv)r }r (hMX^This method provides a convenient way to summarize the status of the step for status displays:r hNj<hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjX^This method provides a convenient way to summarize the status of the step for status displays:r r }r (hMj hNj ubaubhn)r }r (hMUhNj<hONhThqhV}r (h[]hZ]hX]hY]h^]Uentries]r (htX8describe() (buildbot.process.buildstep.BuildStep method)hUtr auh`NhahhH]ubh)r }r (hMUhNj<hONhThhV}r (hhXpyh[]hZ]hX]hY]h^]hXmethodr hj uh`NhahhH]r (h)r }r (hMXdescribe(done=False)hNj hOhRhThhV}r (h[]r hahhhZ]hX]hY]h^]r hahXBuildStep.describehhh‰uh`KhahhH]r (h)r }r (hMXdescribehNj hOhRhThhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjXdescriber r }r (hMUhNj ubaubh)r }r (hMUhNj hOhRhThhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r h)r }r (hMX done=FalsehV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX done=Falser r }r (hMUhNj ubahThubaubeubj;)r }r (hMUhNj hOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (jt)r }r (hMUhNj hONhTjwhV}r (hX]hY]hZ]h[]h^]uh`NhahhH]r (jz)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX Parametersr r }r (hMUhNj ubahTjubj)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMXdonehV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXdoner r }r (hMUhNj ubahTjubhjX -- r r }r (hMUhNj ubhjXIf true, the step is finished.r r }r (hMXIf true, the step is finished.hNj ubehThyubahTjubehTjubjz)r }r (hMUhV}r! (hX]hY]hZ]h[]h^]uhNj hH]r" (j)r# }r$ (hMUhV}r% (hX]hY]hZ]h[]h^]uhNj hH]r& hjXReturnsr' r( }r) (hMUhNj# ubahTjubj)r* }r+ (hMUhV}r, (hX]hY]hZ]h[]h^]uhNj hH]r- hv)r. }r/ (hMUhV}r0 (hX]hY]hZ]h[]h^]uhNj* hH]r1 hjXlist of stringsr2 r3 }r4 (hMXlist of stringshNj. ubahThyubahTjubehTjubeubhv)r5 }r6 (hMXDescribe the step succinctly. The return value should be a sequence of short strings suitable for display in a horizontally constrained space.r7 hNj hOhRhThyhV}r8 (hX]hY]hZ]h[]h^]uh`KhahhH]r9 hjXDescribe the step succinctly. The return value should be a sequence of short strings suitable for display in a horizontally constrained space.r: r; }r< (hMj7 hNj5 ubaubcdocutils.nodes note r= )r> }r? (hMXBe 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.hNj hOhRhTUnoter@ hV}rA (hX]hY]hZ]h[]h^]uh`NhahhH]rB hv)rC }rD (hMXBe 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.rE hNj> hOhRhThyhV}rF (hX]hY]hZ]h[]h^]uh`KhH]rG hjXBe 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.rH rI }rJ (hMjE hNjC ubaubaubeubeubhv)rK }rL (hMXrBuild 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.rM hNj<hOhRhThyhV}rN (hX]hY]hZ]h[]h^]uh`KhahhH]rO hjXrBuild 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.rP rQ }rR (hMjM hNjK ubaubhn)rS }rT (hMUhNj<hOhRhThqhV}rU (h[]hZ]hX]hY]h^]Uentries]rV (htX;setProgress() (buildbot.process.buildstep.BuildStep method)hUtrW auh`NhahhH]ubh)rX }rY (hMUhNj<hOhRhThhV}rZ (hhXpyr[ h[]hZ]hX]hY]h^]hXmethodr\ hj\ uh`NhahhH]r] (h)r^ }r_ (hMXsetProgress(metric, value)hNjX hOhRhThhV}r` (h[]ra hahhhZ]hX]hY]h^]rb hahXBuildStep.setProgresshhh‰uh`KhahhH]rc (h)rd }re (hMX setProgresshNj^ hOhRhThhV}rf (hX]hY]hZ]h[]h^]uh`KhahhH]rg hjX setProgressrh ri }rj (hMUhNjd ubaubh)rk }rl (hMUhNj^ hOhRhThhV}rm (hX]hY]hZ]h[]h^]uh`KhahhH]rn (h)ro }rp (hMXmetrichV}rq (hX]hY]hZ]h[]h^]uhNjk hH]rr hjXmetricrs rt }ru (hMUhNjo ubahThubh)rv }rw (hMXvaluehV}rx (hX]hY]hZ]h[]h^]uhNjk hH]ry hjXvaluerz r{ }r| (hMUhNjv ubahThubeubeubj;)r} }r~ (hMUhNjX hOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (jt)r }r (hMUhNj} hOhRhTjwhV}r (hX]hY]hZ]h[]h^]uh`NhahhH]r jz)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX Parametersr r }r (hMUhNj ubahTjubj)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r cdocutils.nodes bullet_list r )r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (cdocutils.nodes list_item r )r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMXmetrichV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXmetricr r }r (hMUhNj ubahTjubhjX (r r }r (hMUhNj ubh)r }r (hMUhV}r (UreftypeUobjr U reftargetXstringr U refdomainj[ h[]hZ]U refexplicithX]hY]h^]uhNj hH]r j)r }r (hMj hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXstringr r }r (hMUhNj ubahTjubahThubhjX)r }r (hMUhNj ubhjX -- r r }r (hMUhNj ubhjXthe metric to updater r }r (hMXthe metric to updatehNj ubehThyubahTU list_itemr ubj )r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMXvaluehV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXvaluer r }r (hMUhNj ubahTjubhjX (r r }r (hMUhNj ubh)r }r (hMUhV}r (Ureftypej U reftargetXintegerr U refdomainj[ h[]hZ]U refexplicithX]hY]h^]uhNj hH]r j)r }r (hMj hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXintegerr r }r (hMUhNj ubahTjubahThubhjX)r }r (hMUhNj ubhjX -- r r }r (hMUhNj ubhjXthe new value for the metricr r }r (hMXthe new value for the metrichNj ubehThyubahTj ubehTU bullet_listr ubahTjubehTjubaubhv)r }r (hMXtUpdate a progress metric. This should be called by subclasses that can provide useful progress-tracking information.r hNj} hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjXtUpdate a progress metric. This should be called by subclasses that can provide useful progress-tracking information.r r }r (hMj hNj ubaubhv)r }r (hMXFThe specified metric name must be included in :attr:`progressMetrics`.hNj} hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (hjX.The specified metric name must be included in r r }r (hMX.The specified metric name must be included in hNj ubh)r }r (hMX:attr:`progressMetrics`r hNj hOhRhThhV}r (UreftypeXattrhhXprogressMetricsU refdomainXpyr h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r h)r }r (hMj hV}r (hX]hY]r (hj Xpy-attrr ehZ]h[]h^]uhNj hH]r hjXprogressMetricsr r }r (hMUhNj ubahThubaubhjX.r }r (hMX.hNj ubeubeubeubhv)r }r (hMX~The following methods are provided as utilities to subclasses. These methods should only be invoked after the step is started.r hNj<hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r hjX~The following methods are provided as utilities to subclasses. These methods should only be invoked after the step is started.r r }r (hMj hNj ubaubhn)r }r (hMUhNj<hOhRhThqhV}r (h[]hZ]hX]hY]h^]Uentries]r (htX<slaveVersion() (buildbot.process.buildstep.BuildStep method)h!Utr auh`NhahhH]ubh)r }r (hMUhNj<hOhRhThhV}r (hhXpyr h[]hZ]hX]hY]h^]hXmethodr hj uh`NhahhH]r (h)r }r (hMX&slaveVersion(command, oldVersion=None)hNj hOhRhThhV}r (h[]r h!ahhhZ]hX]hY]h^]r h!ahXBuildStep.slaveVersionhhh‰uh`KhahhH]r! (h)r" }r# (hMX slaveVersionhNj hOhRhThhV}r$ (hX]hY]hZ]h[]h^]uh`KhahhH]r% hjX slaveVersionr& r' }r( (hMUhNj" ubaubh)r) }r* (hMUhNj hOhRhThhV}r+ (hX]hY]hZ]h[]h^]uh`KhahhH]r, (h)r- }r. (hMXcommandhV}r/ (hX]hY]hZ]h[]h^]uhNj) hH]r0 hjXcommandr1 r2 }r3 (hMUhNj- ubahThubh)r4 }r5 (hMXoldVersion=NonehV}r6 (hX]hY]hZ]h[]h^]uhNj) hH]r7 hjXoldVersion=Noner8 r9 }r: (hMUhNj4 ubahThubeubeubj;)r; }r< (hMUhNj hOhRhTj>hV}r= (hX]hY]hZ]h[]h^]uh`KhahhH]r> (jt)r? }r@ (hMUhNj; hOhRhTjwhV}rA (hX]hY]hZ]h[]h^]uh`NhahhH]rB (jz)rC }rD (hMUhV}rE (hX]hY]hZ]h[]h^]uhNj? hH]rF (j)rG }rH (hMUhV}rI (hX]hY]hZ]h[]h^]uhNjC hH]rJ hjX ParametersrK rL }rM (hMUhNjG ubahTjubj)rN }rO (hMUhV}rP (hX]hY]hZ]h[]h^]uhNjC hH]rQ j )rR }rS (hMUhV}rT (hX]hY]hZ]h[]h^]uhNjN hH]rU (j )rV }rW (hMUhV}rX (hX]hY]hZ]h[]h^]uhNjR hH]rY hv)rZ }r[ (hMUhV}r\ (hX]hY]hZ]h[]h^]uhNjV hH]r] (j)r^ }r_ (hMXcommandhV}r` (hX]hY]hZ]h[]h^]uhNjZ hH]ra hjXcommandrb rc }rd (hMUhNj^ ubahTjubhjX (re rf }rg (hMUhNjZ ubh)rh }ri (hMUhV}rj (Ureftypej U reftargetXstringrk U refdomainj h[]hZ]U refexplicithX]hY]h^]uhNjZ hH]rl j)rm }rn (hMjk hV}ro (hX]hY]hZ]h[]h^]uhNjh hH]rp hjXstringrq rr }rs (hMUhNjm ubahTjubahThubhjX)rt }ru (hMUhNjZ ubhjX -- rv rw }rx (hMUhNjZ ubhjXcommand to examinery rz }r{ (hMXcommand to examinehNjZ ubehThyubahTj ubj )r| }r} (hMUhV}r~ (hX]hY]hZ]h[]h^]uhNjR hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj| hH]r (j)r }r (hMX oldVersionhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX oldVersionr r }r (hMUhNj ubahTjubhjX -- r r }r (hMUhNj ubhjX4return value if the slave does not specify a versionr r }r (hMX4return value if the slave does not specify a versionhNj ubehThyubahTj ubehTj ubahTjubehTjubjz)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj? hH]r (j)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXReturnsr r }r (hMUhNj ubahTjubj)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXstringr r }r (hMXstringhNj ubahThyubahTjubehTjubeubhv)r }r (hMX9Fetch 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``.hNj; hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (hjXFetch the version of the named command, as specified on the slave. In practice, all commands on a slave have the same version, but passing r r }r (hMXFetch the version of the named command, as specified on the slave. In practice, all commands on a slave have the same version, but passing hNj ubh)r }r (hMX ``command``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXcommandr r }r (hMUhNj ubahThubhjXy is still useful to ensure that the command is implemented on the slave. If the command is not implemented on the slave, r r }r (hMXy is still useful to ensure that the command is implemented on the slave. If the command is not implemented on the slave, hNj ubh)r }r (hMX:meth:`slaveVersion`r hNj hOhRhThhV}r (UreftypeXmethhhX slaveVersionU refdomainXpyr h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r h)r }r (hMj hV}r (hX]hY]r (hj Xpy-methr ehZ]h[]h^]uhNj hH]r hjX slaveVersionr r }r (hMUhNj ubahThubaubhjX will return r r }r (hMX will return hNj ubh)r }r (hMX``None``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXNoner r }r (hMUhNj ubahThubhjX.r }r (hMX.hNj ubeubhv)r }r (hMXtVersions take the form ``x.y`` where ``x`` and ``y`` are integers, and are compared as expected for version numbers.hNj; hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (hjXVersions take the form r r }r (hMXVersions take the form hNj ubh)r }r (hMX``x.y``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXx.yr r }r (hMUhNj ubahThubhjX where r r }r (hMX where hNj ubh)r }r (hMX``x``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXxr }r (hMUhNj ubahThubhjX and r r }r (hMX and hNj ubh)r }r (hMX``y``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXyr }r (hMUhNj ubahThubhjX@ are integers, and are compared as expected for version numbers.r r }r (hMX@ are integers, and are compared as expected for version numbers.hNj ubeubhv)r }r (hMXBuildbot 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.hNj; hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`KhahhH]r (hjXRBuildbot versions older than 0.5.0 did not support version queries; in this case, r r }r (hMXRBuildbot versions older than 0.5.0 did not support version queries; in this case, hNj ubh)r }r (hMX:meth:`slaveVersion`r hNj hOhRhThhV}r (UreftypeXmethhhX slaveVersionU refdomainXpyr h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`KhH]r h)r }r (hMj hV}r (hX]hY]r (hj Xpy-methr ehZ]h[]h^]uhNj hH]r hjX slaveVersionr r }r (hMUhNj ubahThubaubhjX will return r r }r (hMX will return hNj ubh)r }r (hMX``oldVersion``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX oldVersionr r }r (hMUhNj ubahThubhjXh. Since such ancient versions of Buildbot are no longer in use, this functionality is largely vestigial.r r }r (hMXh. Since such ancient versions of Buildbot are no longer in use, this functionality is largely vestigial.hNj ubeubeubeubhn)r }r (hMUhNj<hOhRhThqhV}r (h[]hZ]hX]hY]h^]Uentries]r (htXGslaveVersionIsOlderThan() (buildbot.process.buildstep.BuildStep method)hUtr auh`NhahhH]ubh)r }r (hMUhNj<hOhRhThhV}r (hhXpyr! h[]hZ]hX]hY]h^]hXmethodr" hj" uh`NhahhH]r# (h)r$ }r% (hMX,slaveVersionIsOlderThan(command, minversion)hNj hOhRhThhV}r& (h[]r' hahhhZ]hX]hY]h^]r( hahX!BuildStep.slaveVersionIsOlderThanhhh‰uh`MhahhH]r) (h)r* }r+ (hMXslaveVersionIsOlderThanhNj$ hOhRhThhV}r, (hX]hY]hZ]h[]h^]uh`MhahhH]r- hjXslaveVersionIsOlderThanr. r/ }r0 (hMUhNj* ubaubh)r1 }r2 (hMUhNj$ hOhRhThhV}r3 (hX]hY]hZ]h[]h^]uh`MhahhH]r4 (h)r5 }r6 (hMXcommandhV}r7 (hX]hY]hZ]h[]h^]uhNj1 hH]r8 hjXcommandr9 r: }r; (hMUhNj5 ubahThubh)r< }r= (hMX minversionhV}r> (hX]hY]hZ]h[]h^]uhNj1 hH]r? hjX minversionr@ rA }rB (hMUhNj< ubahThubeubeubj;)rC }rD (hMUhNj hOhRhTj>hV}rE (hX]hY]hZ]h[]h^]uh`MhahhH]rF (jt)rG }rH (hMUhNjC hOhRhTjwhV}rI (hX]hY]hZ]h[]h^]uh`NhahhH]rJ (jz)rK }rL (hMUhV}rM (hX]hY]hZ]h[]h^]uhNjG hH]rN (j)rO }rP (hMUhV}rQ (hX]hY]hZ]h[]h^]uhNjK hH]rR hjX ParametersrS rT }rU (hMUhNjO ubahTjubj)rV }rW (hMUhV}rX (hX]hY]hZ]h[]h^]uhNjK hH]rY j )rZ }r[ (hMUhV}r\ (hX]hY]hZ]h[]h^]uhNjV hH]r] (j )r^ }r_ (hMUhV}r` (hX]hY]hZ]h[]h^]uhNjZ hH]ra hv)rb }rc (hMUhV}rd (hX]hY]hZ]h[]h^]uhNj^ hH]re (j)rf }rg (hMXcommandhV}rh (hX]hY]hZ]h[]h^]uhNjb hH]ri hjXcommandrj rk }rl (hMUhNjf ubahTjubhjX (rm rn }ro (hMUhNjb ubh)rp }rq (hMUhV}rr (Ureftypej U reftargetXstringrs U refdomainj! h[]hZ]U refexplicithX]hY]h^]uhNjb hH]rt j)ru }rv (hMjs hV}rw (hX]hY]hZ]h[]h^]uhNjp hH]rx hjXstringry rz }r{ (hMUhNju ubahTjubahThubhjX)r| }r} (hMUhNjb ubhjX -- r~ r }r (hMUhNjb ubhjXcommand to examiner r }r (hMXcommand to examinehNjb ubehThyubahTj ubj )r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNjZ hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMX minversionhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX minversionr r }r (hMUhNj ubahTjubhjX -- r r }r (hMUhNj ubhjXminimum versionr r }r (hMXminimum versionhNj ubehThyubahTj ubehTj ubahTjubehTjubjz)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNjG hH]r (j)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXReturnsr r }r (hMUhNj ubahTjubj)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXbooleanr r }r (hMXbooleanhNj ubahThyubahTjubehTjubeubhv)r }r (hMXoThis method returns true if ``command`` is not implemented on the slave, or if it is older than ``minversion``.hNjC hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`MhahhH]r (hjXThis method returns true if r r }r (hMXThis method returns true if hNj ubh)r }r (hMX ``command``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXcommandr r }r (hMUhNj ubahThubhjX9 is not implemented on the slave, or if it is older than r r }r (hMX9 is not implemented on the slave, or if it is older than hNj ubh)r }r (hMX``minversion``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX minversionr r }r (hMUhNj ubahThubhjX.r }r (hMX.hNj ubeubeubeubhn)r }r (hMUhNj<hOhRhThqhV}r (h[]hZ]hX]hY]h^]Uentries]r (htX<getSlaveName() (buildbot.process.buildstep.BuildStep method)h1Utr auh`NhahhH]ubh)r }r (hMUhNj<hOhRhThhV}r (hhXpyh[]hZ]hX]hY]h^]hXmethodr hj uh`NhahhH]r (h)r }r (hMXgetSlaveName()hNj hOhRhThhV}r (h[]r h1ahhhZ]hX]hY]h^]r h1ahXBuildStep.getSlaveNamehhh‰uh`M hahhH]r (h)r }r (hMX getSlaveNamehNj hOhRhThhV}r (hX]hY]hZ]h[]h^]uh`M hahhH]r hjX getSlaveNamer r }r (hMUhNj ubaubh)r }r (hMUhNj hOhRhThhV}r (hX]hY]hZ]h[]h^]uh`M hahhH]ubeubj;)r }r (hMUhNj hOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`M hahhH]r (jt)r }r (hMUhNj hOhRhTjwhV}r (hX]hY]hZ]h[]h^]uh`NhahhH]r jz)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXReturnsr r }r (hMUhNj ubahTjubj)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXstringr r }r (hMXstringhNj ubahThyubahTjubehTjubaubhv)r }r (hMX5Get the name of the buildslave assigned to this step.r hNj hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`M hahhH]r hjX5Get the name of the buildslave assigned to this step.r r }r (hMj hNj ubaubeubeubhn)r }r (hMUhNj<hOhRhThqhV}r (h[]hZ]hX]hY]h^]Uentries]r (htX:runCommand() (buildbot.process.buildstep.BuildStep method)hUtr auh`NhahhH]ubh)r }r (hMUhNj<hOhRhThhV}r (hhXpyh[]hZ]hX]hY]h^]hXmethodr hj uh`NhahhH]r (h)r }r (hMXrunCommand(command)hNj hOhRhThhV}r (h[]r hahhhZ]hX]hY]h^]r hahXBuildStep.runCommandhhh‰uh`MhahhH]r (h)r }r (hMX runCommandhNj hOhRhThhV}r (hX]hY]hZ]h[]h^]uh`MhahhH]r hjX runCommandr r }r (hMUhNj ubaubh)r }r! (hMUhNj hOhRhThhV}r" (hX]hY]hZ]h[]h^]uh`MhahhH]r# h)r$ }r% (hMXcommandhV}r& (hX]hY]hZ]h[]h^]uhNj hH]r' hjXcommandr( r) }r* (hMUhNj$ ubahThubaubeubj;)r+ }r, (hMUhNj hOhRhTj>hV}r- (hX]hY]hZ]h[]h^]uh`MhahhH]r. (jt)r/ }r0 (hMUhNj+ hOhRhTjwhV}r1 (hX]hY]hZ]h[]h^]uh`NhahhH]r2 jz)r3 }r4 (hMUhV}r5 (hX]hY]hZ]h[]h^]uhNj/ hH]r6 (j)r7 }r8 (hMUhV}r9 (hX]hY]hZ]h[]h^]uhNj3 hH]r: hjXReturnsr; r< }r= (hMUhNj7 ubahTjubj)r> }r? (hMUhV}r@ (hX]hY]hZ]h[]h^]uhNj3 hH]rA hv)rB }rC (hMUhV}rD (hX]hY]hZ]h[]h^]uhNj> hH]rE hjXDeferredrF rG }rH (hMXDeferredhNjB ubahThyubahTjubehTjubaubhv)rI }rJ (hMXThis method connects the given command to the step's buildslave and runs it, returning the Deferred from :meth:`~buildbot.process.buildstep.RemoteCommand.run`.hNj+ hOhRhThyhV}rK (hX]hY]hZ]h[]h^]uh`MhahhH]rL (hjXiThis method connects the given command to the step's buildslave and runs it, returning the Deferred from rM rN }rO (hMXiThis method connects the given command to the step's buildslave and runs it, returning the Deferred from hNjI ubh)rP }rQ (hMX5:meth:`~buildbot.process.buildstep.RemoteCommand.run`rR hNjI hOhRhThhV}rS (UreftypeXmethhhX,buildbot.process.buildstep.RemoteCommand.runU refdomainXpyrT h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`MhH]rU h)rV }rW (hMjR hV}rX (hX]hY]rY (hjT Xpy-methrZ ehZ]h[]h^]uhNjP hH]r[ hjXrunr\ r] }r^ (hMUhNjV ubahThubaubhjX.r_ }r` (hMX.hNjI ubeubeubeubhn)ra }rb (hMUhNj<hOhRhThqhV}rc (h[]hZ]hX]hY]h^]Uentries]rd (htX6addURL() (buildbot.process.buildstep.BuildStep method)hUtre auh`NhahhH]ubh)rf }rg (hMUhNj<hOhRhThhV}rh (hhXpyh[]hZ]hX]hY]h^]hXmethodri hji uh`NhahhH]rj (h)rk }rl (hMXaddURL(name, url)hNjf hOhRhThhV}rm (h[]rn hahhhZ]hX]hY]h^]ro hahXBuildStep.addURLhhh‰uh`MhahhH]rp (h)rq }rr (hMXaddURLhNjk hOhRhThhV}rs (hX]hY]hZ]h[]h^]uh`MhahhH]rt hjXaddURLru rv }rw (hMUhNjq ubaubh)rx }ry (hMUhNjk hOhRhThhV}rz (hX]hY]hZ]h[]h^]uh`MhahhH]r{ (h)r| }r} (hMXnamehV}r~ (hX]hY]hZ]h[]h^]uhNjx hH]r hjXnamer r }r (hMUhNj| ubahThubh)r }r (hMXurlhV}r (hX]hY]hZ]h[]h^]uhNjx hH]r hjXurlr r }r (hMUhNj ubahThubeubeubj;)r }r (hMUhNjf hOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`MhahhH]r (jt)r }r (hMUhNj hOhRhTjwhV}r (hX]hY]hZ]h[]h^]uh`NhahhH]r jz)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjX Parametersr r }r (hMUhNj ubahTjubj)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r j )r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j )r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMXnamehV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXnamer r }r (hMUhNj ubahTjubhjX -- r r }r (hMUhNj ubhjXURL namer r }r (hMXURL namehNj ubehThyubahTj ubj )r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNj hH]r (j)r }r (hMXurlhV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXurlr r }r (hMUhNj ubahTjubhjX -- r r }r (hMUhNj ubhjXthe URLr r }r (hMXthe URLhNj ubehThyubahTj ubehTj ubahTjubehTjubaubhv)r }r (hMXAdd 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.hNj hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`MhahhH]r (hjXAdd a link to the given r r }r (hMXAdd a link to the given hNj ubh)r }r (hMX``url``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXurlr r }r (hMUhNj ubahThubhjX, with the given r r }r (hMX, with the given hNj ubh)r }r (hMX``name``hV}r (hX]hY]hZ]h[]h^]uhNj hH]r hjXnamer r }r (hMUhNj ubahThubhjXn to displays of this step. This allows a step to provide links to data that is not available in the log files.r r }r (hMXn to displays of this step. This allows a step to provide links to data that is not available in the log files.hNj ubeubeubeubhv)r }r (hMXThe :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.hNj<hOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`MhahhH]r (hjXThe r r }r (hMXThe hNj ubh)r }r (hMX:class:`BuildStep`r hNj hOhRhThhV}r (UreftypeXclasshhX BuildStepU refdomainXpyr h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`MhH]r h)r }r (hMj hV}r (hX]hY]r (hj Xpy-classr ehZ]h[]h^]uhNj hH]r hjX BuildStepr r }r (hMUhNj ubahThubaubhjXJ class provides minimal support for log handling, that is extended by the rr}r(hMXJ class provides minimal support for log handling, that is extended by the hNj ubh)r}r(hMX:class:`LoggingBuildStep`rhNj hOhRhThhV}r(UreftypeXclasshhXLoggingBuildStepU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`MhH]rh)r }r (hMjhV}r (hX]hY]r (hjXpy-classr ehZ]h[]h^]uhNjhH]rhjXLoggingBuildSteprr}r(hMUhNj ubahThubaubhjX class. The following methods provide some useful behaviors. These methods can be called while the step is running, but not before.rr}r(hMX class. The following methods provide some useful behaviors. These methods can be called while the step is running, but not before.hNj ubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX6addLog() (buildbot.process.buildstep.BuildStep method)h Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r (hMX addLog(name)hNjhOhRhThhV}r!(h[]r"h ahhhZ]hX]hY]h^]r#h ahXBuildStep.addLoghhh‰uh`M&hahhH]r$(h)r%}r&(hMXaddLoghNjhOhRhThhV}r'(hX]hY]hZ]h[]h^]uh`M&hahhH]r(hjXaddLogr)r*}r+(hMUhNj%ubaubh)r,}r-(hMUhNjhOhRhThhV}r.(hX]hY]hZ]h[]h^]uh`M&hahhH]r/h)r0}r1(hMXnamehV}r2(hX]hY]hZ]h[]h^]uhNj,hH]r3hjXnamer4r5}r6(hMUhNj0ubahThubaubeubj;)r7}r8(hMUhNjhOhRhTj>hV}r9(hX]hY]hZ]h[]h^]uh`M&hahhH]r:(jt)r;}r<(hMUhNj7hOhRhTjwhV}r=(hX]hY]hZ]h[]h^]uh`NhahhH]r>(jz)r?}r@(hMUhV}rA(hX]hY]hZ]h[]h^]uhNj;hH]rB(j)rC}rD(hMUhV}rE(hX]hY]hZ]h[]h^]uhNj?hH]rFhjX ParametersrGrH}rI(hMUhNjCubahTjubj)rJ}rK(hMUhV}rL(hX]hY]hZ]h[]h^]uhNj?hH]rMhv)rN}rO(hMUhV}rP(hX]hY]hZ]h[]h^]uhNjJhH]rQ(j)rR}rS(hMXnamehV}rT(hX]hY]hZ]h[]h^]uhNjNhH]rUhjXnamerVrW}rX(hMUhNjRubahTjubhjX -- rYrZ}r[(hMUhNjNubhjXlog namer\r]}r^(hMXlog namehNjNubehThyubahTjubehTjubjz)r_}r`(hMUhV}ra(hX]hY]hZ]h[]h^]uhNj;hH]rb(j)rc}rd(hMUhV}re(hX]hY]hZ]h[]h^]uhNj_hH]rfhjXReturnsrgrh}ri(hMUhNjcubahTjubj)rj}rk(hMUhV}rl(hX]hY]hZ]h[]h^]uhNj_hH]rmhv)rn}ro(hMUhV}rp(hX]hY]hZ]h[]h^]uhNjjhH]rq(h)rr}rs(hMX):class:`~buildbot.status.logfile.LogFile`rthNjnhOhRhThhV}ru(UreftypeXclasshhXbuildbot.status.logfile.LogFileU refdomainXpyrvh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`M#hH]rwh)rx}ry(hMjthV}rz(hX]hY]r{(hjvXpy-classr|ehZ]h[]h^]uhNjrhH]r}hjXLogFiler~r}r(hMUhNjxubahThubaubhjX instancerr}r(hMX instancehNjnubehThyubahTjubehTjubeubhv)r}r(hMXTAdd a new logfile with the given name to the step, and return the log file instance.rhNj7hOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`M%hahhH]rhjXTAdd a new logfile with the given name to the step, and return the log file instance.rr}r(hMjhNjubaubeubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX6getLog() (buildbot.process.buildstep.BuildStep method)h2Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMX getLog(name)hNjhOhRhThhV}r(h[]rh2ahhhZ]hX]hY]h^]rh2ahXBuildStep.getLoghhh‰uh`M.hahhH]r(h)r}r(hMXgetLoghNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`M.hahhH]rhjXgetLogrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`M.hahhH]rh)r}r(hMXnamehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXnamerr}r(hMUhNjubahThubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`M.hahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]r(jz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXnamehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXnamerr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXlog namerr}r(hMXlog namehNjubehThyubahTjubehTjubjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXReturnsrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(h)r}r(hMX):class:`~buildbot.status.logfile.LogFile`rhNjhOhRhThhV}r(UreftypeXclasshhXbuildbot.status.logfile.LogFileU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`M*hH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-classrehZ]h[]h^]uhNjhH]rhjXLogFilerr}r(hMUhNjubahThubaubhjX instancerr}r(hMX instancehNjubehThyubahTjubehTjubjz)r}r(hMUhNjhOhRhTjhV}r(hX]hY]hZ]h[]h^]uh`M+hahhH]r(j)r}r(hMXraiseshV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXRaisesrr}r(hMUhNjubahTjubj)r}r(hMX(:exc:`KeyError` if the log is not found hV}r(hX]hY]hZ]h[]h^]uhNjhH]r hv)r }r (hMX':exc:`KeyError` if the log is not foundhNjhOhRhThyhV}r (hX]hY]hZ]h[]h^]uh`M+hH]r (h)r}r(hMX:exc:`KeyError`rhNj hOhRhThhV}r(UreftypeXexchhXKeyErrorU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjhjhuh`M+hH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-excrehZ]h[]h^]uhNjhH]rhjXKeyErrorrr}r(hMUhNjubahThubaubhjX if the log is not foundrr}r(hMX if the log is not foundhNj ubeubahTjubeubeubhv)r }r!(hMX Get an existing logfile by name.r"hNjhOhRhThyhV}r#(hX]hY]hZ]h[]h^]uh`M-hahhH]r$hjX Get an existing logfile by name.r%r&}r'(hMj"hNj ubaubeubeubhn)r(}r)(hMUhNj<hOhRhThqhV}r*(h[]hZ]hX]hY]h^]Uentries]r+(htX>addCompleteLog() (buildbot.process.buildstep.BuildStep method)h$Utr,auh`NhahhH]ubh)r-}r.(hMUhNj<hOhRhThhV}r/(hhXpyh[]hZ]hX]hY]h^]hXmethodr0hj0uh`NhahhH]r1(h)r2}r3(hMXaddCompleteLog(name, text)hNj-hOhRhThhV}r4(h[]r5h$ahhhZ]hX]hY]h^]r6h$ahXBuildStep.addCompleteLoghhh‰uh`M7hahhH]r7(h)r8}r9(hMXaddCompleteLoghNj2hOhRhThhV}r:(hX]hY]hZ]h[]h^]uh`M7hahhH]r;hjXaddCompleteLogr<r=}r>(hMUhNj8ubaubh)r?}r@(hMUhNj2hOhRhThhV}rA(hX]hY]hZ]h[]h^]uh`M7hahhH]rB(h)rC}rD(hMXnamehV}rE(hX]hY]hZ]h[]h^]uhNj?hH]rFhjXnamerGrH}rI(hMUhNjCubahThubh)rJ}rK(hMXtexthV}rL(hX]hY]hZ]h[]h^]uhNj?hH]rMhjXtextrNrO}rP(hMUhNjJubahThubeubeubj;)rQ}rR(hMUhNj-hOhRhTj>hV}rS(hX]hY]hZ]h[]h^]uh`M7hahhH]rT(jt)rU}rV(hMUhNjQhOhRhTjwhV}rW(hX]hY]hZ]h[]h^]uh`NhahhH]rXjz)rY}rZ(hMUhV}r[(hX]hY]hZ]h[]h^]uhNjUhH]r\(j)r]}r^(hMUhV}r_(hX]hY]hZ]h[]h^]uhNjYhH]r`hjX Parametersrarb}rc(hMUhNj]ubahTjubj)rd}re(hMUhV}rf(hX]hY]hZ]h[]h^]uhNjYhH]rgj )rh}ri(hMUhV}rj(hX]hY]hZ]h[]h^]uhNjdhH]rk(j )rl}rm(hMUhV}rn(hX]hY]hZ]h[]h^]uhNjhhH]rohv)rp}rq(hMUhV}rr(hX]hY]hZ]h[]h^]uhNjlhH]rs(j)rt}ru(hMXnamehV}rv(hX]hY]hZ]h[]h^]uhNjphH]rwhjXnamerxry}rz(hMUhNjtubahTjubhjX -- r{r|}r}(hMUhNjpubhjXlog namer~r}r(hMXlog namehNjpubehThyubahTj ubj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXtexthV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXtextrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXcontent of the logfilerr}r(hMXcontent of the logfilehNjubehThyubahTj ubehTj ubahTjubehTjubaubhv)r}r(hMXThis 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.hNjQhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`M4hahhH]r(hjX$This method adds a new log and sets rr}r(hMX$This method adds a new log and sets hNjubh)r}r(hMX``text``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXtextrr}r(hMUhNjubahThubhjX 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.rr}r(hMX 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.hNjubeubeubeubhn)r}r(hMUhNj<hOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX:addHTMLLog() (buildbot.process.buildstep.BuildStep method)h,Utrauh`NhahhH]ubh)r}r(hMUhNj<hOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXaddHTMLLog(name, html)hNjhOhRhThhV}r(h[]rh,ahhhZ]hX]hY]h^]rh,ahXBuildStep.addHTMLLoghhh‰uh`M>hahhH]r(h)r}r(hMX addHTMLLoghNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`M>hahhH]rhjX addHTMLLogrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`M>hahhH]r(h)r}r(hMXnamehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXnamerr}r(hMUhNjubahThubh)r}r(hMXhtmlhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXhtmlrr}r(hMUhNjubahThubeubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`M>hahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXnamehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXnamerr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXlog namerr}r(hMXlog namehNjubehThyubahTj ubj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r (hMXhtmlhV}r (hX]hY]hZ]h[]h^]uhNjhH]r hjXhtmlr r }r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXcontent of the logfilerr}r(hMXcontent of the logfilehNjubehThyubahTj ubehTj ubahTjubehTjubaubhv)r}r(hMXSimilar to :meth:`addCompleteLog`, this adds a logfile containing pre-formatted HTML, allowing more expressiveness than the text format supported by :meth:`addCompleteLog`.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`M=hahhH]r(hjX Similar to rr}r(hMX Similar to hNjubh)r}r(hMX:meth:`addCompleteLog`rhNjhOhRhThhV}r(UreftypeXmethhhXaddCompleteLogU refdomainXpyr h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`M=hH]r!h)r"}r#(hMjhV}r$(hX]hY]r%(hj Xpy-methr&ehZ]h[]h^]uhNjhH]r'hjXaddCompleteLogr(r)}r*(hMUhNj"ubahThubaubhjXt, this adds a logfile containing pre-formatted HTML, allowing more expressiveness than the text format supported by r+r,}r-(hMXt, this adds a logfile containing pre-formatted HTML, allowing more expressiveness than the text format supported by hNjubh)r.}r/(hMX:meth:`addCompleteLog`r0hNjhOhRhThhV}r1(UreftypeXmethhhXaddCompleteLogU refdomainXpyr2h[]hZ]U refexplicithX]hY]h^]hhjhjhuh`M=hH]r3h)r4}r5(hMj0hV}r6(hX]hY]r7(hj2Xpy-methr8ehZ]h[]h^]uhNj.hH]r9hjXaddCompleteLogr:r;}r<(hMUhNj4ubahThubaubhjX.r=}r>(hMX.hNjubeubeubeubhn)r?}r@(hMUhNj<hOhRhThqhV}rA(h[]hZ]hX]hY]h^]Uentries]rB(htX>addLogObserver() (buildbot.process.buildstep.BuildStep method)h UtrCauh`NhahhH]ubh)rD}rE(hMUhNj<hOhRhThhV}rF(hhXpyh[]hZ]hX]hY]h^]hXmethodrGhjGuh`NhahhH]rH(h)rI}rJ(hMX!addLogObserver(logname, observer)hNjDhOhRhThhV}rK(h[]rLh ahhhZ]hX]hY]h^]rMh ahXBuildStep.addLogObserverhhh‰uh`MGhahhH]rN(h)rO}rP(hMXaddLogObserverhNjIhOhRhThhV}rQ(hX]hY]hZ]h[]h^]uh`MGhahhH]rRhjXaddLogObserverrSrT}rU(hMUhNjOubaubh)rV}rW(hMUhNjIhOhRhThhV}rX(hX]hY]hZ]h[]h^]uh`MGhahhH]rY(h)rZ}r[(hMXlognamehV}r\(hX]hY]hZ]h[]h^]uhNjVhH]r]hjXlognamer^r_}r`(hMUhNjZubahThubh)ra}rb(hMXobserverhV}rc(hX]hY]hZ]h[]h^]uhNjVhH]rdhjXobserverrerf}rg(hMUhNjaubahThubeubeubj;)rh}ri(hMUhNjDhOhRhTj>hV}rj(hX]hY]hZ]h[]h^]uh`MGhahhH]rk(jt)rl}rm(hMUhNjhhOhRhTjwhV}rn(hX]hY]hZ]h[]h^]uh`NhahhH]rojz)rp}rq(hMUhV}rr(hX]hY]hZ]h[]h^]uhNjlhH]rs(j)rt}ru(hMUhV}rv(hX]hY]hZ]h[]h^]uhNjphH]rwhjX Parametersrxry}rz(hMUhNjtubahTjubj)r{}r|(hMUhV}r}(hX]hY]hZ]h[]h^]uhNjphH]r~j )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNj{hH]r(j )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXlognamehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXlognamerr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXlog namerr}r(hMXlog namehNjubehThyubahTj ubj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXobserverhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXobserverrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXlog observer instancerr}r(hMXlog observer instancehNjubehThyubahTj ubehTj ubahTjubehTjubaubhv)r}r(hMXAdd 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.rhNjhhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MDhahhH]rhjXAdd 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.rr}r(hMjhNjubaubhv)r}r(hMXESee :ref:`Adding-LogObservers` for more information on log observers.hNjhhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MGhahhH]r(hjXSee rr}r(hMXSee hNjubh)r}r(hMX:ref:`Adding-LogObservers`rhNjhOhRhThhV}r(UreftypeXrefhhXadding-logobserversU refdomainXstdrh[]hZ]U refexplicithX]hY]h^]hhuh`MGhH]rj)r}r(hMjhV}r(hX]hY]r(hjXstd-refrehZ]h[]h^]uhNjhH]rhjXAdding-LogObserversrr}r(hMUhNjubahTjubaubhjX' for more information on log observers.rr}r(hMX' for more information on log observers.hNjubeubeubeubeubeubeubhJ)r}r(hMUhNhKhOhRhThUhV}r(hX]hY]hZ]h[]rhFah^]rhauh`MJhahhH]r(hc)r}r(hMXLoggingBuildSteprhNjhOhRhThghV}r(hX]hY]hZ]h[]h^]uh`MJhahhH]rhjXLoggingBuildSteprr}r(hMjhNjubaubhn)r}r(hMUhNjhONhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX6LoggingBuildStep (class in buildbot.process.buildstep)hUtrauh`NhahhH]ubh)r}r(hMUhNjhONhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXclassrhjuh`NhahhH]r(h)r}r(hMXLoggingBuildStep(logfiles, lazylogfiles, log_eval_func, name, locks, haltOnFailure, flunkOnWarnings, flunkOnFailure, warnOnWarnings, warnOnFailure, alwaysRun, progressMetrics, useProgress, doStepIf, hideStepIf)hNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahXLoggingBuildSteprhUh‰uh`MhahhH]r(h)r}r(hMXclass hNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXclass rr}r(hMUhNjubaubh)r}r(hMXbuildbot.process.buildstep.hNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXbuildbot.process.buildstep.rr}r(hMUhNjubaubh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXLoggingBuildSteprr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(h)r}r(hMXlogfileshV}r(hX]hY]hZ]h[]h^]uhNjhH]r hjXlogfilesr r }r (hMUhNjubahThubh)r }r(hMX lazylogfileshV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX lazylogfilesrr}r(hMUhNj ubahThubh)r}r(hMX log_eval_funchV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX log_eval_funcrr}r(hMUhNjubahThubh)r}r(hMXnamehV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXnamerr }r!(hMUhNjubahThubh)r"}r#(hMXlockshV}r$(hX]hY]hZ]h[]h^]uhNjhH]r%hjXlocksr&r'}r((hMUhNj"ubahThubh)r)}r*(hMX haltOnFailurehV}r+(hX]hY]hZ]h[]h^]uhNjhH]r,hjX haltOnFailurer-r.}r/(hMUhNj)ubahThubh)r0}r1(hMXflunkOnWarningshV}r2(hX]hY]hZ]h[]h^]uhNjhH]r3hjXflunkOnWarningsr4r5}r6(hMUhNj0ubahThubh)r7}r8(hMXflunkOnFailurehV}r9(hX]hY]hZ]h[]h^]uhNjhH]r:hjXflunkOnFailurer;r<}r=(hMUhNj7ubahThubh)r>}r?(hMXwarnOnWarningshV}r@(hX]hY]hZ]h[]h^]uhNjhH]rAhjXwarnOnWarningsrBrC}rD(hMUhNj>ubahThubh)rE}rF(hMX warnOnFailurehV}rG(hX]hY]hZ]h[]h^]uhNjhH]rHhjX warnOnFailurerIrJ}rK(hMUhNjEubahThubh)rL}rM(hMX alwaysRunhV}rN(hX]hY]hZ]h[]h^]uhNjhH]rOhjX alwaysRunrPrQ}rR(hMUhNjLubahThubh)rS}rT(hMXprogressMetricshV}rU(hX]hY]hZ]h[]h^]uhNjhH]rVhjXprogressMetricsrWrX}rY(hMUhNjSubahThubh)rZ}r[(hMX useProgresshV}r\(hX]hY]hZ]h[]h^]uhNjhH]r]hjX useProgressr^r_}r`(hMUhNjZubahThubh)ra}rb(hMXdoStepIfhV}rc(hX]hY]hZ]h[]h^]uhNjhH]rdhjXdoStepIfrerf}rg(hMUhNjaubahThubh)rh}ri(hMX hideStepIfhV}rj(hX]hY]hZ]h[]h^]uhNjhH]rkhjX hideStepIfrlrm}rn(hMUhNjhubahThubeubeubj;)ro}rp(hMUhNjhOhRhTj>hV}rq(hX]hY]hZ]h[]h^]uh`MhahhH]rr(jt)rs}rt(hMUhNjohONhTjwhV}ru(hX]hY]hZ]h[]h^]uh`NhahhH]rvjz)rw}rx(hMUhV}ry(hX]hY]hZ]h[]h^]uhNjshH]rz(j)r{}r|(hMUhV}r}(hX]hY]hZ]h[]h^]uhNjwhH]r~hjX Parametersrr}r(hMUhNj{ubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjwhH]rj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXlogfileshV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXlogfilesrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXsee rr}r(hMXsee hNjubh)r}r(hMX:bb:step:`ShellCommand`rhNjhOhRhThhV}r(UreftypeXstephhX ShellCommandU refdomainXbbrh[]hZ]U refexplicithX]hY]h^]hhuh`MNhH]rh)r}r(hMjhV}r(hX]hY]r(hjXbb-steprehZ]h[]h^]uhNjhH]rhjX ShellCommandrr}r(hMUhNjubahThubaubehThyubahTj ubj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMX lazylogfileshV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX lazylogfilesrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXsee rr}r(hMXsee hNjubh)r}r(hMX:bb:step:`ShellCommand`rhNjhOhRhThhV}r(UreftypeXstephhX ShellCommandU refdomainXbbrh[]hZ]U refexplicithX]hY]h^]hhuh`MOhH]rh)r}r(hMjhV}r(hX]hY]r(hjXbb-steprehZ]h[]h^]uhNjhH]rhjX ShellCommandrr}r(hMUhNjubahThubaubehThyubahTj ubj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMX log_eval_funchV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX log_eval_funcrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXsee rr}r(hMXsee hNjubh)r}r(hMX:bb:step:`ShellCommand`rhNjhOhRhThhV}r(UreftypeXstephhX ShellCommandU refdomainXbbrh[]hZ]U refexplicithX]hY]h^]hhuh`MPhH]rh)r}r(hMjhV}r(hX]hY]r(hjXbb-steprehZ]h[]h^]uhNjhH]rhjX ShellCommandrr}r(hMUhNjubahThubaubehThyubahTj ubehTj ubahTjubehTjubaubhv)r}r(hMXIThe remaining arguments are passed to the :class:`BuildStep` constructor.rhNjohOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MRhahhH]r(hjX*The remaining arguments are passed to the rr}r(hMX*The remaining arguments are passed to the hNjubh)r}r(hMX:class:`BuildStep`rhNjhOhRhThhV}r(UreftypeXclasshhX BuildStepU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MRhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-classrehZ]h[]h^]uhNjhH]r hjX BuildStepr r }r (hMUhNjubahThubaubhjX constructor.r r}r(hMX constructor.hNjubeubhv)r}r(hMXThis subclass of :class:`BuildStep` is designed to help its subclasses run remote commands that produce standard I/O logfiles. It:hNjohOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MThahhH]r(hjXThis subclass of rr}r(hMXThis subclass of hNjubh)r}r(hMX:class:`BuildStep`rhNjhOhRhThhV}r(UreftypeXclasshhX BuildStepU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MThH]rh)r}r(hMjhV}r(hX]hY]r (hjXpy-classr!ehZ]h[]h^]uhNjhH]r"hjX BuildStepr#r$}r%(hMUhNjubahThubaubhjX_ is designed to help its subclasses run remote commands that produce standard I/O logfiles. It:r&r'}r((hMX_ is designed to help its subclasses run remote commands that produce standard I/O logfiles. It:hNjubeubj )r)}r*(hMUhNjohOhRhTj hV}r+(Ubulletr,X*h[]hZ]hX]hY]h^]uh`MWhahhH]r-(j )r.}r/(hMX6tracks progress using the length of the stdout logfiler0hNj)hOhRhTj hV}r1(hX]hY]hZ]h[]h^]uh`NhahhH]r2hv)r3}r4(hMj0hNj.hOhRhThyhV}r5(hX]hY]hZ]h[]h^]uh`MWhH]r6hjX6tracks progress using the length of the stdout logfiler7r8}r9(hMj0hNj3ubaubaubj )r:}r;(hMXBprovides hooks for summarizing and evaluating the command's resultr<hNj)hOhRhTj hV}r=(hX]hY]hZ]h[]h^]uh`NhahhH]r>hv)r?}r@(hMj<hNj:hOhRhThyhV}rA(hX]hY]hZ]h[]h^]uh`MXhH]rBhjXBprovides hooks for summarizing and evaluating the command's resultrCrD}rE(hMj<hNj?ubaubaubj )rF}rG(hMXsupports lazy logfilesrHhNj)hOhRhTj hV}rI(hX]hY]hZ]h[]h^]uh`NhahhH]rJhv)rK}rL(hMjHhNjFhOhRhThyhV}rM(hX]hY]hZ]h[]h^]uh`MYhH]rNhjXsupports lazy logfilesrOrP}rQ(hMjHhNjKubaubaubj )rR}rS(hMXNhandles the mechanics of starting, interrupting, and finishing remote commandsrThNj)hOhRhTj hV}rU(hX]hY]hZ]h[]h^]uh`NhahhH]rVhv)rW}rX(hMjThNjRhOhRhThyhV}rY(hX]hY]hZ]h[]h^]uh`MZhH]rZhjXNhandles the mechanics of starting, interrupting, and finishing remote commandsr[r\}r](hMjThNjWubaubaubj )r^}r_(hMXYdetects lost slaves and finishes with a status of :data:`~buildbot.status.results.RETRY` hNj)hOhRhTj hV}r`(hX]hY]hZ]h[]h^]uh`NhahhH]rahv)rb}rc(hMXXdetects lost slaves and finishes with a status of :data:`~buildbot.status.results.RETRY`hNj^hOhRhThyhV}rd(hX]hY]hZ]h[]h^]uh`M[hH]re(hjX2detects lost slaves and finishes with a status of rfrg}rh(hMX2detects lost slaves and finishes with a status of hNjbubh)ri}rj(hMX&:data:`~buildbot.status.results.RETRY`rkhNjbhOhRhThhV}rl(UreftypeXdatahhXbuildbot.status.results.RETRYU refdomainXpyrmh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`M[hH]rnh)ro}rp(hMjkhV}rq(hX]hY]rr(hjmXpy-datarsehZ]h[]h^]uhNjihH]rthjXRETRYrurv}rw(hMUhNjoubahThubaubeubaubeubhn)rx}ry(hMUhNjohOhRhThqhV}rz(h[]hZ]hX]hY]h^]Uentries]r{(htX@logfiles (buildbot.process.buildstep.LoggingBuildStep attribute)h*Utr|auh`NhahhH]ubh)r}}r~(hMUhNjohOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX attributerhjuh`NhahhH]r(h)r}r(hMXlogfilesrhNj}hOhRhThhV}r(h[]rh*ahhhZ]hX]hY]h^]rh*ahXLoggingBuildStep.logfileshjh‰uh`MghahhH]rh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MghahhH]rhjXlogfilesrr}r(hMUhNjubaubaubj;)r}r(hMUhNj}hOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`MghahhH]r(hv)r}r(hMXThe 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::hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`M`hahhH]r(hjX(The logfiles to track, as described for rr}r(hMX(The logfiles to track, as described for hNjubh)r}r(hMX:bb:step:`ShellCommand`rhNjhOhRhThhV}r(UreftypeXstephhX ShellCommandU refdomainXbbrh[]hZ]U refexplicithX]hY]h^]hhuh`M`hH]rh)r}r(hMjhV}r(hX]hY]r(hjXbb-steprehZ]h[]h^]uhNjhH]rhjX ShellCommandrr}r(hMUhNjubahThubaubhjX". The contents of the class-level rr}r(hMX". The contents of the class-level hNjubh)r}r(hMX ``logfiles``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXlogfilesrr}r(hMUhNjubahThubhjXu attribute are combined with those passed to the constructor, so subclasses may add log files with a class attribute:rr}r(hMXu attribute are combined with those passed to the constructor, so subclasses may add log files with a class attribute:hNjubeubj)r}r(hMXFclass MyStep(LoggingBuildStep): logfiles = dict(debug='debug.log')hNjhOhRhTjhV}r(jjh[]hZ]hX]hY]h^]uh`MchahhH]rhjXFclass MyStep(LoggingBuildStep): logfiles = dict(debug='debug.log')rr}r(hMUhNjubaubhv)r}r(hMXnNote that lazy logfiles cannot be specified using this method; they must be provided as constructor arguments.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MfhahhH]rhjXnNote that lazy logfiles cannot be specified using this method; they must be provided as constructor arguments.rr}r(hMjhNjubaubeubeubhn)r}r(hMUhNjohONhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htXCstartCommand() (buildbot.process.buildstep.LoggingBuildStep method)hUtrauh`NhahhH]ubh)r}r(hMUhNjohONhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXstartCommand(command)rhNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahXLoggingBuildStep.startCommandhjh‰uh`M{hahhH]r(h)r}r(hMX startCommandhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`M{hahhH]rhjX startCommandrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`M{hahhH]rh)r}r(hMXcommandhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXcommandrr}r(hMUhNjubahThubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`M{hahhH]r(jt)r}r(hMUhNjhONhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXcommandhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXcommandrr }r (hMUhNjubahTjubhjX -- r r }r (hMUhNjubhjXthe rr}r(hMXthe hNjubh)r}r(hMX2:class:`~buildbot.process.buildstep.RemoteCommand`rhNjhOhRhThhV}r(UreftypeXclasshhX(buildbot.process.buildstep.RemoteCommandU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MjhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-classrehZ]h[]h^]uhNjhH]rhjX RemoteCommandrr}r(hMUhNjubahThubaubhjX instance to startr r!}r"(hMX instance to starthNjubehThyubahTjubehTjubaubj= )r#}r$(hMX 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)hNjhOhRhTj@ hV}r%(hX]hY]hZ]h[]h^]uh`NhahhH]r&(cdocutils.nodes block_quote r')r(}r)(hMUhV}r*(hX]hY]hZ]h[]h^]uhNj#hH]r+hv)r,}r-(hMXThis 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.hNj(hOhRhThyhV}r.(hX]hY]hZ]h[]h^]uh`MohH]r/(hjX This method permits an optional r0r1}r2(hMX This method permits an optional hNj,ubh)r3}r4(hMX``errorMessages``hV}r5(hX]hY]hZ]h[]h^]uhNj,hH]r6hjX errorMessagesr7r8}r9(hMUhNj3ubahThubhjX~ parameter, allowing errors detected early in the command process to be logged. It will be removed, and its use is deprecated.r:r;}r<(hMX~ parameter, allowing errors detected early in the command process to be logged. It will be removed, and its use is deprecated.hNj,ubeubahTU block_quoter=ubhv)r>}r?(hMX: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@hNj#hOhRhThyhV}rA(hX]hY]hZ]h[]h^]uh`MrhH]rBhjX: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.rCrD}rE(hMj@hNj>ubaubhv)rF}rG(hMXSubclasses should override :meth:`~buildbot.process.buildstep.BuildStep.start` and, after setting up an appropriate command, call this method. ::rHhNj#hOhRhThyhV}rI(hX]hY]hZ]h[]h^]uh`MvhH]rJ(hjXSubclasses should override rKrL}rM(hMXSubclasses should override hNjFubh)rN}rO(hMX3:meth:`~buildbot.process.buildstep.BuildStep.start`rPhNjFhOhRhThhV}rQ(UreftypeXmethhhX*buildbot.process.buildstep.BuildStep.startU refdomainXpyrRh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MvhH]rSh)rT}rU(hMjPhV}rV(hX]hY]rW(hjRXpy-methrXehZ]h[]h^]uhNjNhH]rYhjXstartrZr[}r\(hMUhNjTubahThubaubhjX@ and, after setting up an appropriate command, call this method.r]r^}r_(hMX@ and, after setting up an appropriate command, call this method.hNjFubeubj)r`}ra(hMXVdef start(self): cmd = RemoteShellCommand(..) self.startCommand(cmd, warnings)hNj#hTjhV}rb(jjh[]hZ]hX]hY]h^]uh`MxhH]rchjXVdef start(self): cmd = RemoteShellCommand(..) self.startCommand(cmd, warnings)rdre}rf(hMUhNj`ubaubeubeubeubhv)rg}rh(hMXTo 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.hNjohOhRhThyhV}ri(hX]hY]hZ]h[]h^]uh`M|hahhH]rj(hjXPTo refine the status output, override one or more of the following methods. The rkrl}rm(hMXPTo refine the status output, override one or more of the following methods. The hNjgubh)rn}ro(hMX:class:`LoggingBuildStep`rphNjghOhRhThhV}rq(UreftypeXclasshhXLoggingBuildStepU refdomainXpyrrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`M|hH]rsh)rt}ru(hMjphV}rv(hX]hY]rw(hjrXpy-classrxehZ]h[]h^]uhNjnhH]ryhjXLoggingBuildSteprzr{}r|(hMUhNjtubahThubaubhjXJ implementations are stubs, so there is no need to call the parent method.r}r~}r(hMXJ implementations are stubs, so there is no need to call the parent method.hNjgubeubhn)r}r(hMUhNjohOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htXFcommandComplete() (buildbot.process.buildstep.LoggingBuildStep method)h.Utrauh`NhahhH]ubh)r}r(hMUhNjohOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXcommandComplete(command)hNjhOhRhThhV}r(h[]rh.ahhhZ]hX]hY]h^]rh.ahX LoggingBuildStep.commandCompletehjh‰uh`MhahhH]r(h)r}r(hMXcommandCompletehNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXcommandCompleterr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rh)r}r(hMXcommandhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXcommandrr}r(hMUhNjubahThubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXcommandhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXcommandrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjX!the just-completed remote commandrr}r(hMX!the just-completed remote commandhNjubehThyubahTjubehTjubaubhv)r}r(hMXThis 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.rhNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXThis 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(hMjhNjubaubeubeubhn)r}r(hMUhNjohOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htXDcreateSummary() (buildbot.process.buildstep.LoggingBuildStep method)h0Utrauh`NhahhH]ubh)r}r(hMUhNjohOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXcreateSummary(stdio)hNjhOhRhThhV}r(h[]rh0ahhhZ]hX]hY]h^]rh0ahXLoggingBuildStep.createSummaryhjh‰uh`MhahhH]r(h)r}r(hMX createSummaryhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjX createSummaryrr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rh)r}r(hMXstdiohV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXstdiorr}r(hMUhNjubahThubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(jt)r}r(hMUhNjhOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]rjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r (hX]hY]hZ]h[]h^]uhNjhH]r hv)r }r (hMUhV}r (hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXstdiohV}r(hX]hY]hZ]h[]h^]uhNj hH]rhjXstdiorr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNj ubhjXstdio rr}r(hMXstdio hNj ubh)r}r(hMX):class:`~buildbot.status.logfile.LogFile`rhNj hOhRhThhV}r(UreftypeXclasshhXbuildbot.status.logfile.LogFileU refdomainXpyr h[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]r!h)r"}r#(hMjhV}r$(hX]hY]r%(hj Xpy-classr&ehZ]h[]h^]uhNjhH]r'hjXLogFiler(r)}r*(hMUhNj"ubahThubaubehThyubahTjubehTjubaubhv)r+}r,(hMXThis 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., :meth:`~BuildStep.addURL`.hNjhOhRhThyhV}r-(hX]hY]hZ]h[]h^]uh`MhahhH]r.(hjXThis 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., r/r0}r1(hMXThis 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., hNj+ubh)r2}r3(hMX:meth:`~BuildStep.addURL`r4hNj+hOhRhThhV}r5(UreftypeXmethhhXBuildStep.addURLU refdomainXpyr6h[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]r7h)r8}r9(hMj4hV}r:(hX]hY]r;(hj6Xpy-methr<ehZ]h[]h^]uhNj2hH]r=hjXaddURLr>r?}r@(hMUhNj8ubahThubaubhjX.rA}rB(hMX.hNj+ubeubeubeubhn)rC}rD(hMUhNjohOhRhThqhV}rE(h[]hZ]hX]hY]h^]Uentries]rF(htXFevaluateCommand() (buildbot.process.buildstep.LoggingBuildStep method)hUtrGauh`NhahhH]ubh)rH}rI(hMUhNjohOhRhThhV}rJ(hhXpyh[]hZ]hX]hY]h^]hXmethodrKhjKuh`NhahhH]rL(h)rM}rN(hMXevaluateCommand(command)hNjHhOhRhThhV}rO(h[]rPhahhhZ]hX]hY]h^]rQhahX LoggingBuildStep.evaluateCommandhjh‰uh`MhahhH]rR(h)rS}rT(hMXevaluateCommandhNjMhOhRhThhV}rU(hX]hY]hZ]h[]h^]uh`MhahhH]rVhjXevaluateCommandrWrX}rY(hMUhNjSubaubh)rZ}r[(hMUhNjMhOhRhThhV}r\(hX]hY]hZ]h[]h^]uh`MhahhH]r]h)r^}r_(hMXcommandhV}r`(hX]hY]hZ]h[]h^]uhNjZhH]rahjXcommandrbrc}rd(hMUhNj^ubahThubaubeubj;)re}rf(hMUhNjHhOhRhTj>hV}rg(hX]hY]hZ]h[]h^]uh`MhahhH]rh(jt)ri}rj(hMUhNjehOhRhTjwhV}rk(hX]hY]hZ]h[]h^]uh`NhahhH]rl(jz)rm}rn(hMUhV}ro(hX]hY]hZ]h[]h^]uhNjihH]rp(j)rq}rr(hMUhV}rs(hX]hY]hZ]h[]h^]uhNjmhH]rthjX Parametersrurv}rw(hMUhNjqubahTjubj)rx}ry(hMUhV}rz(hX]hY]hZ]h[]h^]uhNjmhH]r{hv)r|}r}(hMUhV}r~(hX]hY]hZ]h[]h^]uhNjxhH]r(j)r}r(hMXcommandhV}r(hX]hY]hZ]h[]h^]uhNj|hH]rhjXcommandrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNj|ubhjX!the just-completed remote commandrr}r(hMX!the just-completed remote commandhNj|ubehThyubahTjubehTjubjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjihH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXReturnsrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(hjXstep result from rr}r(hMXstep result from hNjubh)r}r(hMX:mod:`buildbot.status.results`rhNjhOhRhThhV}r(UreftypeXmodhhXbuildbot.status.resultsU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-modrehZ]h[]h^]uhNjhH]rhjXbuildbot.status.resultsrr}r(hMUhNjubahThubaubehThyubahTjubehTjubeubhv)r}r(hMX%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`.hNjehOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(hjX]This hook should decide what result the step should have. The default implementation invokes rr}r(hMX]This hook should decide what result the step should have. The default implementation invokes hNjubh)r}r(hMX``log_eval_func``hV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX log_eval_funcrr}r(hMUhNjubahThubhjX if it exists, and looks at rr}r(hMX if it exists, and looks at hNjubh)r}r(hMX4:attr:`~buildbot.process.buildstep.RemoteCommand.rc`rhNjhOhRhThhV}r(UreftypeXattrhhX+buildbot.process.buildstep.RemoteCommand.rcU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-attrrehZ]h[]h^]uhNjhH]rhjXrcrr}r(hMUhNjubahThubaubhjX to distinguish rr}r(hMX to distinguish hNjubh)r}r(hMX(:data:`~buildbot.status.results.SUCCESS`rhNjhOhRhThhV}r(UreftypeXdatahhXbuildbot.status.results.SUCCESSU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-datarehZ]h[]h^]uhNjhH]rhjXSUCCESSrr}r(hMUhNjubahThubaubhjX from rr}r(hMX from hNjubh)r}r(hMX(:data:`~buildbot.status.results.FAILURE`rhNjhOhRhThhV}r(UreftypeXdatahhXbuildbot.status.results.FAILUREU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-datarehZ]h[]h^]uhNjhH]rhjXFAILURErr}r(hMUhNjubahThubaubhjX.r}r(hMX.hNjubeubeubeubhv)r}r(hMX(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`.hNjohOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(hjXThe 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(hMXThe 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 hNjubh)r}r(hMX:meth:`~BuildStep.describe`rhNjhOhRhThhV}r(UreftypeXmethhhXBuildStep.describeU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methr ehZ]h[]h^]uhNjhH]r hjXdescriber r }r (hMUhNjubahThubaubhjX+. If that is not flexible enough, override rr}r(hMX+. If that is not flexible enough, override hNjubh)r}r(hMX:meth:`getText`rhNjhOhRhThhV}r(UreftypeXmethhhXgetTextU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXgetTextrr}r(hMUhNjubahThubaubhjX and/or r r!}r"(hMX and/or hNjubh)r#}r$(hMX:meth:`getText2`r%hNjhOhRhThhV}r&(UreftypeXmethhhXgetText2U refdomainXpyr'h[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]r(h)r)}r*(hMj%hV}r+(hX]hY]r,(hj'Xpy-methr-ehZ]h[]h^]uhNj#hH]r.hjXgetText2r/r0}r1(hMUhNj)ubahThubaubhjX.r2}r3(hMX.hNjubeubhn)r4}r5(hMUhNjohOhRhThqhV}r6(h[]hZ]hX]hY]h^]Uentries]r7(htX>getText() (buildbot.process.buildstep.LoggingBuildStep method)h'Utr8auh`NhahhH]ubh)r9}r:(hMUhNjohOhRhThhV}r;(hhXpyh[]hZ]hX]hY]h^]hXmethodr<hj<uh`NhahhH]r=(h)r>}r?(hMXgetText(command, results)hNj9hOhRhThhV}r@(h[]rAh'ahhhZ]hX]hY]h^]rBh'ahXLoggingBuildStep.getTexthjh‰uh`MhahhH]rC(h)rD}rE(hMXgetTexthNj>hOhRhThhV}rF(hX]hY]hZ]h[]h^]uh`MhahhH]rGhjXgetTextrHrI}rJ(hMUhNjDubaubh)rK}rL(hMUhNj>hOhRhThhV}rM(hX]hY]hZ]h[]h^]uh`MhahhH]rN(h)rO}rP(hMXcommandhV}rQ(hX]hY]hZ]h[]h^]uhNjKhH]rRhjXcommandrSrT}rU(hMUhNjOubahThubh)rV}rW(hMXresultshV}rX(hX]hY]hZ]h[]h^]uhNjKhH]rYhjXresultsrZr[}r\(hMUhNjVubahThubeubeubj;)r]}r^(hMUhNj9hOhRhTj>hV}r_(hX]hY]hZ]h[]h^]uh`MhahhH]r`(jt)ra}rb(hMUhNj]hOhRhTjwhV}rc(hX]hY]hZ]h[]h^]uh`NhahhH]rd(jz)re}rf(hMUhV}rg(hX]hY]hZ]h[]h^]uhNjahH]rh(j)ri}rj(hMUhV}rk(hX]hY]hZ]h[]h^]uhNjehH]rlhjX Parametersrmrn}ro(hMUhNjiubahTjubj)rp}rq(hMUhV}rr(hX]hY]hZ]h[]h^]uhNjehH]rsj )rt}ru(hMUhV}rv(hX]hY]hZ]h[]h^]uhNjphH]rw(j )rx}ry(hMUhV}rz(hX]hY]hZ]h[]h^]uhNjthH]r{hv)r|}r}(hMUhV}r~(hX]hY]hZ]h[]h^]uhNjxhH]r(j)r}r(hMXcommandhV}r(hX]hY]hZ]h[]h^]uhNj|hH]rhjXcommandrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNj|ubhjX!the just-completed remote commandrr}r(hMX!the just-completed remote commandhNj|ubehThyubahTj ubj )r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjthH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]r(j)r}r(hMXresultshV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXresultsrr}r(hMUhNjubahTjubhjX -- rr}r(hMUhNjubhjXstep result from rr}r(hMXstep result from hNjubh)r}r(hMX:meth:`evaluateCommand`rhNjhOhRhThhV}r(UreftypeXmethhhXevaluateCommandU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXevaluateCommandrr}r(hMUhNjubahThubaubehThyubahTj ubehTj ubahTjubehTjubjz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjahH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXReturnsrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhv)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXa list of short stringsrr}r(hMXa list of short stringshNjubahThyubahTjubehTjubeubhv)r}r(hMXThis 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.hNj]hOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(hjXZThis method is the primary means of describing the step. The default implementation calls rr}r(hMXZThis method is the primary means of describing the step. The default implementation calls hNjubh)r}r(hMX:meth:`~BuildStep.describe`rhNjhOhRhThhV}r(UreftypeXmethhhXBuildStep.describeU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXdescriberr}r(hMUhNjubahThubaubhjX, which is usually the easiest method to override, and then appends a string describing the step status if it was not successful.rr}r(hMX, which is usually the easiest method to override, and then appends a string describing the step status if it was not successful.hNjubeubeubeubhn)r}r(hMUhNjohOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htX?getText2() (buildbot.process.buildstep.LoggingBuildStep method)hUtrauh`NhahhH]ubh)r}r(hMUhNjohOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hXmethodrhjuh`NhahhH]r(h)r}r(hMXgetText2(command, results)hNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahXLoggingBuildStep.getText2hjh‰uh`MhahhH]r(h)r}r(hMXgetText2hNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXgetText2rr}r(hMUhNjubaubh)r}r(hMUhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(h)r}r(hMXcommandhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXcommandrr}r(hMUhNjubahThubh)r}r(hMXresultshV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjXresultsrr}r(hMUhNjubahThubeubeubj;)r }r (hMUhNjhOhRhTj>hV}r (hX]hY]hZ]h[]h^]uh`MhahhH]r (jt)r }r(hMUhNj hOhRhTjwhV}r(hX]hY]hZ]h[]h^]uh`NhahhH]r(jz)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNj hH]r(j)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rhjX Parametersrr}r(hMUhNjubahTjubj)r}r(hMUhV}r(hX]hY]hZ]h[]h^]uhNjhH]rj )r }r!(hMUhV}r"(hX]hY]hZ]h[]h^]uhNjhH]r#(j )r$}r%(hMUhV}r&(hX]hY]hZ]h[]h^]uhNj hH]r'hv)r(}r)(hMUhV}r*(hX]hY]hZ]h[]h^]uhNj$hH]r+(j)r,}r-(hMXcommandhV}r.(hX]hY]hZ]h[]h^]uhNj(hH]r/hjXcommandr0r1}r2(hMUhNj,ubahTjubhjX -- r3r4}r5(hMUhNj(ubhjX!the just-completed remote commandr6r7}r8(hMX!the just-completed remote commandr9hNj(ubehThyubahTj ubj )r:}r;(hMUhV}r<(hX]hY]hZ]h[]h^]uhNj hH]r=hv)r>}r?(hMUhV}r@(hX]hY]hZ]h[]h^]uhNj:hH]rA(j)rB}rC(hMXresultshV}rD(hX]hY]hZ]h[]h^]uhNj>hH]rEhjXresultsrFrG}rH(hMUhNjBubahTjubhjX -- rIrJ}rK(hMUhNj>ubhjXstep result from rLrM}rN(hMXstep result from hNj>ubh)rO}rP(hMX:meth:`evaluateCommand`rQhNj>hOhRhThhV}rR(UreftypeXmethhhXevaluateCommandU refdomainXpyrSh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rTh)rU}rV(hMjQhV}rW(hX]hY]rX(hjSXpy-methrYehZ]h[]h^]uhNjOhH]rZhjXevaluateCommandr[r\}r](hMUhNjUubahThubaubehThyubahTj ubehTj ubahTjubehTjubjz)r^}r_(hMUhV}r`(hX]hY]hZ]h[]h^]uhNj hH]ra(j)rb}rc(hMUhV}rd(hX]hY]hZ]h[]h^]uhNj^hH]rehjXReturnsrfrg}rh(hMUhNjbubahTjubj)ri}rj(hMUhV}rk(hX]hY]hZ]h[]h^]uhNj^hH]rlhv)rm}rn(hMUhV}ro(hX]hY]hZ]h[]h^]uhNjihH]rphjXa list of short stringsrqrr}rs(hMXa list of short stringsrthNjmubahThyubahTjubehTjubeubhv)ru}rv(hMXLike :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.rwhNj hOhRhThyhV}rx(hX]hY]hZ]h[]h^]uh`MhahhH]ry(hjXLike rzr{}r|(hMXLike hNjuubh)r}}r~(hMX:meth:`getText`rhNjuhOhRhThhV}r(UreftypeXmethhhXgetTextU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNj}hH]rhjXgetTextrr}r(hMUhNjubahThubaubhjX, 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(hMX, 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.hNjuubeubeubeubeubeubeubhJ)r}r(hMUhNhKhOhRhThUhV}r(hX]hY]hZ]h[]rhEah^]rhauh`MhahhH]r(hc)r}r(hMX ExceptionsrhNjhOhRhThghV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjX Exceptionsrr}r(hMjhNjubaubhn)r}r(hMUhNjhOhRhThqhV}r(h[]hZ]hX]hY]h^]Uentries]r(htXBuildStepFailedrhUtrauh`NhahhH]ubh)r}r(hMUhNjhOhRhThhV}r(hhXpyh[]hZ]hX]hY]h^]hX exceptionrhjuh`NhahhH]r(h)r}r(hMjhNjhOhRhThhV}r(h[]rhahhhZ]hX]hY]h^]rhahjhUh‰uh`MhahhH]r(h)r}r(hMX exception hNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjX exception rr}r(hMUhNjubaubh)r}r(hMXbuildbot.process.buildstep.hNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXbuildbot.process.buildstep.rr}r(hMUhNjubaubh)r}r(hMjhNjhOhRhThhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhjXBuildStepFailedrr}r(hMUhNjubaubeubj;)r}r(hMUhNjhOhRhTj>hV}r(hX]hY]hZ]h[]h^]uh`MhahhH]rhv)r}r(hMXThis 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`.hNjhOhRhThyhV}r(hX]hY]hZ]h[]h^]uh`MhahhH]r(hjXThis 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(hMXThis 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 hNjubh)r}r(hMX:meth:`BuildStep.failed`rhNjhOhRhThhV}r(UreftypeXmethhhXBuildStep.failedU refdomainXpyrh[]hZ]U refexplicithX]hY]h^]hhjjjhuh`MhH]rh)r}r(hMjhV}r(hX]hY]r(hjXpy-methrehZ]h[]h^]uhNjhH]rhjXBuildStep.failedrr}r(hMUhNjubahThubaubhjX.r}r(hMX.hNjubeubaubeubeubeubahMUU transformerrNU footnote_refsr}rUrefnamesr}rUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rhahU 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_levelr KU strip_classesr NhgNUerror_encoding_error_handlerr Ubackslashreplacer Udebugr NUembed_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_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.8/master/docs/developer/cls-buildsteps.rstr-Ugettext_compactr.U generatorr/NUdump_internalsr0NU smart_quotesr1U pep_base_urlr2Uhttp://www.python.org/dev/peps/r3Usyntax_highlightr4Ulongr5Uinput_encoding_error_handlerr6jUauto_id_prefixr7Uidr8Udoctitle_xformr9Ustrip_elements_with_classesr:NU _config_filesr;]Ufile_insertion_enabledr<U raw_enabledr=KU dump_settingsr>NubUsymbol_footnote_startr?KUidsr@}rA(hjMhjhjh jhDhKh jXh jrh jIhhhjhjk hjhjhjhj hjhEjhjh]cdocutils.nodes target rB)rC}rD(hMUhNhKhOhRhTUtargetrEhV}rF(hX]h[]rGh]ahZ]UismodhY]h^]uh`KhahhH]ubhFjhj$hj hjwhGhhj^ hjh jSh!j h"jh#jh$j2h%jh&jh'j>h(jSh)jh*jh+jh,jh-jh.jh/j^h1j h0jhj$ h2jh3jh4jh5jh6jh7j h8jgh9jh:j*uUsubstitution_namesrH}rIhThahV}rJ(hX]h[]hZ]UsourcehRhY]h^]uU footnotesrK]rLUrefidsrM}rNub.PKJtDD7ss<buildbot-v0.8.8/.doctrees/developer/cls-buildfactory.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X buildfactory implementation noteqNX buildfactoryqNuUsubstitution_defsq}q Uparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startqKUnameidsq}q(hU buildfactory-implementation-noteqhU buildfactoryquUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qX[/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/cls-buildfactory.rstqq}qbUtagnameqUsectionq U attributesq!}q"(Udupnamesq#]Uclassesq$]Ubackrefsq%]Uidsq&]q'haUnamesq(]q)hauUlineq*KUdocumentq+hh]q,(cdocutils.nodes title q-)q.}q/(hX BuildFactoryq0hhhhhUtitleq1h!}q2(h#]h$]h%]h&]h(]uh*Kh+hh]q3cdocutils.nodes Text q4X BuildFactoryq5q6}q7(hh0hh.ubaubh)q8}q9(hUhhhhhh h!}q:(h#]h$]h%]h&]q;hah(]q}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.8/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]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hh8hhuUsubstitution_namesr}rhh+h!}r(h#]h&]h%]Usourcehh$]h(]uU footnotesr]rUrefidsr}rub.PKJtD%jfCC2buildbot-v0.8.8/.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.slavePortnumq X'buildbot.config.MasterConfig.logMaxSizeqX0buildbot.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.mergeRequestsqXslavesq NX'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.propertiesq0Xreconfigurationq1NX configurationq2NX#buildbot.config.MasterConfig.statusq3X+buildbot.config.BuilderConfig.canStartBuildq4Xbuildbot.config.errorq5X'buildbot.config.MasterConfig.validationq6X'buildbot.config.MasterConfig.schedulersq7Xbuildbot.config.MasterConfigq8X'buildbot.config.BuilderConfig.nextBuildq9X/buildbot.config.MasterConfig.prioritizeBuildersq:X"buildbot.config.MasterConfig.titleq;Xbuildbot.config.BuilderConfigqX'buildbot.config.MasterConfig.loadConfigq?X)buildbot.config.MasterConfig.buildHorizonq@Xbuilder configurationqANX"buildbot.config.BuilderConfig.nameqBXcustom subclassesqCNX#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 hhhhhhhhhhhUerror-handlingqQhUstatus-receiversqRhhhhhU schedulersqShhhUreconfigurable-servicesqThhhhhhhhhU user-managersqUhhh UslavesqVh!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-sourcesqWh0h0h1UreconfigurationqXh2U configurationqYh3h3h4h4h5h5h6h6h7h7h8h8h9h9h:h:h;h;hh>h?h?h@h@hAUbuilder-configurationqZhBhBhCUcustom-subclassesq[hDhDhEhEhFhFuUchildrenq\]q](cdocutils.nodes section q^)q_}q`(U rawsourceqaUUparentqbhUsourceqccdocutils.nodes reprunicode qdXQ/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/config.rstqeqf}qgbUtagnameqhUsectionqiU attributesqj}qk(Udupnamesql]Uclassesqm]Ubackrefsqn]Uidsqo]qp(Xmodule-buildbot.configqqhYeUnamesqr]qsh2auUlineqtKUdocumentquhh\]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)h8UtqauhtNhuhh\]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]rh8aUmodulerhhn]hl]hm]hr]r h8aUfullnamer 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)hUtrAauhtNhuhh\]ubh)rB}rC(haUhbj*hchfhhhhj}rD(hhXpyho]hn]hl]hm]hr]hX attributerEhjEuhtNhuhh\]rF(j)rG}rH(haX logMaxSizerIhbjBhchfhhjhj}rJ(ho]rKhajhhn]hl]hm]hr]rLhaj 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)h:Utr#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-h:ajhhn]hl]hm]hr]r.h:aj 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(hX5slavePortnum (buildbot.config.MasterConfig attribute)h UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX slavePortnumrhbjhchfhhjhj}r(ho]rh ajhhn]hl]hm]hr]rh aj XMasterConfig.slavePortnumj jj uhtKkhuhh\]rj )r}r(hajhbjhchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKkhuhh\]rh~X slavePortnumrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKkhuhh\]rh)r}r(haXThe strports specification for the slave (integer inputs are normalized to a string), or None; based on :bb:cfg:`slavePortnum`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKihuhh\]r(h~XhThe strports specification for the slave (integer inputs are normalized to a string), or None; based on rr}r(haXhThe strports specification for the slave (integer inputs are normalized to a string), or None; based on hbjubh)r}r(haX:bb:cfg:`slavePortnum`rhbjhchfhhhhj}r(UreftypeXcfghhX slavePortnumU refdomainXbbrho]hn]U refexplicithl]hm]hr]hhuhtKih\]rh)r}r(hajhj}r(hl]hm]r(hjXbb-cfgrehn]ho]hr]uhbjh\]rh~X slavePortnumrr}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=UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r }r (haX debugPasswordr hbjhchfhhjhj}r (ho]r h=ajhhn]hl]hm]hr]rh=aj XMasterConfig.debugPasswordj jj uhtKuhuhh\]rj )r}r(haj hbj hchfhhj#hj}r(hl]hm]hn]ho]hr]uhtKuhuhh\]rh~X debugPasswordrr}r(haUhbjubaubaubj))r}r(haUhbjhchfhhj,hj}r(hl]hm]hn]ho]hr]uhtKuhuhh\]rh)r}r(haXIThe password for the debug client, or None; from :bb:cfg:`debugPassword`.hbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtKshuhh\]r(h~X1The password for the debug client, or None; from rr }r!(haX1The password for the debug client, or None; from hbjubh)r"}r#(haX:bb:cfg:`debugPassword`r$hbjhchfhhhhj}r%(UreftypeXcfghhX debugPasswordU refdomainXbbr&ho]hn]U refexplicithl]hm]hr]hhuhtKsh\]r'h)r(}r)(haj$hj}r*(hl]hm]r+(hj&Xbb-cfgr,ehn]ho]hr]uhbj"h\]r-h~X debugPasswordr.r/}r0(haUhbj(ubahhhubaubh~X.r1}r2(haX.hbjubeubaubeubh)r3}r4(haUhbj*hchfhhhhj}r5(ho]hn]hl]hm]hr]Uentries]r6(hX0manhole (buildbot.config.MasterConfig attribute)h Utr7auhtNhuhh\]ubh)r8}r9(haUhbj*hchfhhhhj}r:(hhXpyho]hn]hl]hm]hr]hX attributer;hj;uhtNhuhh\]r<(j)r=}r>(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)h6UtrsauhtNhuhh\]ubh)rt}ru(haUhbj*hchfhhhhj}rv(hhXpyho]hn]hl]hm]hr]hX attributerwhjwuhtNhuhh\]rx(j)ry}rz(haX validationr{hbjthchfhhjhj}r|(ho]r}h6ajhhn]hl]hm]hr]r~h6aj 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)h7UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haX schedulersrhbjhchfhhjhj}r(ho]rh7ajhhn]hl]hm]hr]rh7aj 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)h3UtrauhtNhuhh\]ubh)r}r(haUhbj*hchfhhhhj}r(hhXpyho]hn]hl]hm]hr]hX attributerhjuhtNhuhh\]r(j)r}r(haXstatusrhbjhchfhhjhj}r(ho]rh3ajhhn]hl]hm]hr]rh3aj 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 hAauhtKhuhh\]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 (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)h9Utr 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 h9ajhhn]hl]hm]hr]r h9aj 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)h4Utr 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 h4ajhhn]hl]hm]hr]r h4aj 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)h0Utr= 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 h0ajhhn]hl]hm]hr]rH h0aj 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 ubaubaubeubeubeubeubeubh^)r }r (haUhbhhchfhhhihj}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)h5Utr 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 h5ajhhn]hl]hm]hr]r h5aj 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 reporthbj 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}r/ (hl]hm]hn]ho]hr]uhbj" h\]r0 h)r1 }r2 (haUhj}r3 (hl]hm]hn]ho]hr]uhbj- h\]r4 (j)r5 }r6 (haXmsghj}r7 (hl]hm]hn]ho]hr]uhbj1 h\]r8 h~Xmsgr9 r: }r; (haUhbj5 ubahhjubh~X (r< r= }r> (haUhbj1 ubh)r? }r@ (haUhj}rA (UreftypejU reftargetXstringrB U refdomainj ho]hn]U refexplicithl]hm]hr]uhbj1 h\]rC h)rD }rE (hajB hj}rF (hl]hm]hn]ho]hr]uhbj? h\]rG h~XstringrH rI }rJ (haUhbjD ubahhhubahhhubh~X)rK }rL (haUhbj1 ubh~X -- rM rN }rO (haUhbj1 ubh~Xthe message to addrP rQ }rR (haXthe message to addhbj1 ubehhhubahhjubehhjubaubh)rS }rT (haXGAdd another error message to the (presumably not-yet-raised) exception.rU hbj hchfhhhhj}rV (hl]hm]hn]ho]hr]uhtM+huhh\]rW h~XGAdd another error message to the (presumably not-yet-raised) exception.rX rY }rZ (hajU hbjS ubaubeubeubeubeubcdocutils.nodes target r[ )r\ }r] (haX.. _developer-Reconfiguration:hbj hchfhhUtargetr^ hj}r_ (ho]hn]hl]hm]hr]Urefidr` hPuhtM.huhh\]ubeubh^)ra }rb (haUhbhhchfUexpect_referenced_by_namerc }rd h j\ shhhihj}re (hl]hm]hn]ho]rf (hXhPehr]rg (h1h euhtM1huhUexpect_referenced_by_idrh }ri hPj\ sh\]rj (hw)rk }rl (haXReconfigurationrm hbja hchfhhh{hj}rn (hl]hm]hn]ho]hr]uhtM1huhh\]ro h~XReconfigurationrp rq }rr (hajm hbjk ubaubh)rs }rt (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.hbja hchfhhhhj}ru (hl]hm]hn]ho]hr]uhtM3huhh\]rv (h~XqWhen the buildmaster receives a signal to begin a reconfig, it re-reads the configuration file, generating a new rw rx }ry (haXqWhen the buildmaster receives a signal to begin a reconfig, it re-reads the configuration file, generating a new hbjs ubh)rz }r{ (haX:py:class:`MasterConfig`r| hbjs 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]uhbjz 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.hbjs ubeubh)r }r (haXSSee :ref:`master-service-hierarchy` for the structure of the Buildbot service tree.hbja 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.hbja 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 hbja 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.hbja 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 (haUhbja 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\]r h~XreconfigServicer r}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]hXclassr hj uhtNhuhh\]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\]r.(h)r/}r0(haUhbj+hchfhhhhj}r1(ho]hn]hl]hm]hr]Uentries]r2(hXEreconfigService() (buildbot.config.ReconfigurableServiceMixin method)h Utr3auhtNhuhh\]ubh)r4}r5(haUhbj+hchfhhhhj}r6(hhXpyho]hn]hl]hm]hr]hXmethodr7hj7uhtNhuhh\]r8(j)r9}r:(haXreconfigService(new_config)r;hbj4hchfhhjhj}r<(ho]r=h ajhhn]hl]hm]hr]r>h aj X*ReconfigurableServiceMixin.reconfigServicej jj uhtMnhuhh\]r?(j )r@}rA(haXreconfigServicehbj9hchfhhj#hj}rB(hl]hm]hn]ho]hr]uhtMnhuhh\]rCh~XreconfigServicerDrE}rF(haUhbj@ubaubjF)rG}rH(haUhbj9hchfhhjIhj}rI(hl]hm]hn]ho]hr]uhtMnhuhh\]rJjL)rK}rL(haX new_confighj}rM(hl]hm]hn]ho]hr]uhbjGh\]rNh~X new_configrOrP}rQ(haUhbjKubahhjTubaubeubj))rR}rS(haUhbj4hchfhhj,hj}rT(hl]hm]hn]ho]hr]uhtMnhuhh\]rU(j`)rV}rW(haUhbjRhchfhhjchj}rX(hl]hm]hn]ho]hr]uhtNhuhh\]rY(jf)rZ}r[(haUhj}r\(hl]hm]hn]ho]hr]uhbjVh\]r](jk)r^}r_(haUhj}r`(hl]hm]hn]ho]hr]uhbjZh\]rah~X Parametersrbrc}rd(haUhbj^ubahhjsubjt)re}rf(haUhj}rg(hl]hm]hn]ho]hr]uhbjZh\]rhh)ri}rj(haUhj}rk(hl]hm]hn]ho]hr]uhbjeh\]rl(j)rm}rn(haX new_confighj}ro(hl]hm]hn]ho]hr]uhbjih\]rph~X new_configrqrr}rs(haUhbjmubahhjubh~X (rtru}rv(haUhbjiubh)rw}rx(haX:py:class:`MasterConfig`ryhbjihchfhhhhj}rz(UreftypeXclasshhX MasterConfigU refdomainXpyr{ho]hn]U refexplicithl]hm]hr]hhhjhhuhtMYh\]r|h)r}}r~(hajyhj}r(hl]hm]r(hj{Xpy-classrehn]ho]hr]uhbjwh\]rh~X MasterConfigrr}r(haUhbj}ubahhhubaubh~X)r}r(haUhbjiubh~X -- rr}r(haUhbjiubh~Xnew master configurationrr}r(haXnew master configurationrhbjiubehhhubahhjubehhjubjf)r}r(haUhj}r(hl]hm]hn]ho]hr]uhbjVh\]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.rhbjRhchfhhhhj}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.rhbjRhchfhhhhj}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.hbjRhchfhhhhj}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.hbjRhchfhhhhj}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-r.}r/(haj*hbj(ubaubaubeubeubeubeubh^)r0}r1(haUhbja hchfhhhihj}r2(hl]hm]hn]ho]r3hWahr]r4h/auhtMwhuhh\]r5(hw)r6}r7(haXChange Sourcesr8hbj0hchfhhh{hj}r9(hl]hm]hn]ho]hr]uhtMwhuhh\]r:h~XChange Sourcesr;r<}r=(haj8hbj6ubaubh)r>}r?(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.hbj0hchfhhhhj}r@(hl]hm]hn]ho]hr]uhtMyhuhh\]rA(h~XRWhen reconfiguring, there is no method by which Buildbot can determine that a new rBrC}rD(haXRWhen reconfiguring, there is no method by which Buildbot can determine that a new hbj>ubh)rE}rF(haX/:py:class:`~buildbot.changes.base.ChangeSource`rGhbj>hchfhhhhj}rH(UreftypeXclasshhX"buildbot.changes.base.ChangeSourceU refdomainXpyrIho]hn]U refexplicithl]hm]hr]hhhNhhuhtMyh\]rJh)rK}rL(hajGhj}rM(hl]hm]rN(hjIXpy-classrOehn]ho]hr]uhbjEh\]rPh~X ChangeSourcerQrR}rS(haUhbjKubahhhubaubh~X+ represents the same source as an existing rTrU}rV(haX+ represents the same source as an existing hbj>ubh)rW}rX(haX/:py:class:`~buildbot.changes.base.ChangeSource`rYhbj>hchfhhhhj}rZ(UreftypeXclasshhX"buildbot.changes.base.ChangeSourceU refdomainXpyr[ho]hn]U refexplicithl]hm]hr]hhhNhhuhtMyh\]r\h)r]}r^(hajYhj}r_(hl]hm]r`(hj[Xpy-classraehn]ho]hr]uhbjWh\]rbh~X ChangeSourcercrd}re(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.rfrg}rh(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)ri}rj(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``.hbj0hchfhhhhj}rk(hl]hm]hn]ho]hr]uhtMhuhh\]rl(h)rm}rn(haX/:py:class:`~buildbot.changes.base.ChangeSource`rohbjihchfhhhhj}rp(UreftypeXclasshhX"buildbot.changes.base.ChangeSourceU refdomainXpyrqho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rrh)rs}rt(hajohj}ru(hl]hm]rv(hjqXpy-classrwehn]ho]hr]uhbjmh\]rxh~X ChangeSourceryrz}r{(haUhbjsubahhhubaubh~X inherits r|r}}r~(haX inherits hbjiubh)r}r(haX*:py:class:`~buildbot.util.ComparableMixin`rhbjihchfhhhhj}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 hbjiubh)r}r(haX``compare_attrs``hj}r(hl]hm]hn]ho]hr]uhbjih\]rh~X compare_attrsrr}r(haUhbjubahhhubh~X.r}r(haX.hbjiubeubh)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.hbj0hchfhhhhj}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.hbj0hchfhhhhj}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(haUhbja 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.r r }r(haj hbjubaubh)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)r.}r/(haj*hj}r0(hl]hm]r1(hj,Xpy-classr2ehn]ho]hr]uhbj(h\]r3h~X BaseSchedulerr4r5}r6(haUhbj.ubahhhubaubh~X implements a helper method, r7r8}r9(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\]r?h)r@}rA(haj<hj}rB(hl]hm]rC(hj>Xpy-methrDehn]ho]hr]uhbj:h\]rEh~XfindNewSchedulerInstancerFrG}rH(haUhbj@ubahhhubaubh~XC, which will return the new instance of the scheduler in the given rIrJ}rK(haXC, which will return the new instance of the scheduler in the given hbjubh)rL}rM(haX:py:class:`MasterConfig`rNhbjhchfhhhhj}rO(UreftypeXclasshhX MasterConfigU refdomainXpyrPho]hn]U refexplicithl]hm]hr]hhhNhhuhtMh\]rQh)rR}rS(hajNhj}rT(hl]hm]rU(hjPXpy-classrVehn]ho]hr]uhbjLh\]rWh~X MasterConfigrXrY}rZ(haUhbjRubahhhubaubh~X object.r[r\}r](haX object.hbjubeubh^)r^}r_(haUhbjhchfhhhihj}r`(hl]hm]hn]ho]rah[ahr]rbhCauhtMhuhh\]rc(hw)rd}re(haXCustom Subclassesrfhbj^hchfhhh{hj}rg(hl]hm]hn]ho]hr]uhtMhuhh\]rhh~XCustom Subclassesrirj}rk(hajfhbjdubaubh)rl}rm(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}rn(hl]hm]hn]ho]hr]uhtMhuhh\]ro(h~XyCustom subclasses are most often defined directly in the configuration file, or in a Python module that is reloaded with rprq}rr(haXyCustom subclasses are most often defined directly in the configuration file, or in a Python module that is reloaded with hbjlubh)rs}rt(haX ``reload``hj}ru(hl]hm]hn]ho]hr]uhbjlh\]rvh~Xreloadrwrx}ry(haUhbjsubahhhubh~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.rzr{}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.hbjlubeubh)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(hajhbj}ubaubh)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(haUhbja hchfhhhihj}r(hl]hm]hn]ho]rhVahr]rh auhtMhuhh\]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(haUhbja 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(haUhbja hchfhhhihj}r (hl]hm]hn]ho]r hRahr]r hauhtMhuhh\]r (hw)r }r(haXStatus Receiversrhbjhchfhhh{hj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XStatus Receiversrr}r(hajhbj ubaubh)r}r(haXMAt every reconfig, all status listeners are stopped and new versions started.rhbjhchfhhhhj}r(hl]hm]hn]ho]hr]uhtMhuhh\]rh~XMAt every reconfig, all status listeners are stopped and new versions started.rr}r(hajhbjubaubeubeubehaUU transformerrNU footnote_refsr}rUrefnamesr }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-)r.}r/(haUhj}r0(hl]UlevelKho]hn]Usourcehfhm]hr]UlineM.UtypeUINFOr1uh\]r2h)r3}r4(haUhj}r5(hl]hm]hn]ho]hr]uhbj.h\]r6h~X?Hyperlink target "developer-reconfiguration" is not referenced.r7r8}r9(haUhbj3ubahhhubahhUsystem_messager:ubaUreporterr;NUid_startr<KU autofootnotesr=]r>U citation_refsr?}r@Uindirect_targetsrA]rBUsettingsrC(cdocutils.frontend Values rDorE}rF(Ufootnote_backlinksrGKUrecord_dependenciesrHNU rfc_base_urlrIUhttp://tools.ietf.org/html/rJU tracebackrKUpep_referencesrLNUstrip_commentsrMNU toc_backlinksrNUentryrOU language_coderPUenrQU datestamprRNU report_levelrSKU _destinationrTNU halt_levelrUKU strip_classesrVNh{NUerror_encoding_error_handlerrWUbackslashreplacerXUdebugrYNUembed_stylesheetrZUoutput_encoding_error_handlerr[Ustrictr\U sectnum_xformr]KUdump_transformsr^NU docinfo_xformr_KUwarning_streamr`NUpep_file_url_templateraUpep-%04drbUexit_status_levelrcKUconfigrdNUstrict_visitorreNUcloak_email_addressesrfUtrim_footnote_reference_spacergUenvrhNUdump_pseudo_xmlriNUexpose_internalsrjNUsectsubtitle_xformrkU source_linkrlNUrfc_referencesrmNUoutput_encodingrnUutf-8roU source_urlrpNUinput_encodingrqU utf-8-sigrrU_disable_configrsNU id_prefixrtUU tab_widthruKUerror_encodingrvUUTF-8rwU_sourcerxUQ/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/config.rstryUgettext_compactrzU generatorr{NUdump_internalsr|NU smart_quotesr}U pep_base_urlr~Uhttp://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 hjhRjhj h jh hPja h j=h j9h jhjGhjhjhjhjhqj[ )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]hWj0h+jCh,j h-jhh.jh[j^h0jC hXja hZj0 hYh_h3jh4j h5j h6jyh7jhUjh8jh9j h:j)h;jshjh?j1h@jhVjhBj hDj*hEjhFjuUsubstitution_namesr}rhhhuhj}r(hl]ho]hn]Usourcehfhm]hr]uU footnotesr]rUrefidsr}rhP]rj\ asub.PKJtD71buildbot-v0.8.8/.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.8/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.8/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]qUfile_insertion_enabledqU raw_enabledqKU dump_settingsqNubUsymbol_footnote_startqKUidsq}q(h1hh(huUsubstitution_namesr}rhh*h }r(h$]h"]h#]Usourcehh%]h&]uU footnotesr]rUrefidsr}rh(]rhasub.PKJtDt&&;buildbot-v0.8.8/.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.8/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.8/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]Ufile_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.PKJtD<3buildbot-v0.8.8/.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.8/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-buildfactoryqbqcNXdeveloper/cls-remotecommandsqdqeNXdeveloper/cls-buildstepsqfqgNXdeveloper/cls-forceschedqhqiNXdeveloper/cls-irenderableqjqkNXdeveloper/cls-ipropertiesqlqmeUhiddenqnU includefilesqo]qp(hbhdhfhhhjhleUmaxdepthqqKuh(K h]ubaubcdocutils.nodes target qr)qs}qt(hUhhhhhUtargetquh}qv(h$]h#]h!]h"]h&]UrefidqwUindex-0qxuh(Nh)hh]ubcsphinx.ext.todo todo_node qy)qz}q{(hXcls-logobserverq|hhhhUexpect_referenced_by_nameq}}hU todo_nodeq~h}q(h!]h"]qUadmonition-todoqah#]h$]qhxah&]uh(Kh)hUexpect_referenced_by_idq}qhxhssh]q(h+)q}q(hXTodoqh}q(h!]h"]h#]h$]h&]uhhzh]qh2XTodoqq}q(hhhhubahh/ubh6)q}q(hh|hhzhhhh: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_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_sourceqUR/var/build/user_builds/buildbot/checkouts/v0.8.8/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_classesqNU _config_filesq]Ufile_insertion_enabledrU raw_enabledrKU dump_settingsrNubUsymbol_footnote_startrKUidsr}r(hhhxhzuUsubstitution_namesr}rhh)h}r(h!]h$]h#]Usourcehh"]h&]uU footnotesr ]r Urefidsr }r hx]r hsasub.PKJtD::3buildbot-v0.8.8/.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.8/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.8/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.PKJtD-y-y8buildbot-v0.8.8/.doctrees/developer/master-slave.doctreecdocutils.nodes document q)q}q(U nametypesq}q(Xmaster-slave apiqNXmaster-slave-updatesqX build slavesqNXstatq NXslave buildersq NXshell-command-argsq Xcpdirq NX bot methodsq NXmkdirqNXslave-side slavebuilder methodsqNXrmdirqNXdefined commandsqNX master-side slavebuilder methodsqNXshellqNX uploadfileqNX!master-side remotecommand methodsqNXupdatesqNXuploaddirectoryqNXbuildslave methodsqNXbuildingqNXcommandsqNXsetupqNX downloadfileqNXsource commandsqNX connectionqNXpingingqNuUsubstitution_defsq }q!Uparse_messagesq"]q#Ucurrent_sourceq$NU decorationq%NUautofootnote_startq&KUnameidsq'}q((hUmaster-slave-apiq)hUmaster-slave-updatesq*hU build-slavesq+h Ustatq,h Uslave-buildersq-h Ushell-command-argsq.h Ucpdirq/h U bot-methodsq0hUmkdirq1hUslave-side-slavebuilder-methodsq2hUrmdirq3hUdefined-commandsq4hU master-side-slavebuilder-methodsq5hUshellq6hU uploadfileq7hU!master-side-remotecommand-methodsq8hUupdatesq9hUuploaddirectoryq:hUbuildslave-methodsq;hUbuildingqhU downloadfileq?hUsource-commandsq@hU connectionqAhUpingingqBuUchildrenqC]qDcdocutils.nodes section qE)qF}qG(U rawsourceqHUUparentqIhUsourceqJcdocutils.nodes reprunicode qKXW/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/developer/master-slave.rstqLqM}qNbUtagnameqOUsectionqPU attributesqQ}qR(UdupnamesqS]UclassesqT]UbackrefsqU]UidsqV]qWh)aUnamesqX]qYhauUlineqZKUdocumentq[hhC]q\(cdocutils.nodes title q])q^}q_(hHXMaster-Slave APIq`hIhFhJhMhOUtitleqahQ}qb(hS]hT]hU]hV]hX]uhZKh[hhC]qccdocutils.nodes Text qdXMaster-Slave APIqeqf}qg(hHh`hIh^ubaubcdocutils.nodes paragraph qh)qi}qj(hHX2This section describes the master-slave interface.qkhIhFhJhMhOU paragraphqlhQ}qm(hS]hT]hU]hV]hX]uhZKh[hhC]qnhdX2This section describes the master-slave interface.qoqp}qq(hHhkhIhiubaubhE)qr}qs(hHUhIhFhJhMhOhPhQ}qt(hS]hT]hU]hV]quhAahX]qvhauhZKh[hhC]qw(h])qx}qy(hHX ConnectionqzhIhrhJhMhOhahQ}q{(hS]hT]hU]hV]hX]uhZKh[hhC]q|hdX Connectionq}q~}q(hHhzhIhxubaubhh)q}q(hHX\The interface is based on Twisted's Perspective Broker, which operates over TCP connections.qhIhrhJhMhOhlhQ}q(hS]hT]hU]hV]hX]uhZK h[hhC]qhdX\The interface is based on Twisted's Perspective Broker, which operates over TCP connections.qq}q(hHhhIhubaubhh)q}q(hHXThe 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.hIhrhJhMhOhlhQ}q(hS]hT]hU]hV]hX]uhZK h[hhC]q(hdXCThe slave connects to the master, using the parameters supplied to qq}q(hHXCThe slave connects to the master, using the parameters supplied to hIhubcdocutils.nodes strong q)q}q(hHX":command:`buildslave create-slave`hQ}q(hS]hT]qUcommandqahU]hV]hX]uhIhhC]qhdXbuildslave create-slaveqq}q(hHUhIhubahOUstrongqubhdXq. It uses a reconnecting process with an exponential backoff, and will automatically reconnect on disconnection.qq}q(hHXq. It uses a reconnecting process with an exponential backoff, and will automatically reconnect on disconnection.hIhubeubhh)q}q(hHXOnce 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`).hIhrhJhMhOhlhQ}q(hS]hT]hU]hV]hX]uhZKh[hhC]q(hdXOnce connected, the slave authenticates with the Twisted Cred (newcred) mechanism, using the username and password supplied to qq}q(hHXOnce connected, the slave authenticates with the Twisted Cred (newcred) mechanism, using the username and password supplied to hIhubh)q}q(hHX":command:`buildslave create-slave`hQ}q(hS]hT]qhahU]hV]hX]uhIhhC]qhdXbuildslave create-slaveqq}q(hHUhIhubahOhubhdX. The qq}q(hHX. The hIhubcdocutils.nodes emphasis q)q}q(hHX*mind*hQ}q(hS]hT]hU]hV]hX]uhIhhC]qhdXmindqq}q(hHUhIhubahOUemphasisqubhdX" is the slave bot instance (class qq}q(hHX" is the slave bot instance (class hIhubcsphinx.addnodes pending_xref q)q}q(hHX:class:`buildslave.bot.Bot`qhIhhJhMhOU pending_xrefqhQ}q(UreftypeXclassUrefwarnqU reftargetqXbuildslave.bot.BotU refdomainXpyqhV]hU]U refexplicithS]hT]hX]UrefdocqXdeveloper/master-slaveqUpy:classqNU py:moduleqNuhZKhC]qcdocutils.nodes literal q)q}q(hHhhQ}q(hS]hT]q(UxrefqhXpy-classqehU]hV]hX]uhIhhC]qhdXbuildslave.bot.Botqхq}q(hHUhIhubahOUliteralqubaubhdX).qՅq}q(hHX).hIhubeubhh)q}q(hHXOn 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.hIhrhJhMhOhlhQ}q(hS]hT]hU]hV]hX]uhZKh[hhC]q(hdX0On the master side, the realm is implemented by q܅q}q(hHX0On the master side, the realm is implemented by hIhubh)q}q(hHX#:class:`buildbot.master.Dispatcher`qhIhhJhMhOhhQ}q(UreftypeXclasshhXbuildbot.master.DispatcherU refdomainXpyqhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]qh)q}q(hHhhQ}q(hS]hT]q(hhXpy-classqehU]hV]hX]uhIhhC]qhdXbuildbot.master.Dispatcherq녁q}q(hHUhIhubahOhubaubhdXX, which examines the username of incoming avatar requests. There are special cases for qq}q(hHXX, which examines the username of incoming avatar requests. There are special cases for hIhubh)q}q(hHX ``change``hQ}q(hS]hT]hU]hV]hX]uhIhhC]qhdXchangeqq}q(hHUhIhubahOhubhdX, qq}q(hHX, hIhubh)q}q(hHX ``debug``hQ}q(hS]hT]hU]hV]hX]uhIhhC]qhdXdebugqr}r(hHUhIhubahOhubhdX, and rr}r(hHX, and hIhubh)r}r(hHX``statusClient``hQ}r(hS]hT]hU]hV]hX]uhIhhC]rhdX statusClientr r }r (hHUhIjubahOhubhdX, which are not discussed here. For all other usernames, the botmaster is consulted, and if a slave with that name is configured, its r r }r(hHX, which are not discussed here. For all other usernames, the botmaster is consulted, and if a slave with that name is configured, its hIhubh)r}r(hHX':class:`buildbot.buildslave.BuildSlave`rhIhhJhMhOhhQ}r(UreftypeXclasshhXbuildbot.buildslave.BuildSlaveU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-classrehU]hV]hX]uhIjhC]rhdXbuildbot.buildslave.BuildSlaverr}r(hHUhIjubahOhubaubhdX) instance is returned as the perspective.rr}r (hHX) instance is returned as the perspective.hIhubeubeubhE)r!}r"(hHUhIhFhJhMhOhPhQ}r#(hS]hT]hU]hV]r$h+ahX]r%hauhZKh[hhC]r&(h])r'}r((hHX Build Slavesr)hIj!hJhMhOhahQ}r*(hS]hT]hU]hV]hX]uhZKh[hhC]r+hdX Build Slavesr,r-}r.(hHj)hIj'ubaubhh)r/}r0(hHXAt 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``.hIj!hJhMhOhlhQ}r1(hS]hT]hU]hV]hX]uhZKh[hhC]r2(hdXkAt this point, the master-side BuildSlave object has a pointer to the remote, slave-side Bot object in its r3r4}r5(hHXkAt this point, the master-side BuildSlave object has a pointer to the remote, slave-side Bot object in its hIj/ubh)r6}r7(hHX``self.slave``hQ}r8(hS]hT]hU]hV]hX]uhIj/hC]r9hdX self.slaver:r;}r<(hHUhIj6ubahOhubhdX\, and the slave-side Bot object has a reference to the master-side BuildSlave object in its r=r>}r?(hHX\, and the slave-side Bot object has a reference to the master-side BuildSlave object in its hIj/ubh)r@}rA(hHX``self.perspective``hQ}rB(hS]hT]hU]hV]hX]uhIj/hC]rChdXself.perspectiverDrE}rF(hHUhIj@ubahOhubhdX.rG}rH(hHX.hIj/ubeubhE)rI}rJ(hHUhIj!hJhMhOhPhQ}rK(hS]hT]hU]hV]rLh0ahX]rMh auhZK$h[hhC]rN(h])rO}rP(hHX Bot methodsrQhIjIhJhMhOhahQ}rR(hS]hT]hU]hV]hX]uhZK$h[hhC]rShdX Bot methodsrTrU}rV(hHjQhIjOubaubhh)rW}rX(hHX;The slave-side Bot object has the following remote methods:rYhIjIhJhMhOhlhQ}rZ(hS]hT]hU]hV]hX]uhZK&h[hhC]r[hdX;The slave-side Bot object has the following remote methods:r\r]}r^(hHjYhIjWubaubcdocutils.nodes definition_list r_)r`}ra(hHUhIjIhJhMhOUdefinition_listrbhQ}rc(hS]hT]hU]hV]hX]uhZNh[hhC]rd(cdocutils.nodes definition_list_item re)rf}rg(hHX{:meth:`~buildslave.bot.Bot.remote_getCommands` Returns a list of ``(name, version)`` for all commands the slave recognizes hIj`hJhMhOUdefinition_list_itemrhhQ}ri(hS]hT]hU]hV]hX]uhZK)hC]rj(cdocutils.nodes term rk)rl}rm(hHX.:meth:`~buildslave.bot.Bot.remote_getCommands`rnhIjfhJhMhOUtermrohQ}rp(hS]hT]hU]hV]hX]uhZK)hC]rqh)rr}rs(hHjnhIjlhJhMhOhhQ}rt(UreftypeXmethhhX%buildslave.bot.Bot.remote_getCommandsU refdomainXpyruhV]hU]U refexplicithS]hT]hX]hhhNhNuhZK)hC]rvh)rw}rx(hHjnhQ}ry(hS]hT]rz(hjuXpy-methr{ehU]hV]hX]uhIjrhC]r|hdXremote_getCommandsr}r~}r(hHUhIjwubahOhubaubaubcdocutils.nodes definition r)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjfhC]rhh)r}r(hHXKReturns a list of ``(name, version)`` for all commands the slave recognizeshIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZK)hC]r(hdXReturns a list of rr}r(hHXReturns a list of hIjubh)r}r(hHX``(name, version)``hQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdX(name, version)rr}r(hHUhIjubahOhubhdX& for all commands the slave recognizesrr}r(hHX& for all commands the slave recognizeshIjubeubahOU definitionrubeubje)r}r(hHXg: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 hIj`hJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZK1h[hhC]r(jk)r}r(hHX1:meth:`~buildslave.bot.Bot.remote_setBuilderList`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZK1hC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhX(buildslave.bot.Bot.remote_setBuilderListU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZK1hC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdXremote_setBuilderListrr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]r(hh)r}r(hHXGiven 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.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZK,hC]rhdXGiven 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(hHjhIjubaubhh)r}r(hHXMThis method returns a dictionary of :class:`SlaveBuilder` objects - see belowhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZK1hC]r(hdX$This method returns a dictionary of rr}r(hHX$This method returns a dictionary of hIjubh)r}r(hHX:class:`SlaveBuilder`rhIjhJhMhOhhQ}r(UreftypeXclasshhX SlaveBuilderU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZK1hC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-classrehU]hV]hX]uhIjhC]rhdX SlaveBuilderrr}r(hHUhIjubahOhubaubhdX objects - see belowrr}r(hHX objects - see belowhIjubeubehOjubeubje)r}r(hHXM:meth:`~buildslave.bot.Bot.remote_print` Adds a message to the slave logfile hIj`hJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZK4h[hhC]r(jk)r}r(hHX(:meth:`~buildslave.bot.Bot.remote_print`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZK4hC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhXbuildslave.bot.Bot.remote_printU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZK4hC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdX remote_printrr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHX#Adds a message to the slave logfilerhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZK4hC]rhdX#Adds a message to the slave logfilerr}r(hHjhIjubaubahOjubeubje)r}r(hHX8: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 hIj`hJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZK?h[hhC]r(jk)r}r(hHX/:meth:`~buildslave.bot.Bot.remote_getSlaveInfo`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZK?hC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhX&buildslave.bot.Bot.remote_getSlaveInfoU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZK?hC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]r hdXremote_getSlaveInfor r }r (hHUhIjubahOhubaubaubj)r }r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]r(hh)r}r(hHXXReturns the contents of the slave's :file:`info/` directory. This also contains the keyshIj hJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZK7hC]r(hdX$Returns the contents of the slave's rr}r(hHX$Returns the contents of the slave's hIjubh)r}r(hHUhQ}r(hV]hU]hS]hT]rXfileraUrolejhX]uhIjhC]rhdXinfo/rr}r (hHXinfo/hIjubahOhubhdX' directory. This also contains the keysr!r"}r#(hHX' directory. This also contains the keyshIjubeubj_)r$}r%(hHUhQ}r&(hS]hT]hU]hV]hX]uhIj hC]r'(je)r(}r)(hHX*``environ`` copy of the slaves environmenthIj$hJhMhOjhhQ}r*(hS]hT]hU]hV]hX]uhZK:hC]r+(jk)r,}r-(hHX ``environ``r.hIj(hJhMhOjohQ}r/(hS]hT]hU]hV]hX]uhZK:hC]r0h)r1}r2(hHj.hQ}r3(hS]hT]hU]hV]hX]uhIj,hC]r4hdXenvironr5r6}r7(hHUhIj1ubahOhubaubj)r8}r9(hHUhQ}r:(hS]hT]hU]hV]hX]uhIj(hC]r;hh)r<}r=(hHXcopy of the slaves environmentr>hIj8hJhMhOhlhQ}r?(hS]hT]hU]hV]hX]uhZK;hC]r@hdXcopy of the slaves environmentrArB}rC(hHj>hIj<ubaubahOjubeubje)rD}rE(hHXD``system`` OS the slave is running (extracted from Python's os.name)hIj$hJhMhOjhhQ}rF(hS]hT]hU]hV]hX]uhZKahX]rhauhZKMh[hhC]r(h])r}r(hHXSetuprhIjhJhMhOhahQ}r(hS]hT]hU]hV]hX]uhZKMh[hhC]rhdXSetuprr}r(hHjhIjubaubhh)r}r(hHXAfter the initial connection and trading of a mind (Bot) for an avatar (BuildSlave), the master calls the Bot's :meth:`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 :class:`~buildslave.bot.SlaveBuilder` objects, described below. Each of these is handed to the corresponding master-side :class:`~buildbot.process.slavebuilder.SlaveBuilder` object.hIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKOh[hhC]r(hdXpAfter the initial connection and trading of a mind (Bot) for an avatar (BuildSlave), the master calls the Bot's rr}r(hHXpAfter the initial connection and trading of a mind (Bot) for an avatar (BuildSlave), the master calls the Bot's hIjubh)r}r(hHX:meth:`setBuilderList`rhIjhJhMhOhhQ}r(UreftypeXmethhhXsetBuilderListU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKOhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdXsetBuilderListrr}r(hHUhIjubahOhubaubhdX~ method to set up the proper slave builders on the slave side. This method returns a reference to each of the new slave-side rr}r(hHX~ method to set up the proper slave builders on the slave side. This method returns a reference to each of the new slave-side hIjubh)r}r(hHX%:class:`~buildslave.bot.SlaveBuilder`rhIjhJhMhOhhQ}r(UreftypeXclasshhXbuildslave.bot.SlaveBuilderU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKOhC]rh)r }r (hHjhQ}r (hS]hT]r (hjXpy-classr ehU]hV]hX]uhIjhC]rhdX SlaveBuilderrr}r(hHUhIj ubahOhubaubhdXU objects, described below. Each of these is handed to the corresponding master-side rr}r(hHXU objects, described below. Each of these is handed to the corresponding master-side hIjubh)r}r(hHX4:class:`~buildbot.process.slavebuilder.SlaveBuilder`rhIjhJhMhOhhQ}r(UreftypeXclasshhX*buildbot.process.slavebuilder.SlaveBuilderU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKOhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-classrehU]hV]hX]uhIjhC]r hdX SlaveBuilderr!r"}r#(hHUhIjubahOhubaubhdX object.r$r%}r&(hHX object.hIjubeubhh)r'}r((hHXZThis immediately calls the remote :meth:`setMaster` method, then the :meth:`print` method.hIjhJhMhOhlhQ}r)(hS]hT]hU]hV]hX]uhZKVh[hhC]r*(hdX"This immediately calls the remote r+r,}r-(hHX"This immediately calls the remote hIj'ubh)r.}r/(hHX:meth:`setMaster`r0hIj'hJhMhOhhQ}r1(UreftypeXmethhhX setMasterU refdomainXpyr2hV]hU]U refexplicithS]hT]hX]hhhNhNuhZKVhC]r3h)r4}r5(hHj0hQ}r6(hS]hT]r7(hj2Xpy-methr8ehU]hV]hX]uhIj.hC]r9hdX setMasterr:r;}r<(hHUhIj4ubahOhubaubhdX method, then the r=r>}r?(hHX method, then the hIj'ubh)r@}rA(hHX :meth:`print`rBhIj'hJhMhOhhQ}rC(UreftypeXmethhhXprintU refdomainXpyrDhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKVhC]rEh)rF}rG(hHjBhQ}rH(hS]hT]rI(hjDXpy-methrJehU]hV]hX]uhIj@hC]rKhdXprintrLrM}rN(hHUhIjFubahOhubaubhdX method.rOrP}rQ(hHX method.hIj'ubeubeubhE)rR}rS(hHUhIhFhJhMhOhPhQ}rT(hS]hT]hU]hV]rUhBahX]rVhauhZKZh[hhC]rW(h])rX}rY(hHXPingingrZhIjRhJhMhOhahQ}r[(hS]hT]hU]hV]hX]uhZKZh[hhC]r\hdXPingingr]r^}r_(hHjZhIjXubaubhh)r`}ra(hHXITo ping a remote SlaveBuilder, the master calls its :meth:`print` method.rbhIjRhJhMhOhlhQ}rc(hS]hT]hU]hV]hX]uhZK\h[hhC]rd(hdX4To ping a remote SlaveBuilder, the master calls its rerf}rg(hHX4To ping a remote SlaveBuilder, the master calls its hIj`ubh)rh}ri(hHX :meth:`print`rjhIj`hJhMhOhhQ}rk(UreftypeXmethhhXprintU refdomainXpyrlhV]hU]U refexplicithS]hT]hX]hhhNhNuhZK\hC]rmh)rn}ro(hHjjhQ}rp(hS]hT]rq(hjlXpy-methrrehU]hV]hX]uhIjhhC]rshdXprintrtru}rv(hHUhIjnubahOhubaubhdX method.rwrx}ry(hHX method.hIj`ubeubeubhE)rz}r{(hHUhIhFhJhMhOhPhQ}r|(hS]hT]hU]hV]r}hhdXremote_setMasterr?r@}rA(hHUhIj9ubahOhubaubaubj)rB}rC(hHUhQ}rD(hS]hT]hU]hV]hX]uhIj+hC]rEhh)rF}rG(hHX4Provides a reference to the master-side SlaveBuilderrHhIjBhJhMhOhlhQ}rI(hS]hT]hU]hV]hX]uhZKyhC]rJhdX4Provides a reference to the master-side SlaveBuilderrKrL}rM(hHjHhIjFubaubahOjubeubje)rN}rO(hHX}:meth:`~buildslave.bot.SlaveBuilder.remote_print` Adds a message to the slave logfile; used to check round-trip connectivity hIj'hJhMhOjhhQ}rP(hS]hT]hU]hV]hX]uhZK|h[hhC]rQ(jk)rR}rS(hHX1:meth:`~buildslave.bot.SlaveBuilder.remote_print`rThIjNhJhMhOjohQ}rU(hS]hT]hU]hV]hX]uhZK|hC]rVh)rW}rX(hHjThIjRhJhMhOhhQ}rY(UreftypeXmethhhX(buildslave.bot.SlaveBuilder.remote_printU refdomainXpyrZhV]hU]U refexplicithS]hT]hX]hhhNhNuhZK|hC]r[h)r\}r](hHjThQ}r^(hS]hT]r_(hjZXpy-methr`ehU]hV]hX]uhIjWhC]rahdX remote_printrbrc}rd(hHUhIj\ubahOhubaubaubj)re}rf(hHUhQ}rg(hS]hT]hU]hV]hX]uhIjNhC]rhhh)ri}rj(hHXJAdds a message to the slave logfile; used to check round-trip connectivityrkhIjehJhMhOhlhQ}rl(hS]hT]hU]hV]hX]uhZK|hC]rmhdXJAdds a message to the slave logfile; used to check round-trip connectivityrnro}rp(hHjkhIjiubaubahOjubeubje)rq}rr(hHX:meth:`~buildslave.bot.SlaveBuilder.remote_startBuild` Indicates that a build is about to start, and that any subsequent commands are part of that build hIj'hJhMhOjhhQ}rs(hS]hT]hU]hV]hX]uhZKh[hhC]rt(jk)ru}rv(hHX6:meth:`~buildslave.bot.SlaveBuilder.remote_startBuild`rwhIjqhJhMhOjohQ}rx(hS]hT]hU]hV]hX]uhZKhC]ryh)rz}r{(hHjwhIjuhJhMhOhhQ}r|(UreftypeXmethhhX-buildslave.bot.SlaveBuilder.remote_startBuildU refdomainXpyr}hV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]r~h)r}r(hHjwhQ}r(hS]hT]r(hj}Xpy-methrehU]hV]hX]uhIjzhC]rhdXremote_startBuildrr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjqhC]rhh)r}r(hHXaIndicates that a build is about to start, and that any subsequent commands are part of that buildrhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXaIndicates that a build is about to start, and that any subsequent commands are part of that buildrr}r(hHjhIjubaubahOjubeubje)r}r(hHX]:meth:`~buildslave.bot.SlaveBuilder.remote_startCommand` Invokes a command on the slave side hIj'hJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]r(jk)r}r(hHX8:meth:`~buildslave.bot.SlaveBuilder.remote_startCommand`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZKhC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhX/buildslave.bot.SlaveBuilder.remote_startCommandU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdXremote_startCommandrr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHX#Invokes a command on the slave siderhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdX#Invokes a command on the slave siderr}r(hHjhIjubaubahOjubeubje)r}r(hHXf:meth:`~buildslave.bot.SlaveBuilder.remote_interruptCommand` Interrupts the currently-running command hIj'hJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]r(jk)r}r(hHX<:meth:`~buildslave.bot.SlaveBuilder.remote_interruptCommand`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZKhC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhX3buildslave.bot.SlaveBuilder.remote_interruptCommandU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdXremote_interruptCommandrr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHX(Interrupts the currently-running commandrhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdX(Interrupts the currently-running commandrr}r(hHjhIjubaubahOjubeubje)r}r(hHXR:meth:`~buildslave.bot.SlaveBuilder.remote_shutdown` Shuts down the slave cleanly hIj'hJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]r(jk)r}r(hHX4:meth:`~buildslave.bot.SlaveBuilder.remote_shutdown`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZKhC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhX+buildslave.bot.SlaveBuilder.remote_shutdownU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdXremote_shutdownrr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHXShuts down the slave cleanlyrhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXShuts down the slave cleanlyrr}r(hHjhIjubaubahOjubeubeubeubhE)r}r(hHUhIjhJhMhOhPhQ}r(hS]hT]hU]hV]rh5ahX]rhauhZKh[hhC]r(h])r}r(hHX Master-side SlaveBuilder MethodsrhIjhJhMhOhahQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rhdX Master-side SlaveBuilder Methodsrr }r (hHjhIjubaubhh)r }r (hHX<The master side does not have any remotely-callable methods.r hIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rhdX<The master side does not have any remotely-callable methods.rr}r(hHj hIj ubaubeubeubhE)r}r(hHUhIhFhJhMhOhPhQ}r(hS]hT]hU]hV]rh=ahX]rhauhZKh[hhC]r(h])r}r(hHXCommandsrhIjhJhMhOhahQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rhdXCommandsrr}r (hHjhIjubaubhh)r!}r"(hHXActual work done by the slave is represented on the master side by a :class:`buildbot.process.buildstep.RemoteCommand` instance.hIjhJhMhOhlhQ}r#(hS]hT]hU]hV]hX]uhZKh[hhC]r$(hdXEActual work done by the slave is represented on the master side by a r%r&}r'(hHXEActual work done by the slave is represented on the master side by a hIj!ubh)r(}r)(hHX1:class:`buildbot.process.buildstep.RemoteCommand`r*hIj!hJhMhOhhQ}r+(UreftypeXclasshhX(buildbot.process.buildstep.RemoteCommandU refdomainXpyr,hV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]r-h)r.}r/(hHj*hQ}r0(hS]hT]r1(hj,Xpy-classr2ehU]hV]hX]uhIj(hC]r3hdX(buildbot.process.buildstep.RemoteCommandr4r5}r6(hHUhIj.ubahOhubaubhdX instance.r7r8}r9(hHX instance.hIj!ubeubhh)r:}r;(hHX]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:hIjhJhMhOhlhQ}r<(hS]hT]hU]hV]hX]uhZKh[hhC]r=(hdX9The command instance keeps a reference to the slave-side r>r?}r@(hHX9The command instance keeps a reference to the slave-side hIj:ubh)rA}rB(hHX$:class:`buildslave.bot.SlaveBuilder`rChIj:hJhMhOhhQ}rD(UreftypeXclasshhXbuildslave.bot.SlaveBuilderU refdomainXpyrEhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rFh)rG}rH(hHjChQ}rI(hS]hT]rJ(hjEXpy-classrKehU]hV]hX]uhIjAhC]rLhdXbuildslave.bot.SlaveBuilderrMrN}rO(hHUhIjGubahOhubaubhdX, and calls methods like rPrQ}rR(hHX, and calls methods like hIj:ubh)rS}rT(hHX8:meth:`~buildslave.bot.SlaveBuilder.remote_startCommand`rUhIj:hJhMhOhhQ}rV(UreftypeXmethhhX/buildslave.bot.SlaveBuilder.remote_startCommandU refdomainXpyrWhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rXh)rY}rZ(hHjUhQ}r[(hS]hT]r\(hjWXpy-methr]ehU]hV]hX]uhIjShC]r^hdXremote_startCommandr_r`}ra(hHUhIjYubahOhubaubhdX8 to start new commands. Once that method is called, the rbrc}rd(hHX8 to start new commands. Once that method is called, the hIj:ubh)re}rf(hHX%:class:`~buildslave.bot.SlaveBuilder`rghIj:hJhMhOhhQ}rh(UreftypeXclasshhXbuildslave.bot.SlaveBuilderU refdomainXpyrihV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rjh)rk}rl(hHjghQ}rm(hS]hT]rn(hjiXpy-classroehU]hV]hX]uhIjehC]rphdX SlaveBuilderrqrr}rs(hHUhIjkubahOhubaubhdXR instance keeps a reference to the command, and calls the following methods on it:rtru}rv(hHXR instance keeps a reference to the command, and calls the following methods on it:hIj:ubeubhE)rw}rx(hHUhIjhJhMhOhPhQ}ry(hS]hT]hU]hV]rzh8ahX]r{hauhZKh[hhC]r|(h])r}}r~(hHX!Master-Side RemoteCommand MethodsrhIjwhJhMhOhahQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rhdX!Master-Side RemoteCommand Methodsrr}r(hHjhIj}ubaubj_)r}r(hHUhIjwhJhMhOjbhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]r(je)r}r(hHX:meth:`~buildbot.process.buildstep.RemoteCommand.remote_update` Update information about the running command. See below for the format. hIjhJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZKhC]r(jk)r}r(hHX?:meth:`~buildbot.process.buildstep.RemoteCommand.remote_update`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZKhC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhX6buildbot.process.buildstep.RemoteCommand.remote_updateU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdX remote_updaterr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHXHUpdate information about the running command. See below for the format.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXHUpdate information about the running command. See below for the format.rr}r(hHjhIjubaubahOjubeubje)r}r(hHX:meth:`~buildbot.process.buildstep.RemoteCommand.remote_complete` Signal that the command is complete, either successfully or with a Twisted failure. hIjhJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]r(jk)r}r(hHXA:meth:`~buildbot.process.buildstep.RemoteCommand.remote_complete`rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZKhC]rh)r}r(hHjhIjhJhMhOhhQ}r(UreftypeXmethhhX8buildbot.process.buildstep.RemoteCommand.remote_completeU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdXremote_completerr}r(hHUhIjubahOhubaubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHXSSignal that the command is complete, either successfully or with a Twisted failure.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXSSignal that the command is complete, either successfully or with a Twisted failure.rr}r(hHjhIjubaubahOjubeubeubcdocutils.nodes target r)r}r(hHX.. _master-slave-updates:hIjwhJhMhOUtargetrhQ}r(hV]hU]hS]hT]hX]Urefidrh*uhZKh[hhC]ubeubeubhE)r}r(hHUhIhFhJhMUexpect_referenced_by_namer}rhjshOhPhQ}r(hS]hT]hU]hV]r(h9h*ehX]r(hheuhZKh[hUexpect_referenced_by_idr}rh*jshC]r(h])r}r(hHXUpdatesrhIjhJhMhOhahQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rhdXUpdatesrr}r(hHjhIjubaubhh)r}r(hHXUpdates from the slave, sent via :meth:`~buildbot.process.buildstep.RemoteCommand.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 :meth:`~buildbot.process.buildstep.RemoteCommand.remoteUpdate`.hIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]r(hdX!Updates from the slave, sent via rr}r(hHX!Updates from the slave, sent via hIjubh)r}r(hHX?:meth:`~buildbot.process.buildstep.RemoteCommand.remote_update`rhIjhJhMhOhhQ}r(UreftypeXmethhhX6buildbot.process.buildstep.RemoteCommand.remote_updateU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHjhQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIjhC]rhdX remote_updaterr}r(hHUhIjubahOhubaubhdXa, are a list of individual update elements. Each update element is, in turn, a list of the form rr}r(hHXa, are a list of individual update elements. Each update element is, in turn, a list of the form hIjubh)r}r(hHX ``[data, 0]``hQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdX [data, 0]rr}r(hHUhIjubahOhubhdX where the 0 is present for historical reasons. The data is a dictionary, with keys describing the contents. The updates are handled by rr}r (hHX where the 0 is present for historical reasons. The data is a dictionary, with keys describing the contents. The updates are handled by hIjubh)r }r (hHX>:meth:`~buildbot.process.buildstep.RemoteCommand.remoteUpdate`r hIjhJhMhOhhQ}r (UreftypeXmethhhX5buildbot.process.buildstep.RemoteCommand.remoteUpdateU refdomainXpyrhV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]rh)r}r(hHj hQ}r(hS]hT]r(hjXpy-methrehU]hV]hX]uhIj hC]rhdX remoteUpdaterr}r(hHUhIjubahOhubaubhdX.r}r(hHX.hIjubeubhh)r}r(hHXUpdates with different keys can be combined into a single dictionary or delivered sequentially as list elements, at the slave's option.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rhdXUpdates with different keys can be combined into a single dictionary or delivered sequentially as list elements, at the slave's option.r r!}r"(hHjhIjubaubhh)r#}r$(hHXTo summarize, an ``updates`` parameter to :meth:`~buildbot.process.buildstep.RemoteCommand.remote_update` might look like this::hIjhJhMhOhlhQ}r%(hS]hT]hU]hV]hX]uhZKh[hhC]r&(hdXTo summarize, an r'r(}r)(hHXTo summarize, an hIj#ubh)r*}r+(hHX ``updates``hQ}r,(hS]hT]hU]hV]hX]uhIj#hC]r-hdXupdatesr.r/}r0(hHUhIj*ubahOhubhdX parameter to r1r2}r3(hHX parameter to hIj#ubh)r4}r5(hHX?:meth:`~buildbot.process.buildstep.RemoteCommand.remote_update`r6hIj#hJhMhOhhQ}r7(UreftypeXmethhhX6buildbot.process.buildstep.RemoteCommand.remote_updateU refdomainXpyr8hV]hU]U refexplicithS]hT]hX]hhhNhNuhZKhC]r9h)r:}r;(hHj6hQ}r<(hS]hT]r=(hj8Xpy-methr>ehU]hV]hX]uhIj4hC]r?hdX remote_updater@rA}rB(hHUhIj:ubahOhubaubhdX might look like this:rCrD}rE(hHX might look like this:hIj#ubeubcdocutils.nodes literal_block rF)rG}rH(hHX[ [ { 'header' : 'running command..' }, 0 ], [ { 'stdout' : 'abcd', 'stderr' : 'local modifications' }, 0 ], [ { 'log' : ( 'cmd.log', 'cmd invoked at 12:33 pm\n' ) }, 0 ], [ { 'rc' : 0 }, 0 ], ]hIjhJhMhOU literal_blockrIhQ}rJ(U xml:spacerKUpreserverLhV]hU]hS]hT]hX]uhZKh[hhC]rMhdX[ [ { 'header' : 'running command..' }, 0 ], [ { 'stdout' : 'abcd', 'stderr' : 'local modifications' }, 0 ], [ { 'log' : ( 'cmd.log', 'cmd invoked at 12:33 pm\n' ) }, 0 ], [ { 'rc' : 0 }, 0 ], ]rNrO}rP(hHUhIjGubaubhE)rQ}rR(hHUhIjhJhMhOhPhQ}rS(hS]hT]hU]hV]rTh4ahX]rUhauhZKh[hhC]rV(h])rW}rX(hHXDefined CommandsrYhIjQhJhMhOhahQ}rZ(hS]hT]hU]hV]hX]uhZKh[hhC]r[hdXDefined Commandsr\r]}r^(hHjYhIjWubaubhh)r_}r`(hHX1The following commands are defined on the slaves.rahIjQhJhMhOhlhQ}rb(hS]hT]hU]hV]hX]uhZKh[hhC]rchdX1The following commands are defined on the slaves.rdre}rf(hHjahIj_ubaubj)rg}rh(hHX.. _shell-command-args:hIjQhJhMhOjhQ}ri(hV]hU]hS]hT]hX]jh.uhZKh[hhC]ubhE)rj}rk(hHUhIjQhJhMj}rlh jgshOhPhQ}rm(hS]hT]hU]hV]rn(h6h.ehX]ro(hh euhZKh[hj}rph.jgshC]rq(h])rr}rs(hHXshellrthIjjhJhMhOhahQ}ru(hS]hT]hU]hV]hX]uhZKh[hhC]rvhdXshellrwrx}ry(hHjthIjrubaubhh)rz}r{(hHXORuns a shell command on the slave. This command takes the following arguments:r|hIjjhJhMhOhlhQ}r}(hS]hT]hU]hV]hX]uhZKh[hhC]r~hdXORuns a shell command on the slave. This command takes the following arguments:rr}r(hHj|hIjzubaubhh)r}r(hHX ``command``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXcommandrr}r(hHUhIjubahOhubaubcdocutils.nodes block_quote r)r}r(hHUhIjjhJhMhOU block_quoterhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHXThe 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.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXThe 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(hHjhIjubaubaubhh)r}r(hHX ``workdir``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXworkdirrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHXCDirectory in which to run the command, relative to the builder dir.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXCDirectory in which to run the command, relative to the builder dir.rr}r(hHjhIjubaubaubhh)r}r(hHX``env``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXenvrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHX 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.hIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]r(hdXxA dictionary of environment variables to augment or replace the existing environment on the slave. In this dictionary, rr}r(hHXxA dictionary of environment variables to augment or replace the existing environment on the slave. In this dictionary, hIjubh)r}r(hHX``PYTHONPATH``hQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdX PYTHONPATHrr}r(hHUhIjubahOhubhdX 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(hHX is treated specially: it should be a list of path components, rather than a string, and will be prepended to the existing Python path.hIjubeubaubhh)r}r(hHX``initial_stdin``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdX initial_stdinrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHXSA string which will be written to the command's standard input before it is closed.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXSA string which will be written to the command's standard input before it is closed.rr}r(hHjhIjubaubaubhh)r}r(hHX``want_stdout``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdX want_stdoutrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHX2If false, then no updates will be sent for stdout.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdX2If false, then no updates will be sent for stdout.rr}r(hHjhIjubaubaubhh)r}r(hHX``want_stderr``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]r h)r }r (hHjhQ}r (hS]hT]hU]hV]hX]uhIjhC]r hdX want_stderrrr}r(hHUhIj ubahOhubaubj)r}r(hHUhIjjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHX2If false, then no updates will be sent for stderr.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdX2If false, then no updates will be sent for stderr.rr}r(hHjhIjubaubaubhh)r}r(hHX ``usePTY``rhIjjhJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZKh[hhC]r!h)r"}r#(hHjhQ}r$(hS]hT]hU]hV]hX]uhIjhC]r%hdXusePTYr&r'}r((hHUhIj"ubahOhubaubj)r)}r*(hHUhIjjhJhMhOjhQ}r+(hS]hT]hU]hV]hX]uhZNh[hhC]r,hh)r-}r.(hHXIf true, the command should be run with a PTY (POSIX only). This defaults to the value specified in the slave's ``buildbot.tac``.hIj)hJhMhOhlhQ}r/(hS]hT]hU]hV]hX]uhZKhC]r0(hdXqIf true, the command should be run with a PTY (POSIX only). This defaults to the value specified in the slave's r1r2}r3(hHXqIf true, the command should be run with a PTY (POSIX only). This defaults to the value specified in the slave's hIj-ubh)r4}r5(hHX``buildbot.tac``hQ}r6(hS]hT]hU]hV]hX]uhIj-hC]r7hdX buildbot.tacr8r9}r:(hHUhIj4ubahOhubhdX.r;}r<(hHX.hIj-ubeubaubhh)r=}r>(hHX``not_really``r?hIjjhJhMhOhlhQ}r@(hS]hT]hU]hV]hX]uhZKh[hhC]rAh)rB}rC(hHj?hQ}rD(hS]hT]hU]hV]hX]uhIj=hC]rEhdX not_reallyrFrG}rH(hHUhIjBubahOhubaubj)rI}rJ(hHUhIjjhJhMhOjhQ}rK(hS]hT]hU]hV]hX]uhZNh[hhC]rLhh)rM}rN(hHX7If true, skip execution and return an update with rc=0.rOhIjIhJhMhOhlhQ}rP(hS]hT]hU]hV]hX]uhZKhC]rQhdX7If true, skip execution and return an update with rc=0.rRrS}rT(hHjOhIjMubaubaubhh)rU}rV(hHX ``timeout``rWhIjjhJhMhOhlhQ}rX(hS]hT]hU]hV]hX]uhZKh[hhC]rYh)rZ}r[(hHjWhQ}r\(hS]hT]hU]hV]hX]uhIjUhC]r]hdXtimeoutr^r_}r`(hHUhIjZubahOhubaubj)ra}rb(hHUhIjjhJhMhOjhQ}rc(hS]hT]hU]hV]hX]uhZNh[hhC]rdhh)re}rf(hHX9Maximum time without output before the command is killed.rghIjahJhMhOhlhQ}rh(hS]hT]hU]hV]hX]uhZKhC]rihdX9Maximum time without output before the command is killed.rjrk}rl(hHjghIjeubaubaubhh)rm}rn(hHX ``maxTime``rohIjjhJhMhOhlhQ}rp(hS]hT]hU]hV]hX]uhZKh[hhC]rqh)rr}rs(hHjohQ}rt(hS]hT]hU]hV]hX]uhIjmhC]ruhdXmaxTimervrw}rx(hHUhIjrubahOhubaubj)ry}rz(hHUhIjjhJhMhOjhQ}r{(hS]hT]hU]hV]hX]uhZNh[hhC]r|hh)r}}r~(hHXAMaximum overall time from the start before the command is killed.rhIjyhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]rhdXAMaximum overall time from the start before the command is killed.rr}r(hHjhIj}ubaubaubhh)r}r(hHX ``logfiles``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKh[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXlogfilesrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]r(hh)r}r(hHX1A 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:hIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZKhC]r(hdXA 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(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 hIjubh)r}r(hHX ``filename``hQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXfilenamerr}r(hHUhIjubahOhubhdXC key specifying the filename, and can also have the following keys:rr}r(hHXC key specifying the filename, and can also have the following keys:hIjubeubhh)r}r(hHX ``follow``rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZMhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXfollowrr}r(hHUhIjubahOhubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHX[Only follow the file from its current end-of-file, rather that starting from the beginning.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZMhC]rhdX[Only follow the file from its current end-of-file, rather that starting from the beginning.rr}r(hHjhIjubaubahOjubeubhh)r}r(hHX``logEnviron``rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZMh[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdX logEnvironrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHX7If false, the command's environment will not be logged.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZMhC]rhdX7If false, the command's environment will not be logged.rr}r(hHjhIjubaubaubhh)r}r(hHX2The ``shell`` command sends the following updates:rhIjjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM h[hhC]r(hdXThe rr}r(hHXThe hIjubh)r}r(hHX ``shell``hQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXshellrr}r(hHUhIjubahOhubhdX% command sends the following updates:rr}r(hHX% command sends the following updates:hIjubeubj_)r}r(hHUhIjjhJhMhOjbhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]r(je)r}r(hHX``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. hIjhJhMhOjhhQ}r(hS]hT]hU]hV]hX]uhZMhC]r(jk)r}r(hHX ``stdout``rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZMhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXstdoutrr}r(hHUhIjubahOhubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHXThe data is a bytestring which represents a continuation of the stdout stream. Note that the bytestring boundaries are not necessarily aligned with newlines.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM hC]rhdXThe data is a bytestring which represents a continuation of the stdout stream. Note that the bytestring boundaries are not necessarily aligned with newlines.rr}r(hHjhIjubaubahOjubeubje)r}r (hHX<``stderr`` Similar to ``stdout``, but for the error stream. hIjhJhMhOjhhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r (jk)r }r (hHX ``stderr``rhIjhJhMhOjohQ}r(hS]hT]hU]hV]hX]uhZMhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIj hC]rhdXstderrrr}r(hHUhIjubahOhubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhh)r}r(hHX0Similar to ``stdout``, but for the error stream.hIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZMhC]r(hdX Similar to r r!}r"(hHX Similar to hIjubh)r#}r$(hHX ``stdout``hQ}r%(hS]hT]hU]hV]hX]uhIjhC]r&hdXstdoutr'r(}r)(hHUhIj#ubahOhubhdX, but for the error stream.r*r+}r,(hHX, but for the error stream.hIjubeubahOjubeubje)r-}r.(hHXb``header`` Similar to ``stdout``, but containing data for a stream of buildbot-specific metadata. hIjhJhMhOjhhQ}r/(hS]hT]hU]hV]hX]uhZMh[hhC]r0(jk)r1}r2(hHX ``header``r3hIj-hJhMhOjohQ}r4(hS]hT]hU]hV]hX]uhZMhC]r5h)r6}r7(hHj3hQ}r8(hS]hT]hU]hV]hX]uhIj1hC]r9hdXheaderr:r;}r<(hHUhIj6ubahOhubaubj)r=}r>(hHUhQ}r?(hS]hT]hU]hV]hX]uhIj-hC]r@hh)rA}rB(hHXVSimilar to ``stdout``, but containing data for a stream of buildbot-specific metadata.hIj=hJhMhOhlhQ}rC(hS]hT]hU]hV]hX]uhZMhC]rD(hdX Similar to rErF}rG(hHX Similar to hIjAubh)rH}rI(hHX ``stdout``hQ}rJ(hS]hT]hU]hV]hX]uhIjAhC]rKhdXstdoutrLrM}rN(hHUhIjHubahOhubhdXA, but containing data for a stream of buildbot-specific metadata.rOrP}rQ(hHXA, but containing data for a stream of buildbot-specific metadata.hIjAubeubahOjubeubje)rR}rS(hHX``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``. hIjhJhMhOjhhQ}rT(hS]hT]hU]hV]hX]uhZMh[hhC]rU(jk)rV}rW(hHX``rc``rXhIjRhJhMhOjohQ}rY(hS]hT]hU]hV]hX]uhZMhC]rZh)r[}r\(hHjXhQ}r](hS]hT]hU]hV]hX]uhIjVhC]r^hdXrcr_r`}ra(hHUhIj[ubahOhubaubj)rb}rc(hHUhQ}rd(hS]hT]hU]hV]hX]uhIjRhC]rehh)rf}rg(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 ``rc``.hIjbhJhMhOhlhQ}rh(hS]hT]hU]hV]hX]uhZMhC]ri(hdXThe 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 rjrk}rl(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 hIjfubh)rm}rn(hHX``rc``hQ}ro(hS]hT]hU]hV]hX]uhIjfhC]rphdXrcrqrr}rs(hHUhIjmubahOhubhdX.rt}ru(hHX.hIjfubeubahOjubeubje)rv}rw(hHX``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. hIjhJhMhOjhhQ}rx(hS]hT]hU]hV]hX]uhZM!h[hhC]ry(jk)rz}r{(hHX``log``r|hIjvhJhMhOjohQ}r}(hS]hT]hU]hV]hX]uhZM!hC]r~h)r}r(hHj|hQ}r(hS]hT]hU]hV]hX]uhIjzhC]rhdXlogrr}r(hHUhIjubahOhubaubj)r}r(hHUhQ}r(hS]hT]hU]hV]hX]uhIjvhC]rhh)r}r(hHXThis 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.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZMhC]rhdXThis 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(hHjhIjubaubahOjubeubeubeubhE)r}r(hHUhIjQhJhMhOhPhQ}r(hS]hT]hU]hV]rh7ahX]rhauhZM$h[hhC]r(h])r}r(hHX uploadFilerhIjhJhMhOhahQ}r(hS]hT]hU]hV]hX]uhZM$h[hhC]rhdX uploadFilerr}r(hHjhIjubaubhh)r}r(hHX>Upload a file from the slave to the master. The arguments arerhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM&h[hhC]rhdX>Upload a file from the slave to the master. The arguments arerr}r(hHjhIjubaubhh)r}r(hHX ``workdir``rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM(h[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXworkdirrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHXGThe base directory for the filename, relative to the builder's basedir.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM*hC]rhdXGThe base directory for the filename, relative to the builder's basedir.rr}r(hHjhIjubaubaubhh)r}r(hHX ``slavesrc``rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM,h[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXslavesrcrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHX<Name of the filename to read from., relative to the workdir.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM.hC]rhdX<Name of the filename to read from., relative to the workdir.rr}r(hHjhIjubaubaubhh)r}r(hHX ``writer``rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM0h[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXwriterrr}r(hHUhIjubahOhubaubj)r}r(hHUhIjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r}r(hHX7A remote reference to a writer object, described below.rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM2hC]rhdX7A remote reference to a writer object, described below.rr}r(hHjhIjubaubaubhh)r}r(hHX ``maxsize``rhIjhJhMhOhlhQ}r(hS]hT]hU]hV]hX]uhZM4h[hhC]rh)r}r(hHjhQ}r(hS]hT]hU]hV]hX]uhIjhC]rhdXmaxsizerr}r(hHUhIjubahOhubaubj)r}r(hHUhIjhJhMhOjhQ}r(hS]hT]hU]hV]hX]uhZNh[hhC]rhh)r }r (hHXeMaximum size, in bytes, of the file to write. The operation will fail if the file exceeds this size.r hIjhJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZM6hC]r hdXeMaximum size, in bytes, of the file to write. The operation will fail if the file exceeds this size.r r }r (hHj hIj ubaubaubhh)r }r (hHX ``blocksize``r hIjhJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZM9h[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX blocksizer r }r (hHUhIj ubahOhubaubj)r }r (hHUhIjhJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHX/The block size with which to transfer the file.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZM;hC]r hdX/The block size with which to transfer the file.r r }r (hHj hIj ubaubaubhh)r }r! (hHX ``keepstamp``r" hIjhJhMhOhlhQ}r# (hS]hT]hU]hV]hX]uhZM=h[hhC]r$ h)r% }r& (hHj" hQ}r' (hS]hT]hU]hV]hX]uhIj hC]r( hdX keepstampr) r* }r+ (hHUhIj% ubahOhubaubj)r, }r- (hHUhIjhJhMhOjhQ}r. (hS]hT]hU]hV]hX]uhZNh[hhC]r/ hh)r0 }r1 (hHX7If true, preserve the file modified and accessed times.r2 hIj, hJhMhOhlhQ}r3 (hS]hT]hU]hV]hX]uhZM?hC]r4 hdX7If true, preserve the file modified and accessed times.r5 r6 }r7 (hHj2 hIj0 ubaubaubhh)r8 }r9 (hHX*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)``.hIjhJhMhOhlhQ}r: (hS]hT]hU]hV]hX]uhZMAh[hhC]r; (hdXGThe slave calls a few remote methods on the writer object. First, the r< r= }r> (hHXGThe slave calls a few remote methods on the writer object. First, the hIj8 ubh)r? }r@ (hHX ``write``hQ}rA (hS]hT]hU]hV]hX]uhIj8 hC]rB hdXwriterC rD }rE (hHUhIj? ubahOhubhdX method is called with a bytestring containing data, until all of the data has been transmitted. Then, the slave calls the writer's rF rG }rH (hHX method is called with a bytestring containing data, until all of the data has been transmitted. Then, the slave calls the writer's hIj8 ubh)rI }rJ (hHX ``close``hQ}rK (hS]hT]hU]hV]hX]uhIj8 hC]rL hdXcloserM rN }rO (hHUhIjI ubahOhubhdX, followed (if rP rQ }rR (hHX, followed (if hIj8 ubh)rS }rT (hHX ``keepstamp``hQ}rU (hS]hT]hU]hV]hX]uhIj8 hC]rV hdX keepstamprW rX }rY (hHUhIjS ubahOhubhdX is true) by a call to rZ r[ }r\ (hHX is true) by a call to hIj8 ubh)r] }r^ (hHX``upload(atime, mtime)``hQ}r_ (hS]hT]hU]hV]hX]uhIj8 hC]r` hdXupload(atime, mtime)ra rb }rc (hHUhIj] ubahOhubhdX.rd }re (hHX.hIj8 ubeubhh)rf }rg (hHXWThis command sends ``rc`` and ``stderr`` updates, as defined for the ``shell`` command.hIjhJhMhOhlhQ}rh (hS]hT]hU]hV]hX]uhZMFh[hhC]ri (hdXThis command sends rj rk }rl (hHXThis command sends hIjf ubh)rm }rn (hHX``rc``hQ}ro (hS]hT]hU]hV]hX]uhIjf hC]rp hdXrcrq rr }rs (hHUhIjm ubahOhubhdX and rt ru }rv (hHX and hIjf ubh)rw }rx (hHX ``stderr``hQ}ry (hS]hT]hU]hV]hX]uhIjf hC]rz hdXstderrr{ r| }r} (hHUhIjw ubahOhubhdX updates, as defined for the r~ r }r (hHX updates, as defined for the hIjf ubh)r }r (hHX ``shell``hQ}r (hS]hT]hU]hV]hX]uhIjf hC]r hdXshellr r }r (hHUhIj ubahOhubhdX command.r r }r (hHX command.hIjf ubeubeubhE)r }r (hHUhIjQhJhMhOhPhQ}r (hS]hT]hU]hV]r h:ahX]r hauhZMJh[hhC]r (h])r }r (hHXuploadDirectoryr hIj hJhMhOhahQ}r (hS]hT]hU]hV]hX]uhZMJh[hhC]r hdXuploadDirectoryr r }r (hHj hIj ubaubhh)r }r (hHXSimilar to ``uploadFile``, this command will upload an entire directory to the master, in the form of a tarball. It takes the following arguments:hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMLh[hhC]r (hdX Similar to r r }r (hHX Similar to hIj ubh)r }r (hHX``uploadFile``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX uploadFiler r }r (hHUhIj ubahOhubhdXz, this command will upload an entire directory to the master, in the form of a tarball. It takes the following arguments:r r }r (hHXz, this command will upload an entire directory to the master, in the form of a tarball. It takes the following arguments:hIj ubeubhh)r }r (hHX=``workdir`` ``slavesrc`` ``writer`` ``maxsize`` ``blocksize``hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMOh[hhC]r (h)r }r (hHX ``workdir``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXworkdirr r }r (hHUhIj ubahOhubhdX r }r (hHX hIj ubh)r }r (hHX ``slavesrc``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXslavesrcr r }r (hHUhIj ubahOhubhdX r }r (hHX hIj ubh)r }r (hHX ``writer``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXwriterr r }r (hHUhIj ubahOhubhdX r }r (hHX hIj ubh)r }r (hHX ``maxsize``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXmaxsizer r }r (hHUhIj ubahOhubhdX r }r (hHX hIj ubh)r }r (hHX ``blocksize``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX blocksizer r }r (hHUhIj ubahOhubeubj)r }r (hHUhIj hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHXSee ``uploadFile``hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMUhC]r (hdXSee r r }r (hHXSee hIj ubh)r }r (hHX``uploadFile``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX uploadFiler r }r (hHUhIj ubahOhubeubaubhh)r }r (hHX ``compress``r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMWh[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXcompressr r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHXHCompression algorithm to use -- one of ``None``, ``'bz2'``, or ``'gz'``.hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMYhC]r (hdX'Compression algorithm to use -- one of r r }r (hHX'Compression algorithm to use -- one of hIj ubh)r }r (hHX``None``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXNoner r }r (hHUhIj ubahOhubhdX, r r }r (hHX, hIj ubh)r }r (hHX ``'bz2'``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX'bz2'r r }r (hHUhIj ubahOhubhdX, or r r }r (hHX, or hIj ubh)r }r (hHX``'gz'``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX'gz'r r }r (hHUhIj ubahOhubhdX.r }r (hHX.hIj ubeubaubhh)r }r (hHXThe 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.hIj hJhMhOhlhQ}r! (hS]hT]hU]hV]hX]uhZM[h[hhC]r" (hdX.The writer object is treated similarly to the r# r$ }r% (hHX.The writer object is treated similarly to the hIj ubh)r& }r' (hHX``uploadFile``hQ}r( (hS]hT]hU]hV]hX]uhIj hC]r) hdX uploadFiler* r+ }r, (hHUhIj& ubahOhubhdXE command, but after the file is closed, the slave calls the master's r- r. }r/ (hHXE command, but after the file is closed, the slave calls the master's hIj ubh)r0 }r1 (hHX ``unpack``hQ}r2 (hS]hT]hU]hV]hX]uhIj hC]r3 hdXunpackr4 r5 }r6 (hHUhIj0 ubahOhubhdX1 method with no arguments to extract the tarball.r7 r8 }r9 (hHX1 method with no arguments to extract the tarball.hIj ubeubhh)r: }r; (hHXWThis command sends ``rc`` and ``stderr`` updates, as defined for the ``shell`` command.hIj hJhMhOhlhQ}r< (hS]hT]hU]hV]hX]uhZM_h[hhC]r= (hdXThis command sends r> r? }r@ (hHXThis command sends hIj: ubh)rA }rB (hHX``rc``hQ}rC (hS]hT]hU]hV]hX]uhIj: hC]rD hdXrcrE rF }rG (hHUhIjA ubahOhubhdX and rH rI }rJ (hHX and hIj: ubh)rK }rL (hHX ``stderr``hQ}rM (hS]hT]hU]hV]hX]uhIj: hC]rN hdXstderrrO rP }rQ (hHUhIjK ubahOhubhdX updates, as defined for the rR rS }rT (hHX updates, as defined for the hIj: ubh)rU }rV (hHX ``shell``hQ}rW (hS]hT]hU]hV]hX]uhIj: hC]rX hdXshellrY rZ }r[ (hHUhIjU ubahOhubhdX command.r\ r] }r^ (hHX command.hIj: ubeubeubhE)r_ }r` (hHUhIjQhJhMhOhPhQ}ra (hS]hT]hU]hV]rb h?ahX]rc hauhZMch[hhC]rd (h])re }rf (hHX downloadFilerg hIj_ hJhMhOhahQ}rh (hS]hT]hU]hV]hX]uhZMch[hhC]ri hdX downloadFilerj rk }rl (hHjg hIje ubaubhh)rm }rn (hHXbThis command will download a file from the master to the slave. It takes the following arguments:ro hIj_ hJhMhOhlhQ}rp (hS]hT]hU]hV]hX]uhZMeh[hhC]rq hdXbThis command will download a file from the master to the slave. It takes the following arguments:rr rs }rt (hHjo hIjm ubaubhh)ru }rv (hHX ``workdir``rw hIj_ hJhMhOhlhQ}rx (hS]hT]hU]hV]hX]uhZMhh[hhC]ry h)rz }r{ (hHjw hQ}r| (hS]hT]hU]hV]hX]uhIju hC]r} hdXworkdirr~ r }r (hHUhIjz ubahOhubaubj)r }r (hHUhIj_ hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHXMBase directory for the destination filename, relative to the builder basedir.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMjhC]r hdXMBase directory for the destination filename, relative to the builder basedir.r r }r (hHj hIj ubaubaubhh)r }r (hHX ``slavedest``r hIj_ hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMlh[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX slavedestr r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj_ hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHX.Filename to write to, relative to the workdir.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMnhC]r hdX.Filename to write to, relative to the workdir.r r }r (hHj hIj ubaubaubhh)r }r (hHX ``reader``r hIj_ hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMph[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXreaderr r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj_ hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHX7A remote reference to a reader object, described below.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMrhC]r hdX7A remote reference to a reader object, described below.r r }r (hHj hIj ubaubaubhh)r }r (hHX ``maxsize``r hIj_ hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMth[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXmaxsizer r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj_ hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHXMaximum size of the file.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMvhC]r hdXMaximum size of the file.r r }r (hHj hIj ubaubaubhh)r }r (hHX ``blocksize``r hIj_ hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMxh[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX blocksizer r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj_ hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHX/The block size with which to transfer the file.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMzhC]r hdX/The block size with which to transfer the file.r r }r (hHj hIj ubaubaubhh)r }r (hHX``mode``r hIj_ hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZM|h[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXmoder r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj_ hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHXAccess mode for the new file.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZM~hC]r hdXAccess mode for the new file.r r }r (hHj hIj ubaubaubhh)r }r (hHXThe 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.hIj_ hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r (hdXThe reader object's r r }r (hHXThe reader object's hIj ubh)r }r (hHX``read(maxsize)``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX read(maxsize)r r }r (hHUhIj ubahOhubhdX 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 (hHX 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 hIj ubh)r }r (hHX ``close``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXcloser r }r (hHUhIj ubahOhubhdX method.r r }r (hHX method.hIj ubeubhh)r }r! (hHXWThis command sends ``rc`` and ``stderr`` updates, as defined for the ``shell`` command.hIj_ hJhMhOhlhQ}r" (hS]hT]hU]hV]hX]uhZMh[hhC]r# (hdXThis command sends r$ r% }r& (hHXThis command sends hIj ubh)r' }r( (hHX``rc``hQ}r) (hS]hT]hU]hV]hX]uhIj hC]r* hdXrcr+ r, }r- (hHUhIj' ubahOhubhdX and r. r/ }r0 (hHX and hIj ubh)r1 }r2 (hHX ``stderr``hQ}r3 (hS]hT]hU]hV]hX]uhIj hC]r4 hdXstderrr5 r6 }r7 (hHUhIj1 ubahOhubhdX updates, as defined for the r8 r9 }r: (hHX updates, as defined for the hIj ubh)r; }r< (hHX ``shell``hQ}r= (hS]hT]hU]hV]hX]uhIj hC]r> hdXshellr? r@ }rA (hHUhIj; ubahOhubhdX command.rB rC }rD (hHX command.hIj ubeubeubhE)rE }rF (hHUhIjQhJhMhOhPhQ}rG (hS]hT]hU]hV]rH h1ahX]rI hauhZMh[hhC]rJ (h])rK }rL (hHXmkdirrM hIjE hJhMhOhahQ}rN (hS]hT]hU]hV]hX]uhZMh[hhC]rO hdXmkdirrP rQ }rR (hHjM hIjK ubaubhh)rS }rT (hHXThis command will create a directory on the slave. It will also create any intervening directories required. It takes the following argument:rU hIjE hJhMhOhlhQ}rV (hS]hT]hU]hV]hX]uhZMh[hhC]rW hdXThis command will create a directory on the slave. It will also create any intervening directories required. It takes the following argument:rX rY }rZ (hHjU hIjS ubaubhh)r[ }r\ (hHX``dir``r] hIjE hJhMhOhlhQ}r^ (hS]hT]hU]hV]hX]uhZMh[hhC]r_ h)r` }ra (hHj] hQ}rb (hS]hT]hU]hV]hX]uhIj[ hC]rc hdXdirrd re }rf (hHUhIj` ubahOhubaubj)rg }rh (hHUhIjE hJhMhOjhQ}ri (hS]hT]hU]hV]hX]uhZNh[hhC]rj hh)rk }rl (hHXDirectory to create.rm hIjg hJhMhOhlhQ}rn (hS]hT]hU]hV]hX]uhZMhC]ro hdXDirectory to create.rp rq }rr (hHjm hIjk ubaubaubhh)rs }rt (hHX=The ``mkdir`` command produces the same updates as ``shell``.ru hIjE hJhMhOhlhQ}rv (hS]hT]hU]hV]hX]uhZMh[hhC]rw (hdXThe rx ry }rz (hHXThe hIjs ubh)r{ }r| (hHX ``mkdir``hQ}r} (hS]hT]hU]hV]hX]uhIjs hC]r~ hdXmkdirr r }r (hHUhIj{ ubahOhubhdX& command produces the same updates as r r }r (hHX& command produces the same updates as hIjs ubh)r }r (hHX ``shell``hQ}r (hS]hT]hU]hV]hX]uhIjs hC]r hdXshellr r }r (hHUhIj ubahOhubhdX.r }r (hHX.hIjs ubeubeubhE)r }r (hHUhIjQhJhMhOhPhQ}r (hS]hT]hU]hV]r h3ahX]r hauhZMh[hhC]r (h])r }r (hHXrmdirr hIj hJhMhOhahQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r hdXrmdirr r }r (hHj hIj ubaubhh)r }r (hHX]This command will remove a directory or file on the slave. It takes the following arguments:r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r hdX]This command will remove a directory or file on the slave. It takes the following arguments:r r }r (hHj hIj ubaubhh)r }r (hHX``dir``r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXdirr r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHXDirectory to remove.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMhC]r hdXDirectory to remove.r r }r (hHj hIj ubaubaubhh)r }r (hHX``timeout`` ``maxTime``hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r (h)r }r (hHX ``timeout``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXtimeoutr r }r (hHUhIj ubahOhubhdX r }r (hHX hIj ubh)r }r (hHX ``maxTime``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXmaxTimer r }r (hHUhIj ubahOhubeubj)r }r (hHUhIj hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHXSee ``shell``, above.hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMhC]r (hdXSee r r }r (hHXSee hIj ubh)r }r (hHX ``shell``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXshellr r }r (hHUhIj ubahOhubhdX, above.r r }r (hHX, above.hIj ubeubaubhh)r }r (hHX=The ``rmdir`` command produces the same updates as ``shell``.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r (hdXThe r r }r (hHXThe hIj ubh)r }r (hHX ``rmdir``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXrmdirr r }r (hHUhIj ubahOhubhdX& command produces the same updates as r r }r (hHX& command produces the same updates as hIj ubh)r }r (hHX ``shell``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXshellr r }r (hHUhIj ubahOhubhdX.r }r (hHX.hIj ubeubeubhE)r }r (hHUhIjQhJhMhOhPhQ}r (hS]hT]hU]hV]r h/ahX]r h auhZMh[hhC]r (h])r }r (hHXcpdirr hIj hJhMhOhahQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r hdXcpdirr r }r (hHj hIj ubaubhh)r }r (hHXgThis command will copy a directory from place to place on the slave. It takes the following arguments:r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r hdXgThis command will copy a directory from place to place on the slave. It takes the following arguments:r r }r (hHj hIj ubaubhh)r }r (hHX ``fromdir``r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXfromdirr r }r! (hHUhIj ubahOhubaubj)r" }r# (hHUhIj hJhMhOjhQ}r$ (hS]hT]hU]hV]hX]uhZNh[hhC]r% hh)r& }r' (hHXKSource directory for the copy operation, relative to the builder's basedir.r( hIj" hJhMhOhlhQ}r) (hS]hT]hU]hV]hX]uhZMhC]r* hdXKSource directory for the copy operation, relative to the builder's basedir.r+ r, }r- (hHj( hIj& ubaubaubhh)r. }r/ (hHX ``todir``r0 hIj hJhMhOhlhQ}r1 (hS]hT]hU]hV]hX]uhZMh[hhC]r2 h)r3 }r4 (hHj0 hQ}r5 (hS]hT]hU]hV]hX]uhIj. hC]r6 hdXtodirr7 r8 }r9 (hHUhIj3 ubahOhubaubj)r: }r; (hHUhIj hJhMhOjhQ}r< (hS]hT]hU]hV]hX]uhZNh[hhC]r= hh)r> }r? (hHXPDestination directory for the copy operation, relative to the builder's basedir.r@ hIj: hJhMhOhlhQ}rA (hS]hT]hU]hV]hX]uhZMhC]rB hdXPDestination directory for the copy operation, relative to the builder's basedir.rC rD }rE (hHj@ hIj> ubaubaubhh)rF }rG (hHX``timeout`` ``maxTime``hIj hJhMhOhlhQ}rH (hS]hT]hU]hV]hX]uhZMh[hhC]rI (h)rJ }rK (hHX ``timeout``hQ}rL (hS]hT]hU]hV]hX]uhIjF hC]rM hdXtimeoutrN rO }rP (hHUhIjJ ubahOhubhdX rQ }rR (hHX hIjF ubh)rS }rT (hHX ``maxTime``hQ}rU (hS]hT]hU]hV]hX]uhIjF hC]rV hdXmaxTimerW rX }rY (hHUhIjS ubahOhubeubj)rZ }r[ (hHUhIj hJhMhOjhQ}r\ (hS]hT]hU]hV]hX]uhZNh[hhC]r] hh)r^ }r_ (hHXSee ``shell``, above.hIjZ hJhMhOhlhQ}r` (hS]hT]hU]hV]hX]uhZMhC]ra (hdXSee rb rc }rd (hHXSee hIj^ ubh)re }rf (hHX ``shell``hQ}rg (hS]hT]hU]hV]hX]uhIj^ hC]rh hdXshellri rj }rk (hHUhIje ubahOhubhdX, above.rl rm }rn (hHX, above.hIj^ ubeubaubhh)ro }rp (hHX=The ``cpdir`` command produces the same updates as ``shell``.rq hIj hJhMhOhlhQ}rr (hS]hT]hU]hV]hX]uhZMh[hhC]rs (hdXThe rt ru }rv (hHXThe hIjo ubh)rw }rx (hHX ``cpdir``hQ}ry (hS]hT]hU]hV]hX]uhIjo hC]rz hdXcpdirr{ r| }r} (hHUhIjw ubahOhubhdX& command produces the same updates as r~ r }r (hHX& command produces the same updates as hIjo ubh)r }r (hHX ``shell``hQ}r (hS]hT]hU]hV]hX]uhIjo hC]r hdXshellr r }r (hHUhIj ubahOhubhdX.r }r (hHX.hIjo ubeubeubhE)r }r (hHUhIjQhJhMhOhPhQ}r (hS]hT]hU]hV]r h,ahX]r h auhZMh[hhC]r (h])r }r (hHXstatr hIj hJhMhOhahQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r hdXstatr r }r (hHj hIj ubaubhh)r }r (hHXThis command returns status information about a file or directory. It takes a single parameter, ``file``, specifying the filename relative to the builder's basedir.hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r (hdXaThis command returns status information about a file or directory. It takes a single parameter, r r }r (hHXaThis command returns status information about a file or directory. It takes a single parameter, hIj ubh)r }r (hHX``file``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXfiler r }r (hHUhIj ubahOhubhdX<, specifying the filename relative to the builder's basedir.r r }r (hHX<, specifying the filename relative to the builder's basedir.hIj ubeubhh)r }r (hHXIt produces two status updates:r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r hdXIt produces two status updates:r r }r (hHj hIj ubaubhh)r }r (hHX``stat``r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXstatr r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHX+The return value from Python's ``os.stat``.hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMhC]r (hdXThe return value from Python's r r }r (hHXThe return value from Python's hIj ubh)r }r (hHX ``os.stat``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXos.statr r }r (hHUhIj ubahOhubhdX.r }r (hHX.hIj ubeubaubhh)r }r (hHX``rc``r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r h)r }r (hHj hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXrcr r }r (hHUhIj ubahOhubaubj)r }r (hHUhIj hJhMhOjhQ}r (hS]hT]hU]hV]hX]uhZNh[hhC]r hh)r }r (hHX$0 if the file is found, otherwise 1.r hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMhC]r hdX$0 if the file is found, otherwise 1.r r }r (hHj hIj ubaubaubeubhE)r }r (hHUhIjQhJhMhOhPhQ}r (hS]hT]hU]hV]r h@ahX]r hauhZMh[hhC]r (h])r }r (hHXSource Commandsr hIj hJhMhOhahQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r hdXSource Commandsr r }r (hHj hIj ubaubhh)r }r (hHXThe 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.hIj hJhMhOhlhQ}r (hS]hT]hU]hV]hX]uhZMh[hhC]r (hdXThe source commands (r r }r (hHXThe source commands (hIj ubh)r }r (hHX``bk``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXbkr r }r (hHUhIj ubahOhubhdX, r r }r (hHX, hIj ubh)r }r (hHX``cvs``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXcvsr r }r (hHUhIj ubahOhubhdX, r r }r (hHX, hIj ubh)r }r (hHX ``darcs``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXdarcsr r }r (hHUhIj ubahOhubhdX, r r }r (hHX, hIj ubh)r }r (hHX``git``hQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdXgitr r! }r" (hHUhIj ubahOhubhdX, r# r$ }r% (hHX, hIj ubh)r& }r' (hHX``repo``hQ}r( (hS]hT]hU]hV]hX]uhIj hC]r) hdXrepor* r+ }r, (hHUhIj& ubahOhubhdX, r- r. }r/ (hHX, hIj ubh)r0 }r1 (hHX``bzr``hQ}r2 (hS]hT]hU]hV]hX]uhIj hC]r3 hdXbzrr4 r5 }r6 (hHUhIj0 ubahOhubhdX, r7 r8 }r9 (hHX, hIj ubh)r: }r; (hHX``hg``hQ}r< (hS]hT]hU]hV]hX]uhIj hC]r= hdXhgr> r? }r@ (hHUhIj: ubahOhubhdX, rA rB }rC (hHX, hIj ubh)rD }rE (hHX``p4``hQ}rF (hS]hT]hU]hV]hX]uhIj hC]rG hdXp4rH rI }rJ (hHUhIjD ubahOhubhdX, rK rL }rM (hHX, hIj ubh)rN }rO (hHX ``p4sync``hQ}rP (hS]hT]hU]hV]hX]uhIj hC]rQ hdXp4syncrR rS }rT (hHUhIjN ubahOhubhdX, and rU rV }rW (hHX, and hIj ubh)rX }rY (hHX``mtn``hQ}rZ (hS]hT]hU]hV]hX]uhIj hC]r[ hdXmtnr\ r] }r^ (hHUhIjX ubahOhubhdXN) are deprecated. See the docstrings in the source code for more information.r_ r` }ra (hHXN) are deprecated. See the docstrings in the source code for more information.hIj ubeubeubeubeubeubahHUU transformerrb NU footnote_refsrc }rd Urefnamesre }rf Usymbol_footnotesrg ]rh Uautofootnote_refsri ]rj Usymbol_footnote_refsrk ]rl U citationsrm ]rn h[hU current_linero NUtransform_messagesrp ]rq (cdocutils.nodes system_message rr )rs }rt (hHUhQ}ru (hS]UlevelKhV]hU]UsourcehMhT]hX]UlineKUtypeUINFOrv uhC]rw hh)rx }ry (hHUhQ}rz (hS]hT]hU]hV]hX]uhIjs hC]r{ hdX:Hyperlink target "master-slave-updates" is not referenced.r| r} }r~ (hHUhIjx ubahOhlubahOUsystem_messager ubjr )r }r (hHUhQ}r (hS]UlevelKhV]hU]UsourcehMhT]hX]UlineKUtypejv uhC]r hh)r }r (hHUhQ}r (hS]hT]hU]hV]hX]uhIj hC]r hdX8Hyperlink target "shell-command-args" is not referenced.r r }r (hHUhIj ubahOhlubahOj 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 NhaNUerror_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.8/master/docs/developer/master-slave.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 (h*jh+j!h.jjh/j h2jh0jIh1jE h3j h4jQh,j h6jjh7jh-jh5jh9jh:j h8jwhjh?j_ hAhrh;jhBjRh)hFh@j uUsubstitution_namesr }r hOh[hQ}r (hS]hV]hU]UsourcehMhT]hX]uU footnotesr ]r Urefidsr }r (h*]r jah.]r jgauub.PKJtD +0Պ1buildbot-v0.8.8/.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.8/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.regrssions``) - 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.regrssions``) - 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.regrssions``h2}q(h4]h5]h6]h7]h:]uh$hh>]qhGXbuildbot.test.regrssionsq؅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.8/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]Ufile_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.PKJtD+bb;buildbot-v0.8.8/.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.8/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.8/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.PKJtD L0buildbot-v0.8.8/.doctrees/relnotes/index.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.8/master/docs/relnotes/index.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/indexquh0Kh2]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::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%(hX\For a more detailed description of the changes made in this version, see the git log itself:hjubaubcdocutils.nodes literal_block r&)r'}r((hXgit log v0.8.7..v0.8.8hjhh"h$U literal_blockr)h&}r*(hDhEh+]h*]h(]h)]h.]uh0Kh1hh2]r+h;Xgit log v0.8.7..v0.8.8r,r-}r.(hUhj'ubaubeubh)r/}r0(hUhhhh"h$h%h&}r1(h(]h)]h*]h+]r2Uolder-versionsr3ah.]r4h auh0Kh1hh2]r5(h4)r6}r7(hXOlder Versionsr8hj/hh"h$h8h&}r9(h(]h)]h*]h+]h.]uh0Kh1hh2]r:h;XOlder Versionsr;r<}r=(hj8hj6ubaubhJ)r>}r?(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:hj/hh"h$hNh&}r@(h(]h)]h*]h+]h.]uh0Kh1hh2]rA(h;XBRelease notes for older versions of Buildbot are available in the rBrC}rD(hXBRelease notes for older versions of Buildbot are available in the hj>ubh)rE}rF(hUh&}rG(hXmaster/docs/relnotes/rHhXFhttps://github.com/buildbot/buildbot/blob/master/master/docs/relnotes/h+]h*]h(]h)]h.]uhj>h2]rIh)rJ}rK(hjHh&}rL(h(]h)]h*]h+]h.]uhjEh2]rMh;Xmaster/docs/relnotes/rNrO}rP(hUhjJubah$hubah$hubh;XF directory of the source tree. Newer versions are also available here:rQrR}rS(hXF directory of the source tree. Newer versions are also available here:hj>ubeubcdocutils.nodes compound rT)rU}rV(hUhj/hh"h$UcompoundrWh&}rX(h(]h)]rYUtoctree-wrapperrZah*]h+]h.]uh0Nh1hh2]r[csphinx.addnodes toctree r\)r]}r^(hUhjUhh"h$Utoctreer_h&}r`(UnumberedraKU includehiddenrbhhU titlesonlyrcUglobrdh+]h*]h(]h)]h.]Uentriesre]rf(NXrelnotes/0.8.7rgrhNXrelnotes/0.8.6rirjeUhiddenrkU includefilesrl]rm(jgjieUmaxdepthrnKuh0Kh2]ubaubeubeubhh"h$h%h&}ro(h(]h)]h*]h+]rpUslaverqah.]rrhauh0Kh1hh2]rs(h4)rt}ru(hXSlavervhhhh"h$h8h&}rw(h(]h)]h*]h+]h.]uh0Kh1hh2]rxh;XSlaveryrz}r{(hjvhjtubaubhh)r|}r}(hUhKhhhh"h$h%h&}r~(h(]rjOah)]h*]h+]rUid2rah.]uh0Kh1hh2]rh4)r}r(hX2Deprecations, Removals, and Non-Compatible Changesrhj|hh"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(hUhj|hh"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(hjqhNhNh h-h jh j3h 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]rUsettingsr(cdocutils.frontend Values ror }r (Ufootnote_backlinksr KUrecord_dependenciesr NU rfc_base_urlr Uhttp://tools.ietf.org/html/rU tracebackrUpep_referencesrNUstrip_commentsrNU toc_backlinksrUentryrU language_coderUenrU datestamprNU report_levelrKU _destinationrNU halt_levelrKU strip_classesrNh8NUerror_encoding_error_handlerrUbackslashreplacerUdebugrNUembed_stylesheetrUoutput_encoding_error_handlerrUstrictr 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_linkr0NUrfc_referencesr1NUoutput_encodingr2Uutf-8r3U source_urlr4NUinput_encodingr5U utf-8-sigr6U_disable_configr7NU id_prefixr8UU tab_widthr9KUerror_encodingr:UUTF-8r;U_sourcer<UO/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/relnotes/index.rstr=Ugettext_compactr>U generatorr?NUdump_internalsr@NU smart_quotesrAU pep_base_urlrBUhttp://www.python.org/dev/peps/rCUsyntax_highlightrDUlongrEUinput_encoding_error_handlerrFj Uauto_id_prefixrGUidrHUdoctitle_xformrIUstrip_elements_with_classesrJNU _config_filesrK]Ufile_insertion_enabledrLU raw_enabledrMKU dump_settingsrNNubUsymbol_footnote_startrOKUidsrP}rQ(jqhhihch-hjj|jQjKjhjjhXhTjjj3j/uUsubstitution_namesrR}rSh$h1h&}rT(h(]h+]h*]Usourceh"h)]h.]uU footnotesrU]rVUrefidsrW}rXub.PKJtD*Б0buildbot-v0.8.8/.doctrees/relnotes/0.8.6.doctreecdocutils.nodes document q)q}q(U nametypesq}q(X#release notes for buildbot v0.8.6p1qNXslaveqNXfeaturesqNX2deprecations, removals, and non-compatible changesq NXchanges for developersq NXolder versionsq NXmasterq NXdetailsq NX0.8.6p1qNuUsubstitution_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.8/master/docs/relnotes/0.8.6.rstq"q#}q$bUtagnameq%Usectionq&U attributesq'}q((Udupnamesq)]Uclassesq*]Ubackrefsq+]Uidsq,]q-U#release-notes-for-buildbot-v0-8-6p1q.aUnamesq/]q0hauUlineq1KUdocumentq2hUchildrenq3]q4(cdocutils.nodes title q5)q6}q7(hX#Release Notes for Buildbot v0.8.6p1q8hhh h#h%Utitleq9h'}q:(h)]h*]h+]h,]h/]uh1Kh2hh3]q;cdocutils.nodes Text q}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`. hj8h h#h%hvh'}r`(h)]h*]h+]h,]h/]uh1Nh2hh3]rahK)rb}rc(hX6The 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 :ref:`the Buildbot manual `.hj^h h#h%hOh'}rd(h)]h*]h+]h,]h/]uh1K_h3]re(h`rhjbh h#h%jKh'}r(UreftypeXrefjMjNXmercurial-hookU refdomainXstdrh,]h+]U refexplicith)]h*]h/]jPjQuh1K_h3]rjr)r}r(hjh'}r(h)]h*]r(jXjXstd-refreh+]h,]h/]uhjh3]rh(h)]h*]h+]h,]h/]uhjh3]r?heh+]h,]h/]uhj4h3]r?h}r?(hUhj9ubaubeubhs)r@}rA(hX`Buildbot has a new web hook to handle push notifications from Google Code - see :bb:pull:`278`. hjh h#h%hvh'}rB(h)]h*]h+]h,]h/]uh1Nh2hh3]rChK)rD}rE(hX_Buildbot has a new web hook to handle push notifications from Google Code - see :bb:pull:`278`.hj@h h#h%hOh'}rF(h)]h*]h+]h,]h/]uh1Kh3]rG(h}r?(hX]For a more detailed description of the changes made in this version, see the Git log itself::hj/h h#h%hOh'}r@(h)]h*]h+]h,]h/]uh1Kh2hh3]rAhubaubjb)rE}rF(hX&git log buildbot-0.8.5..buildbot-0.8.6hj/h h#h%jeh'}rG(hEhFh,]h+]h)]h*]h/]uh1Kh2hh3]rHh}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(h}q?hh&sh/Usectionq@h1}qA(h5]h6]h4]h3]qB(hh"eh7]qC(h heuh9Kh:hUexpect_referenced_by_idqD}qEh"h&sh#]qF(cdocutils.nodes title qG)qH}qI(h(X First RunqJh)h(h(Uh)j5ubaubj)r?}r@(h(X~The requirement to install SQLAlchemy-0.7.10 is due to a conflict between newer versions of SQLAlchemy and SQLAlchemy-Migrate.rAh)hh*h-h/j!h1}rB(h5]h6]h4]h3]h7]uh9Nh:hh#]rCh`)rD}rE(h(jAh)j?h*h-h/hdh1}rF(h5]h6]h4]h3]h7]uh9KAh#]rGhNX~The requirement to install SQLAlchemy-0.7.10 is due to a conflict between newer versions of SQLAlchemy and SQLAlchemy-Migrate.rHrI}rJ(h(jAh)jDubaubaubeubh;)rK}rL(h(Uh)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 1a4af6ec1dbb724b884ea14f439b272f30439e4dh)jKh*h-h/j7h1}r(j9j:h3]h4]h5]h6]h7]uh9KSh:hh#]rhNX2011-12-04 10:04:40-0600 [-] Starting factory 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)j~ubaubeubh;)r}r(h(Uh)h`_ and you get this:h)jh*h-h/hdh1}r>(h5]h6]h4]h3]h7]uh9Kh:hh#]r?(hNX Click on the r@rA}rB(h(X Click on the h)j<ubh)rC}rD(h(X;`Waterfall Display link `_h1}rE(UnameXWaterfall Display linkhXhttp://localhost:8010/waterfallrFh3]h4]h5]h6]h7]uh)j<h#]rGhNXWaterfall Display linkrHrI}rJ(h(Uh)jCubah/hubh%)rK}rL(h(X" jKh)j<h/h0h1}rM(UrefurijFh3]rNh ah4]h5]h6]h7]rOh auh#]ubhNX and you get this:rPrQ}rR(h(X and you get this:h)j<ubeubj1)rS}rT(h(XA.. image:: _images/waterfall-empty.png :alt: empty waterfall. h)jh*h-h/j4h1}rU(UuriX$tutorial/_images/waterfall-empty.pngrVh3]h4]h5]h6]j7}rWU*jVsh7]Ualth+Xempty waterfall.rXrY}rZbuh9Nh:hh#]ubh`)r[}r\(h(XThat'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.r]h)jh*h-h/hdh1}r^(h5]h6]h4]h3]h7]uh9Kh:hh#]r_hNXThat'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.r`ra}rb(h(j]h)j[ubaubh`)rc}rd(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)jh*h-h/hdh1}re(h5]h6]h4]h3]h7]uh9Kh:hh#]rf(hNXYou'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 rgrh}ri(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)jcubcsphinx.addnodes pending_xref rj)rk}rl(h(X:ref:`quick-tour-label`rmh)jch*h-h/U pending_xrefrnh1}ro(UreftypeXrefUrefwarnrpU reftargetrqXquick-tour-labelU refdomainXstdrrh3]h4]U refexplicith5]h6]h7]UrefdocrsXtutorial/firstrunrtuh9Kh#]ruh)rv}rw(h(jmh1}rx(h5]h6]ry(UxrefrzjrXstd-refr{eh4]h3]h7]uh)jkh#]r|hNXquick-tour-labelr}r~}r(h(Uh)jvubah/hubaubeubeubeubeh(UU transformerrNU footnote_refsr}rUrefnamesr}r(Xpython]rhah]rhaXgit]rhauUsymbol_footnotesr]rUautofootnote_refsr]rUsymbol_footnote_refsr]rU citationsr]rh:hU current_linerNUtransform_messagesr]rcdocutils.nodes system_message r)r}r(h(Uh1}r(h5]UlevelKh3]h4]Usourceh-h6]h7]UlineKUtypeUINFOruh#]rh`)r}r(h(Uh1}r(h5]h6]h4]h3]h7]uh)jh#]rhNX5Hyperlink target "first-run-label" is not referenced.rr}r(h(Uh)jubah/hdubah/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_classesrNhKNUerror_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.8/master/docs/tutorial/firstrun.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(hjhjhj hhRhhhh}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)hHXOpen 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*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):hj%ubaubcdocutils.nodes literal_block r-)r.}r/(hXHcd cd tmp/buildbot source sandbox/bin/activate $EDITOR master/master.cfghhh!h$h+U literal_blockr0h-}r1(U xml:spacer2Upreserver3h/]h0]h1]h2]h3]uh6K"h7hh8]r4hHXHcd cd tmp/buildbot source sandbox/bin/activate $EDITOR master/master.cfgr5r6}r7(hUhj.ubaubh[)r8}r9(hXANow, look for the section marked *PROJECT IDENTITY* which reads::r:hhh!h$h+h^h-}r;(h1]h2]h0]h/]h3]uh6K'h7hh8]r<(hHX!Now, look for the section marked r=r>}r?(hX!Now, look for the section marked hj8ubhp)r@}rA(hX*PROJECT IDENTITY*h-}rB(h1]h2]h0]h/]h3]uhj8h8]rChHXPROJECT IDENTITYrDrE}rF(hUhj@ubah+h{ubhHX which reads:rGrH}rI(hX which reads:hj8ubeubj-)rJ}rK(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+j0h-}rL(j2j3h/]h0]h1]h2]h3]uh6K)h7hh8]rMhHX,####### 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"rNrO}rP(hUhjJubaubh[)rQ}rR(hXpIf you want, you can change either of these links to anything you want to see what happens when you change them.rShhh!h$h+h^h-}rT(h1]h2]h0]h/]h3]uh6K2h7hh8]rUhHXpIf you want, you can change either of these links to anything you want to see what happens when you change them.rVrW}rX(hjShjQubaubh[)rY}rZ(hX5After making a change go into the terminal and type::r[hhh!h$h+h^h-}r\(h1]h2]h0]h/]h3]uh6K4h7hh8]r]hHX4After making a change go into the terminal and type:r^r_}r`(hX4After making a change go into the terminal and type:hjYubaubj-)ra}rb(hXbuildbot reconfig masterhhh!h$h+j0h-}rc(j2j3h/]h0]h1]h2]h3]uh6K6h7hh8]rdhHXbuildbot reconfig masterrerf}rg(hUhjaubaubh[)rh}ri(hXOYou will see a handful of lines of output from the master log, much like this::rjhhh!h$h+h^h-}rk(h1]h2]h0]h/]h3]uh6K8h7hh8]rlhHXNYou will see a handful of lines of output from the master log, much like this:rmrn}ro(hXNYou will see a handful of lines of output from the master log, much like this:hjhubaubj-)rp}rq(hXQ2011-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.hhh!h$h+j0h-}rr(j2j3h/]h0]h1]h2]h3]uh6K:h7hh8]rshHXQ2011-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.rtru}rv(hUhjpubaubh[)rw}rx(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.ryhhh!h$h+h^h-}rz(h1]h2]h0]h/]h3]uh6KMh7hh8]r{hHXThe 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.r|r}}r~(hjyhjwubaubh[)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]uh6KQh7hh8]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 auh6KWh7hh8]r(hA)r}r(hXConfiguration Errorsrhjh!h$h+hEh-}r(h1]h2]h0]h/]h3]uh6KWh7hh8]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]uh6KYh7hh8]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]uh6K]h7hh8]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:hjubaubj-)r}r(hXSc[title'] = "Pyflakes" c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"hjh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6K`h7hh8]rhHXSc[title'] = "Pyflakes" c['titleURL'] = "http://divmod.org/trac/wiki/DivmodPyflakes"rr}r(hUhjubaubh[)r}r(hXOThis creates a Python SyntaxError. Now go ahead and reconfig the buildmaster::rhjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kch7hh8]rhHXNThis creates a Python SyntaxError. Now go ahead and reconfig the buildmaster:rr}r(hXNThis creates a Python SyntaxError. Now go ahead and reconfig the buildmaster:hjubaubj-)r}r(hXbuildbot reconfig masterhjh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Keh7hh8]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]uh6Kgh7hh8]rhHX!This time, the output looks like:rr}r(hX!This time, the output looks like:hjubaubj-)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+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Kih7hh8]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 ?"rhjh!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(hjhjubaubh[)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 r r }r (hXOn the hjubj)r }r (hX.`waterfall `_h-}r(UnamehjXhttp://localhost:8010/waterfallrh/]h0]h1]h2]h3]uhjh8]rhHX waterfallrr}r(hUhj ubah+jubh()r}r(hX" jKhjh+h,h-}r(Urefurijh/]rU waterfallrah0]h1]h2]h3]rhauh8]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:rr}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.pngr"h/]h0]h1]h2]U candidatesr#}r$U*j"sh3]Ualth"Xforce a build.r%r&}r'buh6Nh7hh8]ubh[)r(}r)(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-}r*(h1]h2]h0]h/]h3]uh6Kh7hh8]r+(hHXClick r,r-}r.(hXClick hj(ubhp)r/}r0(hX *Force Build*h-}r1(h1]h2]h0]h/]h3]uhj(h8]r2hHX Force Buildr3r4}r5(hUhj/ubah+h{ubhHXN - there's no need to fill in any of the fields in this case. Next, click on r6r7}r8(hXN - there's no need to fill in any of the fields in this case. Next, click on hj(ubj)r9}r:(hXD`view in waterfall `_h-}r;(UnameXview in waterfalljX-http://localhost:8010/waterfall?show=runtestsr<h/]h0]h1]h2]h3]uhj(h8]r=hHXview in waterfallr>r?}r@(hUhj9ubah+jubh()rA}rB(hX0 jKhj(h+h,h-}rC(Urefurij<h/]rDUview-in-waterfallrEah0]h1]h2]h3]rFhauh8]ubhHX.rG}rH(hX.hj(ubeubh[)rI}rJ(hXYou will now see:rKhjh!h$h+h^h-}rL(h1]h2]h0]h/]h3]uh6Kh7hh8]rMhHXYou will now see:rNrO}rP(hjKhjIubaubj)rQ}rR(hXR.. image:: _images/runtests-success.png :alt: an successful test run happened. hjh!h$h+j h-}rS(UuriX%tutorial/_images/runtests-success.pngrTh/]h0]h1]h2]j#}rUU*jTsh3]Ualth"X an successful test run happened.rVrW}rXbuh6Nh7hh8]ubeubh)rY}rZ(hUhhh!h$h+h9h-}r[(h1]h2]h0]h/]r\Uenabling-the-irc-botr]ah3]r^hauh6Kh7hh8]r_(hA)r`}ra(hXEnabling the IRC BotrbhjYh!h$h+hEh-}rc(h1]h2]h0]h/]h3]uh6Kh7hh8]rdhHXEnabling the IRC Botrerf}rg(hjbhj`ubaubh[)rh}ri(hXqBuildbot includes an IRC bot that you can tell to join a channel and control to report on the status of buildbot.rjhjYh!h$h+h^h-}rk(h1]h2]h0]h/]h3]uh6Kh7hh8]rlhHXqBuildbot includes an IRC bot that you can tell to join a channel and control to report on the status of buildbot.rmrn}ro(hjjhjhubaubh[)rp}rq(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!*)hjYh!h$h+h^h-}rr(h1]h2]h0]h/]h3]uh6Kh7hh8]rs(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. (rtru}rv(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. (hjpubhp)rw}rx(hX5*Note: please do not join the main buildbot channel!*h-}ry(h1]h2]h0]h/]h3]uhjph8]rzhHX3Note: please do not join the main buildbot channel!r{r|}r}(hUhjwubah+h{ubhHX)r~}r(hX)hjpubeubh[)r}r(hXvEdit the config and look for the *STATUS TARGETS* section. Enter these lines below the WebStatus line in master.cfg::hjYh!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:hjubeubj-)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"]))hjYh!h$h+j0h-}r(j2j3h/]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::rhjYh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX%Reconfigure the build master then do:rr}r(hX%Reconfigure the build master then do:hjubaubj-)r}r(hX cat master/twistd.log | grep IRChjYh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rhHX cat master/twistd.log | grep IRCrr}r(hUhjubaubh[)r}r(hX0The log output should contain a line like this::rhjYh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX/The log output should contain a line like this:rr}r(hX/The log output should contain a line like this:hjubaubj-)r}r(hXe2009-08-01 15:35:20+0200 [-] adding IStatusReceiver hjYh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rhHXe2009-08-01 15:35:20+0200 [-] adding IStatusReceiver rr}r(hUhjubaubh[)r}r(hXRYou should see the bot now joining in your IRC client. In your IRC channel, type::hjYh!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(hXQYou should see the bot now joining in your IRC client. In your IRC channel, type:hjubaubj-)r}r(hXbbtest: commandshjYh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rhHXbbtest: commandsrr}r(hUhjubaubh[)r}r(hX/to get a list of the commands the bot supports.rhjYh!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(hXULet's tell the bot to notify certain events, to learn which EVENTS we can notify on::rhjYh!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(hXTLet's tell the bot to notify certain events, to learn which EVENTS we can notify on:hjubaubj-)r}r(hXbbtest: help notifyhjYh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rhHXbbtest: help notifyrr}r(hUhjubaubh[)r}r(hX(Now let's set some event notifications::rhjYh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX'Now let's set some event notifications:rr}r(hX'Now let's set some event notifications:hjubaubj-)r}r(hXNbbtest: notify on started bbtest: notify on finished bbtest: notify on failurehjYh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rhHXNbbtest: notify on started bbtest: notify on finished bbtest: notify on failurerr}r(hUhjubaubh[)r}r(hX7The bot should have responded to each of the commands::rhjYh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX6The bot should have responded to each of the commands:rr}r(hX6The bot should have responded to each of the commands:hjubaubj-)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']hjYh!h$h+j0h-}r(j2j3h/]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.rhjYh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX:Now, go back to the web interface and force another build.rr}r(hjhjubaubh[)r}r(hXGNotice how the bot tells you about the start and finish of this build::rhjYh!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(hXFNotice how the bot tells you about the start and finish of this build:hjubaubj-)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/1hjYh!h$h+j0h-}r (j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]r hHX< 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/1r r}r(hUhj ubaubh[)r}r(hX+You can also use the bot to force a build::rhjYh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Kh7hh8]rhHX*You can also use the bot to force a build:rr}r(hX*You can also use the bot to force a build:hjubaubj-)r}r(hX'bbtest: force build runtests test buildhjYh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rhHX'bbtest: force build runtests test buildrr}r(hUhjubaubh[)r}r (hXPBut to allow this, you'll need to have ``allowForce`` in the IRC configuration::hjYh!h$h+h^h-}r!(h1]h2]h0]h/]h3]uh6Kh7hh8]r"(hHX'But to allow this, you'll need to have r#r$}r%(hX'But to allow this, you'll need to have hjubcdocutils.nodes literal r&)r'}r((hX``allowForce``h-}r)(h1]h2]h0]h/]h3]uhjh8]r*hHX allowForcer+r,}r-(hUhj'ubah+Uliteralr.ubhHX in the IRC configuration:r/r0}r1(hX in the IRC configuration:hjubeubj-)r2}r3(hXc['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest", allowForce=True, channels=["#buildbot-test"]))hjYh!h$h+j0h-}r4(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]r5hHXc['status'].append(words.IRC(host="irc.freenode.org", nick="bbtest", allowForce=True, channels=["#buildbot-test"]))r6r7}r8(hUhj2ubaubh[)r9}r:(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::hjYh!h$h+h^h-}r;(h1]h2]h0]h/]h3]uh6Kh7hh8]r<hHXThis 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:r=r>}r?(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:hj9ubaubj-)r@}rA(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/2hjYh!h$h+j0h-}rB(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rChHXP<@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/2rDrE}rF(hUhj@ubaubh[)rG}rH(hX5You can also see the new builds in the web interface.rIhjYh!h$h+h^h-}rJ(h1]h2]h0]h/]h3]uh6Kh7hh8]rKhHX5You can also see the new builds in the web interface.rLrM}rN(hjIhjGubaubj)rO}rP(hXU.. image:: _images/irc-testrun.png :alt: a successful test run from IRC happened. hjYh!h$h+j h-}rQ(UuriX tutorial/_images/irc-testrun.pngrRh/]h0]h1]h2]j#}rSU*jRsh3]Ualth"X(a successful test run from IRC happened.rTrU}rVbuh6Nh7hh8]ubeubh)rW}rX(hUhhh!h$h+h9h-}rY(h1]h2]h0]h/]rZUsetting-authorized-web-usersr[ah3]r\h auh6Kh7hh8]r](hA)r^}r_(hXSetting Authorized Web Usersr`hjWh!h$h+hEh-}ra(h1]h2]h0]h/]h3]uh6Kh7hh8]rbhHXSetting Authorized Web Usersrcrd}re(hj`hj^ubaubh[)rf}rg(hX4Further down, look for the WebStatus configuration::rhhjWh!h$h+h^h-}ri(h1]h2]h0]h/]h3]uh6Kh7hh8]rjhHX3Further down, look for the WebStatus configuration:rkrl}rm(hX3Further down, look for the WebStatus configuration:hjfubaubj-)rn}ro(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))hjWh!h$h+j0h-}rp(j2j3h/]h0]h1]h2]h3]uh6Kh7hh8]rqhHX1c['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))rrrs}rt(hUhjnubaubh[)ru}rv(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.hjWh!h$h+h^h-}rw(h1]h2]h0]h/]h3]uh6M h7hh8]rx(hHXThe ryrz}r{(hXThe hjuubj&)r|}r}(hX``auth.BasicAuth()``h-}r~(h1]h2]h0]h/]h3]uhjuh8]rhHXauth.BasicAuth()rr}r(hUhj|ubah+j.ubhHXZ 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 hjuubhd)r}r(hX:bb:status:`WebStatus`rhjuh!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+j.ubaubhHX, for more about the WebStatus configuration.rr}r(hX, for more about the WebStatus configuration.hjuubeubeubh)r}r(hUhhh!h$h+h9h-}r(h1]h2]h0]h/]rUdebugging-with-manholerah3]rhauh6Mh7hh8]r(hA)r}r(hXDebugging with Manholerhjh!h$h+hEh-}r(h1]h2]h0]h/]h3]uh6Mh7hh8]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]uh6Mh7hh8]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(hXVTo 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]uh6Mh7hh8]rhHXUTo use this you will need to install an additional package or two to your virtualenv:rr}r(hXUTo use this you will need to install an additional package or two to your virtualenv:hjubaubj-)r}r(hXXcd cd tmp/buildbot source sandbox/bin/activate easy_install pycrypto easy_install pyasn1hjh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6Mh7hh8]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:hjubaubj-)r}r(hXc = BuildmasterConfig = {}hjh!h$h+j0h-}r(j2j3h/]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]uh6M$h7hh8]rhHX;Insert the following to enable debugging mode with manhole:rr}r(hX;Insert the following to enable debugging mode with manhole:hjubaubj-)r}r(hX####### DEBUGGING from buildbot import manhole c['manhole'] = manhole.PasswordManhole("tcp:1234:interface=127.0.0.1","admin","passwd")hjh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6M&h7hh8]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]uh6M*h7hh8]rhHX]After restarting the master, you can ssh into the master and get an interactive Python shell:rr}r(hX]After restarting the master, you can ssh into the master and get an interactive Python shell:hjubaubj-)r}r(hX3ssh -p1234 admin@127.0.0.1 # enter passwd at prompthjh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6M,h7hh8]rhHX3ssh -p1234 admin@127.0.0.1 # enter passwd at promptrr}r(hUhjubaubcdocutils.nodes note r)r}r(hXThe 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.13bhjh!h$h+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::hjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6M0h8]rhHX\The pyasn1-0.1.1 release has a bug which results in an exception similar to this on startup:rr}r(hX\The pyasn1-0.1.1 release has a bug which results in an exception similar to this on startup:hjubaubj-)r}r(hX6exceptions.TypeError: argument 2 must be long, not inthjh+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6M3h8]rhHX6exceptions.TypeError: argument 2 must be long, not intrr}r(hUhjubaubh[)r}r(hXVIf you see this, the temporary solution is to install the previous version of pyasn1::hjh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6M5h8]rhHXUIf you see this, the temporary solution is to install the previous version of pyasn1:rr}r(hXUIf you see this, the temporary solution is to install the previous version of pyasn1:hjubaubj-)r}r(hXpip install pyasn1-0.0.13bhjh+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6M8h8]r hHXpip install pyasn1-0.0.13br r }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]rhHXnIf you wanted to check which slaves are connected and what builders those slaves are assigned to you could do:rr}r(hXnIf you wanted to check which slaves are connected and what builders those slaves are assigned to you could do:hj ubaubj-)r}r(hXg>>> master.botmaster.slaves {'example-slave': }hjh!h$h+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6M<h7hh8]rhHXg>>> master.botmaster.slaves {'example-slave': }rr}r(hUhjubaubh[)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]uh6M?h7hh8]r(hHX,Objects can be explored in more depth using r r!}r"(hX,Objects can be explored in more depth using hjubcdocutils.nodes title_reference r#)r$}r%(hX`dir(x)`h-}r&(h1]h2]h0]h/]h3]uhjh8]r'hHXdir(x)r(r)}r*(hUhj$ubah+Utitle_referencer+ubhHX or the helper function r,r-}r.(hX or the helper function hjubj#)r/}r0(hX `show(x)`h-}r1(h1]h2]h0]h/]h3]uhjh8]r2hHXshow(x)r3r4}r5(hUhj/ubah+j+ubhHX.r6}r7(hX.hjubeubeubheubh!h$h+h9h-}r8(h1]h2]h0]h/]r9Uadding-a-try-schedulerr:ah3]r;hauh6MCh7hh8]r<(hA)r=}r>(hXAdding a 'try' schedulerr?hhh!h$h+hEh-}r@(h1]h2]h0]h/]h3]uh6MCh7hh8]rAhHXAdding a 'try' schedulerrBrC}rD(hj?hj=ubaubh[)rE}rF(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.)rGhhh!h$h+h^h-}rH(h1]h2]h0]h/]h3]uh6MEh7hh8]rIhHXBuildbot 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.)rJrK}rL(hjGhjEubaubh[)rM}rN(hX7To set this up, add the following lines to master.cfg::rOhhh!h$h+h^h-}rP(h1]h2]h0]h/]h3]uh6MIh7hh8]rQhHX6To set this up, add the following lines to master.cfg:rRrS}rT(hX6To set this up, add the following lines to master.cfg:hjMubaubj-)rU}rV(hX;from buildbot.scheduler import Try_Userpass c['schedulers'].append(Try_Userpass( name='try', builderNames=['runtests'], port=5555, userpass=[('sampleuser','samplepass')]))hhh!h$h+j0h-}rW(j2j3h/]h0]h1]h2]h3]uh6MKh7hh8]rXhHX;from buildbot.scheduler import Try_Userpass c['schedulers'].append(Try_Userpass( name='try', builderNames=['runtests'], port=5555, userpass=[('sampleuser','samplepass')]))rYrZ}r[(hUhjUubaubh[)r\}r](hX@Then you can submit changes using the :bb:cmdline:`try` command.r^hhh!h$h+h^h-}r_(h1]h2]h0]h/]h3]uh6MRh7hh8]r`(hHX&Then you can submit changes using the rarb}rc(hX&Then you can submit changes using the hj\ubhd)rd}re(hX:bb:cmdline:`try`rfhj\h!h$h+hhh-}rg(UreftypeXcmdlinehjhkXtryU refdomainXbbrhh/]h0]U refexplicith1]h2]h3]hmhnuh6MRh8]rij&)rj}rk(hjfh-}rl(h1]h2]rm(hujhX bb-cmdlinerneh0]h/]h3]uhjdh8]rohHXtryrprq}rr(hUhjjubah+j.ubaubhHX command.rsrt}ru(hX command.hj\ubeubh[)rv}rw(hXgLet's try this out by making a one-line change to pyflakes, say, to make it trace the tree by default::hhh!h$h+h^h-}rx(h1]h2]h0]h/]h3]uh6MTh7hh8]ryhHXfLet's try this out by making a one-line change to pyflakes, say, to make it trace the tree by default:rzr{}r|(hXfLet's try this out by making a one-line change to pyflakes, say, to make it trace the tree by default:hjvubaubj-)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+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6MWh7hh8]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(hUhj}ubaubh[)r}r(hX,Then run buildbot's try command as follows::rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6M\h7hh8]rhHX+Then run buildbot's try command as follows:rr}r(hX+Then run buildbot's try command as follows:hjubaubj-)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+j0h-}r(j2j3h/]h0]h1]h2]h3]uh6M^h7hh8]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.rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mah7hh8]rhHXThis will do "git diff" for you and send the resulting patch to the server for build and test against the latest sources from Git.rr}r(hjhjubaubh[)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]uh6Mdh7hh8]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.rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mjh7hh8]rhHXTo make yourself show up as the author of the change, use the --who=emailaddr option on 'buildbot try' to pass your email address.rr}r(hjhjubaubh[)r}r(hXwTo make a description of the change show up, use the --properties=comment="this is a comment" option on 'buildbot try'.rhhh!h$h+h^h-}r(h1]h2]h0]h/]h3]uh6Mmh7hh8]rhHXwTo make a description of the change show up, use the --properties=comment="this is a comment" option on 'buildbot try'.rr}r(hjhjubaubh[)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]uh6Mph7hh8]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 hjubhd)r}r(hX:bb:sched:`Try_Jobdir`rhjh!h$h+hhh-}r(UreftypeXschedhjhkX Try_JobdirU refdomainXbbrh/]h0]U refexplicith1]h2]h3]hmhnuh6Mph8]rj&)r}r(hjh-}r(h1]h2]r(hujXbb-schedreh0]h/]h3]uhjh8]rhHX Try_Jobdirrr}r(hUhjubah+j.ubaubhHX.r}r(hX.hjubeubeubh!h$h+Usystem_messagerh-}r(h1]UlevelKh/]h0]rjaUsourceh$h2]h3]UlineKUtypeUINFOruh6Mhh7hh8]rh[)r}r(hUh-}r(h1]h2]h0]h/]h3]uhhh8]rhHX,Duplicate explicit target name: "waterfall".rr}r(hUhjubah+h^ubaubaUcurrent_sourcerNU decorationrNUautofootnote_startrKUnameidsr}r(hj:hjEhh5h jh jh hh j[h jhjhjhj]hhNUinput_encodingr?U utf-8-sigr@U_disable_configrANU id_prefixrBUU tab_widthrCKUerror_encodingrDUUTF-8rEU_sourcerFUN/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/tutorial/tour.rstrGUgettext_compactrHU generatorrINUdump_internalsrJNU smart_quotesrKU pep_base_urlrLUhttp://www.python.org/dev/peps/rMUsyntax_highlightrNUlongrOUinput_encoding_error_handlerrPj*Uauto_id_prefixrQUidrRUdoctitle_xformrSUstrip_elements_with_classesrTNU _config_filesrU]Ufile_insertion_enabledrVU raw_enabledrWKU dump_settingsrXNubUsymbol_footnote_startrYKUidsrZ}r[(hhj:hh5hjjjjjjjjjjjEjAh}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.8/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.PKJtDԪ: : 0buildbot-v0.8.8/.doctrees/tutorial/index.doctreecdocutils.nodes document q)q}q(U nametypesq}qXbuildbot tutorialqNsUsubstitution_defsq}qUparse_messagesq ]q Ucurrent_sourceq NU decorationq NUautofootnote_startq KUnameidsq}qhUbuildbot-tutorialqsUchildrenq]qcdocutils.nodes section q)q}q(U rawsourceqUUparentqhUsourceqcdocutils.nodes reprunicode qXO/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/tutorial/index.rstqq}qbUtagnameqUsectionqU attributesq}q (Udupnamesq!]Uclassesq"]Ubackrefsq#]Uidsq$]q%haUnamesq&]q'hauUlineq(KUdocumentq)hh]q*(cdocutils.nodes title q+)q,}q-(hXBuildbot Tutorialq.hhhhhUtitleq/h}q0(h!]h"]h#]h$]h&]uh(Kh)hh]q1cdocutils.nodes Text q2XBuildbot Tutorialq3q4}q5(hh.hh,ubaubcdocutils.nodes paragraph q6)q7}q8(hX Contents:q9hhhhhU paragraphq:h}q;(h!]h"]h#]h$]h&]uh(Kh)hh]q}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/firstrunqTqUNX tutorial/tourqVqWNXtutorial/furtherqXqYeUhiddenqZU includefilesq[]q\(hThVhXeUmaxdepthq]Kuh(Kh]ubaubeubahUU transformerq^NU footnote_refsq_}q`Urefnamesqa}qbUsymbol_footnotesqc]qdUautofootnote_refsqe]qfUsymbol_footnote_refsqg]qhU citationsqi]qjh)hU current_lineqkNUtransform_messagesql]qmUreporterqnNUid_startqoKU autofootnotesqp]qqU citation_refsqr}qsUindirect_targetsqt]quUsettingsqv(cdocutils.frontend Values qwoqx}qy(Ufootnote_backlinksqzKUrecord_dependenciesq{NU rfc_base_urlq|Uhttp://tools.ietf.org/html/q}U tracebackq~Upep_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.8/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.PKJtD6buildbot-v0.8.8/.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.8/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(h$Xafrom 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 ]h%hh&h)h+hh-}r?(hhh/]h0]h1]h2]h3]uh5Kh6hh]r@hJXafrom 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 ]rArB}rC(h$Uh%j=ubaubhN)rD}rE(h$XZThe 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).rFh%hh&h)h+hRh-}rG(h1]h2]h0]h/]h3]uh5Mh6hh]rHhJXZThe 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).rIrJ}rK(h$jFh%jDubaubeubh7)rL}rM(h$Uh%h8h&h)h+hhJX Conclusionr?r@}rA(h$j<h%j:ubaubhN)rB}rC(h$XPlease note that this article has just scratched the surface; given the complexity of the task of build automation, the possiblities 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.rDh%j4h&h)h+hRh-}rE(h1]h2]h0]h/]h3]uh5Mh6hh]rFhJXPlease note that this article has just scratched the surface; given the complexity of the task of build automation, the possiblities 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.rGrH}rI(h$jDh%jBubaubhN)rJ}rK(h$X(Thanks to Davide Brini for permission to include this tutorial, derived from one he originally posted at http://backreference.org )h%j4h&h)h+hRh-}rL(h1]h2]h0]h/]h3]uh5Mh6hh]rM(hJXj(Thanks to Davide Brini for permission to include this tutorial, derived from one he originally posted at rNrO}rP(h$Xj(Thanks to Davide Brini for permission to include this tutorial, derived from one he originally posted at h%jJubcdocutils.nodes reference rQ)rR}rS(h$Xhttp://backreference.orgrTh-}rU(UrefurijTh/]h0]h1]h2]h3]uh%jJh]rVhJXhttp://backreference.orgrWrX}rY(h$Uh%jRubah+U referencerZubhJX )r[r\}r](h$X )h%jJubeubeubeubeh$UU transformerr^NU footnote_refsr_}r`Urefnamesra}rbUsymbol_footnotesrc]rdUautofootnote_refsre]rfUsymbol_footnote_refsrg]rhU citationsri]rjh6hU current_linerkNUtransform_messagesrl]rmcdocutils.nodes system_message rn)ro}rp(h$Uh-}rq(h1]UlevelKh/]h0]Usourceh)h2]h3]UlineKUtypeUINFOrruh]rshN)rt}ru(h$Uh-}rv(h1]h2]h0]h/]h3]uh%joh]rwhJX1Hyperlink target "fiveminutes" is not referenced.rxry}rz(h$Uh%jtubah+hRubah+Usystem_messager{ubaUreporterr|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_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_sourcerUU/var/build/user_builds/buildbot/checkouts/v0.8.8/master/docs/tutorial/fiveminutes.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(hh8hhhhhh8hjLhhhhjhj4uUsubstitution_namesr}rh+h6h-}r(h1]h/]h0]Usourceh)h2]h3]uU footnotesr]rUrefidsr}rh]rh"asub.PK"bWDa buildbot-v0.8.8/_static/plus.pngPNG  IHDR &q pHYs  tIME 1l9tEXtComment̖RIDATcz(BpipPc |IENDB`PKeJtDL{773buildbot-v0.8.8/_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`PKJtD=ww!buildbot-v0.8.8/_static/agogo.css/* * agogo.css_t * ~~~~~~~~~~~ * * Sphinx stylesheet -- agogo theme. * * :copyright: Copyright 2007-2013 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; }PKJtDkl\\$buildbot-v0.8.8/_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 */PK"bWDDUkkbuildbot-v0.8.8/_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`PK"bWDx!buildbot-v0.8.8/_static/bgtop.pngPNG  IHDRP2sRGBbKGDUWS!ÿ pHYs  tIME-tEXtCommentCreated with GIMPW IDAT8]ˎ@!C_d2mgAQy#|qI w X/`ᶮqdϏϪfH=C&H9M Cv"QV1T^ΜF#lvTت&j0PGyV!.6`HSsVfCxAƎ/]MyTږ9vne`cSLFUs%J'h v|m5ku|*l>*6D夻zdDX?IENDB`PK"bWD_Բ$buildbot-v0.8.8/_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`PKFEDVR>>buildbot-v0.8.8/_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; } } PK"bWD;l/l/%buildbot-v0.8.8/_static/underscore.js// Underscore.js 1.3.1 // (c) 2009-2012 Jeremy Ashkenas, DocumentCloud Inc. // Underscore is freely distributable under the MIT license. // Portions of Underscore are inspired or borrowed from Prototype, // Oliver Steele's Functional, and John Resig's Micro-Templating. // For all details and documentation: // http://documentcloud.github.com/underscore (function(){function q(a,c,d){if(a===c)return a!==0||1/a==1/c;if(a==null||c==null)return a===c;if(a._chain)a=a._wrapped;if(c._chain)c=c._wrapped;if(a.isEqual&&b.isFunction(a.isEqual))return a.isEqual(c);if(c.isEqual&&b.isFunction(c.isEqual))return c.isEqual(a);var e=l.call(a);if(e!=l.call(c))return false;switch(e){case "[object String]":return a==String(c);case "[object Number]":return a!=+a?c!=+c:a==0?1/a==1/c:a==+c;case "[object Date]":case "[object Boolean]":return+a==+c;case "[object RegExp]":return a.source== c.source&&a.global==c.global&&a.multiline==c.multiline&&a.ignoreCase==c.ignoreCase}if(typeof a!="object"||typeof c!="object")return false;for(var f=d.length;f--;)if(d[f]==a)return true;d.push(a);var f=0,g=true;if(e=="[object Array]"){if(f=a.length,g=f==c.length)for(;f--;)if(!(g=f in a==f in c&&q(a[f],c[f],d)))break}else{if("constructor"in a!="constructor"in c||a.constructor!=c.constructor)return false;for(var h in a)if(b.has(a,h)&&(f++,!(g=b.has(c,h)&&q(a[h],c[h],d))))break;if(g){for(h in c)if(b.has(c, h)&&!f--)break;g=!f}}d.pop();return g}var r=this,G=r._,n={},k=Array.prototype,o=Object.prototype,i=k.slice,H=k.unshift,l=o.toString,I=o.hasOwnProperty,w=k.forEach,x=k.map,y=k.reduce,z=k.reduceRight,A=k.filter,B=k.every,C=k.some,p=k.indexOf,D=k.lastIndexOf,o=Array.isArray,J=Object.keys,s=Function.prototype.bind,b=function(a){return new m(a)};if(typeof exports!=="undefined"){if(typeof module!=="undefined"&&module.exports)exports=module.exports=b;exports._=b}else r._=b;b.VERSION="1.3.1";var j=b.each= b.forEach=function(a,c,d){if(a!=null)if(w&&a.forEach===w)a.forEach(c,d);else if(a.length===+a.length)for(var e=0,f=a.length;e2;a== null&&(a=[]);if(y&&a.reduce===y)return e&&(c=b.bind(c,e)),f?a.reduce(c,d):a.reduce(c);j(a,function(a,b,i){f?d=c.call(e,d,a,b,i):(d=a,f=true)});if(!f)throw new TypeError("Reduce of empty array with no initial value");return d};b.reduceRight=b.foldr=function(a,c,d,e){var f=arguments.length>2;a==null&&(a=[]);if(z&&a.reduceRight===z)return e&&(c=b.bind(c,e)),f?a.reduceRight(c,d):a.reduceRight(c);var g=b.toArray(a).reverse();e&&!f&&(c=b.bind(c,e));return f?b.reduce(g,c,d,e):b.reduce(g,c)};b.find=b.detect= function(a,c,b){var e;E(a,function(a,g,h){if(c.call(b,a,g,h))return e=a,true});return e};b.filter=b.select=function(a,c,b){var e=[];if(a==null)return e;if(A&&a.filter===A)return a.filter(c,b);j(a,function(a,g,h){c.call(b,a,g,h)&&(e[e.length]=a)});return e};b.reject=function(a,c,b){var e=[];if(a==null)return e;j(a,function(a,g,h){c.call(b,a,g,h)||(e[e.length]=a)});return e};b.every=b.all=function(a,c,b){var e=true;if(a==null)return e;if(B&&a.every===B)return a.every(c,b);j(a,function(a,g,h){if(!(e= e&&c.call(b,a,g,h)))return n});return e};var E=b.some=b.any=function(a,c,d){c||(c=b.identity);var e=false;if(a==null)return e;if(C&&a.some===C)return a.some(c,d);j(a,function(a,b,h){if(e||(e=c.call(d,a,b,h)))return n});return!!e};b.include=b.contains=function(a,c){var b=false;if(a==null)return b;return p&&a.indexOf===p?a.indexOf(c)!=-1:b=E(a,function(a){return a===c})};b.invoke=function(a,c){var d=i.call(arguments,2);return b.map(a,function(a){return(b.isFunction(c)?c||a:a[c]).apply(a,d)})};b.pluck= function(a,c){return b.map(a,function(a){return a[c]})};b.max=function(a,c,d){if(!c&&b.isArray(a))return Math.max.apply(Math,a);if(!c&&b.isEmpty(a))return-Infinity;var e={computed:-Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;b>=e.computed&&(e={value:a,computed:b})});return e.value};b.min=function(a,c,d){if(!c&&b.isArray(a))return Math.min.apply(Math,a);if(!c&&b.isEmpty(a))return Infinity;var e={computed:Infinity};j(a,function(a,b,h){b=c?c.call(d,a,b,h):a;bd?1:0}),"value")};b.groupBy=function(a,c){var d={},e=b.isFunction(c)?c:function(a){return a[c]};j(a,function(a,b){var c=e(a,b);(d[c]||(d[c]=[])).push(a)});return d};b.sortedIndex=function(a, c,d){d||(d=b.identity);for(var e=0,f=a.length;e>1;d(a[g])=0})})};b.difference=function(a){var c=b.flatten(i.call(arguments,1));return b.filter(a,function(a){return!b.include(c,a)})};b.zip=function(){for(var a=i.call(arguments),c=b.max(b.pluck(a,"length")),d=Array(c),e=0;e=0;d--)b=[a[d].apply(this,b)];return b[0]}}; b.after=function(a,b){return a<=0?b():function(){if(--a<1)return b.apply(this,arguments)}};b.keys=J||function(a){if(a!==Object(a))throw new TypeError("Invalid object");var c=[],d;for(d in a)b.has(a,d)&&(c[c.length]=d);return c};b.values=function(a){return b.map(a,b.identity)};b.functions=b.methods=function(a){var c=[],d;for(d in a)b.isFunction(a[d])&&c.push(d);return c.sort()};b.extend=function(a){j(i.call(arguments,1),function(b){for(var d in b)a[d]=b[d]});return a};b.defaults=function(a){j(i.call(arguments, 1),function(b){for(var d in b)a[d]==null&&(a[d]=b[d])});return a};b.clone=function(a){return!b.isObject(a)?a:b.isArray(a)?a.slice():b.extend({},a)};b.tap=function(a,b){b(a);return a};b.isEqual=function(a,b){return q(a,b,[])};b.isEmpty=function(a){if(b.isArray(a)||b.isString(a))return a.length===0;for(var c in a)if(b.has(a,c))return false;return true};b.isElement=function(a){return!!(a&&a.nodeType==1)};b.isArray=o||function(a){return l.call(a)=="[object Array]"};b.isObject=function(a){return a===Object(a)}; b.isArguments=function(a){return l.call(a)=="[object Arguments]"};if(!b.isArguments(arguments))b.isArguments=function(a){return!(!a||!b.has(a,"callee"))};b.isFunction=function(a){return l.call(a)=="[object Function]"};b.isString=function(a){return l.call(a)=="[object String]"};b.isNumber=function(a){return l.call(a)=="[object Number]"};b.isNaN=function(a){return a!==a};b.isBoolean=function(a){return a===true||a===false||l.call(a)=="[object Boolean]"};b.isDate=function(a){return l.call(a)=="[object Date]"}; b.isRegExp=function(a){return l.call(a)=="[object RegExp]"};b.isNull=function(a){return a===null};b.isUndefined=function(a){return a===void 0};b.has=function(a,b){return I.call(a,b)};b.noConflict=function(){r._=G;return this};b.identity=function(a){return a};b.times=function(a,b,d){for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\//g,"/")};b.mixin=function(a){j(b.functions(a), function(c){K(c,b[c]=a[c])})};var L=0;b.uniqueId=function(a){var b=L++;return a?a+b:b};b.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var t=/.^/,u=function(a){return a.replace(/\\\\/g,"\\").replace(/\\'/g,"'")};b.template=function(a,c){var d=b.templateSettings,d="var __p=[],print=function(){__p.push.apply(__p,arguments);};with(obj||{}){__p.push('"+a.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(d.escape||t,function(a,b){return"',_.escape("+ u(b)+"),'"}).replace(d.interpolate||t,function(a,b){return"',"+u(b)+",'"}).replace(d.evaluate||t,function(a,b){return"');"+u(b).replace(/[\r\n\t]/g," ")+";__p.push('"}).replace(/\r/g,"\\r").replace(/\n/g,"\\n").replace(/\t/g,"\\t")+"');}return __p.join('');",e=new Function("obj","_",d);return c?e(c,b):function(a){return e.call(this,a,b)}};b.chain=function(a){return b(a).chain()};var m=function(a){this._wrapped=a};b.prototype=m.prototype;var v=function(a,c){return c?b(a).chain():a},K=function(a,c){m.prototype[a]= function(){var a=i.call(arguments);H.call(a,this._wrapped);return v(c.apply(b,a),this._chain)}};b.mixin(b);j("pop,push,reverse,shift,sort,splice,unshift".split(","),function(a){var b=k[a];m.prototype[a]=function(){var d=this._wrapped;b.apply(d,arguments);var e=d.length;(a=="shift"||a=="splice")&&e===0&&delete d[0];return v(d,this._chain)}});j(["concat","join","slice"],function(a){var b=k[a];m.prototype[a]=function(){return v(b.apply(this._wrapped,arguments),this._chain)}});m.prototype.chain=function(){this._chain= true;return this};m.prototype.value=function(){return this._wrapped}}).call(this); PK"bWD<>'buildbot-v0.8.8/_static/ajax-loader.gifGIF89aU|NU|l!Created with ajaxload.info! ! NETSCAPE2.0,30Ikc:Nf E1º.`q-[9ݦ9 JkH! ,4N!  DqBQT`1 `LE[|ua C%$*! ,62#+AȐ̔V/cNIBap ̳ƨ+Y2d! ,3b%+2V_ ! 1DaFbR]=08,Ȥr9L! ,2r'+JdL &v`\bThYB)@<&,ȤR! ,3 9tڞ0!.BW1  sa50 m)J! ,2 ٜU]qp`a4AF0` @1Α! ,20IeBԜ) q10ʰPaVڥ ub[;PK"bWDPu u #buildbot-v0.8.8/_static/comment.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 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"bWDhkk buildbot-v0.8.8/_static/down.pngPNG  IHDRasRGBbKGDC pHYs B(xtIME"U{IDAT8ҡNCAJ, ++@4>/U^,~T&3M^^^PM6ٹs*RJa)eG*W<"F Fg78G>q OIp:sAj5GنyD^+yU:p_%G@D|aOs(yM,"msx:.b@D|`Vٟ۲иeKſ/G!IENDB`PK"bWD+0 buildbot-v0.8.8/_static/file.pngPNG  IHDRabKGD pHYs  tIME  )TIDAT8˭J@Ir('[ "&xYZ X0!i|_@tD] #xjv YNaEi(əy@D&`6PZk$)5%"z.NA#Aba`Vs_3c,2mj [klvy|!Iմy;v "߮a?A7`c^nk?Bg}TЙD# "RD1yER*6MJ3K_Ut8F~IENDB`PK"bWD[{gtt&buildbot-v0.8.8/_static/up-pressed.pngPNG  IHDRasRGBbKGDC pHYs B(xtIME ,ZeIDAT8͓jA*WKk-,By@- و/`cXYh!6jf GrOlXvvfk2!p!GOOԲ &zf 6|M~%`]* ΛM]K ZĆ1Er%ȶcm1`= 0 && !jQuery(node.parentNode).hasClass(className)) { var span = document.createElement("span"); span.className = className; span.appendChild(document.createTextNode(val.substr(pos, text.length))); node.parentNode.insertBefore(span, node.parentNode.insertBefore( document.createTextNode(val.substr(pos + text.length)), node.nextSibling)); node.nodeValue = val.substr(0, pos); } } else if (!jQuery(node).is("button, select, textarea")) { jQuery.each(node.childNodes, function() { highlight(this); }); } } return this.each(function() { highlight(this); }); }; /** * Small JavaScript module for the documentation. */ var Documentation = { init : function() { this.fixFirefoxAnchorBug(); this.highlightSearchWords(); this.initIndexTable(); }, /** * i18n support */ TRANSLATIONS : {}, PLURAL_EXPR : function(n) { return n == 1 ? 0 : 1; }, LOCALE : 'unknown', // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) gettext : function(string) { var translated = Documentation.TRANSLATIONS[string]; if (typeof translated == 'undefined') return string; return (typeof translated == 'string') ? translated : translated[0]; }, ngettext : function(singular, plural, n) { var translated = Documentation.TRANSLATIONS[singular]; if (typeof translated == 'undefined') return (n == 1) ? singular : plural; return translated[Documentation.PLURALEXPR(n)]; }, addTranslations : function(catalog) { for (var key in catalog.messages) this.TRANSLATIONS[key] = catalog.messages[key]; this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); this.LOCALE = catalog.locale; }, /** * add context elements like header anchor links */ addContextElements : function() { $('div[id] > :header:first').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this headline')). appendTo(this); }); $('dt[id]').each(function() { $('\u00B6'). attr('href', '#' + this.id). attr('title', _('Permalink to this definition')). appendTo(this); }); }, /** * workaround a firefox stupidity */ fixFirefoxAnchorBug : function() { if (document.location.hash && $.browser.mozilla) window.setTimeout(function() { document.location.href += ''; }, 10); }, /** * highlight the search words provided in the url in the text */ highlightSearchWords : function() { var params = $.getQueryParameters(); var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; if (terms.length) { var body = $('div.body'); window.setTimeout(function() { $.each(terms, function() { body.highlightText(this.toLowerCase(), 'highlighted'); }); }, 10); $('') .appendTo($('#searchbox')); } }, /** * init the domain index toggle buttons */ initIndexTable : function() { var togglers = $('img.toggler').click(function() { var src = $(this).attr('src'); var idnum = $(this).attr('id').substr(7); $('tr.cg-' + idnum).toggle(); if (src.substr(-9) == 'minus.png') $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); else $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); }).css('display', ''); if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { togglers.click(); } }, /** * helper function to hide the search marks again */ hideSearchWords : function() { $('#searchbox .highlight-link').fadeOut(300); $('span.highlighted').removeClass('highlighted'); }, /** * make the url absolute */ makeURL : function(relativeURL) { return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; }, /** * get the current relative url */ getCurrentURL : function() { var path = document.location.pathname; var parts = path.split(/\//); $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { if (this == '..') parts.pop(); }); var url = parts.join('/'); return path.substring(url.lastIndexOf('/') + 1, path.length - 1); } }; // quick alias for translations _ = Documentation.gettext; $(document).ready(function() { Documentation.init(); }); PKJtD(xEE&buildbot-v0.8.8/_static/searchtools.js/* * searchtools.js_t * ~~~~~~~~~~~~~~~~ * * Sphinx JavaScript utilties for the full-text search. * * :copyright: Copyright 2007-2013 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 = $('