mirror of
https://we.phorge.it/source/phorge.git
synced 2025-02-01 01:18:22 +01:00
Differential - add ability to setup "create" addresses for revisions
Summary: Fixes T1476. The body of the email should be just the output of some diff command. Test Plan: git diff master > text.txt; ./bin/mail receive-test --to <configured-diff-create-address> < text.txt; a diff was successfully created...! email generated had a working link to the diff. ./bin/mail receive-test --to <configured-diff-create-address> < README.md; a diff was not created as expected...! email generated had a sensical error message, telling me that the mail body should have been generated via a diff command Reviewers: epriestley Reviewed By: epriestley Subscribers: johnny-bit, Korvin, epriestley Maniphest Tasks: T1476 Differential Revision: https://secure.phabricator.com/D11574
This commit is contained in:
parent
42c5ef2101
commit
2fc43598b5
5 changed files with 155 additions and 2 deletions
|
@ -322,6 +322,7 @@ phutil_register_library_map(array(
|
|||
'DifferentialCreateCommentConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateCommentConduitAPIMethod.php',
|
||||
'DifferentialCreateDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateDiffConduitAPIMethod.php',
|
||||
'DifferentialCreateInlineConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateInlineConduitAPIMethod.php',
|
||||
'DifferentialCreateMailReceiver' => 'applications/differential/mail/DifferentialCreateMailReceiver.php',
|
||||
'DifferentialCreateRawDiffConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateRawDiffConduitAPIMethod.php',
|
||||
'DifferentialCreateRevisionConduitAPIMethod' => 'applications/differential/conduit/DifferentialCreateRevisionConduitAPIMethod.php',
|
||||
'DifferentialCustomField' => 'applications/differential/customfield/DifferentialCustomField.php',
|
||||
|
@ -3421,6 +3422,7 @@ phutil_register_library_map(array(
|
|||
'DifferentialCreateCommentConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
||||
'DifferentialCreateDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
||||
'DifferentialCreateInlineConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
||||
'DifferentialCreateMailReceiver' => 'PhabricatorMailReceiver',
|
||||
'DifferentialCreateRawDiffConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
||||
'DifferentialCreateRevisionConduitAPIMethod' => 'DifferentialConduitAPIMethod',
|
||||
'DifferentialCustomField' => 'PhabricatorCustomField',
|
||||
|
|
|
@ -162,6 +162,22 @@ EOTEXT
|
|||
return $status;
|
||||
}
|
||||
|
||||
public function supportsEmailIntegration() {
|
||||
return true;
|
||||
}
|
||||
|
||||
public function getAppEmailBlurb() {
|
||||
return pht(
|
||||
'Send email to these addresses to create revisions. The body of the '.
|
||||
'message and / or one or more attachments should be the output of a '.
|
||||
'"diff" command. %s',
|
||||
phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $this->getInboundEmailSupportLink(),),
|
||||
pht('Learn More')));
|
||||
}
|
||||
|
||||
protected function getCustomCapabilities() {
|
||||
return array(
|
||||
DifferentialDefaultViewCapability::CAPABILITY => array(
|
||||
|
|
|
@ -12,8 +12,9 @@ abstract class DifferentialConduitAPIMethod extends ConduitAPIMethod {
|
|||
$uri = PhabricatorEnv::getProductionURI($uri);
|
||||
|
||||
return array(
|
||||
'id' => $diff->getID(),
|
||||
'uri' => $uri,
|
||||
'id' => $diff->getID(),
|
||||
'phid' => $diff->getPHID(),
|
||||
'uri' => $uri,
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,123 @@
|
|||
<?php
|
||||
|
||||
final class DifferentialCreateMailReceiver extends PhabricatorMailReceiver {
|
||||
|
||||
public function isEnabled() {
|
||||
$app_class = 'PhabricatorDifferentialApplication';
|
||||
return PhabricatorApplication::isClassInstalled($app_class);
|
||||
}
|
||||
|
||||
public function canAcceptMail(PhabricatorMetaMTAReceivedMail $mail) {
|
||||
$differential_app = new PhabricatorDifferentialApplication();
|
||||
return $this->canAcceptApplicationMail($differential_app, $mail);
|
||||
}
|
||||
|
||||
protected function processReceivedMail(
|
||||
PhabricatorMetaMTAReceivedMail $mail,
|
||||
PhabricatorUser $sender) {
|
||||
|
||||
$attachments = $mail->getAttachments();
|
||||
$files = array();
|
||||
$errors = array();
|
||||
if ($attachments) {
|
||||
$files = id(new PhabricatorFileQuery())
|
||||
->setViewer($sender)
|
||||
->withPHIDs($attachments)
|
||||
->execute();
|
||||
foreach ($files as $index => $file) {
|
||||
if ($file->getMimeType() != 'text/plain') {
|
||||
$errors[] = pht(
|
||||
'Could not parse file %s; only files with mimetype text/plain '.
|
||||
'can be parsed via email.',
|
||||
$file->getName());
|
||||
unset($files[$index]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$diffs = array();
|
||||
foreach ($files as $file) {
|
||||
$call = new ConduitCall(
|
||||
'differential.createrawdiff',
|
||||
array(
|
||||
'diff' => $file->loadFileData(),
|
||||
));
|
||||
$call->setUser($sender);
|
||||
try {
|
||||
$result = $call->execute();
|
||||
$diffs[$file->getName()] = $result['uri'];
|
||||
} catch (Exception $e) {
|
||||
$errors[] = pht(
|
||||
'Could not parse attachment %s; only attachments (and mail bodies) '.
|
||||
'generated via "diff" commands can be parsed.',
|
||||
$file->getName());
|
||||
}
|
||||
}
|
||||
|
||||
$body = $mail->getCleanTextBody();
|
||||
if ($body) {
|
||||
$call = new ConduitCall(
|
||||
'differential.createrawdiff',
|
||||
array(
|
||||
'diff' => $body,));
|
||||
$call->setUser($sender);
|
||||
try {
|
||||
$result = $call->execute();
|
||||
$diffs[pht('Mail Body')] = $result['uri'];
|
||||
} catch (Exception $e) {
|
||||
$errors[] = pht(
|
||||
'Could not parse mail body; only mail bodies (and attachments) '.
|
||||
'generated via "diff" commands can be parsed.');
|
||||
}
|
||||
}
|
||||
|
||||
$subject_prefix =
|
||||
PhabricatorEnv::getEnvConfig('metamta.differential.subject-prefix');
|
||||
if (count($diffs)) {
|
||||
$subject = pht(
|
||||
'You successfully created %d diff(s).',
|
||||
count($diffs));
|
||||
} else {
|
||||
$subject = pht(
|
||||
'Diff creation failed; see body for error(s).',
|
||||
count($errors));
|
||||
}
|
||||
$body = new PhabricatorMetaMTAMailBody();
|
||||
$body->addRawSection($subject);
|
||||
if (count($diffs)) {
|
||||
$text_body = '';
|
||||
$html_body = array();
|
||||
$body_label = pht('DIFF LINK(S)', count($diffs));
|
||||
foreach ($diffs as $filename => $diff_uri) {
|
||||
$text_body .= $filename.': '.$diff_uri."\n";
|
||||
$html_body[] = phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $diff_uri,
|
||||
),
|
||||
$filename);
|
||||
$html_body[] = phutil_tag('br');
|
||||
}
|
||||
$body->addTextSection($body_label, $text_body);
|
||||
$body->addHTMLSection($body_label, $html_body);
|
||||
}
|
||||
|
||||
if (count($errors)) {
|
||||
$body_section = new PhabricatorMetaMTAMailSection();
|
||||
$body_label = pht('ERROR(S)', count($errors));
|
||||
foreach ($errors as $error) {
|
||||
$body_section->addFragment($error);
|
||||
}
|
||||
$body->addTextSection($body_label, $body_section);
|
||||
}
|
||||
|
||||
id(new PhabricatorMetaMTAMail())
|
||||
->addTos(array($sender->getPHID()))
|
||||
->setSubject($subject)
|
||||
->setSubjectPrefix($subject_prefix)
|
||||
->setFrom($sender->getPHID())
|
||||
->setBody($body->render())
|
||||
->saveAndSend();
|
||||
}
|
||||
|
||||
}
|
|
@ -19,6 +19,7 @@ abstract class PhabricatorBaseEnglishTranslation
|
|||
),
|
||||
'Task(s)' => array('Task', 'Tasks'),
|
||||
|
||||
'ERROR(S)' => array('ERROR', 'ERRORS'),
|
||||
'%d Error(s)' => array('%d Error', '%d Errors'),
|
||||
'%d Warning(s)' => array('%d Warning', '%d Warnings'),
|
||||
'%d Auto-Fix(es)' => array('%d Auto-Fix', '%d Auto-Fixes'),
|
||||
|
@ -31,6 +32,16 @@ abstract class PhabricatorBaseEnglishTranslation
|
|||
'%d path(s)' => array('%d path', '%d paths'),
|
||||
'%d diff(s)' => array('%d diff', '%d diffs'),
|
||||
|
||||
'DIFF LINK(S)' => array('DIFF LINK', 'DIFF LINKS'),
|
||||
'You successfully created %d diff(s).' => array(
|
||||
'You successfully created %d diff.',
|
||||
'You successfully created %d diffs.',
|
||||
),
|
||||
'Diff creation failed; see body for error(s).' => array(
|
||||
'Diff creation failed; see body for error.',
|
||||
'Diff creation failed; see body for errors.',
|
||||
),
|
||||
|
||||
'There are %d raw fact(s) in storage.' => array(
|
||||
'There is %d raw fact in storage.',
|
||||
'There are %d raw facts in storage.',
|
||||
|
|
Loading…
Add table
Reference in a new issue