| OLD | NEW |
| (Empty) |
| 1 # -*- test-case-name: buildbot.test.test_changes -*- | |
| 2 | |
| 3 from twisted.python import log | |
| 4 | |
| 5 from buildbot.pbutil import NewCredPerspective | |
| 6 from buildbot.changes import base, changes | |
| 7 | |
| 8 class ChangePerspective(NewCredPerspective): | |
| 9 | |
| 10 def __init__(self, changemaster, prefix): | |
| 11 self.changemaster = changemaster | |
| 12 self.prefix = prefix | |
| 13 | |
| 14 def attached(self, mind): | |
| 15 return self | |
| 16 def detached(self, mind): | |
| 17 pass | |
| 18 | |
| 19 def perspective_addChange(self, changedict): | |
| 20 log.msg("perspective_addChange called") | |
| 21 pathnames = [] | |
| 22 prefixpaths = None | |
| 23 for path in changedict['files']: | |
| 24 if self.prefix: | |
| 25 if not path.startswith(self.prefix): | |
| 26 # this file does not start with the prefix, so ignore it | |
| 27 continue | |
| 28 path = path[len(self.prefix):] | |
| 29 pathnames.append(path) | |
| 30 | |
| 31 if pathnames: | |
| 32 change = changes.Change(changedict['who'], | |
| 33 pathnames, | |
| 34 changedict['comments'], | |
| 35 branch=changedict.get('branch'), | |
| 36 revision=changedict.get('revision'), | |
| 37 repository=changedict.get('repository'), | |
| 38 revlink=changedict.get('revlink', ''), | |
| 39 category=changedict.get('category'), | |
| 40 when=changedict.get('when'), | |
| 41 properties=changedict.get('properties', {}) | |
| 42 ) | |
| 43 self.changemaster.addChange(change) | |
| 44 | |
| 45 class PBChangeSource(base.ChangeSource): | |
| 46 compare_attrs = ["user", "passwd", "port", "prefix"] | |
| 47 | |
| 48 def __init__(self, user="change", passwd="changepw", port=None, | |
| 49 prefix=None, sep=None): | |
| 50 """I listen on a TCP port for Changes from 'buildbot sendchange'. | |
| 51 | |
| 52 I am a ChangeSource which will accept Changes from a remote source. I | |
| 53 share a TCP listening port with the buildslaves. | |
| 54 | |
| 55 The 'buildbot sendchange' command, the contrib/svn_buildbot.py tool, | |
| 56 and the contrib/bzr_buildbot.py tool know how to send changes to me. | |
| 57 | |
| 58 @type prefix: string (or None) | |
| 59 @param prefix: if set, I will ignore any filenames that do not start | |
| 60 with this string. Moreover I will remove this string | |
| 61 from all filenames before creating the Change object | |
| 62 and delivering it to the Schedulers. This is useful | |
| 63 for changes coming from version control systems that | |
| 64 represent branches as parent directories within the | |
| 65 repository (like SVN and Perforce). Use a prefix of | |
| 66 'trunk/' or 'project/branches/foobranch/' to only | |
| 67 follow one branch and to get correct tree-relative | |
| 68 filenames. | |
| 69 | |
| 70 @param sep: DEPRECATED (with an axe). sep= was removed in | |
| 71 buildbot-0.7.4 . Instead of using it, you should use | |
| 72 prefix= with a trailing directory separator. This | |
| 73 docstring (and the better-than-nothing error message | |
| 74 which occurs when you use it) will be removed in 0.7.5 . | |
| 75 """ | |
| 76 | |
| 77 # sep= was removed in 0.7.4 . This more-helpful-than-nothing error | |
| 78 # message will be removed in 0.7.5 . | |
| 79 assert sep is None, "prefix= is now a complete string, do not use sep=" | |
| 80 # TODO: current limitations | |
| 81 assert user == "change" | |
| 82 assert passwd == "changepw" | |
| 83 assert port == None | |
| 84 self.user = user | |
| 85 self.passwd = passwd | |
| 86 self.port = port | |
| 87 self.prefix = prefix | |
| 88 | |
| 89 def describe(self): | |
| 90 # TODO: when the dispatcher is fixed, report the specific port | |
| 91 #d = "PB listener on port %d" % self.port | |
| 92 d = "PBChangeSource listener on all-purpose slaveport" | |
| 93 if self.prefix is not None: | |
| 94 d += " (prefix '%s')" % self.prefix | |
| 95 return d | |
| 96 | |
| 97 def startService(self): | |
| 98 base.ChangeSource.startService(self) | |
| 99 # our parent is the ChangeMaster object | |
| 100 # find the master's Dispatch object and register our username | |
| 101 # TODO: the passwd should be registered here too | |
| 102 master = self.parent.parent | |
| 103 master.dispatcher.register(self.user, self) | |
| 104 | |
| 105 def stopService(self): | |
| 106 base.ChangeSource.stopService(self) | |
| 107 # unregister our username | |
| 108 master = self.parent.parent | |
| 109 master.dispatcher.unregister(self.user) | |
| 110 | |
| 111 def getPerspective(self): | |
| 112 return ChangePerspective(self.parent, self.prefix) | |
| OLD | NEW |