Skip to content

Commit

Permalink
Merge sa2ajj/buildbot:gerrit-labels (PR #1175)
Browse files Browse the repository at this point in the history
+autopep8
  • Loading branch information
djmitche committed Jul 12, 2014
2 parents ce8b220 + e0be6c9 commit 2008c3f
Show file tree
Hide file tree
Showing 6 changed files with 339 additions and 141 deletions.
106 changes: 65 additions & 41 deletions master/buildbot/status/status_gerrit.py
Expand Up @@ -20,6 +20,8 @@

import time

import warnings

from buildbot.status import buildset
from buildbot.status.base import StatusReceiverMultiService
from buildbot.status.builder import EXCEPTION
Expand All @@ -36,17 +38,57 @@
# Cache the version that the gerrit server is running for this many seconds
GERRIT_VERSION_CACHE_TIMEOUT = 600

GERRIT_LABEL_VERIFIED = 'Verified'
GERRIT_LABEL_REVIEWED = 'Code-Review'


def makeReviewResult(message, *labels):
"""
helper to produce a review result
"""
return dict(message=message, labels=dict(labels))


def _handleLegacyResult(result):
"""
make sure the result is backward compatible
"""
if not isinstance(result, dict):
warnings.warn('The Gerrit status callback uses the old way to '
'communicate results. The outcome might be not what is '
'expected.')
message, verified, reviewed = result
result = makeReviewResult(message,
(GERRIT_LABEL_VERIFIED, verified),
(GERRIT_LABEL_REVIEWED, reviewed))
return result


def _old_add_label(label, value):
if label == GERRIT_LABEL_VERIFIED:
return ["--verified %d" % int(value)]
elif label == GERRIT_LABEL_REVIEWED:
return ["--code-review %d" % int(value)]
else:
warnings.warn('Gerrit older than 2.6 does not support custom labels. '
'Setting %s is ignored.' % label)
return []


def _new_add_label(label, value):
return ["--label %s=%d" % (label, int(value))]


def defaultReviewCB(builderName, build, result, status, arg):
if result == RETRY:
return None, 0, 0
return makeReviewResult(None)

message = "Buildbot finished compiling your patchset\n"
message += "on configuration: %s\n" % builderName
message += "The result is: %s\n" % Results[result].upper()

# message, verified, reviewed
return message, (result == SUCCESS or -1), 0
return makeReviewResult(message,
(GERRIT_LABEL_VERIFIED, result == SUCCESS or -1))


def defaultSummaryCB(buildInfoList, results, status, arg):
Expand All @@ -69,15 +111,12 @@ def defaultSummaryCB(buildInfoList, results, status, arg):
else:
failure = True

msg = '\n\n'.join(msgs)

if success and not failure:
verified = 1
else:
verified = -1

reviewed = 0
return (msg, verified, reviewed)
return makeReviewResult('\n\n'.join(msgs), (GERRIT_LABEL_VERIFIED, verified))


# These are just sentinel values for GerritStatusPush.__init__ args
Expand All @@ -96,20 +135,6 @@ class GerritStatusPush(StatusReceiverMultiService, buildset.BuildSetSummaryNotif
def __init__(self, server, username, reviewCB=DEFAULT_REVIEW,
startCB=None, port=29418, reviewArg=None,
startArg=None, summaryCB=DEFAULT_SUMMARY, summaryArg=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 passed to the review callback.
@param startArg: Optional argument passed to the start callback.
@param summaryCB: Callback that is called each time a buildset finishes, and that is used
to define a message and review approvals depending on the build result.
@param summaryArg: Optional argument passed to the summary callback.
"""
StatusReceiverMultiService.__init__(self)

# If neither reviewCB nor summaryCB were specified, default to sending
Expand Down Expand Up @@ -232,8 +257,8 @@ def buildStarted(self, builderName, build):
def buildFinished(self, builderName, build, result):
"""Do the SSH gerrit verify command to the server."""
if self.reviewCB:
message, verified, reviewed = self.reviewCB(builderName, build, result, self.master_status, self.reviewArg)
self.sendCodeReviews(build, message, verified, reviewed)
result = _handleLegacyResult(self.reviewCB(builderName, build, result, self.master_status, self.reviewArg))
self.sendCodeReviews(build, result)

def sendBuildSetSummary(self, buildset, builds):
if self.summaryCB:
Expand All @@ -254,10 +279,11 @@ def getBuildInfo(build):
}
buildInfoList = sorted([getBuildInfo(build) for build in builds], key=lambda bi: bi['name'])

message, verified, reviewed = self.summaryCB(buildInfoList, Results[buildset['results']], self.master_status, self.summaryArg)
self.sendCodeReviews(builds[0], message, verified, reviewed)
result = _handleLegacyResult(self.summaryCB(buildInfoList, Results[buildset['results']], self.master_status, self.summaryArg))
self.sendCodeReviews(builds[0], result)

def sendCodeReviews(self, build, message, verified=0, reviewed=0):
def sendCodeReviews(self, build, result):
message = result.get('message', None)
if message is None:
return

Expand All @@ -275,7 +301,7 @@ def sendCodeReviews(self, build, message, verified=0, reviewed=0):
change2 = downloaded[2 * i]
revision = downloaded[2 * i + 1]
if change1 == change2:
self.sendCodeReview(project, revision, message, verified, reviewed)
self.sendCodeReview(project, revision, result)
else:
return # something is wrong, abort
return
Expand All @@ -291,32 +317,30 @@ def sendCodeReviews(self, build, message, verified=0, reviewed=0):
revision = None

if project is not None and revision is not None:
self.sendCodeReview(project, revision, message, verified, reviewed)
self.sendCodeReview(project, revision, result)
return

def sendCodeReview(self, project, revision, message=None, verified=0, reviewed=0):
def sendCodeReview(self, project, revision, result):
gerrit_version = self.getCachedVersion()
if (verified or reviewed) and gerrit_version is None:
self.callWithVersion(lambda: self.sendCodeReview(project, revision, message, verified, reviewed))
if gerrit_version is None:
self.callWithVersion(lambda: self.sendCodeReview(project, revision, result))
return

command = self._gerritCmd("review", "--project %s" % str(project))
message = result.get('message', None)
if message:
command.append("--message '%s'" % message.replace("'", "\""))

if verified:
assert(gerrit_version)
labels = result.get('labels', None)
if labels:
assert gerrit_version
if gerrit_version < LooseVersion("2.6"):
command.extend(["--verified %d" % int(verified)])
add_label = _old_add_label
else:
command.extend(["--label Verified=%d" % int(verified)])
add_label = _new_add_label

if reviewed:
assert(gerrit_version)
if gerrit_version < LooseVersion("2.6"):
command.extend(["--code-review %d" % int(reviewed)])
else:
command.extend(["--label Code-Review=%d" % int(reviewed)])
for label, value in labels.items():
command.extend(add_label(label, value))

command.append(str(revision))
print command
Expand Down

0 comments on commit 2008c3f

Please sign in to comment.