diff --git a/master/buildbot/status/status_gerrit.py b/master/buildbot/status/status_gerrit.py index 58c7a541eae..3292c863c3b 100644 --- a/master/buildbot/status/status_gerrit.py +++ b/master/buildbot/status/status_gerrit.py @@ -37,15 +37,19 @@ def defaultReviewCB(builderName, build, result, status, arg): class GerritStatusPush(StatusReceiverMultiService): """Event streamer to a gerrit ssh server.""" - def __init__(self, server, username, reviewCB=defaultReviewCB, port=29418, reviewArg=None, - **kwargs): + def __init__(self, server, username, reviewCB=defaultReviewCB, + startCB=None, port=29418, reviewArg=None, + startArg=None, **kwargs): """ @param server: Gerrit SSH server's address to use for push event notifications. @param username: Gerrit SSH server's username. @param reviewCB: Callback that is called each time a build is finished, and that is used to define the message and review approvals depending on the build result. + @param startCB: Callback that is called each time a build is started. + Used to define the message sent to Gerrit. @param port: Gerrit SSH server's port. - @param reviewArg: Optional argument that is passed to the callback. + @param reviewArg: Optional argument passed to the review callback. + @param startArg: Optional argument passed to the start callback. """ StatusReceiverMultiService.__init__(self) # Parameters. @@ -54,6 +58,8 @@ def __init__(self, server, username, reviewCB=defaultReviewCB, port=29418, revie self.gerrit_port = port self.reviewCB = reviewCB self.reviewArg = reviewArg + self.startCB = startCB + self.startArg = startArg class LocalPP(ProcessProtocol): def __init__(self, status): @@ -80,18 +86,26 @@ def startService(self): def builderAdded(self, name, builder): return self # subscribe to this builder + def buildStarted(self, builderName, build): + if self.startCB is not None: + message = self.startCB(builderName, build, self.startArg) + self.sendCodeReviews(build, message) + def buildFinished(self, builderName, build, result): """Do the SSH gerrit verify command to the server.""" + message, verified, reviewed = self.reviewCB(builderName, build, result, self.reviewArg) + self.sendCodeReviews(build, message, verified, reviewed) + + def sendCodeReviews(self, build, message, verified=0, reviewed=0): + if message is None: + return # Gerrit + Repo downloads = build.getProperty("repo_downloads") downloaded = build.getProperty("repo_downloaded") - if downloads is not None and downloaded is not None: + if downloads is not None and downloaded is not None: downloaded = downloaded.split(" ") if downloads and 2 * len(downloads) == len(downloaded): - message, verified, reviewed = self.reviewCB(builderName, build, result, self.status, self.reviewArg) - if message is None: - return for i in range(0, len(downloads)): try: project, change1 = downloads[i].split(" ") @@ -110,9 +124,6 @@ def buildFinished(self, builderName, build, result): project = build.getProperty("project") revision = build.getProperty("got_revision") if project is not None and revision is not None: - message, verified, reviewed = self.reviewCB(builderName, build, result, self.status, self.reviewArg) - if message is None: - return self.sendCodeReview(project, revision, message, verified, reviewed) return diff --git a/master/docs/release-notes.rst b/master/docs/release-notes.rst index a5db9251f6a..77e23a403c7 100644 --- a/master/docs/release-notes.rst +++ b/master/docs/release-notes.rst @@ -31,6 +31,10 @@ Changes for Developers * Added an optional build start callback to ``buildbot.status.status_gerrit.GerritStatusPush`` +* An optional ``startCB`` callback to :bb:status:`GerritStatusPush` can be used + to send a message back to the committer. + See the linked documentation for details. + Slave -----