diff options
Diffstat (limited to 'buildbot/contrib/fakechange.py')
-rwxr-xr-x | buildbot/contrib/fakechange.py | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/buildbot/contrib/fakechange.py b/buildbot/contrib/fakechange.py new file mode 100755 index 0000000..52cc766 --- /dev/null +++ b/buildbot/contrib/fakechange.py @@ -0,0 +1,82 @@ +#! /usr/bin/python + +""" +This is an example of how to use the remote ChangeMaster interface, which is +a port that allows a remote program to inject Changes into the buildmaster. + +The buildmaster can either pull changes in from external sources (see +buildbot.changes.changes.ChangeMaster.addSource for an example), or those +changes can be pushed in from outside. This script shows how to do the +pushing. + +Changes are just dictionaries with three keys: + + 'who': a simple string with a username. Responsibility for this change will + be assigned to the named user (if something goes wrong with the build, they + will be blamed for it). + + 'files': a list of strings, each with a filename relative to the top of the + source tree. + + 'comments': a (multiline) string with checkin comments. + +Each call to .addChange injects a single Change object: each Change +represents multiple files, all changed by the same person, and all with the +same checkin comments. + +The port that this script connects to is the same 'slavePort' that the +buildslaves and other debug tools use. The ChangeMaster service will only be +available on that port if 'change' is in the list of services passed to +buildbot.master.makeApp (this service is turned ON by default). +""" + +import sys +import commands +import random +import os.path + +from twisted.spread import pb +from twisted.cred import credentials +from twisted.internet import reactor +from twisted.python import log + + +def done(*args): + reactor.stop() + + +users = ('zaphod', 'arthur', 'trillian', 'marvin', 'sbfast') +dirs = ('src', 'doc', 'tests') +sources = ('foo.c', 'bar.c', 'baz.c', 'Makefile') +docs = ('Makefile', 'index.html', 'manual.texinfo') + + +def makeFilename(): + d = random.choice(dirs) + if d in ('src', 'tests'): + f = random.choice(sources) + else: + f = random.choice(docs) + return os.path.join(d, f) + + +def send_change(remote): + who = random.choice(users) + if len(sys.argv) > 1: + files = sys.argv[1:] + else: + files = [makeFilename()] + comments = commands.getoutput("fortune") + change = {'who': who, 'files': files, 'comments': comments} + d = remote.callRemote('addChange', change) + d.addCallback(done) + print "%s: %s" % (who, " ".join(files)) + + +f = pb.PBClientFactory() +d = f.login(credentials.UsernamePassword("change", "changepw")) +reactor.connectTCP("localhost", 8007, f) +err = lambda f: (log.err(), reactor.stop()) +d.addCallback(send_change).addErrback(err) + +reactor.run() |