Major User visible changes in Buildbot.             -*- outline -*-
   see the git log for a detailed list of changes:
   http://github.com/buildbot/buildbot/commits/master


* Buildbot 0.8.4p1 (June 18, 2011)

** Fix a hang on startup (bug #1992)

** Fix errors in handling changes via sendchange (hgbuildbot, sendchange)

** Fix incorrect property renderings (Trigger, SVN)

** Allow configuration of change cache once again

* Buildbot 0.8.4 (June 12, 2011)

** Monotone support

Monotone support has returned to Buildbot, thanks to Richard Levitte.

** `Blocker` step

A "beta" version of the Blocker step has been added; this step allows multiple
concurrent builds to be synchronized.  It is "beta" in the sense that it may
contain significant bugs, is only documented in the source code, and has an
interface that is subject to non-compatible change in later versions of
Buildbot.  See `contrib/blockertest` for a test and demonstration of the new
step's functionality.

** Deprecations, Removals, and Non-Compatible Changes

*** Init script now uses /etc/default/buildmaster for instance configuration.
Also MASTER_ENABLED used in /etc/default/buildmaster now accepts 'true|yes|1'
to enable instance and 'false|no|0' to disable(not case sensitive). Other
values will be considered as syntax error.

*** 'buildbot.status.words.IRC' now defaults to `AllowForce=False` to prevent
IRC bots from being allowed to force builds by default.

*** MasterShellCommand and all of the transfer steps now default to
haltOnFailure=True and flunkOnFailure=True

*** GitPoller's 'workdir' parameter should always be supplied; using the
default (/tmp/gitpoller_work) is deprecated and will not be supported in future
versions.

*** ChangeFilter should now be imported from `buildbot.changes.filter'; the old
import path will still work.

*** What used to be called simply 'Scheduler' should now be instantiated as
'SingleBranchScheduler', and its branch argument is mandatory.

*** The Dependent scheduler is now in its own module,
'buildbot.schedulers.dependent', although the old name will continue to work.

*** The mergeRequests parameters are now more flexible, but an incompatible
change was made: if the BuilderConfig mergeRequests argument is explicitly set
to True, then the default merge method will be used.  In earlier versions, this
configuration fell back to the global c['mergeRequests'] parameter's value.  To
avoid this, remove `mergeRequests=True` from any BuilderConfig constructor
invocations.

*** The `Status.getBuildSets` method now returns its result via Deferred.

*** The `BuilderControl.getPendingBuilds` method has been renamed to
`getPendingBuildRequestControls`; `BuilderStatus.getPendingBuilds` has been
renamed to `getPendingBuildStatuses`.  Both now return their results via
Deferred.

*** The utility method `Builder.getOldesetRequestTime` now returns its result
via a Deferred, and that result is now a DateTime object.

*** The remote BuildSetStatus method `waitForSuccess` is no longer available.

*** The BuildRequestStatus methods `getSubmitTime` and `getSourceStamp` now
return their results via a Deferred.  The `asDict` method omits these values,
as it retuns synchronously.

*** Buildbot now uses temporary tables, which can cause problems with
replication in MySQL.  See "Database Specification" in the manual for more
details.

** Scheduler Improvements

*** Nightly scheduler now accepts a change_filter argument

** SQLAlchemy & SQLAlchemy-Migrate

Buildbot now uses SQLAlchemy as a database abstraction layer.  This gives
greater inter-database compatibility and a more stable and reliable basis for
this core component of the framework.  SQLAlchemy-Migrate is used to manage
changes to the database schema from version to version.

*** Postgres support

Buildbot should now work with a Postgres backend just as well as it does with
MySQL or SQLite.  Buildbot is actively tested against all three backends.

** Less garish color scheme

The default color scheme for Buildbot has been modified to make it slightly
less, well, neon. Note: This will not affect already-created masters, as
their default.css file has already been created. If you currently use the
default and want to get the new version, just overwrite public_html/default.css
with the copy in this version.

* Buildbot 0.8.3 (December 19, 2010)

** Deprecations and Removals

*** Change sources can no longer call change-related methods on self.parent.
Instead, use self.master methods, e.g., self.master.addChange.

* Next Release

** PBChangeSource now supports authentication

PBChangeSource now supports the `user` and `passwd` arguments.  Users with a
publicly exposed PB port should use these parameters to limit sendchange
access.

Previous versions of Buildbot should never be configured with a PBChangeSource
and a publicly accessible slave port, as that arrangement  allows anyone to
connect and inject a change into the Buildmaster without any authentication at
all, aside from the hard-coded 'change'/'changepw' credentials.  In many cases,
this can lead to arbitrary code injection on slaves.

** Experiemental Gerrit and Repo support

A new ChangeSource (GerritChangeSource), status listener (GerritStatusPush),
and source step (Repo) are available in this version.  These are not fully
documented and still have a number of known bugs outstanding (see
http://buildbot.net/trac/wiki/RepoProject), and as such are considered
experimental in this release.

** WithProperties now supports lambda substitutions

WithProperties now has the option to pass callable functions as keyword
arguments to substitute in the results of more complex Python code at
evaluation-time.

** New 'SetPropertiesFromEnv' step

This step uses the slave environment to set build properties.

** Deprecations and Removals

*** The console view previously had an undocumented feature that would strip
leading digits off the category name.  This was undocumented and apparently
non-functional, and has been removed. (#1059)

*** contrib/hg_buildbot.py was removed in favor of buildbot.changes.hgbuildbot.

*** The misnamed sendchange option 'username' has been renamed to 'who'; the old
option continues to work, but is deprecated and will be removed. (#1711)


* Buildbot 0.8.2 (October 29, 2010)

** Upgrading

Upgrading to from the previous version will require an 'upgrade-master' run.
However, the schema changes are backward-compatible, so if a downgrade is
required, it will not be difficult.

** New Requirements

The Buildmaster now requires Jinja-2.1 or higher.

Both master and slave now require Twisted-8.0.0.  Although Twisted-2.5.0 may
still work, it is not tested and not supported.

** Command-line options changed

To resolve conflicting command-line options (ticket #972) for sendchange
command the following changes were done:

 * `-m` option now means `--master`
 * `-c` option now means `--comments`
 * `-C` option now means `--category`

Added new `-n|--no-logrotate` flag to create-master command which disables
internal logging and log rotation mechanism in buildbot.tac (ticket #973)

** MasterShellCommand semantics change

The MasterShellCommand now provides the buildmaster's environment to the step
by default; pass env={} to pass a clean environment, instead.

** Log Rotation

The default 'create-master' output now rotates ten twistd.log files, each of
about 10MiB.  This is a change from older versions, which would rotate an
unbounded number of 1MiB files.

** New configuration key, 'changeCacheSize'

This sets the number of changes that buildbot will keep in memory at once.
Users of distributed version control systems should consider setting this to a
high value (e.g. 10,000)

** New libvirt-based Latent Buildslave Support

This extends the support already included for EC2 buildslaves to include any
virtualization platform supported by libvirt.

** Canceling Pending Builds for a Change

Change pages on the webstatus now have buttons to cancel any pending
builds that include that change (across all builders). The corresponding
authz privledge to control access to this feature is 'stopChange'.

** New Change source

*** CVSMaildirSource

This parses mail sent by buildbot_cvs_mail.py in contrib directory.
See docs for more info.

** New Steps

*** VC++ 9, VS2008, VCExpress9 - part of the vstudio suite of steps

** Deprecations and Removals

*** Removed sendchange's --revision_number argument (use --revision)

*** Deprecating old CVS MairdirSources:
    Please post to the list if you are using
      FreshCVS   FCMaildirSource
      Syncmail   SyncmailMaildirSource
      Bonsai     BonsaiMaildirSource

*** statusgui is deprecated in this version and will be removed in the next
release.  Please file a bug at http://buildbot.net if you wish to reverse this
decision.

*** The Twisted-only steps BuildDebs and ProcessDocs have been removed.


* Release 0.8.1 (June 16, 2010)

** Slave Split into separate component

Installing 'buildbot' will no longer allow you to run a slave - for that,
you'll now need the 'buildslave' component, which is available by easy_install.
This is merely a packaging change - the buildslave and buildbot components are
completely inter-compatible, just as they always have been.

** Features

*** Add googlecode_atom.py to contrib (ticket #842)

*** Implement clean master shutdown, available through WebStatus

** Fixes

*** Pass local environment variables along with getProcessOutput. Required for
    ssh agent authentication.

*** IRC doc fixes (ticket #852)

*** Remove builder count from one_line_per_build (ticket #854)

*** Set the 'revision' property more often (ticket #101)

*** Change property priority ordering (ticket #809)

*** Fixes to MaildirSource for CVS

*** Use shutil.rmtree on POSIX systems

*** Fix NameError in MailNotifier (ticket #758)

*** Reduce verbosity of patches in twistd.log (ticket #803)

*** Documentation updates to reflect UI customization via
    templates (ticket #866)

** Deprecations

*** Arch, Bazaar, and Monotone to be removed in 0.8.2

This decision isn't final, but support for these VC's will be removed in
version 0.8.2 unless a maintainers steps forward to document, test, and update
them.

*** Support for starting buildmaster from Makefiles to be removed in 0.8.2

In a little-used feature, 'buildbot start' would run 'make start' if a
Makefile.buildbot existed in the master directory.  This functionality will be
removed in Buildbot-0.8.2, and the create-master command will no longer create
a Makefile.sample.  Of course, Buildbot still supports build processes on the
slave using make!


* Release 0.8.0 (May 25, 2010)

** (NOTE!) Scheduler requires keyword arguments

If you are creating your Scheduler like this:

  Scheduler("mysched", "mybranch", 0, ["foo", "bar"])

then it's time to change that to specify each of the arguments with a keyword:

  Scheduler(name="mysched", branch="mybranch",
        treeStableTimer=0, builderNames=["foo", "bar"])

** Database Backend

Scheduler, change, and build request information is now stored in a database -
by default, in SQLite, although MySQL is also supported.  With this change,
scheduled builds will persist over buildmaster restarts, as will
interrelationships between schedulers (e.g., Triggerable and Dependent).

Upgrading to the new database backend is easy, although it brings additional
requirements on the buildmaster.  See the Buildbot documentation for more
information.

** Visual Studio / VC++ Compile Steps

** New Change/SourceStamp attributes 'project' and 'repository'

These attributes can be used to further refine matching by schedulers.
Repository completes the SourceStamp: the tuple of (repository, branch,
revision) completely specifies a source code tree.  Likewise, the project
attribute can be used to support building several distinct projects within one
buildmaster, replacing the use of category for this purpose.  Matching can be
done using regular expressions, so it's even possible to support nested
projects!

** ShellCommands expand environment variables

If you pass to a shell command an environment variable like this:

ShellCommand(..., env={"FOO": "${BAR}"})

then, on the slave side the variable FOO will have the same value as
the alread existing BAR variable on the slave. This is mostly used to
expand variable like this: "PATH": "/my/directory:${PATH}" where PATH
will have "/my/directory" prepended to it.

** Builders can setup properties

There is a new parameter to the builders to setup properties on a
per-builder basis.

** New /json web status

This view has lots of useful information perfectly formed for serving as input
to JavaScript status displays.  See /json/help for details.

** Jinja

All web status is now generated using the Jinja templating engine, which gives
buildbot a much more attractive and maintainable appearance.  Buildbot's output
is also now XHTML-compliant!

** Authorization Framework

The web-based status displays now provide fine-grained control over who can
do what - force builds, stop builds, cancel builds, etc.  See the manual for
configuration details.

** Mercurial uses full revisions

Mercurial now sets got_revision to the full 40-character revision id instead of
the short IDs.

** Cleanup, Bug Fixes, and Test Fixes

Thanks to help from a number of devoted contributors, this version of Buildbot
has seen a lot of house-cleaning, and even passes all of its own unit tests!  

** Removals

*** Removed buildbot.status.html.Waterfall (deprecated in 0.7.6)

Note that this does not remove the waterfall -- just an old version of it which
did not include the rest of the WebStatus pages.

*** BuildmasterConfig no longer accepts 'bots' and 'sources' as keys
(deprecated in 0.7.6). Use 'slaves' and 'change_source' instead.


* Release 0.7.12 (January 21, 2010)

** New 'console' display

This is a new web status view combining the best of the (t)grid and waterfall
views.

** New 'extended' stylesheet

Buildbot has a new, much nicer stylesheet available.  Copy the file
buildbot/status/web/extended.css over your existing public_html/buildbot.css to
se it.

** Builders can be configured with an object

Instead of a list of dictionaries, builders can now specified using a
BuilderConfig object in the configuration file.  This will allow for better
argument checking and default values, and also makes it easier for users to
create subclasses to handle site-specific builder details.  The old,
dictionary-based method of configuration is still supported.

** Check for common mis-configuration in addStep

When adding a new step to a factory, either of these are acceptable:

  f.addStep(ShellCommand(command="echo hello, world", description="say hi"))
  f.addStep(ShellCommand, command="echo hello, world", description="say hi")

but trying to mix these syntaxes is a common misconfiguration:

  f.addStep(ShellCommand(command="echo hello, world"), description="say hi")

in which case the description argument was silently ignored.  This is now an
error.

** Support for log compression

Log files can be compressed on the master side using either gzip or bzip2.

** Builder.ping no longer accepts timeout argument (bug #664).

The implementation was not robust enough and could cause the master to
unexpectedly disconnect the slave.

** MailNotifier's customMesg replaced by messageFormatter

The customMesg mechanism had the unfortunate side effect of loading all data
for a build into memory simultaneously, which for some builds could cause
memory exhaustion.

** Suppression of selected compiler warnings

The WarningCountingShellCommand class has been extended with the ability to
upload from the slave a file contain warnings to be ignored. See the
documentation of the suppressionFile argument to the Compile build step.

** New buildstep `MTR'

A new class buildbot.process.mtrlogobserver.MTR was added. This buildstep is
used to run test suites using mysql-test-run. It parses the stdio output for
test failures and summarises them on the waterfall page. It also makes server
error logs available for debugging failures, and optionally inserts
information about test runs and test failures into an external database.

** Python API Docs

The docstrings for buildbot are now available in a web-friendly format:
  http://buildbot.net/buildbot/docs/latest/reference

** Many, many bugfixes


* Release 0.7.11p (July 16, 2009)

Fixes a few test failures in 0.7.11, and gives a default value for branchType
if it is not specified by the master.


* Release 0.7.11 (July 5, 2009)

Developers too numerous to mention contributed to this release.  Buildbot has
truly become a community-maintained application.  Much hard work is not
mentioned here, so please consult the git logs for the detailed changes in this
release.

** Better Memory Performance, Disk Cleanup

Buildbot handles its memory usage a bit better, and can automatically purge old
history to keep memory and disk usage low.  Look for eventHorizon,
buildHorizon, logHorizon, and changeHorizon.

** Password Protection for Force Build and Stop actions

It is now possible to require authentication to force build and stop via the
WebStatus interface. To use this, set the 'auth' field of WebStatus to a valid
IAuth implementation. Current implementations are:
	BasicAuth with a list of user/passwords
	HTPasswdAuth with an .htpasswd file
By default, the unauthenticated behavior will occur.

** Web Status changes

The "Graceful Shutdown" feature, as a kind of "force", now obeys allowForce.

The waterfall and other pages are more deeply interlinked.

Pending builds can be individually cancelled, or cancelled in bulk.

** Fixed Transfer Steps

Transfer step classes are more reliable; DirectoryUpload and DirectoryDownload
use tarfile instead of manually framing files.  The DirectoryUpload step also
now supports compression.

** Conditional Steps

Steps now take a doStepIf parameter which can be used to implement simple
conditional execution of a step.

** Colorized Steps

Steps are now hilighted with a color in the build view to indicate their
success or failure.

** Improved build prioritization

Bugfixes and fairer scheduling

** Transposed Grid

Similar to the grid view, but with the axes reversed and showing different
info.  Located at /tgrid.

** Trigger steps improvements

Trigger now supports copy_properties, to send selected properties to the
triggered build.


* Release 0.7.10 (25 Feb 2009)

This release is mainly a collection of user-submitted patches since
the last release.

** New Features

*** Environment variables in a builder (#100)

It is useful to be able to pass environment variables to all steps in a
builder.  This is now possible by adding { .. 'env': { 'var' : 'value' }, ... }
to the builder specification.

*** IRC status plugin improvements (#330, #357, #378, #280, #381, #411, #368)

*** usePTY specified in master.cfg, defaults to False (#158, #255)

Using a pty has some benefits in terms of supporting "Stop Build", but causes
numerous problems with simpler jobs which can be killed by a SIGHUP when their
standard input is closed.  With this change, PTYs are not used by default,
although you can enable them either on slaves (with the --usepty option to
create-slave) or on the master.

*** More information about buildslaves via the web plugin (#110)

A new page, rooted at /buildslave/$SLAVENAME, gives extensive information about
the buildslave.

*** More flexible merging of requests (#415)

The optional c['mergeRequests'] configuration parameter takes a function
which can decide whether two requests are mergeable.

*** Steps can be made to run even if the build has halted (#414)

Adding alwaysRun=True to a step will cause it to run even if some other step
has failed and has haltOnFailure=True.

*** Compress buildstep logfiles (#26)

Logs for each buildstep, which can take a lot of space on a busy buildmaster,
are automatically compressed after the step has finished.

*** Support for "latent" buildslaves

The buildslaves that are started on-demand are called "latent" buildslaves.
Buildbot ships with an abstract base class for building latent buildslaves, and
a concrete implementation for AWS EC2. 

*** Customized MailNotifier messages (#175)

MailNotifier now takes an optional function to build the notification message,
allowing ultimate site-level control over the format of buildbot's notification
emails.

*** Nightly scheduler support for building only if changes have occurred

With the addition of onlyIfChanged=True, the Nightly scheduler will not schedule
a new build if no changes have been made since its last scheduled build.

*** Add ATOM/RSS feeds to WebStatus (#372)

Two new pages, /atom and /rss, provide feeds of build events to any feed
reader.  These paths take the same "category" and "branch" arguments as the
waterfall and grid.

*** Add categories to Schedulers and Changes (#182)

This allows a moderate amount of support for multiple projects built in a
single buildmaster.

*** Gracefully shut down a buildslave after its build is complete

The /buildslaves/$SLAVENAME pages have a "Gracefully Shutdown" button which
will cause the corresponding slave to shut itself down when it finishes its
current build.  This is a good way to do work on a slave without causing a
spurious build failure.

*** SVN source steps can send usernames and passwords (#41)

Adding username="foo" and/or password="bar" to an SVN step will cause
--username and --password arguments to be passed to 'svn' on the slave side.
Passwords are suitably obfuscated in logfiles.

** New Steps

*** DirectoryUpload (#393)

This step uploads an entire directory to the master, and can be useful when a
build creates several products (e.g., a client and server package).

*** MasterShellCommand

This step runs a shell command on the server, and can be useful for
post-processing build products, or performing other maintenance tasks on the
master.

*** PyLint (#259)

A PyLint step is available to complement the existing PyFlakes step.

** Bugs Fixed

*** Process output from new versions of Test::Harness (#346)

*** Fixes to the try client and scheduler

*** Remove redundant loop in MailNotifier (#315)

*** Display correct $PWD in logfiles (#179)

*** Do not assume a particular python version on Windows (#401)

*** Sort files in changes (#402)

*** Sort buildslaves lexically (#416)

*** Send properties to all builds initiated by AnyBranchScheduler

*** Dependent Schedulers are more robust to reconfiguration (#35)

*** Fix properties handling in triggered buidls (#392)

*** Use "call" on Windows to avoid errors (#417)

*** Support setDefaultWorkdir in FileUpload and FileDownload (#209)

*** Support WithProperties in FileUpload and FileDownload (#210)

*** Fix a bug where changes could be lost on a master crash (#202)

*** Remove color settings from non-presentation code (#251)

*** Fix builders which stopped working after a PING (#349, #85)

*** Isolate Python exceptions in status plugins (#388)

*** Notify about slaves missing at master startup (#302)

*** Fix tracebacks in web display after a reconfig (#176)

** Version-Control Changes

*** Many Mercurial fixes

 - Inrepo branch support finalized (source step + changegroup hook + test case)
   (#65 #185 #187)

 - Reduced amount of full clones by separating clone with update into
   clone/pull/update steps (#186, #227) (see #412 for future work here)

 - Fixed mercurial changegroup hook to work with Mercurial 1.1 API (#181, #380)

*** Many git fixes

*** Add got_revision to Perforce support (#127)

*** Use "git foo" everywhere instead of deprecated "git-foo"

** Minor Changes

*** factory.addSteps (#317)

If you have a common list of steps that are included in multiple factories, you
can use f.addSteps(steplist) to add them all at once.

*** Twisted logfile rotation and cleanup (#108)

By default, Buildbot now rotates and cleans up the (potentially voluminous)
twistd.log files.

*** Prioritize build requests based on the time they wre submitted (#334)

Balancing of load is a bit more fair, although not true load balancing.


* Release 0.7.9 (15 Sep 2008)

** New Features

*** Configurable public_html directory (#162)

The public_html/ directory, which provides static content for the WebStatus()
HTTP server, is now configurable. The default location is still the
public_html/ subdirectory of the buildmaster's base directory, but you can
change this by passing a suitable argument when creating the WebStatus()
instance in your master.cfg file:

  c['status'].append( WebStatus(8080, public_html="/var/www/buildbot") )

*** Lock access modes (#313)

Albert Hofkamp added code to provide two distinct access modes to Locks:
"counting" and "exclusive". Locks can accept a configurable number of
"counting"-mode users, or a single "exclusive"-mode. For example, a Lock is
defined with maxCount=3, and then a 'compile' BuildStep uses this lock in
counting mode, while a 'cleanup' BuildStep uses this lock in exclusive mode.
Then, there can be one, two, or three simultaneous Builds in the compile step
(as long as there are no builds in the cleanup step). Only one build can be
in the cleanup step at a time, and if there is such a build in the cleanup
step, then the compile steps in other builds will wait for it to finish.
Please see the "Interlocks" section of the user's manual for more details.

** Bugs Fixed

*** Buildslave missing_timeout= fired too quickly (#211)

By providing a missing_timeout= argument when creating the BuildSlave
instance, you can ask the buildmaster to send email if a buildslave is
disconnected for too long. A bug in the previous version caused this
notification to be sent too soon, rather than waiting until the timeout
period expired. This should be fixed now.

*** Test command display fixed (#332)

In the previous version, a steps.shell.Test step would display the parsed
test results (in the step's box on the waterfall display) in lieu of any
other descriptive text the step might provide. In this release, these two
pieces of information are combined.

** Minor Changes

The buildmaster's version is logged to its twistd.log file at startup. The
buildslave does the same, to its own logfile.

Remote commands now record how long each command took. The "elapsedTime="
message will appear in the step's main logfile.

The "buildbot restart" command no longer fails if the buildbot wasn't already
running.

The FileUpload and FileDownload steps now create their target directories
(and any missing intermediate directories) before writing to the destination
file.

The per-build and per-step web pages now show the start, finish, and elapsed
time of their build or step.

If a Subversion-based build is started with a mixture of Changes that specify
particular numeric revisions and "HEAD" Changes (which indicate that a trunk
checkout is desired), the build will use a trunk checkout. Previously this
would probably cause an error. It is not clear how this situation might
arise.

** Compability With Other Tools

The mercurial commit hook (buildbot.changes.hgbuildbot) in the previous
version doesn't work with hg-1.0 or later (it uses an API function that was
present in the hg-0.9.5 release, but was removed from hg-1.0). This
incompability has been fixed: the new version of buildbot should be
compatible with hg-1.0 and newer (and it probably retains compability with
hg-0.9.5 and earlier too). (#328)

The Git tool has traditionally provided two ways to run each command, either
as subcommands of /usr/bin/git (like "git checkout"), or as individual tools
(like /usr/bin/git-checkout). The latter form is being removed in the
upcoming 1.6 Git release. Previous versions of Buildbot have used the
git-checkout form, and will break when Git is upgraded to 1.6 or beyond. The
new Buildbot release switches to the subcommand form. Note that this is a
change on the buildslave side.

The Git checkout command will now use the default branch (as set in the
steps.source.Git() step definition) if the changes that it is building do not
specify some other branch to build. (#340)

** Deprecation Schedule

No features have been deprecated in this release, and no deprecated features
have been removed. As a reminder, the following deprecated features are
scheduled for removal in an upcoming release:

c['sources'] (plural) was replaced by c['change_source'] (singular) in 0.7.6,
and will be removed by 0.8.0.

c['bots'] was replaced by c['buildslaves'] in 0.7.6, and will be removed by
0.8.0 . c['bots'] only accepts BuildSlave instances, not name/passwd tuples.

The html.Waterfall status target was replaced by html.WebStatus in 0.7.6, and
will be removed by 0.8.0.


* Release 0.7.8 (24 Jul 2008)

** New features

The IRC bot will respond to three new commands: 'notify' subscribes the
channel (or the sender, if the command is sent as a private "/msg") to hear
about build events. 'join' tells the bot to join some new IRC channel.
'leave' tells it to leave a channel. See the "IRC Bot" section of the User's
Manual for details. (#171)

Build Steps now have "statistics", in addition to logfiles. These are used to
count things like how many tests passed or failed. There are methods to sum
these counters across all steps and display the results in the Build status.
The Waterfall display now shows the count of failed tests on the top-most box
in each column, using this mechanism.

The new buildbot.steps.shell.PerlModuleTest step was added, to run Perl unit
tests. This is a wrapper around the regular ShellCommand that parses the
output of the standard perl unit test system and counts how many tests
passed/failed/etc. The results are put into the step's summary text, and a
count of tests passed/failed/skipped are tracked in the steps's statistics.
The factory.CPAN build factory has been updated to use this, so configuring a
Buildbot to test a perl module available from CPAN should be as easy as:

 s = source.CVS(cvsroot, cvsmodule)
 f = factory.CPAN(s)

Build Properties have been generalized: they remain associated with a single
Build, but the properties can be set from a variety of sources. In previous
releases, the Build itself would set properties like 'buildername', 'branch',
and 'revision' (the latter two indicating which version of the source code it
was trying to get), and the source-checkout BuildSteps would set a property
named 'got_revision' (to indicate what version of the soruce code it actually
got). In this release, the 'scheduler' property is set to indicate which
Scheduler caused the build to be started. In addition, the config file can
specify properties to be set on all Builds, or on all Builds for a specific
Builder. All these properties are available for interpolation into
ShellCommands and environment variables by using the WithProperties() marker.

It may be easier to implement simple build parameterization (e.g. to upload
generated binaries to a specific directory, or to only perform long-running
tests on a nightly build instead of upon every checkin) by using these Build
Properties than to write custom BuildSteps.

** Other improvements

The /buildslaves web page shows which slaves are currently running builds.
Offline slaves are displayed in bold.

Buildbot's setup.py now provides metadata to setuptools (if installed): an
entry_points script was added, and a dependency upon twisted-2.4.x or newer
was declared. This makes it more likely that 'easy_install buildbot' will
work.

The MailNotifier class acquired a mode="passing" flag: in this mode, the
buildbot will only send mail about passing builds (versus only on failing
builds, or only on builds which failed when the previous build had passed).

** Bugs fixed

Don't display force/stop build buttons when build control is disabled (#246)

When a build is waiting on a lock, don't claim that it has started (#107)

Make SVN mode=copy tolerate symlinks on freebsd, "cp -rp" -> "cp -RPp" (#86)

The svnpoller changesource now ignores branch deletion (#261)

The Git unit tests should run even if the user has not told Git about their
username/email.

The WebStatus /xmlrpc server's getStatus() method was renamed to the
more-accurate getLastBuildResults().

The TinderboxMailNotifier status output acquired an useChangeTime= argument.

The bonsaipoller changesource got some fixes.

** Deprecation Schedule

No features have been deprecated in this release, and no deprecated features
have been removed. As a reminder, the following deprecated features are
scheduled for removal in an upcoming release:

c['sources'] (plural) was replaced by c['change_source'] (singular) in 0.7.6,
and will be removed by 0.8.0.

c['bots'] was replaced by c['buildslaves'] in 0.7.6, and will be removed by
0.8.0 . c['bots'] only accepts BuildSlave instances, not name/passwd tuples.

The html.Waterfall status target was replaced by html.WebStatus in 0.7.6, and
will be removed by 0.8.0.



* Release 0.7.7 (29 Mar 2008)

** Things You Need To Know

*** builder names must not start with an underscore (`_').

These are now reserved for internal buildbot purposes, such as the magic
"_all" pseudo-builder that the web pages use to allow force-build buttons
that start builds on all Builders at once.

** New Features

*** "buildbot checkconfig"

The "buildbot checkconfig" command will look at your master.cfg file and tell
you if there are any problems with it. This can be used to test potential
changes to your config file before submitting them to the running
buildmaster. This is particularly useful to run just before doing "buildbot
restart", since the restart will fail if the config file has an error. By
running "buildbot checkconfig master.cfg && buildbot restart", you'll only
perform the restart if the config file was ok. Many thanks to Ben Hearsum for
the patch.

*** Waterfall "?category=FOO" query-arguments

The Waterfall page now accepts one or more "category=" query arguments in the
URL, to filter the display by categories. These behave a lot like the
"builder=" query argument. Thanks to Jermo Davann for the patch.

** Bugs Fixed

Many bugs were fixed, and many minor features were added. Many thanks to
Dustin Mitchell who fixed and coordinated many of these. Here is a terse
list, for more details, please see the Trac page for the 0.7.7 release, at
http://buildbot.net/trac/query?status=closed&milestone=0.7.7 :

Many of the URLs generated by the buildbot were wrong.
Display of last-heard-from timestamps on the buildslaves web page were wrong.
Asking an IRC bot about a build waiting on a Lock should no longer crash.
Same for the web viewer.
Stop treating the encouraged info/ directory as leftover.
Add more force/stop build buttons.
Timestamps displayed on the waterfall now handle daylight savings properly.
p4poller no longer quits after a single failure.
Improved Git support, including 'try', branch, and revisions.
Buildslaves now use 'git', not 'cogito'.
Make older hg client/servers handle specific-revision builds properly.
Fix twisted.scripts._twistw problem on twisted-2.5.0 and windows.
Fix workdir= and env= on ShellCommands
Fix logfile-watching in 'buildbot start' on OS-X.
Fix ShellCommand crashes when the program emits >640kB of output per chunk.
New WarningCountingShellCommand step.
Fix TreeSize step.
Fix transfer.FileUpload/FileDownload crashes for large files.
Make 'buildbor reconfig' on windows tell you that it doesn't work.
Add a To: header to the mail sent by the slave-missing timeout.
Disable usePTY= for most unit tests, it makes some debian systems flunk tests.
Add 'absolute source stamps'
Add 'triggerable schedulers', and a buildstep to trigger them.
Remove buildbot.changes.freshcvsmail
Add new XMLRPC methods: getAllBuilders, getStatus, getLastBuilds.
Accept WithProperties in more places: env=, workdir=, others.
Use --no-auth-cache with SVN commands to avoid clobbering shared svn state.
Add hours/minutes/seconds in the waterfall's ETA display.
Trial: count Doctest lines too.
ShellCommand: record more info in the headers: stdin closing, PTY usage.
Make it possible to stop builds across reconfig boundaries.
SVN revision numbers are now passed as strings, which was breaking MailNotifier

** Deprecation Schedule

The changes.freshcvsmail change source was replaced by
changes.mail.FCMaildirSource in 0.7.6, and has been removed in 0.7.7 .

c['sources'] (plural) was replaced by c['change_source'] (singular) in 0.7.6,
and will be removed by 0.8.0.

c['bots'] was replaced by c['buildslaves'] in 0.7.6, and will be removed by
0.8.0 . c['bots'] only accepts BuildSlave instances, not name/passwd tuples.

The html.Waterfall status target was replaced by html.WebStatus in 0.7.6, and
will be removed by 0.8.0.


* Release 0.7.6 (30 Sep 2007)

** Things You Need To Know

*** 'buildbot upgrade-master'

Each time you install a new version of Buildbot, you should run the new
'buildbot upgrade-master' command on each of your pre-existing buildmasters.
This will add files and fix (or at least detect) incompatibilities between
your old config and the new code.

*** new WebStatus page

The Waterfall has been replaced by the more general WebStatus display,
described below. WebStatus serves static files from a new public_html/
directory that lives in the buildmaster's basedir. Files like index.html,
buildbot.css, and robots.txt are served directly from that directory, so any
modifications you wish to make should be made to those files. In particular,
any custom CSS you've written should be copied into public_html/buildbot.css.
The 'upgrade-master' command will populate this directory for you.

The old Waterfall page is deprecated, but it should continue to work for
another few releases. It is now a subclass of WebStatus which just replaces
the default root URL with another copy of the /waterfall resource.

*** Compatibility: Python-2.3 or newer, Twisted-2.0 or newer

No compatiblity losses here, buildbot-0.7.6 is compatible with the same
versions of python and twisted that 0.7.5 was.

Buildbot is tested on a regular basis (http://buildbot.buildbot.net) against
nearly a full matrix of Python-(2.3,2.4,2.5) * Twisted-(2.0,2.1,2.2,2.4,2.5).

*** New Buildbot Home Page

Buildbot has moved to a new Trac instance at http://buildbot.net/ , and all
new bugs and tickets should be filed there. The old sourceforge bugs at
http://buildbot.sf.net/ will slowly be migrated over. Mailing lists are still
managed at sourceforge, and downloads are still available there.

*** Changed/Deprecated master.cfg Keys and Classes

c['sources'] (plural) has been replaced by c['change_source'] (singular).

c['bots'] has been replaced by c['buildslaves'], and it expects a list of
BuildSlave instances instead of tuples. See below for more details.

The 'freshcvsmail' change source has been deprecated, and will be removed in
the next release.

The html.Waterfall status target has been deprecated, and replaced by
html.WebStatus .

** New Features

*** WebStatus

The new WebStatus display is a superset of the old Waterfall. It contains a
waterfall as a sub-page, but it also contains pages with more compact
representations of recent build status. The "one_line_per_build" page
contains just that, and "one_box_per_builder" shows just the information from
the top of the waterfall page (last-finished-build and current-activity).

The initial page (when you hit the root of the web site) is served from
index.html, and provides links to the Waterfall as well as the other pages.

Most of these pages can be filtered by adding query arguments to the URL.
Adding "?builder=XYZ" will cause the page to only show results for the given
builder. Adding "?builder=XYZ&builder=ABC" will show results for either
builder. "?branch=trunk" will limit the results to builds that involved code
from the trunk.

The /waterfall page has arguments to hide those annoying "buildslave
connected" messages, to start and and at arbitrary times, and to auto-refresh
at a chosen interval (with a hardcoded minimum of 15 seconds). It also has a
"help" page with forms that will help you add all of these nifty filtering
arguments.

The recommended practice is to modify the index.html file to include links to
the filtered pages that you find most useful.

Note that WebStatus defaults to allowForce=False, meaning that the display
will not offer or accept "Force Build" or "Stop Build" controls. (The old
Waterfall defaults to allowForce=True).

The new WebStatus pages try very hard to use only relative links, making life
better when the Buildbot sits behind an HTTP reverse proxy.

In addition, there is a rudimentary XMLRPC server run by the WebStatus
object. It only has two methods so far, but it will acquire more in the
future. The first customer of this is a project to add a buildbot plugin to
Trac.

*** BuildFactory.addStep(Step(args))

BuildFactories can be set up either with a complete list of steps, or by
calling the .addStep() method repeatedly. The preferred way to provide a step
is by instantiating it, rather than giving a class/kwargs pair. This gives
the BuildStep class a chance to examine the arguments (and complain about
anything it doesn't like) while the config file is being read and problems
are being logged. For example, the old-style:

 from buildbot.process.factory import BuildFactory, s
 steps = [s(CVS, cvsroot="blah", mode="copy"),
          s(Compile, command=["make", "all"]),
          s(Test, command=["make", "test"]),
         ]
 f = BuildFactory(steps)

is now:

 f = BuildFactory()
 f.addStep( CVS(cvsroot="blah", mode="copy") )
 f.addStep( Compile(command=["make", "all"]) )
 f.addStep( Test(command=["make", "test"]) )

Authors of BuildStep subclasses which override __init__ to add new arguments
must register them with self.addFactoryArguments(**newargs) to make sure that
those classes will work with this new style, otherwise the new arguments will
be lost.

Using class/kwargs pairs is deprecated, and will be removed in a future
release.


*** BuildSlave instances, max_builds=, notify_on_missing=

Buildslave specification has changed a lot in this release. The old config:

 c['bots'] = [ ("bot1name", "bot1passwd"),
               ("bot2name", "bot2passwd") ]

is now:

 from buildbot.buildslave import BuildSlave
 c['slaves'] = [ BuildSlave("bot1name", "bot1passwd"),
                 BuildSlave("bot2name", "bot2passwd") ]

This new form gives us the ability to add new controls. The first is
"max_builds=", which imposes a concurrency limit that is like the usual
SlaveLock, but gives the buildmaster the opportunity to find a different
slave to run the build. (the buildslave is chosen before the SlaveLock is
claimed, so pure SlaveLocks don't let you take full advantage of build
farms).

The other addition is "notify_on_missing=", which accepts an email address
(or list of addresses), and sends a message when the buildslave has been
disconnected for more than an hour (configurable with missing_timeout=). This
may be useful when you expect that the buildslave hosts should be available
most of the time, and want to investigate the reasons that it went offline.


** Other Improvements

The IRC bot has been refactored to make it easier to add instant-messaging
status delivery in the future. The IM plugins are not yet written, though.

When multiple buildslaves are available for a given build, one of them will
be picked at random. In previous releases, the first one on the list was
always picked. This helps to add a certain measure of load-balancing. More
improvements will be made in the future.

When the buildslave does a VC checkout step that requires clobbering the
build directory (i.e. in all modes except for 'update'), the buildslave will
first set the permissions on all build files to allow their deletion, before
it attempts to delete them. This should fix some problems in which a build
process left non-user-writable files lying around (frequently a result of
enthusiastic unit tests).

The BuildStep's workdir= argument can now accept a WithProperties()
specification, allowing greater control over the workdir.

Support for the 'Bazaar' version control system (/usr/bin/bzr) has been
added, using the buildbot.steps.source.Bzr class. This is a replacement for
the old 'Arch' (/usr/bin/tla and /usr/bin/baz) systems, which are still
supported by Buildbot with the source.Arch and source.Bazaar classes,
respectively. Unfortunately the old baz system claimed the 'Bazaar' classname
early, so the new system must use source.Bzr instead of the desired
source.Bazaar . A future release might change this.

A rudimentary Gnome Panel applet is provided in contrib/bb_applet.py, which
provides 'buildbot statusgui' -like colored status boxes inside the panel.
Installing it is a bit tricky, though.

The 'buildbot try' command now accepts a '--diff=foo.patch' argument, to let
you provide a pre-computed patch. This makes it easier to test out patches
that you've looked over for safety, without first applying them to your local
source tree.

A new Mercurial change source was added, hg_buildbot.py, which runs as an
in-process post-commit hook. This gives us access to much more information
about the change, as well as being much faster.

The email-based changesource have been refactored, to make it easier to write
new mail parsers. A parser for the SVN "commit-email.pl" script has been
added.

** Bugs Fixed

Far too many to count. Please see
http://buildbot.net/trac/query?status=closed&milestone=0.7.6 for a partial
list of tickets closed for this release, and the ChangeLog for a complete
list of all changes since 0.7.5 .


* Release 0.7.5 (10 Dec 2006)

** Things You Need To Know

*** The Great BuildStep Renaming

All BuildSteps have moved! They used to be classes in buildbot.process.step,
but now they all have separate modules in buildbot.steps.* . They have been
split out into separate categories: for example, the source checkout steps
are now buildbot.steps.source.CVS, buildbot.steps.source.Darcs, etc. The most
commonly used one is probably buildbot.steps.shell.ShellCommand . The
python-specific steps are in buildbot.steps.python, and the Twisted-specific
steps are in buildbot.steps.python_twisted .

You will need to update your master.cfg files to use the new names. The old
names are deprecated and will be removed altogether in the next release.

*** Compatibility

Buildbot now requires python-2.3 or later. Buildbot now requires
Twisted-2.0.0 or later. Support for earlier versions of both has finally been
removed. If you discover it works with unsupported versions, please return
your Buildbot to the factory for repairs :-).

Buildbot has *not* yet been tested against the recent python-2.5 release. It
has been tested against the latest SVN version of Twisted, but only in
conjunction with python-2.4 .

** new features

*** reconfiguring a Builder no longer causes a disconnect/reconnect cycle

This means that sending SIGHUP to the master or running 'buildbot reconfig
MASTERDIR' command no longer interrupts any current builds, nor does it lose
pending builds like it did before. This involved a fairly substantial
refactoring of the various internal BotPerspective/BotMaster/Builder classes.
Note that reconfiguring Schedulers still loses any Changes that were waiting
for the tree to become stable: hopefully this will be fixed in the next
release.

*** 'buildbot start/restart/reconfig' now show logs until startup is complete

These commands now have additional code to follow twistd.log and display all
the lines that are emitted from the beginning of the start/reconfig action
until it has completed. This gives you a chance to see any problems detected
in the config file without needing to manually look in twistd.log or use
another shell to 'tail -f' it. This also makes it clear which config file is
being used. This functionality is not available under windows.

In addition, if any problems are detected during 'start' or 'restart' (but
not reconfig), the buildbot command will terminate with a non-zero exit
status, making it easier to use in scripts. Closes SF#1517975.

*** Locks now take maxCount=N to allow multiple simultaneous owners

This allows Locks to be non-exclusive but still limit maximum concurrency.
Thanks to James Knight for the patch. Closes SF#1434997.

*** filetransfer steps

buildbot.steps.transfer.FileUpload is a buildstep that will move files from
the slave to the master. Likewise, FileDownload will move files from the
master down to the buildslave. Many thanks to Albert Hofkamp for contributing
these classes. Closes SF#1504631.

*** pyflakes step

buildbot.steps.python.PyFlakes will run the simple 'pyflakes' static analysis
tool and parse the results to tell you about undefined names, unused imports,
etc. You'll need to tell it how to run pyflakes, usually with something like
command=["pyflakes", "src/packagedir"] or the like. The default command is
"make pyflakes", which assumes that you have a suitable target in your
top-level Makefile.

*** Monotone support

Nathaniel Smith has contributed initial support for the Monotone version
control system. The code still needs docs and tests, but on the other hand it
has been in use by the Monotone buildbot for a long time now, so it is
probably fairly stable.

*** Tinderbox support

Ben Hearsum and the Mozilla crew have contributed some classes to allow
Buildbot to work with Tinderbox clients. One piece is
buildbot.changes.bonsaipoller.BonsaiPoller, which is a ChangeSource that
polls a Bonsai server (which is a kind of web-vased viewcvs CGI script) to
discover source code changes. The other piece is
buildbot.status.tinderbox.TinderboxMailNotifier, which is a status plugin
that sends email in the same format as Tinderbox does, which allows a number
of Tinderbox tools to be driven by Buildbot instead.

*** SVN Poller

Niklaus Giger contributed a ChangeSource (buildbot.changes.svnpoller) which
polls a remote SVN repository on a periodic basis. This is useful when, for
whatever reason, you cannot add a post-commit hook script to the repository.
This obsoletes the external contrib/svn_watcher.py script.

** notes for plugin developers

*** IStatusLog.readlines()

This new method makes it easier for a status plugin (or a
BuildStep.createSummary method) to walk through a StatusLog one line at a
time. For example, if you wanted to create an extra logfile that just
contained all the GCC warnings from the main log, you could use the
following:

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

The "BuildStep LogFiles" section of the user's manual contains more
information. This method is not particularly memory-efficient yet (it reads
the whole logfile into memory first, then splits it into lines); this will be
improved in a future release.

** bug fixes

*** Update source.SVN to work with the new SVN-1.4.0

The latest subversion changed the behavior in an unusual situation which
caused the unit tests to fail. This was unlikely to cause a problem in actual
usage, but the tests have been updated to pass with the new version.

*** update svn_buildbot.py to avoid mangling filenames

Older versions of this script were stripping the wrong number of columns from
the output of 'svnlook changed', and would sometimes mangle filenames. This
has been fixed. Closes SF#1545146.

*** logfiles= caused subsequent build failures under Windows

Earlier versions of buildbot didn't explicitly close any logfiles= file
handles when the build finished. On windows (where you cannot delete a file
that someone else is reading), this could cause the next build to fail as the
source checkout step was unable to delete the old working directory. This has
been fixed. Closes SF#1568415.

*** logfiles= didn't work on OS-X

Macintosh OS-X has a different behavior when reading files that have reached
EOF, the result was that logfiles= sometimes didn't work. Thanks to Mark Rowe
for the patch.

** other changes

The 'buildbot sighup MASTERDIR' command has been replaced with 'buildbot
reconfig MASTERDIR', since that seems to be a slightly more meaningful name.
The 'sighup' form will remain as an alias.


* Release 0.7.4 (23 Aug 2006)

** Things You Need To Know

The PBChangeSource's prefix= argument has changed, you probably need to add a
slash now. This is mostly used by sites which use Subversion and
svn_buildbot.py.

The subcommands that are used to create a buildmaster or a buildslave have
changed. They used to be called 'buildbot master' and 'buildbot slave'. Now
they are called 'buildbot create-master' and 'buildbot create-slave'. Zipf's
Law suggests that these are more appropriate names for these
infrequently-used commands.

The syntax for the c['manhole'] feature has changed.

** new features

*** full Perforce support

SF#1473939: large patch from Scott Lamb, with docs and unit tests! This
includes both the step.P4 source-checkout BuildStep, and the changes.p4poller
ChangeSource you'll want to feed it. P4 is now supported just as well as all
the other VC systems. Thanks Scott!

*** SSH-based Manhole

The 'manhole' feature allows buildbot developers to get access to a python
read/eval/print loop (REPL) inside the buildmaster through a network
connection. Previously, this ran over unencrypted telnet, using a simple
username/password for access control. The new release defaults to encrypted
SSH access, using either username/password or an authorized_keys file (just
like sshd). There also exists an unencrypted telnet form, but its use is
discouraged. The syntax for setting up a manhole has changed, so master.cfg
files that use them must be updated. The "Debug options" section in the
user's manual provides a complete description.

*** Multiple Logfiles

BuildSteps can watch multiple log files in realtime, not just stdout/stderr.
This works in a similar fashion to 'tail -f': the file is polled once per
second, and any new data is sent to the buildmaster.

This requires a buildslave running 0.7.4 or later, and a warning message is
produced if used against an old buildslave (which will otherwise produce no
data). Use "logfiles={'name': 'filename'}" to take advantage of this feature
from master.cfg, and see the "ShellCommand" section of the user's manual for
full documentation.

The 'Trial' buildstep has been updated to use this, to display
_trial_temp/test.log in realtime. It also knows to fall back to the previous
"cat" command if the buildslave is too old.

*** BuildStep URLs

BuildSteps can now add arbitrary URLs which will be displayed on the
Waterfall page in the same place that Logs are presented. This is intended to
provide a link to generated HTML pages, such as the output of a code coverage
tool. The step is responsible for somehow uploading the HTML to a web server:
this feature merely provides an easy way to present the HREF link to the
user. See the "BuildStep URLs" section of the user's manual for details and
examples.

*** LogObservers

BuildSteps can now attach LogObservers to various logfiles, allowing them to
get real-time log output. They can use this to watch for progress-indicating
events (like counting the number of files compiled, or the number of tests
which have run), and update both ETA/progress-tracking and step text. This
allows for more accurate ETA information, and more information passed to the
user about how much of the process has completed.

The 'Trial' buildstep has been updated to use this for progress tracking, by
counting how many test cases have run.

** new documentation

What classes are useful in your master.cfg file? A table of them has been
added to the user's manual, in a section called "Index of Useful Classes".

Want a list of all the keys in master.cfg? Look in the "Index of master.cfg
keys" section.

A number of pretty diagrams have been added to the "System Architecture"
portion of the manual, explaining how all the buildbot pieces fit together.

An HTML form of the user's manual is now shipped in the source tarball. This
makes it a bit bigger: sorry about that. The old PyCon-2003 paper has been
removed from the distribution, as it is mostly supplanted by the user's
manual by this point.

** bugfixes

SF#1217699 + SF#1381867: The prefix= argument to PBChangeSource has been
changed: now it does just a simple string-prefix match and strip. The
previous behavior was buggy and unhelpful. NOTE: if you were using prefix=
before, you probably need to add a slash to the end of it.

SF#1398174: ignore SVN property changes better, fixed by Olivier Bonnet

SF#1452801: don't double-escape the build URL, fixed by Olivier Bonnet

SF#1401121: add support for running py2exe on windows, by Mark Hammond

reloading unchanged config files with WithProperties shouldn't change anything.

All svn commands now include --non-interactive so they won't ask for
passwords. Instead, the command will fail if it cannot be performed without
user input.

Deprecation warnings with newer versions of Twisted have been hushed.

** compatibility

I haven't actually removed support for Twisted-1.3.0 yet, but I'd like to.

The step_twisted default value for --reporter matches modern Twisteds,
though, and won't work under 1.3.0.

ShellCommand.flunkOnFailure now defaults to True, so any shell command which
fails counts as a build failure. Set this to False if you don't want this
behavior.

** minor features

contrib/darcs_buildbot.py contains a new script suitable for use in a darcs
commit-hook.

Hovering a cursor over the yellow "Build #123" box in the Waterfall display
will pop up an HTML tooltip to show the reason for the build. Thanks to Zandr
Milewski for the suggestion.

contrib/CSS/*.css now contains several contributed stylesheets to make the
Waterfall display a bit less ugly. Thanks to John O'Duinn for gathering them.

ShellCommand and its derivatives can now accept either a string or a list of
strings in the description= and descriptionDone= arguments. Thanks to Paul
Winkler for the catch.


* Release 0.7.3 (23 May 2006)

** compatibility

This release is compatible with Twisted-1.3.0, but the next one will not be.
Please upgrade to at least Twisted-2.0.x soon, as the next buildbot release
will require it.

** new features

*** Mercurial support

Support for Mercurial version control system (http://selenic.com/mercurial)
has been added. This adds a buildbot.process.step.Mercurial BuildStep. A
suitable hook script to deliver changes to the buildmaster is still missing.

*** 'buildbot restart' command

The 'buildbot restart BASEDIR' command will perform a 'buildbot stop' and
'buildbot start', and will attempt to wait for the buildbot process to shut
down in between. This is useful when you need to upgrade the code on your
buildmaster or buildslave and want to take it down for a minimum amount of
time.

*** build properties

Each build now has a set of named "Build Properties", which can be set by
steps and interpolated into ShellCommands. The 'revision' and 'got_revision'
properties are the most interesting ones available at this point, and can be
used e.g. to get the VC revision number into the filename of a generated
tarball. See the user's manual section entited "Build Properties" for more
details.

** minor features

*** IRC now takes password= argument

Useful for letting your bot claim a persistent identity.

*** svn_buildbot.py is easier to modify to understand branches
*** BuildFactory has a new .addStep method
*** p4poller has new arguments
*** new contrib scripts: viewcvspoll, svnpoller, svn_watcher

These poll an external VC repository to watch for changes, as opposed to
adding a hook script to the repository that pushes changes into the
buildmaster. This means higher latency but may be easier to configure,
especially if you do not have authority on the repository host.

*** VC build property 'got_revision'

The 'got_revision' property reports what revision a VC step actually
acquired, which may be useful to know when building from HEAD.

*** improved CSS in Waterfall

The Waterfall display has a few new class= tags, which may make it easier to
write custom CSS to make it look prettier.

*** robots_txt= argument in Waterfall

You can now pass a filename to the robots_txt= argument, which will be served
as the "robots.txt" file. This can be used to discourage search engine
spiders from crawling through the numerous build-status pages.

** bugfixes

*** tests more likely to pass on non-English systems

The unit test suite now sets $LANG='C' to make subcommands emit error
messages in english instead of whatever native language is in use on the
host. This improves the chances that the unit tests will pass on such
systems. This affects certain VC-related subcommands too.

test_vc was assuming that the system time was expressed with a numeric
timezone, which is not always the case, especially under windows. This
probably works better now than it did before. This only affects the CVS
tests.

'buildbot try' (for CVS) now uses UTC instead of the local timezone. The
'got_revision' property is also expressed in UTC. Both should help deal with
buggy versions of CVS that don't parse numeric timezones properly.


* Release 0.7.2 (17 Feb 2006)

** new features

*** all TCP port numbers in config file now accept a strports string

Sometimes it is useful to restrict certain TCP ports that the buildmaster
listens on to use specific network interfaces. In particular, if the
buildmaster and SVN repository live on the same machine, you may want to
restrict the PBChangeSource to only listen on the loopback interface,
insuring that no external entities can inject Changes into the buildbot.
Likewise, if you are using something like Apache's reverse-proxy feature to
provide access to the buildmaster's HTML status page, you might want to hide
the real Waterfall port by having it only bind to the loopback interface.

To accomplish this, use a string like "tcp:12345:interface=127.0.0.1" instead
of a number like 12345. These strings are called "strports specification
strings", and are documented in twisted's twisted.application.strports module
(you can probably type 'pydoc twisted.application.strports' to see this
documentation). Pretty much everywhere the buildbot takes a port number will
now accept a strports spec, and any bare numbers are translated into TCP port
numbers (listening on all network interfaces) for compatibility.

*** buildslave --umask control

Twisted's daemonization utility (/usr/bin/twistd) automatically sets the
umask to 077, which means that all files generated by both the buildmaster
and the buildslave will only be readable by the account under which the
respective daemon is running. This makes it unnecessarily difficult to share
build products (e.g. by symlinking ~/public_html/current_docs/ to a directory
within the slave's build directory where each build puts the results of a
"make docs" step).

The 'buildbot slave <PARAMS>' command now accepts a --umask argument, which
can be used to override the umask set by twistd. If you create the buildslave
with '--umask=022', then all build products will be world-readable, making it
easier for other processes (run under other accounts) to access them.

** bug fixes

The 0.7.1 release had a bug whereby reloading the config file could break all
configured Schedulers, causing them to raise an exception when new changes
arrived but not actually schedule a new build. This has been fixed.

Fixed a bug which caused the AnyBranchScheduler to explode when branch==None.
Thanks to Kevin Turner for the catch. I also think I fixed a bug whereby the
TryScheduler would explode when it was given a Change (which it is supposed
to simply ignore).

The Waterfall display now does more quoting of names (including Builder
names, BuildStep names, etc), so it is more likely that these names can
contain unusual characters like spaces, quotes, and slashes. There may still
be some problems with these kinds of names, however.. please report any bugs
to the mailing list.


* Release 0.7.1 (26 Nov 2005)

** new features

*** scheduler.Nightly

Dobes Vandermeer contributed a cron-style 'Nightly' scheduler. Unlike the
more-primitive Periodic class (which only lets you specify the duration
between build attempts), Nightly lets you schedule builds for specific times
of day, week, month, or year. The interface is very much like the crontab(5)
file. See the buildbot.scheduler.Nightly docstring for complete details.

** minor new features

*** step.Trial can work with Trial from Twisted >2.1.0

The 'Trial' step now accepts the trialMode= argument, which should be a list
of strings to be added to trial's argv array. This defaults to ["-to"], which
is appropriate for the Trial that ships in Twisted-2.1.0 and earlier, and
tells Trial to emit non-colorized verbose output. To use this step with
trials from later versions of Twisted, this should be changed to
["--reporter=bwverbose"].

In addition, you can now set other Trial command-line parameters through the
trialArgs= argument. This is a list of strings, and defaults to an empty list.

*** Added a 'resubmit this build' button to the web page

*** Make the VC-checkout step's description more useful

Added the word "[branch]" to the VC step's description (used in the Step's
box on the Waterfall page, among others) when we're checking out a
non-default branch. Also add "rNNN" where appropriate to indicate which
revision is being checked out. Thanks to Brad Hards and Nathaniel Smith for
the suggestion.

** bugs fixed

Several patches from Dobes Vandermeer: Escape the URLs in email, in case they
have spaces and such. Fill otherwise-empty <td> elements, as a workaround for
buggy browsers that might optimize them away. Also use binary mode when
opening status pickle files, to make windows work better. The
AnyBranchScheduler now works even when you don't provide a fileIsImportant=
argument.

Stringify the base revision before stuffing it into a 'try' jobfile, helping
SVN and Arch implement 'try' builds better. Thanks to Steven Walter for the
patch.

Fix the compare_attrs list in PBChangeSource, FreshCVSSource, and Waterfall.
Before this, certain changes to these objects in the master.cfg file were
ignored, such that you would have to stop and re-start the buildmaster to
make them take effect.

The config file is now loaded serially, shutting down old (or replaced)
Status/ChangeSource plugins before starting new ones. This fixes a bug in
which changing an aspect of, say, the Waterfall display would cause an
exception as both old and new instances fight over the same TCP port. This
should also fix a bug whereby new Periodic Schedulers could fire a build
before the Builders have finished being added.

There was a bug in the way Locks were handled when the config file was
reloaded: changing one Builder (but not the others) and reloading master.cfg
would result in multiple instances of the same Lock object, so the Locks
would fail to prevent simultaneous execution of Builds or Steps. This has
been fixed.

** other changes

For a long time, certain StatusReceiver methods (like buildStarted and
stepStarted) have been able to return another StatusReceiver instance
(usually 'self') to indicate that they wish to subscribe to events within the
new object. For example, if the buildStarted() method returns 'self', the
status receiver will also receive events for the new build, like
stepStarted() and buildETAUpdate(). Returning a 'self' from buildStarted() is
equivalent to calling build.subscribe(self).

Starting with buildbot-0.7.1, this auto-subscribe convenience will also
register to automatically unsubscribe the target when the build or step has
finished, just as if build.unsubscribe(self) had been called. Also, the
unsubscribe() method has been changed to not explode if the same receiver is
unsubscribed multiple times. (note that it will still explode is the same
receiver is *subscribed* multiple times, so please continue to refrain from
doing that).


* Release 0.7.0 (24 Oct 2005)

** new features

*** new c['schedulers'] config-file element (REQUIRED)

The code which decides exactly *when* a build is performed has been massively
refactored, enabling much more flexible build scheduling. YOU MUST UPDATE
your master.cfg files to match: in general this will merely require you to
add an appropriate c['schedulers'] entry. Any old ".treeStableTime" settings
on the BuildFactory instances will now be ignored. The user's manual has
complete details with examples of how the new Scheduler classes work.

*** c['interlocks'] removed, Locks and Dependencies now separate items

The c['interlocks'] config element has been removed, and its functionality
replaced with two separate objects. Locks are used to tell the buildmaster
that certain Steps or Builds should not run at the same time as other Steps
or Builds (useful for test suites that require exclusive access to some
external resource: of course the real fix is to fix the tests, because
otherwise your developers will be suffering from the same limitations). The
Lock object is created in the config file and then referenced by a Step
specification tuple or by the 'locks' key of the Builder specification
dictionary. Locks come in two flavors: MasterLocks are buildmaster-wide,
while SlaveLocks are specific to a single buildslave.

When you want to have one Build run or not run depending upon whether some
other set of Builds have passed or failed, you use a special kind of
Scheduler defined in the scheduler.Dependent class. This scheduler watches an
upstream Scheduler for builds of a given source version to complete, and only
fires off its own Builders when all of the upstream's Builders have built
that version successfully.

Both features are fully documented in the user's manual.

*** 'buildbot try'

The 'try' feature has finally been added. There is some configuration
involved, both in the buildmaster config and on the developer's side, but
once in place this allows the developer to type 'buildbot try' in their
locally-modified tree and to be given a report of what would happen if their
changes were to be committed. This works by computing a (base revision,
patch) tuple that describes the developer's tree, sending that to the
buildmaster, then running a build with that source on a given set of
Builders. The 'buildbot try' tool then emits status messages until the builds
have finished.

'try' exists to allow developers to run cross-platform tests on their code
before committing it, reducing the chances they will inconvenience other
developers by breaking the build. The UI is still clunky, but expect it to
change and improve over the next few releases.

Instructions for developers who want to use 'try' (and the configuration
changes necessary to enable its use) are in the user's manual.

*** Build-On-Branch

When suitably configured, the buildbot can be used to build trees from a
variety of related branches. You can set up Schedulers to build a tree using
whichever branch was last changed, or users can request builds of specific
branches through IRC, the web page, or (eventually) the CLI 'buildbot force'
subcommand.

The IRC 'force' command now takes --branch and --revision arguments (not that
they always make sense). Likewise the HTML 'force build' button now has an
input field for branch and revision. Your build's source-checkout step must
be suitably configured to support this: for SVN it involves giving both a
base URL and a default branch. Other VC systems are configured differently.
The ChangeSource must also provide branch information: the 'buildbot
sendchange' command now takes a --branch argument to help hook script writers
accomplish this.

*** Multiple slaves per Builder

You can now attach multiple buildslaves to each Builder. This can provide
redundancy or primitive load-balancing among many machines equally capable of
running the build. To use this, define a key in the Builder specification
dictionary named 'slavenames' with a list of buildslave names (instead of the
usual 'slavename' that contains just a single slavename).

*** minor new features

The IRC and email status-reporting facilities now provide more specific URLs
for particular builds, in addition to the generic buildmaster home page. The
HTML per-build page now has more information.

The Twisted-specific test classes have been modified to match the argument
syntax preferred by Trial as of Twisted-2.1.0 and newer. The generic trial
steps are still suitable for the Trial that comes with older versions of
Twisted, but may produce deprecation warnings or errors when used with the
latest Trial.

** bugs fixed

DNotify, used by the maildir-watching ChangeSources, had problems on some
64-bit systems relating to signed-vs-unsigned constants and the DN_MULTISHOT
flag. A workaround was provided by Brad Hards.

The web status page should now be valid XHTML, thanks to a patch by Brad
Hards. The charset parameter is specified to be UTF-8, so VC comments,
builder names, etc, should probably all be in UTF-8 to be displayed properly.

** creeping version dependencies

The IRC 'force build' command now requires python2.3 (for the shlex.split
function).


* Release 0.6.6 (23 May 2005)

** bugs fixed

The 'sendchange', 'stop', and 'sighup' subcommands were broken, simple bugs
that were not caught by the test suite. Sorry.

The 'buildbot master' command now uses "raw" strings to create .tac files
that will still function under windows (since we must put directory names
that contain backslashes into that file).

The keep-on-disk behavior added in 0.6.5 included the ability to upgrade old
in-pickle LogFile instances. This upgrade function was not added to the
HTMLLogFile class, so an exception would be raised when attempting to load or
display any build with one of these logs (which are normally used only for
showing build exceptions). This has been fixed.

Several unnecessary imports were removed, so the Buildbot should function
normally with just Twisted-2.0.0's "Core" module installed. (of course you
will need TwistedWeb, TwistedWords, and/or TwistedMail if you use status
targets that require them). The test suite should skip all tests that cannot
be run because of missing Twisted modules.

The master/slave's basedir is now prepended to sys.path before starting the
daemon. This used to happen implicitly (as a result of twistd's setup
preamble), but 0.6.5 internalized the invocation of twistd and did not copy
this behavior. This change restores the ability to access "private.py"-style
modules in the basedir from the master.cfg file with a simple "import
private" statement. Thanks to Thomas Vander Stichele for the catch.


* Release 0.6.5 (18 May 2005)

** deprecated config keys removed

The 'webPortnum', 'webPathname', 'irc', and 'manholePort' config-file keys,
which were deprecated in the previous release, have now been removed. In
addition, Builders must now always be configured with dictionaries: the
support for configuring them with tuples has been removed.

** master/slave creation and startup changed

The buildbot no longer uses .tap files to store serialized representations of
the buildmaster/buildslave applications. Instead, this release now uses .tac
files, which are human-readable scripts that create new instances (rather
than .tap files, which were pickles of pre-created instances). 'mktap
buildbot' is gone.

You will need to update your buildbot directories to handle this. The
procedure is the same as creating a new buildmaster or buildslave: use
'buildbot master BASEDIR' or 'buildbot slave BASEDIR ARGS..'. This will
create a 'buildbot.tac' file in the target directory. The 'buildbot start
BASEDIR' will use twistd to start the application.

The 'buildbot start' command now looks for a Makefile.buildbot, and if it
finds one (and /usr/bin/make exists), it will use it to start the application
instead of calling twistd directly. This allows you to customize startup,
perhaps by adding environment variables. The setup commands create a sample
file in Makefile.sample, but you must copy this to Makefile.buildbot to
actually use it. The previous release looked for a bare 'Makefile', and also
installed a 'Makefile', so you were always using the customized approach,
even if you didn't ask for it. That old Makefile launched the .tap file, so
changing names was also necessary to make sure that the new 'buildbot start'
doesn't try to run the old .tap file.

'buildbot stop' now uses os.kill instead of spawning an external process,
making it more likely to work under windows. It waits up to 5 seconds for the
daemon to go away, so you can now do 'buildbot stop BASEDIR; buildbot start
BASEDIR' with less risk of launching the new daemon before the old one has
fully shut down. Likewise, 'buildbot start' imports twistd's internals
directly instead of spawning an external copy, so it should work better under
windows.

** new documentation

All of the old Lore-based documents were converted into a new Texinfo-format
manual, and considerable new text was added to describe the installation
process. The docs are not yet complete, but they're slowly shaping up to form
a proper user's manual.

** new features

Arch checkouts can now use precise revision stamps instead of always using
the latest revision. A separate Source step for using Bazaar (an alternative
Arch client) instead of 'tla' was added. A Source step for Cogito (the new
linux kernel VC system) was contributed by Brandon Philips. All Source steps
now accept a retry= argument to indicate that failing VC checkouts should be
retried a few times (SF#1200395), note that this requires an updated
buildslave.

The 'buildbot sendchange' command was added, to be used in VC hook scripts to
send changes at a pb.PBChangeSource . contrib/arch_buildbot.py was added to
use this tool; it should be installed using the 'Arch meta hook' scheme.

Changes can now accept a branch= parameter, and Builders have an
isBranchImportant() test that acts like isFileImportant(). Thanks to Thomas
Vander Stichele. Note: I renamed his tag= to branch=, in anticipation of an
upcoming feature to build specific branches. "tag" seemed too CVS-centric.

LogFiles have been rewritten to stream the incoming data directly to disk
rather than keeping a copy in memory all the time (SF#1200392). This
drastically reduces the buildmaster's memory requirements and makes 100MB+
log files feasible. The log files are stored next to the serialized Builds,
in files like BASEDIR/builder-dir/12-log-compile-output, so you'll want a
cron job to delete old ones just like you do with old Builds. Old-style
Builds from 0.6.4 and earlier are converted when they are first read, so the
first load of the Waterfall display after updating to this release may take
quite some time.

** build process updates

BuildSteps can now return a status of EXCEPTION, which terminates the build
right away. This allows exceptions to be caught right away, but still make
sure the build stops quickly.

** bug fixes

Some more windows incompatibilities were fixed. The test suite now has two
failing tests remaining, both of which appear to be Twisted issues that
should not affect normal operation.

The test suite no longer raises any deprecation warnings when run against
twisted-2.0 (except for the ones which come from Twisted itself).


* Release 0.6.4 (28 Apr 2005)

** major bugs fixed

The 'buildbot' tool in 0.6.3, when used to create a new buildmaster, failed
unless it found a 'changes.pck' file. As this file is created by a running
buildmaster, this made 0.6.3 completely unusable for first-time
installations. This has been fixed.

** minor bugs fixed

The IRC bot had a bug wherein asking it to watch a certain builder (the "I'll
give a shout when the build finishes" message) would cause an exception, so
it would not, in fact, shout. The HTML page had an exception in the "change
sources" page (reached by following the "Changes" link at the top of the
column that shows the names of commiters). Re-loading the config file while
builders were already attached would result in a benign error message. The
server side of the PBListener status client had an exception when providing
information about a non-existent Build (e.g., when the client asks for the
Build that is currently running, and the server says "None").

These bugs have all been fixed.

The unit tests now pass under python2.2; they were failing before because of
some 2.3isms that crept in. More unit tests which failed under windows now
pass, only one (test_webPathname_port) is still failing.

** 'buildbot' tool looks for a .buildbot/options file

The 'statusgui' and the 'debugclient' subcommands can both look for a
.buildbot/ directory, and an 'options' file therein, to extract default
values for the location of the buildmaster. This directory is searched in the
current directory, its parent, etc, all the way up to the filesystem root
(assuming you own the directories in question). It also look in ~/.buildbot/
for this file. This feature allows you to put a .buildbot at the top of your
working tree, telling any 'buildbot' invocations you perform therein how to
get to the buildmaster associated with that tree's project.

Windows users get something similar, using %APPDATA%/buildbot instead of
~/.buildbot .

** windows ShellCommands are launched with 'cmd.exe'

The buildslave has been modified to run all list-based ShellCommands by
prepending [os.environ['COMSPEC'], '/c'] to the argv list before execution.
This should allow the buildslave's PATH to be searched for commands,
improving the chances that it can run the same 'trial -o foo' commands as a
unix buildslave. The potential downside is that spaces in argv elements might
be re-parsed, or quotes might be re-interpreted. The consensus on the mailing
list was that this is a useful thing to do, but please report any problems
you encounter with it.

** minor features

The Waterfall display now shows the buildbot's home timezone at the top of
the timestamp column. The default favicon.ico is now much nicer-looking (it
is generated with Blender.. the icon.blend file is available in CVS in
docs/images/ should you care to play with it).



* Release 0.6.3 (25 Apr 2005)

** 'buildbot' tool gets more uses

The 'buildbot' executable has acquired three new subcommands. 'buildbot
debugclient' brings up the small remote-control panel that connects to a
buildmaster (via the slave port and the c['debugPassword']). This tool,
formerly in contrib/debugclient.py, lets you reload the config file, force
builds, and simulate inbound commit messages. It requires gtk2, glade, and
the python bindings for both to be installed.

'buildbot statusgui' brings up a live status client, formerly available by
running buildbot/clients/gtkPanes.py as a program. This connects to the PB
status port that you create with:

  c['status'].append(client.PBListener(portnum))

and shows two boxes per Builder, one for the last build, one for current
activity. These boxes are updated in realtime. The effect is primitive, but
is intended as an example of what's possible with the PB status interface.

'buildbot statuslog' provides a text-based running log of buildmaster events.

Note: command names are subject to change. These should get much more useful
over time.

** web page has a favicon

When constructing the html.Waterfall instance, you can provide the filename
of an image that will be provided when the "favicon.ico" resource is
requested. Many web browsers display this as an icon next to the URL or
bookmark. A goofy little default icon is included.

** web page has CSS

Thanks to Thomas Vander Stichele, the Waterfall page is now themable through
CSS. The default CSS is located in buildbot/status/classic.css, and creates a
page that is mostly identical to the old, non-CSS based table.

You can specify a different CSS file to use by passing it as the css=
argument to html.Waterfall(). See the docstring for Waterfall for some more
details.

** builder "categories"

Thomas has added code which places each Builder in an optional "category".
The various status targets (Waterfall, IRC, MailNotifier) can accept a list
of categories, and they will ignore any activity in builders outside this
list. This makes it easy to create some Builders which are "experimental" or
otherwise not yet ready for the world to see, or indicate that certain
builders should not harass developers when their tests fail, perhaps because
the build slaves for them are not yet fully functional.

** Deprecated features

*** defining Builders with tuples is deprecated

For a long time, the preferred way to define builders in the config file has
been with a dictionary. The less-flexible old style of a 4-item tuple (name,
slavename, builddir, factory) is now officially deprecated (i.e., it will
emit a warning if you use it), and will be removed in the next release.
Dictionaries are more flexible: additional keys like periodicBuildTime are
simply unavailable to tuple-defined builders.

Note: it is a good idea to watch the logfile (usually in twistd.log) when you
first start the buildmaster, or whenever you reload the config file. Any
warnings or errors in the config file will be found there.

*** c['webPortnum'], c['webPathname'], c['irc'] are deprecated

All status reporters should be defined in the c['status'] array, using
buildbot.status.html.Waterfall or buildbot.status.words.IRC . These have been
deprecated for a while, but this is fair warning that these keys will be
removed in the next release.

*** c['manholePort'] is deprecated

Again, this has been deprecated for a while, in favor of:

 c['manhole'] = master.Manhole(port, username, password)

The preferred syntax will eventually let us use other, better kinds of debug
shells, such as the experimental curses-based ones in the Twisted sandbox
(which would offer command-line editing and history).

** bug fixes

The waterfall page has been improved a bit. A circular-reference bug in the
web page's TextLog class was fixed, which caused a major memory leak in a
long-running buildmaster with large logfiles that are viewed frequently.
Modifying the config file in a way which only changed a builder's base
directory now works correctly. The 'buildbot' command tries to create
slightly more useful master/slave directories, adding a Makefile entry to
re-create the .tap file, and removing global-read permissions from the files
that may contain buildslave passwords.

** twisted-2.0.0 compatibility

Both buildmaster and buildslave should run properly under Twisted-2.0 . There
are still some warnings about deprecated functions, some of which could be
fixed, but there are others that would require removing compatibility with
Twisted-1.3, and I don't expect to do that until 2.0 has been out and stable
for at least several months. The unit tests should pass under 2.0, whereas
the previous buildbot release had tests which could hang when run against the
new "trial" framework in 2.0.

The Twisted-specific steps (including Trial) have been updated to match 2.0
functionality.

** win32 compatibility

Thankt to Nick Trout, more compatibility fixes have been incorporated,
improving the chances that the unit tests will pass on windows systems. There
are still some problems, and a step-by-step "running buildslaves on windows"
document would be greatly appreciated.

** API docs

Thanks to Thomas Vander Stichele, most of the docstrings have been converted
to epydoc format. There is a utility in docs/gen-reference to turn these into
a tree of cross-referenced HTML pages. Eventually these docs will be
auto-generated and somehow published on the buildbot web page.



* Release 0.6.2 (13 Dec 2004)

** new features

It is now possible to interrupt a running build. Both the web page and the
IRC bot feature 'stop build' commands, which can be used to interrupt the
current BuildStep and accelerate the termination of the overall Build. The
status reporting for these still leaves something to be desired (an
'interrupt' event is pushed into the column, and the reason for the interrupt
is added to a pseudo-logfile for the step that was stopped, but if you only
look at the top-level status it appears that the build failed on its own).

Builds are also halted if the connection to the buildslave is lost. On the
slave side, any active commands are halted if the connection to the
buildmaster is lost.

** minor new features

The IRC log bot now reports ETA times in a MMSS format like "2m45s" instead
of the clunky "165 seconds".

** bug fixes

*** Slave Disconnect

Slave disconnects should be handled better now: the current build should be
abandoned properly. Earlier versions could get into weird states where the
build failed to finish, clogging the builder forever (or at least until the
buildmaster was restarted).

In addition, there are weird network conditions which could cause a
buildslave to attempt to connect twice to the same buildmaster. This can
happen when the slave is sending large logfiles over a slow link, while using
short keepalive timeouts. The buildmaster has been fixed to allow the second
connection attempt to take precedence over the first, so that the older
connection is jettisoned to make way for the newer one.

In addition, the buildslave has been fixed to be less twitchy about timeouts.
There are now two parameters: keepaliveInterval (which is controlled by the
mktap 'keepalive' argument), and keepaliveTimeout (which requires editing the
.py source to change from the default of 30 seconds). The slave expects to
see *something* from the master at least once every keepaliveInterval
seconds, and will try to provoke a response (by sending a keepalive request)
'keepaliveTimeout' seconds before the end of this interval just in case there
was no regular traffic. Any kind of traffic will qualify, including
acknowledgements of normal build-status updates.

The net result is that, as long as any given PB message can be sent over the
wire in less than 'keepaliveTimeout' seconds, the slave should not mistakenly
disconnect because of a timeout. There will be traffic on the wire at least
every 'keepaliveInterval' seconds, which is what you want to pay attention to
if you're trying to keep an intervening NAT box from dropping what it thinks
is an abandoned connection. A quiet loss of connection will be detected
within 'keepaliveInterval' seconds.

*** Large Logfiles

The web page rendering code has been fixed to deliver large logfiles in
pieces, using a producer/consumer apparatus. This avoids the large spike in
memory consumption when the log file body was linearized into a single string
and then buffered in the socket's application-side transmit buffer. This
should also avoid the 640k single-string limit for web.distrib servers that
could be hit by large (>640k) logfiles.



* Release 0.6.1 (23 Nov 2004)

** win32 improvements/bugfixes

Several changes have gone in to improve portability to non-unix systems. It
should be possible to run a build slave under windows without major issues
(although step-by-step documentation is still greatly desired: check the
mailing list for suggestions from current win32 users).

*** PBChangeSource: use configurable directory separator, not os.sep

The PBChangeSource, which listens on a TCP socket for change notices
delivered from tools like contrib/svn_buildbot.py, was splitting source
filenames with os.sep . This is inappropriate, because those file names are
coming from the VC repository, not the local filesystem, and the repository
host may be running a different OS (with a different separator convention)
than the buildmaster host. In particular, a win32 buildmaster using a CVS
repository running on a unix box would be confused.

PBChangeSource now takes a sep= argument to indicate the separator character
to use.

*** build saving should work better

windows cannot do the atomic os.rename() trick that unix can, so under win32
the buildmaster falls back to save/delete-old/rename, which carries a slight
risk of losing a saved build log (if the system were to crash between the
delete-old and the rename).

** new features

*** test-result tracking

Work has begun on fine-grained test-result handling. The eventual goal is to
be able to track individual tests over time, and create problem reports when
a test starts failing (which then are resolved when the test starts passing
again). The first step towards this is an ITestResult interface, and code in
the TrialTestParser to create such results for all non-passing tests (the
ones for which Trial emits exception tracebacks).

These test results are currently displayed in a tree-like display in a page
accessible from each Build's page (follow the numbered link in the yellow
box at the start of each build to get there).

This interface is still in flux, as it really wants to be able to accomodate
things like compiler warnings and tests that are skipped because of missing
libraries or unsupported architectures.

** bug fixes

*** VC updates should survive temporary failures

Some VC systems (CVS and SVN in particular) get upset when files are turned
into directories or vice versa, or when repository items are moved without
the knowledge of the VC system. The usual symptom is that a 'cvs update'
fails where a fresh checkout succeeds.

To avoid having to manually intervene, the build slaves' VC commands have
been refactored to respond to update failures by deleting the tree and
attempting a full checkout. This may cause some unnecessary effort when,
e.g., the CVS server falls off the net, but in the normal case it will only
come into play when one of these can't-cope situations arises.

*** forget about an existing build when the slave detaches

If the slave was lost during a build, the master did not clear the
.currentBuild reference, making that builder unavailable for later builds.
This has been fixed, so that losing a slave should be handled better. This
area still needs some work, I think it's still possible to get both the
slave and the master wedged by breaking the connection at just the right
time. Eventually I want to be able to resume interrupted builds (especially
when the interruption is the result of a network failure and not because the
slave or the master actually died).

*** large logfiles now consume less memory

Build logs are stored as lists of (type,text) chunks, so that
stdout/stderr/headers can be displayed differently (if they were
distinguishable when they were generated: stdout and stderr are merged when
usePTY=1). For multi-megabyte logfiles, a large list with many short strings
could incur a large overhead. The new behavior is to merge same-type string
chunks together as they are received, aiming for a chunk size of about 10kb,
which should bring the overhead down to a more reasonable level.

There remains an issue with actually delivering large logfiles over, say,
the HTML interface. The string chunks must be merged together into a single
string before delivery, which causes a spike in the memory usage when the
logfile is viewed. This can also break twisted.web.distrib -type servers,
where the underlying PB protocol imposes a 640k limit on the size of
strings. This will be fixed (with a proper Producer/Consumer scheme) in the
next release.


* Release 0.6.0 (30 Sep 2004)

** new features

*** /usr/bin/buildbot control tool

There is now an executable named 'buildbot'. For now, this just provides a
convenient front-end to mktap/twistd/kill, but eventually it will provide
access to other client functionality (like the 'try' builds, and a status
client). Assuming you put your buildbots in /var/lib/buildbot/master/FOO,
you can do 'buildbot create-master /var/lib/buildbot/master/FOO' and it will
create the .tap file and set up a sample master.cfg for you. Later,
'buildbot start /var/lib/buildbot/master/FOO' will start the daemon.


*** build status now saved in external files, -shutdown.tap unnecessary

The status rewrite included a change to save all build status in a set of
external files. These files, one per build, are put in a subdirectory of the
master's basedir (named according to the 'builddir' parameter of the Builder
configuration dictionary). This helps keep the buildmaster's memory
consumption small: the (potentially large) build logs are kept on disk
instead of in RAM. There is a small cache (2 builds per builder) kept in
memory, but everything else lives on disk.

The big change is that the buildmaster now keeps *all* status in these
files. It is no longer necessary to preserve the buildbot-shutdown.tap file
to run a persistent buildmaster. The buildmaster may be launched with
'twistd -f buildbot.tap' each time, in fact the '-n' option can be added to
prevent twistd from automatically creating the -shutdown.tap file.

There is still one lingering bug with this change: the Expectations object
for each builder (which records how long the various steps took, to provide
an ETA value for the next time) is not yet saved. The result is that the
first build after a restart will not provide an ETA value.

0.6.0 keeps status in a single file per build, as opposed to 0.5.0 which
kept status in many subdirectories (one layer for builds, another for steps,
and a third for logs). 0.6.0 will detect and delete these subdirectories as
it overwrites them.

The saved builds are optional. To prevent disk usage from growing without
bounds, you may want to set up a cron job to run 'find' and delete any which
are too old. The status displays will happily survive without those saved
build objects.

The set of recorded Changes is kept in a similar file named 'changes.pck'.


*** source checkout now uses timestamp/revision

Source checkouts are now performed with an appropriate -D TIMESTAMP (for
CVS) or -r REVISION (for SVN) marker to obtain the exact sources that were
specified by the most recent Change going into the current Build. This
avoids a race condition in which a change might be committed after the build
has started but before the source checkout has completed, resulting in a
mismatched set of source files. Such changes are now ignored.

This works by keeping track of repository-wide revision/transaction numbers
(for version control systems that offer them, like SVN). The checkout or
update is performed with the highest such revision number. For CVS (which
does not have them), the timestamp of each commit message is used, and a -D
argument is created to place the checkout squarely in the middle of the "tree
stable timer"'s window.

This also provides the infrastructure for the upcoming 'try' feature. All
source-checkout commands can now obtain a base revision marker and a patch
from the Build, allowing certain builds to be performed on something other
than the most recent sources.

See source.xhtml and steps.xhtml for details.


*** Darcs and Arch support added

There are now build steps which retrieve a source tree from Darcs and Arch
repositories. See steps.xhtml for details.

Preliminary P4 support has been added, thanks to code from Dave Peticolas.
You must manually set up each build slave with an appropriate P4CLIENT: all
buildbot does is run 'p4 sync' at the appropriate times.


*** Status reporting rewritten

Status reporting was completely revamped. The config file now accepts a
BuildmasterConfig['status'] entry, with a list of objects that perform status
delivery. The old config file entries which controlled the web status port
and the IRC bot have been deprecated in favor of adding instances to
['status']. The following status-delivery classes have been implemented, all
in the 'buildbot.status' package:

 client.PBListener(port, username, passwd)
 html.Waterfall(http_port, distrib_port)
 mail.MailNotifier(fromaddr, mode, extraRecipients..)
 words.IRC(host, nick, channels)

See the individual docstrings for details about how to use each one. You can
create new status-delivery objects by following the interfaces found in the
buildbot.interfaces module.


*** BuildFactory configuration process changed

The basic BuildFactory class is now defined in buildbot.process.factory
rather than buildbot.process.base, so you will have to update your config
files. factory.BuildFactory is the base class, which accepts a list of Steps
to run. See docs/factories.xhtml for details.

There are now easier-to-use BuildFactory classes for projects which use GNU
Autoconf, perl's MakeMaker (CPAN), python's distutils (but no unit tests),
and Twisted's Trial. Each one takes a separate 'source' Step to obtain the
source tree, and then fills in the rest of the Steps for you.


*** CVS/SVN VC steps unified, simplified

The confusing collection of arguments for the CVS step ('clobber=',
'copydir=', and 'export=') have been removed in favor of a single 'mode'
argument. This argument describes how you want to use the sources: whether
you want to update and compile everything in the same tree (mode='update'),
or do a fresh checkout and full build each time (mode='clobber'), or
something in between.

The SVN (Subversion) step has been unified and accepts the same mode=
parameter as CVS. New version control steps will obey the same interface.

Most of the old configuration arguments have been removed. You will need to
update your configuration files to use the new arguments. See
docs/steps.xhtml for a description of all the new parameters.


*** Preliminary Debian packaging added

Thanks to the contributions of Kirill Lapshin, we can now produce .deb
installer packages. These are still experimental, but they include init.d
startup/shutdown scripts, which the the new /usr/bin/buildbot to invoke
twistd. Create your buildmasters in /var/lib/buildbot/master/FOO, and your
slaves in /var/lib/buildbot/slave/BAR, then put FOO and BAR in the
appropriate places in /etc/default/buildbot . After that, the buildmasters
and slaves will be started at every boot.

Pre-built .debs are not yet distributed. Use 'debuild -uc -us' from the
source directory to create them.


** minor features


*** Source Stamps

Each build now has a "source stamp" which describes what sources it used. The
idea is that the sources for this particular build can be completely
regenerated from the stamp. The stamp is a tuple of (revision, patch), where
the revision depends on the VC system being used (for CVS it is either a
revision tag like "BUILDBOT-0_5_0" or a datestamp like "2004/07/23", for
Subversion it is a revision number like 11455). This must be combined with
information from the Builder that is constant across all builds (something to
point at the repository, and possibly a branch indicator for CVS and other VC
systems that don't fold this into the repository string).

The patch is an optional unified diff file, ready to be applied by running
'patch -p0 <PATCH' from inside the workdir. This provides support for the
'try' feature that will eventually allow developers to run buildbot tests on
their code before checking it in.


*** SIGHUP causes the buildmaster's configuration file to be re-read

*** IRC bot now has 'watch' command

You can now tell the buildbot's IRC bot to 'watch <buildername>' on a builder
which is currently performing a build. When that build is finished, the
buildbot will make an announcement (including the results of the build).

The IRC 'force build' command will also announce when the resulting build has
completed.


*** the 'force build' option on HTML and IRC status targets can be disabled

The html.Waterfall display and the words.IRC bot may be constructed with an
allowForce=False argument, which removes the ability to force a build through
these interfaces. Future versions will be able to restrict this build-forcing
capability to authenticated users. The per-builder HTML page no longer
displays the 'Force Build' buttons if it does not have this ability. Thanks
to Fred Drake for code and design suggestions.


*** master now takes 'projectName' and 'projectURL' settings

These strings allow the buildbot to describe what project it is working for.
At the moment they are only displayed on the Waterfall page, but in the next
release they will be retrieveable from the IRC bot as well.


*** survive recent (SVN) Twisted versions

The buildbot should run correctly (albeit with plenty of noisy deprecation
warnings) under the upcoming Twisted-2.0 release.


*** work-in-progress realtime Trial results acquisition

Jonathan Simms (<slyphon>) has been working on 'retrial', a rewrite of
Twisted's unit test framework that will most likely be available in
Twisted-2.0 . Although it is not yet complete, the buildbot will be able to
use retrial in such a way that build status is reported on a per-test basis,
in real time. This will be the beginning of fine-grained test tracking and
Problem management, described in docs/users.xhtml .


* Release 0.5.0 (22 Jul 2004)

** new features

*** web.distrib servers via TCP

The 'webPathname' config option, which specifies a UNIX socket on which to
publish the waterfall HTML page (for use by 'mktap web -u' or equivalent),
now accepts a numeric port number. This publishes the same thing via TCP,
allowing the parent web server to live on a separate machine.

This config option could be named better, but it will go away altogether in
a few releases, when status delivery is unified. It will be replaced with a
WebStatusTarget object, and the config file will simply contain a list of
various kinds of status targets.

*** 'master.cfg' filename is configurable

The buildmaster can use a config file named something other than
"master.cfg". Use the --config=foo.cfg option to mktap to control this.

*** FreshCVSSource now uses newcred (CVSToys >= 1.0.10)

The FreshCVSSource class now defaults to speaking to freshcvs daemons from
modern CVSToys releases. If you need to use the buildbot with a daemon from
CVSToys-1.0.9 or earlier, use FreshCVSSourceOldcred instead. Note that the
new form only requires host/port/username/passwd: the "serviceName"
parameter is no longer meaningful.

*** Builders are now configured with a dictionary, not a tuple

The preferred way to set up a Builder in master.cfg is to provide a
dictionary with various keys, rather than a (non-extensible) 4-tuple. See
docs/config.xhtml for details. The old tuple-way is still supported for now,
it will probably be deprecated in the next release and removed altogether in
the following one.

*** .periodicBuildTime is now exposed to the config file

To set a builder to run at periodic intervals, simply add a
'periodicBuildTime' key to its master.cfg dictionary. Again, see
docs/config.xhtml for details.

*** svn_buildbot.py adds --include, --exclude

The commit trigger script now gives you more control over which files are
sent to the buildmaster and which are not.

*** usePTY is controllable at slave mktap time

The buildslaves usually run their child processes in a pty, which creates a
process group for all the children, which makes it much easier to kill them
all at once (i.e. if a test hangs). However this causes problems on some
systems. Rather than hacking slavecommand.py to disable the use of these
ptys, you can now create the slave's .tap file with --usepty=0 at mktap
time.

** Twisted changes

A summary of warnings (e.g. DeprecationWarnings) is provided as part of the
test-case summarizer. The summarizer also counts Skips, expectedFailures,
and unexpectedSuccesses, displaying the counts on the test step's event box.

The RunUnitTests step now uses "trial -R twisted" instead of "trial
twisted.test", which is a bit cleaner. All .pyc files are deleted before
starting trial, to avoid getting tripped up by deleted .py files.

** documentation

docs/config.xhtml now describes the syntax and allowed contents of the
'master.cfg' configuration file.

** bugfixes

Interlocks had a race condition that could cause the lock to get stuck
forever.

FreshCVSSource has a prefix= argument that was moderately broken (it used to
only work if the prefix was a single directory component). It now works with
subdirectories.

The buildmaster used to complain when it saw the "info" directory in a
slave's workspace. This directory is used to publish information about the
slave host and its administrator, and is not a leftover build directory as
the complaint suggested. This complain has been silenced.


* Release 0.4.3 (30 Apr 2004)

** PBChangeSource made explicit

In 0.4.2 and before, an internal interface was available which allowed
special clients to inject changes into the Buildmaster. This interface is
used by the contrib/svn_buildbot.py script. The interface has been extracted
into a proper PBChangeSource object, which should be created in the
master.cfg file just like the other kinds of ChangeSources. See
docs/sources.xhtml for details.

If you were implicitly using this change source (for example, if you use
Subversion and the svn_buildbot.py script), you *must* add this source to
your master.cfg file, or changes will not be delivered and no builds will be
triggered.

The PBChangeSource accepts the same "prefix" argument as all other
ChangeSources. For a SVN repository that follows the recommended practice of
using "trunk/" for the trunk revisions, you probably want to construct the
source like this:

 source = PBChangeSource(prefix="trunk")

to make sure that the Builders are given sensible (trunk-relative)
filenames for each changed source file.

** Twisted changes

*** step_twisted.RunUnitTests can change "bin/trial"

The twisted RunUnitTests step was enhanced to let you run something other
than "bin/trial", making it easier to use a buildbot on projects which use
Twisted but aren't actually Twisted itself.

*** Twisted now uses Subversion

Now that Twisted has moved from CVS to SVN, the Twisted build processes have
been modified to perform source checkouts from the Subversion repository.

** minor feature additions

*** display Changes with HTML

Changes are displayed with a bit more pizazz, and a links= argument was
added to allow things like ViewCVS links to be added to the display
(although it is not yet clear how this argument should be used: the
interface remains subject to change untill it has been documented).

*** display ShellCommand logs with HTML

Headers are in blue, stderr is in red (unless usePTY=1 in which case stderr
and stdout are indistinguishable). A link is provided which returns the same
contents as plain text (by appending "?text=1" to the URL).

*** buildslaves send real tracebacks upon error

The .unsafeTracebacks option has been turned on for the buildslaves,
allowing them to send a full stack trace when an exception occurs, which is
logged in the buildmaster's twistd.log file. This makes it much easier to
determine what went wrong on the slave side.

*** BasicBuildFactory refactored

The BasicBuildFactory class was refactored to make it easier to create
derivative classes, in particular the BasicSVN variant.

*** "ping buildslave" web button added

There is now a button on the "builder information" page that lets a web user
initiate a ping of the corresponding build slave (right next to the button
that lets them force a build). This was added to help track down a problem
with the slave keepalives.

** bugs fixed:

You can now have multiple BuildSteps with the same name (the names are used
as hash keys in the data structure that helps determine ETA values for each
step, the new code creates unique key names if necessary to avoid
collisions). This means that, for example, you do not have to create a
BuildStep subclass just to have two Compile steps in the same process.

If CVSToys is not installed, the tests that depend upon it are skipped.

Some tests in 0.4.2 failed because of a missing set of test files, they are
now included in the tarball properly.

Slave keepalives should work better now in the face of silent connection
loss (such as when an intervening NAT box times out the association), the
connection should be reestablished in minutes instead of hours.

Shell commands on the slave are invoked with an argument list instead of the
ugly and error-prone split-on-spaces approach. If the ShellCommand is given
a string (instead of a list), it will fall back to splitting on spaces.
Shell commands should work on win32 now (using COMSPEC instead of /bin/sh).

Buildslaves under w32 should theoretically work now, and one was running for
the Twisted buildbot for a while until the machine had to be returned.

The "header" lines in ShellCommand logs (which include the first line, that
displays the command being run, and the last, which shows its exit status)
are now generated by the buildslave side instead of the local (buildmaster)
side. This can provide better error handling and is generally cleaner.
However, if you have an old buildslave (running 0.4.2 or earlier) and a new
buildmaster, then neither end will generate these header lines.

CVSCommand was improved, in certain situations 0.4.2 would perform
unnecessary checkouts (when an update would have sufficed). Thanks to Johan
Dahlin for the patches. The status output was fixed as well, so that
failures in CVS and SVN commands (such as not being able to find the 'svn'
executable) make the step status box red.

Subversion support was refactored to make it behave more like CVS. This is a
work in progress and will be improved in the next release.


* Release 0.4.2 (08 Jan 2004)

** test suite updated

The test suite has been completely moved over to Twisted's "Trial"
framework, and all tests now pass. To run the test suite (consisting of 64
tests, probably covering about 30% of BuildBot's logic), do this:

 PYTHONPATH=. trial -v buildbot.test

** Mail parsers updated

Several bugs in the mail-parsing code were fixed, allowing a buildmaster to
be triggered by mail sent out by a CVS repository. (The Twisted Buildbot is
now using this to trigger builds, as their CVS server machine is having some
difficulties with FreshCVS). The FreshCVS mail format for directory
additions appears to have changed recently: the new parser should handle
both old and new-style messages.

A parser for Bonsai commit messages (buildbot.changes.mail.parseBonsaiMail)
was contributed by Stephen Davis. Thanks Stephen!

** CVS "global options" now available

The CVS build step can now accept a list of "global options" to give to the
cvs command. These go before the "update"/"checkout" word, and are described
fully by "cvs --help-options". Two useful ones might be "-r", which causes
checked-out files to be read-only, and "-R", which assumes the repository is
read-only (perhaps by not attempting to write to lock files).


* Release 0.4.1 (09 Dec 2003)

** MaildirSources fixed

Several bugs in MaildirSource made them unusable. These have been fixed (for
real this time). The Twisted buildbot is using an FCMaildirSource while they
fix some FreshCVS daemon problems, which provided the encouragement for
getting these bugs fixed.

In addition, the use of DNotify (only available under linux) was somehow
broken, possibly by changes in some recent version of Python. It appears to
be working again now (against both python-2.3.3c1 and python-2.2.1).

** master.cfg can use 'basedir' variable

As documented in the sample configuration file (but not actually implemented
until now), a variable named 'basedir' is inserted into the namespace used
by master.cfg . This can be used with something like:

  os.path.join(basedir, "maildir")

to obtain a master-basedir-relative location.


* Release 0.4.0 (05 Dec 2003)

** newapp

I've moved the codebase to Twisted's new 'application' framework, which
drastically cleans up service startup/shutdown just like newcred did for
authorization. This is mostly an internal change, but the interface to
IChangeSources was modified, so in the off chance that someone has written a
custom change source, it may have to be updated to the new scheme.

The most user-visible consequence of this change is that now both
buildmasters and buildslaves are generated with the standard Twisted 'mktap'
utility. Basic documentation is in the README file.

Both buildmaster and buildslave .tap files need to be re-generated to run
under the new code. I have not figured out the styles.Versioned upgrade path
well enough to avoid this yet. Sorry.

This also means that both buildslaves and the buildmaster require
Twisted-1.1.0 or later.

** reloadable master.cfg

Most aspects of a buildmaster is now controlled by a configuration file
which can be re-read at runtime without losing build history. This feature
makes the buildmaster *much* easier to maintain.

In the previous release, you would create the buildmaster by writing a
program to define the Builders and ChangeSources and such, then run it to
create the .tap file. In the new release, you use 'mktap' to create the .tap
file, and the only parameter you give it is the base directory to use. Each
time the buildmaster starts, it will look for a file named 'master.cfg' in
that directory and parse it as a python script. That script must define a
dictionary named 'BuildmasterConfig' with various keys to define the
builders, the known slaves, what port to use for the web server, what IRC
channels to connect to, etc.

This config file can be re-read at runtime, and the buildmaster will compute
the differences and add/remove services as necessary. The re-reading is
currently triggered through the debug port (contrib/debugclient.py is the
debug port client), but future releases will add the ability to trigger the
reconfiguration by IRC command, web page button, and probably a local UNIX
socket (with a helper script to trigger a rebuild locally).

docs/examples/twisted_master.cfg contains a sample configuration file, which
also lists all the keys that can be set.

There may be some bugs lurking, such as re-configuring the buildmaster while
a build is running. It needs more testing.

** MaxQ support

Radix contributed some support scripts to run MaxQ test scripts. MaxQ
(http://maxq.tigris.org/) is a web testing tool that allows you to record
HTTP sessions and play them back.

** Builders can now wait on multiple Interlocks

The "Interlock" code has been enhanced to allow multiple builders to wait on
each one. This was done to support the new config-file syntax for specifying
Interlocks (in which each interlock is a tuple of A and [B], where A is the
builder the Interlock depends upon, and [B] is a list of builders that
depend upon the Interlock).

"Interlock" is misnamed. In the next release it will be changed to
"Dependency", because that's what it really expresses. A new class (probably
called Interlock) will be created to express the notion that two builders
should not run at the same time, useful when multiple builders are run on
the same machine and thrashing results when several CPU- or disk- intensive
compiles are done simultaneously.

** FreshCVSSource can now handle newcred-enabled FreshCVS daemons

There are now two FreshCVSSource classes: FreshCVSSourceNewcred talks to
newcred daemons, and FreshCVSSourceOldcred talks to oldcred ones. Mind you,
FreshCVS doesn't yet do newcred, but when it does, we'll be ready.

'FreshCVSSource' maps to the oldcred form for now. That will probably change
when the current release of CVSToys supports newcred by default.

** usePTY=1 on posix buildslaves

When a buildslave is running under POSIX (i.e. pretty much everything except
windows), child processes are created with a pty instead of separate
stdin/stdout/stderr pipes. This makes it more likely that a hanging build
(when killed off by the timeout code) will have all its sub-childred cleaned
up. Non-pty children would tend to leave subprocesses running because the
buildslave was only able to kill off the top-level process (typically
'make').

Windows doesn't have any concept of ptys, so non-posix systems do not try to
enable them.

** mail parsers should actually work now

The email parsing functions (FCMaildirSource and SyncmailMaildirSource) were
broken because of my confused understanding of how python class methods
work. These sources should be functional now.

** more irc bot sillyness

The IRC bot can now perform half of the famous AYBABTO scene.


* Release 0.3.5 (19 Sep 2003)

** newcred

Buildbot has moved to "newcred", a new authorization framework provided by
Twisted, which is a good bit cleaner and easier to work with than the
"oldcred" scheme in older versions. This causes both buildmaster and
buildslaves to depend upon Twisted 1.0.7 or later. The interface to
'makeApp' has changed somewhat (the multiple kinds of remote connections all
use the same TCP port now).

Old buildslaves will get "_PortalWrapper instance has no attribute
'remote_username'" errors when they try to connect. They must be upgraded.

The FreshCVSSource uses PB to connect to the CVSToys server. This has been
upgraded to use newcred too. If you get errors (TODO: what do they look
like?) in the log when the buildmaster tries to connect, you need to upgrade
your FreshCVS service or use the 'useOldcred' argument when creating your
FreshCVSSource. This is a temporary hack to allow the buildmaster to talk to
oldcred CVSToys servers. Using it will trigger deprecation warnings. It will
go away eventually.

In conjunction with this change, makeApp() now accepts a password which can
be applied to the debug service.

** new features

*** "copydir" for CVS checkouts

The CVS build step can now accept a "copydir" parameter, which should be a
directory name like "source" or "orig". If provided, the CVS checkout is
done once into this directory, then copied into the actual working directory
for compilation etc. Later updates are done in place in the copydir, then
the workdir is replaced with a copy.

This reduces CVS bandwidth (update instead of full checkout) at the expense
of twice the disk space (two copies of the tree).

*** Subversion (SVN) support

Radix (Christopher Armstrong) contributed early support for building
Subversion-based trees. The new 'SVN' buildstep behaves roughly like the
'CVS' buildstep, and the contrib/svn_buildbot.py script can be used as a
checkin trigger to feed changes to a running buildmaster.

** notable bugfixes

*** .tap file generation

We no longer set the .tap filename, because the buildmaster/buildslave
service might be added to an existing .tap file and we shouldn't presume to
own the whole thing. You may want to manually rename the "buildbot.tap" file
to something more meaningful (like "buildslave-bot1.tap").

*** IRC reconnect

If the IRC server goes away (it was restarted, or the network connection was
lost), the buildmaster will now schedule a reconnect attempt.

*** w32 buildslave fixes

An "rm -rf" was turned into shutil.rmtree on non-posix systems.


* Release 0.3.4 (28 Jul 2003)

** IRC client

The buildmaster can now join a set of IRC channels and respond to simple
queries about builder status.

** slave information

The build slaves can now report information from a set of info/* files in
the slave base directory to the buildmaster. This will be used by the slave
administrator to announce details about the system hosting the slave,
contact information, etc. For now, info/admin should contain the name/email
of the person who is responsible for the buildslave, and info/host should
describe the system hosting the build slave (OS version, CPU speed, memory,
etc). The contents of these files are made available through the waterfall
display.

** change notification email parsers

A parser for Syncmail (syncmail.sourceforge.net) was added. SourceForge
provides examples of setting up syncmail to deliver CVS commit messages to
mailing lists, so hopefully this will make it easier for sourceforge-hosted
projects to set up a buildbot.

email processors were moved into buildbot.changes.mail . FCMaildirSource was
moved, and the compatibility location (buildbot.changes.freshcvsmail) will
go away in the next release.

** w32 buildslave ought to work

Some non-portable code was changed to make it more likely that the
buildslave will run under windows. The Twisted buildbot now has a
(more-or-less) working w32 buildslave.


* Release 0.3.3 (21 May 2003):

** packaging changes

*** include doc/examples in the release. Oops again.

** network changes

*** add keepalives to deal with NAT boxes

Some NAT boxes drop port mappings if the TCP connection looks idle for too
long (maybe 30 minutes?). Add application-level keepalives (dummy commands
sent from slave to master every 10 minutes) to appease the NAT box and keep
our connection alive. Enable this with --keepalive in the slave mktap
command line. Check the README for more details.

** UI changes

*** allow slaves to trigger any build that they host

Added an internal function to ask the buildmaster to start one of their
builds. Must be triggered with a debugger or manhole on the slave side for
now, will add a better UI later.

*** allow web page viewers to trigger any build

Added a button to the per-build page (linked by the build names on the third
row of the waterfall page) to allow viewers to manually trigger builds.
There is a field for them to indicate who they are and why they are
triggering the build. It is possible to abuse this, but for now the benefits
outweigh the damage that could be done (worst case, someone can make your
machine run builds continuously).

** generic buildprocess changes

*** don't queue multiple builds for offline slaves

If a slave is not online when a build is ready to run, that build is queued
so the slave will run it when it next connects. However, the buildmaster
used to queue every such build, so the poor slave machine would be subject
to tens or hundreds of builds in a row when they finally did come online.
The buildmaster has been changed to merge these multiple builds into a
single one.

*** bump ShellCommand default timeout to 20 minutes

Used for testing out the win32 twisted builder. I will probably revert this
in the next relese.

*** split args in ShellCommand ourselves instead of using /bin/sh

This should remove the need for /bin/sh on the slave side, improving the
chances that the buildslave can run on win32.

*** add configureEnv argument to Configure step, pass env dict to slave

Allows build processes to do things like 'CFLAGS=-O0 ./configure' without
using /bin/sh to set the environment variable

** Twisted buildprocess changes

*** warn instead of flunk the build when cReactor or qtreactor tests fail

These two always fail. For now, downgrade those failures to a warning
(orange box instead of red).

*** don't use 'clobber' on remote builds

Builds that run on remote machines (freebsd, OS-X) now use 'cvs update'
instead of clobbering their trees and doing a fresh checkout. The multiple
simultaneous CVS checkouts were causing a strain on Glyph's upstream
bandwidth.

*** use trial --testmodule instead of our own test-case-name grepper

The Twisted coding/testing convention has developers put 'test-case-name'
tags (emacs local variables, actually) in source files to indicate which
test cases should be run to exercise that code. Twisted's unit-test
framework just acquired an argument to look for these tags itself. Use that
instead of the extra FindUnitTestsForFiles build step we were doing before.
Removes a good bit of code from buildbot and into Twisted where it really
belongs.


* Release 0.3.2 (07 May 2003):

** packaging changes

*** fix major packaging bug: none of the buildbot/* subdirectories were
included in the 0.3.1 release. Sorry, I'm still figuring out distutils
here..

** internal changes

*** use pb.Cacheable to update Events in remote status client. much cleaner.

*** start to clean up BuildProcess->status.builder interface

** bug fixes

*** waterfall display was missing a <tr>, causing it to be misrendered in most
browsers (except the one I was testing it with, of course)

*** URL without trailing slash (when served in a twisted-web distributed
server, with a url like "http://twistedmatrix.com/~warner.twistd") should do
redirect to URL-with-trailing-slash, otherwise internal hrefs are broken.

*** remote status clients: forget RemoteReferences at shutdown, removes
warnings about "persisting Ephemerals"

** Twisted buildprocess updates:

*** match build process as of twisted-1.0.5
**** use python2.2 everywhere now that twisted rejects python2.1
**** look for test-result constants in multiple places
*** move experimental 'trial --jelly' code to separate module
*** add FreeBSD builder
*** catch rc!=0 in HLint step
*** remove RunUnitTestsRandomly, use randomly=1 parameter instead
*** parameterize ['twisted.test'] default test case to make subclassing easier
*** ignore internal distutils warnings in python2.3 builder


* Release 0.3.1 (29 Apr 2003):

** First release.

** Features implemented:

 change notification from FreshCVS server or parsed maildir contents

 timed builds

 basic builds, configure/compile/test

 some Twisted-specific build steps: docs, unit tests, debuild

 status reporting via web page

** Features still experimental/unpolished

 status reporting via PB client
