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)
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