1
# Copyright 2004-2005 Canonical Ltd. All rights reserved.
3
"""Fill the database with information from Bazaar branch."""
7
from datetime import datetime
9
from buildbot.process.base import ConfigurableBuildFactory, ConfigurableBuild
10
from buildbot.process.step import ShellCommand
12
from canonical.launchpad.database import Branch
13
from canonical.database.constants import UTC_NOW
15
from importd.util import (
16
getTxnManager, tryToAbortTransaction,
19
__all__ = ['bzrScanBuilders']
24
def bzrScanBuilders(slavenames, runner_path=None, periodic=None):
26
getTxnManager().begin()
28
branches = list(Branch.select())
29
branches.sort(key=lambda x: x.id)
30
for branch in branches:
31
name = 'branch-%03d' % (branch.id,)
32
slavename = slavenames[hash(name) % len(slavenames)]
33
builddir = 'bzrscan-jobs'
34
if runner_path is None:
35
runner_path = os.path.join(
36
os.path.dirname(__file__), 'bzrsync.py')
38
runner_path = str(runner_path)
40
periodic = 24 * 60 * 60 # one day
41
branch_name = '%s %s %s' % (
42
branch.owner.name, branch.product_name, branch.name)
43
scanjob = {'id': branch.id, 'branch_name': branch_name,
45
factory = BzrScanBuildFactory(scanjob, runner_path)
46
builderDict = {'name': name, 'slavename': slavename,
47
'builddir': builddir, 'factory': factory,
48
'periodicBuildTime': periodic}
49
builders.append(builderDict)
50
getTxnManager().abort()
52
tryToAbortTransaction()
57
class BzrScanBuildFactory(ConfigurableBuildFactory):
63
def __init__(self, scanjob, runner_path):
65
self.scanjob = scanjob
66
self.runner_path = runner_path
70
self.steps.append((BzrScanShellCommand, {
73
'branch_name': self.scanjob['branch_name'],
74
'command': [sys.executable, self.runner_path,
75
str(self.scanjob['id'])]}))
78
build = ConfigurableBuildFactory.newBuild(self)
79
build.scanjob = self.scanjob
83
class BzrScanShellCommand(ShellCommand):
85
def __init__(self, branch_name, **kwargs):
86
ShellCommand.__init__(self, **kwargs)
87
self.branch_name = branch_name
90
"""Short display of BzrScan steps in buildbot."""
91
return [self.branch_name]
94
class BzrScanBuild(NotifyingBuild):
96
def getObserver(self):
97
return BzrScanBuildObserver(self)
100
class BzrScanBuildObserver:
102
def __init__(self, build):
104
scanjob = build.scanjob
105
self.branch_id = scanjob['id']
107
def startBuild(self):
108
getTxnManager().begin()
110
getTxnManager().commit()
112
def buildFinished(self, successful):
113
getTxnManager().begin()
114
self.setLastMirrorAttempt()
115
getTxnManager().commit()
117
def setLastMirrorAttempt(self):
118
self.getBranch().last_mirror_attempt = UTC_NOW
121
return Branch.get(self.branch_id)