#! /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()
