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, SUCCESS, RETRY
23 from twisted.internet import reactor
24 from twisted.internet.protocol import ProcessProtocol
25
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
35 return message, (result == SUCCESS or -1), 0
36
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
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
67
69 print "gerritout:", data
70
72 print "gerriterr:", data
73
75 if status_object.value.exitCode:
76 print "gerrit status: ERROR:", status_object
77 else:
78 print "gerrit status: OK"
79
85
88
90 if self.startCB is not None:
91 message = self.startCB(builderName, build, self.startArg)
92 self.sendCodeReviews(build, message)
93
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
100 if message is None:
101 return
102
103
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
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
120 return
121
122
123 if build.getProperty("gerrit_branch") is not None:
124 project = build.getProperty("project")
125 revision = build.getProperty("got_revision")
126
127
128
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
150