Package buildbot :: Package status :: Module status_gerrit
[frames] | no frames]

Source Code for Module buildbot.status.status_gerrit

  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 
  3  # License as published by the Free Software Foundation, version 2. 
  4  # 
  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 
  7  # FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more 
  8  # details. 
  9  # 
 10  # You should have received a copy of the GNU General Public License along with 
 11  # this program; if not, write to the Free Software Foundation, Inc., 51 
 12  # Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 
 13  # 
 14  # Copyright Buildbot Team Members 
 15   
 16   
 17  """Push events to gerrit 
 18   
 19  .""" 
 20   
 21  from buildbot.status.base import StatusReceiverMultiService 
 22  from buildbot.status.builder import Results, SUCCESS, RETRY 
 23  from twisted.internet import reactor 
 24  from twisted.internet.protocol import ProcessProtocol 
 25   
26 -def defaultReviewCB(builderName, build, result, status, arg):
27 if result == RETRY: 28 return None, 0, 0 29 30 message = "Buildbot finished compiling your patchset\n" 31 message += "on configuration: %s\n" % builderName 32 message += "The result is: %s\n" % Results[result].upper() 33 34 # message, verified, reviewed 35 return message, (result == SUCCESS or -1), 0
36
37 -class GerritStatusPush(StatusReceiverMultiService):
38 """Event streamer to a gerrit ssh server.""" 39
40 - def __init__(self, server, username, reviewCB=defaultReviewCB, 41 startCB=None, port=29418, reviewArg=None, 42 startArg=None, **kwargs):
43 """ 44 @param server: Gerrit SSH server's address to use for push event notifications. 45 @param username: Gerrit SSH server's username. 46 @param reviewCB: Callback that is called each time a build is finished, and that is used 47 to define the message and review approvals depending on the build result. 48 @param startCB: Callback that is called each time a build is started. 49 Used to define the message sent to Gerrit. 50 @param port: Gerrit SSH server's port. 51 @param reviewArg: Optional argument passed to the review callback. 52 @param startArg: Optional argument passed to the start callback. 53 """ 54 StatusReceiverMultiService.__init__(self) 55 # Parameters. 56 self.gerrit_server = server 57 self.gerrit_username = username 58 self.gerrit_port = port 59 self.reviewCB = reviewCB 60 self.reviewArg = reviewArg 61 self.startCB = startCB 62 self.startArg = startArg
63
64 - class LocalPP(ProcessProtocol):
65 - def __init__(self, status):
66 self.status = status
67
68 - def outReceived(self, data):
69 print "gerritout:", data
70
71 - def errReceived(self, data):
72 print "gerriterr:", data
73
74 - def processEnded(self, status_object):
75 if status_object.value.exitCode: 76 print "gerrit status: ERROR:", status_object 77 else: 78 print "gerrit status: OK"
79
80 - def startService(self):
81 print """Starting up.""" 82 StatusReceiverMultiService.startService(self) 83 self.status = self.parent.getStatus() 84 self.status.subscribe(self)
85
86 - def builderAdded(self, name, builder):
87 return self # subscribe to this builder
88
89 - def buildStarted(self, builderName, build):
90 if self.startCB is not None: 91 message = self.startCB(builderName, build, self.startArg) 92 self.sendCodeReviews(build, message)
93
94 - def buildFinished(self, builderName, build, result):
95 """Do the SSH gerrit verify command to the server.""" 96 message, verified, reviewed = self.reviewCB(builderName, build, result, self.reviewArg) 97 self.sendCodeReviews(build, message, verified, reviewed)
98
99 - def sendCodeReviews(self, build, message, verified=0, reviewed=0):
100 if message is None: 101 return 102 103 # Gerrit + Repo 104 downloads = build.getProperty("repo_downloads") 105 downloaded = build.getProperty("repo_downloaded") 106 if downloads is not None and downloaded is not None: 107 downloaded = downloaded.split(" ") 108 if downloads and 2 * len(downloads) == len(downloaded): 109 for i in range(0, len(downloads)): 110 try: 111 project, change1 = downloads[i].split(" ") 112 except ValueError: 113 return # something is wrong, abort 114 change2 = downloaded[2 * i] 115 revision = downloaded[2 * i + 1] 116 if change1 == change2: 117 self.sendCodeReview(project, revision, message, verified, reviewed) 118 else: 119 return # something is wrong, abort 120 return 121 122 # Gerrit + Git 123 if build.getProperty("gerrit_branch") is not None: # used only to verify Gerrit source 124 project = build.getProperty("project") 125 revision = build.getProperty("got_revision") 126 127 # review doesn't really work with multiple revisions, so let's 128 # just assume it's None there 129 if isinstance(revision, dict): 130 revision = None 131 132 if project is not None and revision is not None: 133 self.sendCodeReview(project, revision, message, verified, reviewed) 134 return
135
136 - def sendCodeReview(self, project, revision, message=None, verified=0, reviewed=0):
137 command = ["ssh", self.gerrit_username + "@" + self.gerrit_server, "-p %d" % self.gerrit_port, 138 "gerrit", "review", "--project %s" % str(project)] 139 if message: 140 command.append("--message '%s'" % message.replace("'","\"")) 141 if verified: 142 command.extend(["--verified %d" % int(verified)]) 143 if reviewed: 144 command.extend(["--code-review %d" % int(reviewed)]) 145 command.append(str(revision)) 146 print command 147 reactor.spawnProcess(self.LocalPP(self), "ssh", command)
148 149 # vim: set ts=4 sts=4 sw=4 et: 150