from buildbot.interfaces import LOG_CHANNEL_STDOUT from buildbot.process.factory import BuildFactory from buildbot.steps.source import SVN from buildbot.steps.shell import ShellCommand from buildbot.steps.transfer import FileUpload, FileDownload from buildbot.steps.python_twisted import Trial from netstring import netstringparser from twisted.spread.banana import decode, encode from twisted.spread.jelly import unjelly, jelly class Translate(ShellCommand): name = "translate" description = ["Translating"] descriptionDone = ["Translation"] command = ["python", "translate.py", "--batch"] translationTarget = "targetpypystandalone" haltOnFailure = False def __init__(self, translationArgs, targetArgs, workdir="build/pypy-src/pypy/translator/goal", *a, **kw): self.command = self.command + translationArgs + [self.translationTarget] + targetArgs ShellCommand.__init__(self, workdir, *a, **kw) def create_summary(stdout, logcreator): stuff = list(netstringparser(stdout)) events = [(name, unjelly(decode(item))) for name, item in zip(*[iter(stuff)]*2)] failed_names = [] for name, event in events: if name == 'ReceivedItemOutcome': (tp, name), outcome = event if outcome.excinfo: # failed test fullname = '.'.join(name) logcreator(fullname, encode(jelly(outcome.excinfo))) failed_names.append(fullname) logcreator('failedtotal.log', "\n".join(failed_names)) class PyTest(ShellCommand): name = "py.test pypy" description = ["PyPy", "Tests"] PYTHON_EXECUTABLE = object() TEST_PACKAGE = object() TEST_ARGUMENTS = object() haltOnFailure = False def __init__(self, testPackage, testArguments, workdir="build/pypy-src", python="python", *a, **kw): ShellCommand.__init__(self, workdir, *a, **kw) self.command = list(self.command) for (marker, replacement) in [(self.PYTHON_EXECUTABLE, [python]), (self.TEST_PACKAGE, [testPackage]), (self.TEST_ARGUMENTS, testArguments)]: index = self.command.index(marker) self.command[index:index + 1] = replacement def createSummary(self, log): stdout = ''.join(log.getChunks(channels=[LOG_CHANNEL_STDOUT], onlyText=True)) create_summary(stdout, self.addCompleteLog) class POSIXPyTest(PyTest): command = [ "find", PyTest.TEST_PACKAGE, "-name", "test", "-type", "d", "-exec", PyTest.PYTHON_EXECUTABLE, "py/bin/py.test", "--session=MySession", PyTest.TEST_ARGUMENTS, "{}", ";"] class WindowsPyTest(PyTest): command = [ "per-directory-py-test.py", PyTest.PYTHON_EXECUTABLE, PyTest.TEST_PACKAGE, PyTest.TEST_ARGUMENTS] class PySwitch(ShellCommand): name = "switch" description = ["Switch", "Py", "to", "reporter-merge"] command = ["svn", "switch", "http://codespeak.net/svn/py/branch/reporter-merge/py"] haltOnFailure = True def __init__(self, workdir="build/pypy-src/py", *a, **kw): ShellCommand.__init__(self, workdir, *a, **kw) class PyPyBuildFactory(BuildFactory): PyTestStep = None executable = "pypy-c" def __init__(self, pytestArguments, translationArguments, targetArguments, *a, **kw): django = kw.pop('django', False) BuildFactory.__init__(self, *a, **kw) self.addStep( SVN, workdir="build/pypy-src", baseURL="http://codespeak.net/svn/pypy/", defaultBranch="dist", mode="copy") self.addStep(PySwitch) self.addStep( FileDownload, mastersrc="netstring_conftest.py", slavedest="conftest.py", workdir="build/pypy-src") self.addStep( FileDownload, mastersrc="netstring.py", slavedest="netstring.py", workdir="build/pypy-src") self.addStep( FileDownload, mastersrc="per-directory-py-test.py", slavedest="per-directory-py-test.py", workdir="build/pypy-src") self.addStep( Translate, translationArgs=translationArguments, targetArgs=targetArguments) # uploadSuffix = "".join(translationArguments + targetArguments) # self.addStep(FileUpload, # slavesrc="pypy-src/pypy/translator/goal/" + self.executable, # masterdest="public_html/builds/" + self.executable + "-" + uploadSuffix) # if pytestArguments is not None: # self.addStep( # self.PyTestStep, # testPackage="pypy", # testArguments=pytestArguments, # timeout=60 * 60) # self.addStep( # self.PyTestStep, # python="pypy/translator/goal/pypy-c", # testPackage="pypy", # # Exclude --boxed if it was specified, because -A shouldn't # # really use much memory. # testArguments=["-A"] + list(arg for arg in pytestArguments if arg != "--boxed"), # timeout=60 * 60) # self.addStep( # SVN, # workdir="build/Twisted-src", # svnurl="svn://svn.twistedmatrix.com/svn/Twisted/trunk", # mode="copy") # self.addStep( # Trial, # workdir="build/pypy-src/pypy/translator/goal", # python=["pypy-c", # "--oldstyle"], # testpath=None, # trial="../../../../Twisted-src/bin/trial", # tests=["twisted"], # env={"PATH": "."}) if django: self.addStep( SVN, workdir="build/Django-src", svnurl="http://code.djangoproject.com/svn/django/trunk/", mode="copy") self.addStep( FileDownload, mastersrc="django-settings.py", slavedest="tests/settings.py", workdir="build/Django-src") self.addStep( ShellCommand, command=[self.sep.join([ "..", "..", "pypy-src", "pypy", "translator", "goal", self.executable]), "runtests.py", "-v", "2", "--settings=settings"], workdir="build/Django-src/tests", env={'PYTHONPATH': '..'}) class POSIXPyPyBuildFactory(PyPyBuildFactory): PyTestStep = POSIXPyTest sep = '/' class WindowsPyPyBuildFactory(PyPyBuildFactory): PyTestStep = WindowsPyTest executable = "pypy-c.exe" sep = '\\'