Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(251)

Side by Side Diff: buildbot/changes/svnpoller.py

Issue 9113086: Add " (CQ)" to the author name in the console if the commit-queue was used. (Closed) Base URL: http://src.chromium.org/svn/trunk/tools/build/third_party/buildbot_8_4p1/
Patch Set: Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | buildbot/status/web/base.py » ('j') | buildbot/status/web/base.py » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # This file is part of Buildbot. Buildbot is free software: you can 1 # This file is part of Buildbot. Buildbot is free software: you can
2 # redistribute it and/or modify it under the terms of the GNU General Public 2 # redistribute it and/or modify it under the terms of the GNU General Public
3 # License as published by the Free Software Foundation, version 2. 3 # License as published by the Free Software Foundation, version 2.
4 # 4 #
5 # This program is distributed in the hope that it will be useful, but WITHOUT 5 # This program is distributed in the hope that it will be useful, but WITHOUT
6 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 6 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
7 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 7 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
8 # details. 8 # details.
9 # 9 #
10 # You should have received a copy of the GNU General Public License along with 10 # You should have received a copy of the GNU General Public License along with
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 if prefix.startswith("/"): 195 if prefix.startswith("/"):
196 prefix = prefix[1:] 196 prefix = prefix[1:]
197 log.msg("SVNPoller: svnurl=%s, root=%s, so prefix=%s" % 197 log.msg("SVNPoller: svnurl=%s, root=%s, so prefix=%s" %
198 (self.svnurl, root, prefix)) 198 (self.svnurl, root, prefix))
199 return prefix 199 return prefix
200 d.addCallback(determine_prefix) 200 d.addCallback(determine_prefix)
201 return d 201 return d
202 202
203 def get_logs(self, _): 203 def get_logs(self, _):
204 args = [] 204 args = []
205 args.extend(["log", "--xml", "--verbose", "--non-interactive"]) 205 args.extend(["log", "--xml", "--verbose", "--non-interactive",
206 "--with-all-revprops"])
sadrul 2012/01/26 17:57:49 You suggested in the previous CL for this that thi
M-A Ruel 2012/01/26 18:53:47 Yes, I want you to do the same thing that what is
206 if self.svnuser: 207 if self.svnuser:
207 args.extend(["--username=%s" % self.svnuser]) 208 args.extend(["--username=%s" % self.svnuser])
208 if self.svnpasswd: 209 if self.svnpasswd:
209 args.extend(["--password=%s" % self.svnpasswd]) 210 args.extend(["--password=%s" % self.svnpasswd])
210 args.extend(["--limit=%d" % (self.histmax), self.svnurl]) 211 args.extend(["--limit=%d" % (self.histmax), self.svnurl])
211 d = self.getProcessOutput(args) 212 d = self.getProcessOutput(args)
212 return d 213 return d
213 214
214 def parse_logs(self, output): 215 def parse_logs(self, output):
215 # parse the XML output, return a list of <logentry> nodes 216 # parse the XML output, return a list of <logentry> nodes
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 relative_path = path[len(self._prefix):] 283 relative_path = path[len(self._prefix):]
283 if relative_path.startswith("/"): 284 if relative_path.startswith("/"):
284 relative_path = relative_path[1:] 285 relative_path = relative_path[1:]
285 where = self.split_file(relative_path) 286 where = self.split_file(relative_path)
286 # 'where' is either None or (branch, final_path) 287 # 'where' is either None or (branch, final_path)
287 return where 288 return where
288 289
289 def create_changes(self, new_logentries): 290 def create_changes(self, new_logentries):
290 changes = [] 291 changes = []
291 292
293 def commit_bot_used(logentry):
294 revprops = logentry.getElementsByTagName('revprops')
295 if revprops is not None:
296 for revprop in revprops.getElementsByTagName('property'):
297 if revprop.getAttribute("name") == "commit-bot":
298 return True
299 return False
300
292 for el in new_logentries: 301 for el in new_logentries:
293 revision = str(el.getAttribute("revision")) 302 revision = str(el.getAttribute("revision"))
294 303
295 revlink='' 304 revlink=''
296 305
297 if self.revlinktmpl: 306 if self.revlinktmpl:
298 if revision: 307 if revision:
299 revlink = self.revlinktmpl % urllib.quote_plus(revision) 308 revlink = self.revlinktmpl % urllib.quote_plus(revision)
300 309
301 log.msg("Adding change revision %s" % (revision,)) 310 log.msg("Adding change revision %s" % (revision,))
302 author = self._get_text(el, "author") 311 author = self._get_text(el, "author")
303 comments = self._get_text(el, "msg") 312 comments = self._get_text(el, "msg")
313 used_cq = commit_bot_used(el)
304 # there is a "date" field, but it provides localtime in the 314 # there is a "date" field, but it provides localtime in the
305 # repository's timezone, whereas we care about buildmaster's 315 # repository's timezone, whereas we care about buildmaster's
306 # localtime (since this will get used to position the boxes on 316 # localtime (since this will get used to position the boxes on
307 # the Waterfall display, etc). So ignore the date field, and 317 # the Waterfall display, etc). So ignore the date field, and
308 # addChange will fill in with the current time 318 # addChange will fill in with the current time
309 branches = {} 319 branches = {}
310 try: 320 try:
311 pathlist = el.getElementsByTagName("paths")[0] 321 pathlist = el.getElementsByTagName("paths")[0]
312 except IndexError: # weird, we got an empty revision 322 except IndexError: # weird, we got an empty revision
313 log.msg("ignoring commit with no paths") 323 log.msg("ignoring commit with no paths")
(...skipping 25 matching lines...) Expand all
339 for branch in branches.keys(): 349 for branch in branches.keys():
340 action = branches[branch]['action'] 350 action = branches[branch]['action']
341 files = branches[branch]['files'] 351 files = branches[branch]['files']
342 number_of_files_changed = len(files) 352 number_of_files_changed = len(files)
343 353
344 if action == u'D' and number_of_files_changed == 1 and files[0] == '': 354 if action == u'D' and number_of_files_changed == 1 and files[0] == '':
345 log.msg("Ignoring deletion of branch '%s'" % branch) 355 log.msg("Ignoring deletion of branch '%s'" % branch)
346 else: 356 else:
347 chdict = dict( 357 chdict = dict(
348 who=author, 358 who=author,
359 cq=used_cq,
349 files=files, 360 files=files,
350 comments=comments, 361 comments=comments,
351 revision=revision, 362 revision=revision,
352 branch=branch, 363 branch=branch,
353 revlink=revlink, 364 revlink=revlink,
354 category=self.category, 365 category=self.category,
355 repository=self.svnurl, 366 repository=self.svnurl,
356 project = self.project) 367 project = self.project)
357 changes.append(chdict) 368 changes.append(chdict)
358 369
359 return changes 370 return changes
360 371
361 @defer.deferredGenerator 372 @defer.deferredGenerator
362 def submit_changes(self, changes): 373 def submit_changes(self, changes):
363 for chdict in changes: 374 for chdict in changes:
364 wfd = defer.waitForDeferred(self.master.addChange(**chdict)) 375 wfd = defer.waitForDeferred(self.master.addChange(**chdict))
365 yield wfd 376 yield wfd
366 wfd.getResult() 377 wfd.getResult()
367 378
368 def finished_ok(self, res): 379 def finished_ok(self, res):
369 if self.cachepath: 380 if self.cachepath:
370 f = open(self.cachepath, "w") 381 f = open(self.cachepath, "w")
371 f.write(str(self.last_change)) 382 f.write(str(self.last_change))
372 f.close() 383 f.close()
373 384
374 log.msg("SVNPoller finished polling %s" % res) 385 log.msg("SVNPoller finished polling %s" % res)
375 return res 386 return res
OLDNEW
« no previous file with comments | « no previous file | buildbot/status/web/base.py » ('j') | buildbot/status/web/base.py » ('J')

Powered by Google App Engine
This is Rietveld 408576698