3 final class PhabricatorRepositoryPushMailWorker
4 extends PhabricatorWorker
{
6 protected function doWork() {
7 $viewer = PhabricatorUser
::getOmnipotentUser();
9 $task_data = $this->getTaskData();
11 $email_phids = idx($task_data, 'emailPHIDs');
13 // If we don't have any email targets, don't send any email.
17 $event_phid = idx($task_data, 'eventPHID');
18 $event = id(new PhabricatorRepositoryPushEventQuery())
20 ->withPHIDs(array($event_phid))
24 $repository = $event->getRepository();
26 $publisher = $repository->newPublisher();
27 if (!$publisher->shouldPublishRepository()) {
28 // If the repository is still importing, don't send email.
32 $targets = id(new PhabricatorRepositoryPushReplyHandler())
33 ->setMailReceiver($repository)
34 ->getMailTargets($email_phids, array());
37 foreach ($targets as $target) {
38 $messages[] = $this->sendMail($target, $repository, $event);
41 foreach ($messages as $message) {
46 private function sendMail(
47 PhabricatorMailTarget
$target,
48 PhabricatorRepository
$repository,
49 PhabricatorRepositoryPushEvent
$event) {
51 $task_data = $this->getTaskData();
52 $viewer = $target->getViewer();
54 $locale = PhabricatorEnv
::beginScopedLocale($viewer->getTranslation());
56 $logs = $event->getLogs();
58 list($ref_lines, $ref_list) = $this->renderRefs($logs);
59 list($commit_lines, $subject_line) = $this->renderCommits(
62 idx($task_data, 'info', array()));
64 $ref_count = count($ref_lines);
65 $commit_count = count($commit_lines);
67 $handles = id(new PhabricatorHandleQuery())
69 ->withPHIDs(array($event->getPusherPHID()))
72 $pusher_name = $handles[$event->getPusherPHID()]->getName();
73 $repo_name = $repository->getMonogram();
77 '%s pushed %d commit(s) to %s.',
88 $details_uri = PhabricatorEnv
::getProductionURI(
89 '/diffusion/pushlog/view/'.$event->getID().'/');
91 $body = new PhabricatorMetaMTAMailBody();
92 $body->addRawSection($overview);
94 $body->addLinkSection(pht('DETAILS'), $details_uri);
97 $body->addTextSection(pht('COMMITS'), implode("\n", $commit_lines));
101 $body->addTextSection(pht('REFERENCES'), implode("\n", $ref_lines));
104 $prefix = pht('[Diffusion]');
108 $parts[] = pht('%s commit(s)', $commit_count);
111 $parts[] = implode(', ', $ref_list);
113 $parts = implode(', ', $parts);
116 $subject = pht('(%s) %s', $parts, $subject_line);
118 $subject = pht('(%s)', $parts);
121 $mail = id(new PhabricatorMetaMTAMail())
122 ->setRelatedPHID($event->getPHID())
123 ->setSubjectPrefix($prefix)
124 ->setVarySubjectPrefix(pht('[Push]'))
125 ->setSubject($subject)
126 ->setFrom($event->getPusherPHID())
127 ->setBody($body->render())
128 ->setHTMLBody($body->renderHTML())
129 ->setThreadID($event->getPHID(), $is_new = true)
132 return $target->willSendMail($mail);
135 private function renderRefs(array $logs) {
136 $ref_lines = array();
139 foreach ($logs as $log) {
142 switch ($log->getRefType()) {
143 case PhabricatorRepositoryPushLog
::REFTYPE_BRANCH
:
144 $type_name = pht('branch');
146 case PhabricatorRepositoryPushLog
::REFTYPE_TAG
:
147 $type_name = pht('tag');
148 $type_prefix = pht('tag:');
150 case PhabricatorRepositoryPushLog
::REFTYPE_BOOKMARK
:
151 $type_name = pht('bookmark');
152 $type_prefix = pht('bookmark:');
154 case PhabricatorRepositoryPushLog
::REFTYPE_REF
:
155 $type_name = pht('ref');
156 $type_prefix = pht('ref:');
158 case PhabricatorRepositoryPushLog
::REFTYPE_COMMIT
:
163 if ($type_name === null) {
167 $flags = $log->getChangeFlags();
168 if ($flags & PhabricatorRepositoryPushLog
::CHANGEFLAG_DANGEROUS
) {
170 } else if ($flags & PhabricatorRepositoryPushLog
::CHANGEFLAG_DELETE
) {
172 } else if ($flags & PhabricatorRepositoryPushLog
::CHANGEFLAG_REWRITE
) {
174 } else if ($flags & PhabricatorRepositoryPushLog
::CHANGEFLAG_APPEND
) {
176 } else if ($flags & PhabricatorRepositoryPushLog
::CHANGEFLAG_ADD
) {
182 $old = nonempty($log->getRefOldShort(), pht('<null>'));
183 $new = nonempty($log->getRefNewShort(), pht('<null>'));
185 $name = $log->getRefName();
187 $ref_lines[] = "{$action} {$type_name} {$name} {$old} > {$new}";
188 $ref_list[] = $type_prefix.$name;
193 array_unique($ref_list),
197 private function renderCommits(
198 PhabricatorRepository
$repository,
202 $commit_lines = array();
203 $subject_line = null;
204 foreach ($logs as $log) {
205 if ($log->getRefType() != PhabricatorRepositoryPushLog
::REFTYPE_COMMIT
) {
209 $commit_info = idx($info, $log->getRefNew(), array());
211 $name = $repository->formatCommitName($log->getRefNew());
214 if (idx($commit_info, 'branches')) {
215 $branches = ' ('.implode(', ', $commit_info['branches']).')';
219 if (strlen(idx($commit_info, 'summary'))) {
220 $summary = ' '.$commit_info['summary'];
223 $commit_lines[] = "{$name}{$branches}{$summary}";
224 if ($subject_line === null) {
225 $subject_line = "{$name}{$summary}";
229 return array($commit_lines, $subject_line);