Package buildbot :: Package changes :: Module hgbuildbot
[frames] | no frames]

Source Code for Module buildbot.changes.hgbuildbot

  1  # hgbuildbot.py - mercurial hooks for buildbot 
  2  # 
  3  # Copyright 2007 Frederic Leroy <fredo@starox.org> 
  4  # 
  5  # This software may be used and distributed according to the terms 
  6  # of the GNU General Public License, incorporated herein by reference. 
  7   
  8  # hook extension to send change notifications to buildbot when a changeset is 
  9  # brought into the repository from elsewhere. 
 10  # 
 11  # default mode is to use mercurial branch 
 12  # 
 13  # to use, configure hgbuildbot in .hg/hgrc like this: 
 14  # 
 15  #   [hooks] 
 16  #   changegroup = python:buildbot.changes.hgbuildbot.hook 
 17  # 
 18  #   [hgbuildbot] 
 19  #   # config items go in here 
 20  # 
 21  # config items: 
 22  # 
 23  # REQUIRED: 
 24  #   master = host:port                   # host to send buildbot changes 
 25  # 
 26  # OPTIONAL: 
 27  #   branchtype = inrepo|dirname          # dirname: branch = name of directory 
 28  #                                        #          containing the repository 
 29  #                                        # 
 30  #                                        # inrepo:  branch = mercurial branch 
 31  # 
 32  #   branch = branchname                  # if set, branch is always branchname 
 33   
 34  import os 
 35   
 36  from mercurial.i18n import gettext as _ 
 37  from mercurial.node import bin, hex, nullid 
 38  from mercurial.context import workingctx 
 39   
 40  # mercurial's on-demand-importing hacks interfere with the: 
 41  #from zope.interface import Interface 
 42  # that Twisted needs to do, so disable it. 
 43  try: 
 44      from mercurial import demandimport 
 45      demandimport.disable() 
 46  except ImportError: 
 47      pass 
 48   
 49  from buildbot.clients import sendchange 
 50  from twisted.internet import defer, reactor 
 51   
 52   
53 -def hook(ui, repo, hooktype, node=None, source=None, **kwargs):
54 # read config parameters 55 master = ui.config('hgbuildbot', 'master') 56 if master: 57 branchtype = ui.config('hgbuildbot', 'branchtype') 58 branch = ui.config('hgbuildbot', 'branch') 59 else: 60 ui.write("* You must add a [hgbuildbot] section to .hg/hgrc in " 61 "order to use buildbot hook\n") 62 return 63 64 if branch is None: 65 if branchtype is not None: 66 if branchtype == 'dirname': 67 branch = os.path.basename(os.getcwd()) 68 if branchtype == 'inrepo': 69 branch = workingctx(repo).branch() 70 71 if hooktype == 'changegroup': 72 s = sendchange.Sender(master, None) 73 d = defer.Deferred() 74 reactor.callLater(0, d.callback, None) 75 # process changesets 76 def _send(res, c): 77 ui.status("rev %s sent\n" % c['revision']) 78 return s.send(c['branch'], c['revision'], c['comments'], 79 c['files'], c['username'])
80 81 try: # first try Mercurial 1.1+ api 82 start = repo[node].rev() 83 end = len(repo) 84 except TypeError: # else fall back to old api 85 start = repo.changelog.rev(bin(node)) 86 end = repo.changelog.count() 87 88 for rev in xrange(start, end): 89 # send changeset 90 node = repo.changelog.node(rev) 91 manifest, user, (time, timezone), files, desc, extra = repo.changelog.read(node) 92 parents = filter(lambda p: not p == nullid, repo.changelog.parents(node)) 93 if branchtype == 'inrepo': 94 branch = extra['branch'] 95 # merges don't always contain files, but at least one file is required by buildbot 96 if len(parents) > 1 and not files: 97 files = ["merge"] 98 change = { 99 'master': master, 100 'username': user, 101 'revision': hex(node), 102 'comments': desc, 103 'files': files, 104 'branch': branch 105 } 106 d.addCallback(_send, change) 107 108 d.addCallbacks(s.printSuccess, s.printFailure) 109 d.addBoth(s.stop) 110 s.run() 111 else: 112 ui.status(_('hgbuildbot: hook %s not supported\n') % hooktype) 113 return 114