mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-25 00:02:41 +01:00
ef85f49adc
Summary: This commit doesn't change license of any file. It just makes the license implicit (inherited from LICENSE file in the root directory). We are removing the headers for these reasons: - It wastes space in editors, less code is visible in editor upon opening a file. - It brings noise to diff of the first change of any file every year. - It confuses Git file copy detection when creating small files. - We don't have an explicit license header in other files (JS, CSS, images, documentation). - Using license header in every file is not obligatory: http://www.apache.org/dev/apply-license.html#new. This change is approved by Alma Chao (Lead Open Source and IP Counsel at Facebook). Test Plan: Verified that the license survived only in LICENSE file and that it didn't modify externals. Reviewers: epriestley, davidrecordon Reviewed By: epriestley CC: aran, Korvin Maniphest Tasks: T2035 Differential Revision: https://secure.phabricator.com/D3886
204 lines
5.5 KiB
PHP
204 lines
5.5 KiB
PHP
<?php
|
|
|
|
abstract class PackageMail {
|
|
|
|
protected $package;
|
|
protected $handles;
|
|
protected $owners;
|
|
protected $paths;
|
|
protected $mailTo;
|
|
|
|
public function __construct(PhabricatorOwnersPackage $package) {
|
|
$this->package = $package;
|
|
}
|
|
|
|
abstract protected function getVerb();
|
|
|
|
abstract protected function isNewThread();
|
|
|
|
final protected function getPackage() {
|
|
return $this->package;
|
|
}
|
|
|
|
final protected function getHandles() {
|
|
return $this->handles;
|
|
}
|
|
|
|
final protected function getOwners() {
|
|
return $this->owners;
|
|
}
|
|
|
|
final protected function getPaths() {
|
|
return $this->paths;
|
|
}
|
|
|
|
final protected function getMailTo() {
|
|
return $this->mailTo;
|
|
}
|
|
|
|
final protected function renderPackageTitle() {
|
|
return $this->getPackage()->getName();
|
|
}
|
|
|
|
final protected function renderRepoSubSection($repository_phid, $paths) {
|
|
$handles = $this->getHandles();
|
|
$section = array();
|
|
$section[] = ' In repository '.$handles[$repository_phid]->getName().
|
|
' - '. PhabricatorEnv::getProductionURI($handles[$repository_phid]
|
|
->getURI());
|
|
foreach ($paths as $path => $ignored) {
|
|
$section[] = ' '.$path;
|
|
}
|
|
|
|
return implode("\n", $section);
|
|
}
|
|
|
|
protected function needSend() {
|
|
return true;
|
|
}
|
|
|
|
protected function loadData() {
|
|
$package = $this->getPackage();
|
|
$owners = $package->loadOwners();
|
|
$this->owners = $owners;
|
|
|
|
$owner_phids = mpull($owners, 'getUserPHID');
|
|
$primary_owner_phid = $package->getPrimaryOwnerPHID();
|
|
$mail_to = $owner_phids;
|
|
if (!in_array($primary_owner_phid, $owner_phids)) {
|
|
$mail_to[] = $primary_owner_phid;
|
|
}
|
|
$this->mailTo = $mail_to;
|
|
|
|
$paths = $package->loadPaths();
|
|
$this->paths = mgroup($paths, 'getRepositoryPHID', 'getPath');
|
|
|
|
$phids = array_merge(
|
|
$this->mailTo,
|
|
array($package->getActorPHID()),
|
|
array_keys($this->paths));
|
|
$this->handles = id(new PhabricatorObjectHandleData($phids))->loadHandles();
|
|
}
|
|
|
|
final protected function renderSummarySection() {
|
|
$package = $this->getPackage();
|
|
$handles = $this->getHandles();
|
|
$section = array();
|
|
$section[] = $handles[$package->getActorPHID()]->getName().' '.
|
|
strtolower($this->getVerb()).' '.$this->renderPackageTitle().'.';
|
|
$section[] = '';
|
|
|
|
$section[] = 'PACKAGE DETAIL';
|
|
$section[] = ' '.PhabricatorEnv::getProductionURI(
|
|
'/owners/package/'.$package->getID().'/');
|
|
|
|
return implode("\n", $section);
|
|
}
|
|
|
|
protected function renderDescriptionSection() {
|
|
return "PACKAGE DESCRIPTION\n".
|
|
' '.$this->getPackage()->getDescription();
|
|
}
|
|
|
|
protected function renderPrimaryOwnerSection() {
|
|
$handles = $this->getHandles();
|
|
return "PRIMARY OWNER\n".
|
|
' '.$handles[$this->getPackage()->getPrimaryOwnerPHID()]->getName();
|
|
}
|
|
|
|
protected function renderOwnersSection() {
|
|
$handles = $this->getHandles();
|
|
$owners = $this->getOwners();
|
|
if (!$owners) {
|
|
return null;
|
|
}
|
|
|
|
$owners = mpull($owners, 'getUserPHID');
|
|
$owners = array_select_keys($handles, $owners);
|
|
$owners = mpull($owners, 'getName');
|
|
return "OWNERS\n".
|
|
' '.implode(', ', $owners);
|
|
}
|
|
|
|
protected function renderAuditingEnabledSection() {
|
|
return "AUDITING ENABLED STATUS\n".
|
|
' '.($this->getPackage()->getAuditingEnabled() ? 'Enabled' : 'Disabled');
|
|
}
|
|
|
|
protected function renderPathsSection() {
|
|
$section = array();
|
|
$section[] = 'PATHS';
|
|
foreach ($this->paths as $repository_phid => $paths) {
|
|
$section[] = $this->renderRepoSubSection($repository_phid, $paths);
|
|
}
|
|
|
|
return implode("\n", $section);
|
|
}
|
|
|
|
final protected function renderBody() {
|
|
$body = array();
|
|
$body[] = $this->renderSummarySection();
|
|
$body[] = $this->renderDescriptionSection();
|
|
$body[] = $this->renderPrimaryOwnerSection();
|
|
$body[] = $this->renderOwnersSection();
|
|
$body[] = $this->renderAuditingEnabledSection();
|
|
$body[] = $this->renderPathsSection();
|
|
$body = array_filter($body);
|
|
return implode("\n\n", $body)."\n";
|
|
}
|
|
|
|
final public function send() {
|
|
$mails = $this->prepareMails();
|
|
|
|
foreach ($mails as $mail) {
|
|
$mail->saveAndSend();
|
|
}
|
|
}
|
|
|
|
final public function prepareMails() {
|
|
if (!$this->needSend()) {
|
|
return array();
|
|
}
|
|
|
|
$this->loadData();
|
|
|
|
$package = $this->getPackage();
|
|
$prefix = PhabricatorEnv::getEnvConfig('metamta.package.subject-prefix');
|
|
$verb = $this->getVerb();
|
|
$threading = $this->getMailThreading();
|
|
list($thread_id, $thread_topic) = $threading;
|
|
|
|
$template = id(new PhabricatorMetaMTAMail())
|
|
->setSubject($this->renderPackageTitle())
|
|
->setSubjectPrefix($prefix)
|
|
->setVarySubjectPrefix("[{$verb}]")
|
|
->setFrom($package->getActorPHID())
|
|
->setThreadID($thread_id, $this->isNewThread())
|
|
->addHeader('Thread-Topic', $thread_topic)
|
|
->setRelatedPHID($package->getPHID())
|
|
->setIsBulk(true)
|
|
->setBody($this->renderBody());
|
|
|
|
$reply_handler = $this->newReplyHandler();
|
|
$mails = $reply_handler->multiplexMail(
|
|
$template,
|
|
array_select_keys($this->getHandles(), $this->getMailTo()),
|
|
array());
|
|
return $mails;
|
|
}
|
|
|
|
private function getMailThreading() {
|
|
return array(
|
|
'package-'.$this->getPackage()->getPHID(),
|
|
'Package '.$this->getPackage()->getOriginalName(),
|
|
);
|
|
}
|
|
|
|
private function newReplyHandler() {
|
|
$reply_handler = PhabricatorEnv::newObjectFromConfig(
|
|
'metamta.package.reply-handler');
|
|
$reply_handler->setMailReceiver($this->getPackage());
|
|
return $reply_handler;
|
|
}
|
|
|
|
}
|