1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17  """Push events to gerrit 
 18   
 19  .""" 
 20   
 21  from buildbot.status.base import StatusReceiverMultiService 
 22  from buildbot.status.builder import Results 
 23  from twisted.internet import reactor 
 24  from twisted.internet.protocol import ProcessProtocol 
 25   
 27      message =  "Buildbot finished compiling your patchset\n" 
 28      message += "on configuration: %s\n" % builderName 
 29      message += "The result is: %s\n" % Results[result].upper() 
 30   
 31       
 32      return message, (result == 0 or -1), 0 
  33   
 35      """Event streamer to a gerrit ssh server.""" 
 36   
 39          """ 
 40          @param server:    Gerrit SSH server's address to use for push event notifications. 
 41          @param username:  Gerrit SSH server's username. 
 42          @param reviewCB:  Callback that is called each time a build is finished, and that is used 
 43                            to define the message and review approvals depending on the build result. 
 44          @param port:      Gerrit SSH server's port. 
 45          @param reviewArg: Optional argument that is passed to the callback. 
 46          """ 
 47          StatusReceiverMultiService.__init__(self) 
 48           
 49          self.gerrit_server = server 
 50          self.gerrit_username = username 
 51          self.gerrit_port = port 
 52          self.reviewCB = reviewCB 
 53          self.reviewArg = reviewArg 
  54   
 58   
 60              print "gerritout:", data 
  61   
 63              print "gerriterr:", data 
  64   
 66              if status_object.value.exitCode: 
 67                  print "gerrit status: ERROR:", status_object 
 68              else: 
 69                  print "gerrit status: OK" 
   70   
 76   
 79   
 81          """Do the SSH gerrit verify command to the server.""" 
 82          repo, git = False, False 
 83   
 84           
 85          try: 
 86              downloads = build.getProperty("repo_downloads") 
 87              downloaded = build.getProperty("repo_downloaded").split(" ") 
 88              repo = True 
 89          except KeyError: 
 90              pass 
 91   
 92          if repo: 
 93              if downloads and 2 * len(downloads) == len(downloaded): 
 94                  message, verified, reviewed = self.reviewCB(builderName, build, result, self.reviewArg) 
 95                  for i in range(0, len(downloads)): 
 96                      try: 
 97                          project, change1 = downloads[i].split(" ") 
 98                      except ValueError: 
 99                          return  
100                      change2 = downloaded[2 * i] 
101                      revision = downloaded[2 * i + 1] 
102                      if change1 == change2: 
103                          self.sendCodeReview(project, revision, message, verified, reviewed) 
104                      else: 
105                          return  
106              return 
107   
108           
109          try: 
110              build.getProperty("gerrit_branch")  
111              project = build.getProperty("project") 
112              revision = build.getProperty("got_revision") 
113              git = True 
114          except KeyError: 
115              pass 
116   
117          if git: 
118              message, verified, reviewed = self.reviewCB(builderName, build, result, self.reviewArg) 
119              self.sendCodeReview(project, revision, message, verified, reviewed) 
120              return 
 121   
122 -    def sendCodeReview(self, project, revision, message=None, verified=0, reviewed=0): 
 123          command = ["ssh", self.gerrit_username + "@" + self.gerrit_server, "-p %d" % self.gerrit_port, 
124                     "gerrit", "review", "--project %s" % str(project)] 
125          if message: 
126              command.append("--message '%s'" % message.replace("'","\"")) 
127          if verified: 
128              command.extend(["--verified %d" % int(verified)]) 
129          if reviewed: 
130              command.extend(["--code-review %d" % int(reviewed)]) 
131          command.append(str(revision)) 
132          print command 
133          reactor.spawnProcess(self.LocalPP(self), "ssh", command) 
  134   
135   
136