Correct Aphlict websocket URI construction after PHP8 compatibility changes
[phabricator.git] / src / applications / repository / worker / PhabricatorRepositoryPushMailWorker.php
blobf6958b786372dbdb0857ab55719b643f57fd7fb7
1 <?php
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');
12 if (!$email_phids) {
13 // If we don't have any email targets, don't send any email.
14 return;
17 $event_phid = idx($task_data, 'eventPHID');
18 $event = id(new PhabricatorRepositoryPushEventQuery())
19 ->setViewer($viewer)
20 ->withPHIDs(array($event_phid))
21 ->needLogs(true)
22 ->executeOne();
24 $repository = $event->getRepository();
26 $publisher = $repository->newPublisher();
27 if (!$publisher->shouldPublishRepository()) {
28 // If the repository is still importing, don't send email.
29 return;
32 $targets = id(new PhabricatorRepositoryPushReplyHandler())
33 ->setMailReceiver($repository)
34 ->getMailTargets($email_phids, array());
36 $messages = array();
37 foreach ($targets as $target) {
38 $messages[] = $this->sendMail($target, $repository, $event);
41 foreach ($messages as $message) {
42 $message->save();
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(
60 $repository,
61 $logs,
62 idx($task_data, 'info', array()));
64 $ref_count = count($ref_lines);
65 $commit_count = count($commit_lines);
67 $handles = id(new PhabricatorHandleQuery())
68 ->setViewer($viewer)
69 ->withPHIDs(array($event->getPusherPHID()))
70 ->execute();
72 $pusher_name = $handles[$event->getPusherPHID()]->getName();
73 $repo_name = $repository->getMonogram();
75 if ($commit_count) {
76 $overview = pht(
77 '%s pushed %d commit(s) to %s.',
78 $pusher_name,
79 $commit_count,
80 $repo_name);
81 } else {
82 $overview = pht(
83 '%s pushed to %s.',
84 $pusher_name,
85 $repo_name);
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);
96 if ($commit_lines) {
97 $body->addTextSection(pht('COMMITS'), implode("\n", $commit_lines));
100 if ($ref_lines) {
101 $body->addTextSection(pht('REFERENCES'), implode("\n", $ref_lines));
104 $prefix = pht('[Diffusion]');
106 $parts = array();
107 if ($commit_count) {
108 $parts[] = pht('%s commit(s)', $commit_count);
110 if ($ref_count) {
111 $parts[] = implode(', ', $ref_list);
113 $parts = implode(', ', $parts);
115 if ($subject_line) {
116 $subject = pht('(%s) %s', $parts, $subject_line);
117 } else {
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)
130 ->setIsBulk(true);
132 return $target->willSendMail($mail);
135 private function renderRefs(array $logs) {
136 $ref_lines = array();
137 $ref_list = array();
139 foreach ($logs as $log) {
140 $type_name = null;
141 $type_prefix = null;
142 switch ($log->getRefType()) {
143 case PhabricatorRepositoryPushLog::REFTYPE_BRANCH:
144 $type_name = pht('branch');
145 break;
146 case PhabricatorRepositoryPushLog::REFTYPE_TAG:
147 $type_name = pht('tag');
148 $type_prefix = pht('tag:');
149 break;
150 case PhabricatorRepositoryPushLog::REFTYPE_BOOKMARK:
151 $type_name = pht('bookmark');
152 $type_prefix = pht('bookmark:');
153 break;
154 case PhabricatorRepositoryPushLog::REFTYPE_REF:
155 $type_name = pht('ref');
156 $type_prefix = pht('ref:');
157 break;
158 case PhabricatorRepositoryPushLog::REFTYPE_COMMIT:
159 default:
160 break;
163 if ($type_name === null) {
164 continue;
167 $flags = $log->getChangeFlags();
168 if ($flags & PhabricatorRepositoryPushLog::CHANGEFLAG_DANGEROUS) {
169 $action = '!';
170 } else if ($flags & PhabricatorRepositoryPushLog::CHANGEFLAG_DELETE) {
171 $action = '-';
172 } else if ($flags & PhabricatorRepositoryPushLog::CHANGEFLAG_REWRITE) {
173 $action = '~';
174 } else if ($flags & PhabricatorRepositoryPushLog::CHANGEFLAG_APPEND) {
175 $action = ' ';
176 } else if ($flags & PhabricatorRepositoryPushLog::CHANGEFLAG_ADD) {
177 $action = '+';
178 } else {
179 $action = '?';
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;
191 return array(
192 $ref_lines,
193 array_unique($ref_list),
197 private function renderCommits(
198 PhabricatorRepository $repository,
199 array $logs,
200 array $info) {
202 $commit_lines = array();
203 $subject_line = null;
204 foreach ($logs as $log) {
205 if ($log->getRefType() != PhabricatorRepositoryPushLog::REFTYPE_COMMIT) {
206 continue;
209 $commit_info = idx($info, $log->getRefNew(), array());
211 $name = $repository->formatCommitName($log->getRefNew());
213 $branches = null;
214 if (idx($commit_info, 'branches')) {
215 $branches = ' ('.implode(', ', $commit_info['branches']).')';
218 $summary = null;
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);