Skip to content

Commit

Permalink
refactor tryserver
Browse files Browse the repository at this point in the history
  • Loading branch information
djmitche committed Apr 9, 2012
1 parent 5b1e7ca commit 32bda48
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 21 deletions.
28 changes: 7 additions & 21 deletions master/buildbot/scripts/runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,9 @@
# pages and texinfo documentation.

from twisted.python import usage
from hashlib import md5
import os
import re
import sys
import time

from buildbot.scripts import base

Expand Down Expand Up @@ -495,30 +493,17 @@ def postOptions(self):
self['master'] = opts.get('masterstatus', None)

class TryServerOptions(base.SubcommandOptions):

optParameters = [
["jobdir", None, None, "the jobdir (maildir) for submitting jobs"],
]

def getSynopsis(self):
return "Usage: buildbot tryserver [options]"


def doTryServer(config):
jobdir = os.path.expanduser(config["jobdir"])
job = sys.stdin.read()
# now do a 'safecat'-style write to jobdir/tmp, then move atomically to
# jobdir/new . Rather than come up with a unique name randomly, I'm just
# going to MD5 the contents and prepend a timestamp.
timestring = "%d" % time.time()
m = md5()
m.update(job)
jobhash = m.hexdigest()
fn = "%s-%s" % (timestring, jobhash)
tmpfile = os.path.join(jobdir, "tmp", fn)
newfile = os.path.join(jobdir, "new", fn)
with open(tmpfile, "w") as f:
f.write(job)
os.rename(tmpfile, newfile)

def postOptions(self):
if not self['jobdir']:
raise usage.UsageError('jobdir is required')

class CheckConfigOptions(base.SubcommandOptions):
optFlags = [
Expand Down Expand Up @@ -797,7 +782,8 @@ def run():
from buildbot.scripts.trycmd import trycmd
sys.exit(trycmd(so))
elif command == "tryserver":
doTryServer(so)
from buildbot.scripts.tryserver import tryserver
sys.exit(tryserver(so))
elif command == "checkconfig":
if not doCheckConfig(so):
sys.exit(1)
Expand Down
38 changes: 38 additions & 0 deletions master/buildbot/scripts/tryserver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# This file is part of Buildbot. Buildbot is free software: you can
# redistribute it and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation, version 2.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Copyright Buildbot Team Members

import os
import sys
import time
from hashlib import md5

def tryserver(config):
jobdir = os.path.expanduser(config["jobdir"])
job = sys.stdin.read()
# now do a 'safecat'-style write to jobdir/tmp, then move atomically to
# jobdir/new . Rather than come up with a unique name randomly, I'm just
# going to MD5 the contents and prepend a timestamp.
timestring = "%d" % time.time()
m = md5()
m.update(job)
jobhash = m.hexdigest()
fn = "%s-%s" % (timestring, jobhash)
tmpfile = os.path.join(jobdir, "tmp", fn)
newfile = os.path.join(jobdir, "new", fn)
with open(tmpfile, "w") as f:
f.write(job)
os.rename(tmpfile, newfile)

return 0
24 changes: 24 additions & 0 deletions master/buildbot/test/unit/test_scripts_runner.py
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,30 @@ def test_invalid_vcs(self):
lambda : self.parse('--vc=foo', *self.master_and_who))


class TestTryServerOptions(OptionsMixin, unittest.TestCase):

def setUp(self):
self.setUpOptions()

def parse(self, *args):
self.opts = runner.TryServerOptions()
self.opts.parseOptions(args)
return self.opts

def test_synopsis(self):
opts = runner.TryServerOptions()
self.assertIn('buildbot tryserver', opts.getSynopsis())

def test_defaults(self):
self.assertRaises(usage.UsageError,
lambda : self.parse())

def test_with_jobdir(self):
opts = self.parse('--jobdir', 'xyz')
exp = dict(jobdir='xyz')
self.assertOptions(opts, exp)


class TestCheckConfigOptions(OptionsMixin, unittest.TestCase):

def setUp(self):
Expand Down
44 changes: 44 additions & 0 deletions master/buildbot/test/unit/test_scripts_tryserver.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# This file is part of Buildbot. Buildbot is free software: you can
# redistribute it and/or modify it under the terms of the GNU General Public
# License as published by the Free Software Foundation, version 2.
#
# This program is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
# details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, write to the Free Software Foundation, Inc., 51
# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Copyright Buildbot Team Members

from __future__ import with_statement

import os
import sys
from cStringIO import StringIO
from twisted.trial import unittest
from buildbot.scripts import tryserver
from buildbot.test.util import dirs

class TestStatusLog(dirs.DirsMixin, unittest.TestCase):

def setUp(self):
self.newdir = os.path.join('jobdir', 'new')
self.tmpdir = os.path.join('jobdir', 'tmp')
self.setUpDirs("jobdir", self.newdir, self.tmpdir)

def test_trycmd(self):
config = dict(jobdir='jobdir')
inputfile = StringIO('this is my try job')
self.patch(sys, 'stdin', inputfile)

tryserver.tryserver(config)

newfiles = os.listdir(self.newdir)
tmpfiles = os.listdir(self.tmpdir)
self.assertEqual((len(newfiles), len(tmpfiles)),
(1, 0))
with open(os.path.join(self.newdir, newfiles[0]), 'rt') as f:
self.assertEqual(f.read(), 'this is my try job')

0 comments on commit 32bda48

Please sign in to comment.