1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 import os.path
17
18 from twisted.internet import defer
19 from twisted.python import log, runtime
20 from twisted.protocols import basic
21
22 from buildbot import pbutil
23 from buildbot.sourcestamp import SourceStamp
24 from buildbot.changes.maildir import MaildirService
25 from buildbot.process.properties import Properties
26 from buildbot.schedulers import base
27 from buildbot.status.builder import BuildSetStatus
28
29
31
35
37
38
39
40
41 if builderNames:
42 for b in builderNames:
43 if not b in self.builderNames:
44 log.msg("%s got with builder %s" % (self, b))
45 log.msg(" but that wasn't in our list: %s"
46 % (self.builderNames,))
47 return []
48 else:
49 builderNames = self.builderNames
50 return builderNames
51
54
57 self.strings = []
58 self.transport = self
59 self.error = False
60
62 self.strings.append(s)
63
66
68 compare_attrs = ( 'name', 'builderNames', 'jobdir', 'properties' )
69
70 - def __init__(self, name, builderNames, jobdir,
71 properties={}):
76
82
84
85
86
87
88
89
90
91
92
93 p = JobFileScanner()
94 p.dataReceived(f.read())
95 if p.error:
96 raise BadJobfile("unable to parse netstrings")
97 s = p.strings
98 ver = s.pop(0)
99 if ver == "1":
100 buildsetID, branch, baserev, patchlevel, diff = s[:5]
101 builderNames = s[5:]
102 if branch == "":
103 branch = None
104 if baserev == "":
105 baserev = None
106 patchlevel = int(patchlevel)
107 patch = (patchlevel, diff)
108 ss = SourceStamp("Old client", branch, baserev, patch)
109 elif ver == "2":
110 buildsetID, branch, baserev, patchlevel, diff, repository, project = s[:7]
111 builderNames = s[7:]
112 if branch == "":
113 branch = None
114 if baserev == "":
115 baserev = None
116 patchlevel = int(patchlevel)
117 patch = (patchlevel, diff)
118 ss = SourceStamp(branch, baserev, patch, repository=repository,
119 project=project)
120 else:
121 raise BadJobfile("unknown version '%s'" % ver)
122 return builderNames, ss, buildsetID
123
125 md = os.path.join(self.parent.parent.basedir, self.jobdir)
126 if runtime.platformType == "posix":
127
128
129 path = os.path.join(md, "new", filename)
130 f = open(path, "r")
131 os.rename(os.path.join(md, "new", filename),
132 os.path.join(md, "cur", filename))
133 else:
134
135
136
137 os.rename(os.path.join(md, "new", filename),
138 os.path.join(md, "cur", filename))
139 path = os.path.join(md, "cur", filename)
140 f = open(path, "r")
141
142 try:
143 builderNames, ss, jobid = self.parseJob(f)
144 except BadJobfile:
145 log.msg("%s reports a bad jobfile in %s" % (self, filename))
146 log.err()
147 return
148
149 builderNames = self.filterBuilderList(builderNames)
150 if not builderNames:
151 return
152 reason = "'try' job"
153 d = self.parent.db.runInteraction(self._try, ss, builderNames, reason)
154 def _done(ign):
155 self.parent.loop_done()
156 d.addCallback(_done)
157 return d
158
159 - def _try(self, t, ss, builderNames, reason):
164
165
167 compare_attrs = ( 'name', 'builderNames', 'port', 'userpass', 'properties' )
168
169 - def __init__(self, name, builderNames, port, userpass,
170 properties={}):
175
183 self.registrations = []
184 for user, passwd in self.userpass:
185 self.registrations.append(
186 master.pbmanager.register(self.port, user, passwd, factory))
187
189 d = defer.maybeDeferred(TryBase.stopService, self)
190 def unreg(_):
191 return defer.gatherResults(
192 [ reg.unregister() for reg in self.registrations ])
193 d.addCallback(unreg)
194
195
200
201 - def perspective_try(self, branch, revision, patch, repository, project,
202 builderNames, properties={}, ):
203 log.msg("user %s requesting build on builders %s" % (self.username,
204 builderNames))
205
206 builderNames = self.parent.filterBuilderList(builderNames)
207 if not builderNames:
208 return
209 ss = SourceStamp(branch, revision, patch, repository=repository,
210 project=project)
211 reason = "'try' job from user %s" % self.username
212
213
214 combined_props = Properties()
215 combined_props.updateFromProperties(self.parent.properties)
216 combined_props.update(properties, "try build")
217
218 status = self.parent.parent.parent.status
219 db = self.parent.parent.db
220 d = db.runInteraction(self._try, ss, builderNames, reason,
221 combined_props, db)
222 def _done(bsid):
223
224 bss = BuildSetStatus(bsid, status, db)
225 from buildbot.status.client import makeRemote
226 r = makeRemote(bss)
227
228 return r
229 d.addCallback(_done)
230 return d
231
232 - def _try(self, t, ss, builderNames, reason, combined_props, db):
238
245