Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15433789
D12239.id29409.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
8 KB
Referenced Files
None
Subscribers
None
D12239.id29409.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -287,6 +287,7 @@
'DatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DatabaseConfigurationProvider.php',
'DefaultDatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php',
'DifferentialAction' => 'applications/differential/constants/DifferentialAction.php',
+ 'DifferentialActionEmailCommand' => 'applications/differential/command/DifferentialActionEmailCommand.php',
'DifferentialActionMenuEventListener' => 'applications/differential/event/DifferentialActionMenuEventListener.php',
'DifferentialAddCommentView' => 'applications/differential/view/DifferentialAddCommentView.php',
'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php',
@@ -3459,6 +3460,7 @@
'DarkConsoleServicesPlugin' => 'DarkConsolePlugin',
'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin',
'DefaultDatabaseConfigurationProvider' => 'DatabaseConfigurationProvider',
+ 'DifferentialActionEmailCommand' => 'MetaMTAEmailTransactionCommand',
'DifferentialActionMenuEventListener' => 'PhabricatorEventListener',
'DifferentialAddCommentView' => 'AphrontView',
'DifferentialAffectedPath' => 'DifferentialDAO',
@@ -3578,7 +3580,7 @@
'DifferentialQueryConduitAPIMethod' => 'DifferentialConduitAPIMethod',
'DifferentialQueryDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod',
'DifferentialRemarkupRule' => 'PhabricatorObjectRemarkupRule',
- 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler',
+ 'DifferentialReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler',
'DifferentialRepositoryField' => 'DifferentialCoreCustomField',
'DifferentialRepositoryLookup' => 'Phobject',
'DifferentialRequiredSignaturesField' => 'DifferentialCoreCustomField',
diff --git a/src/applications/differential/command/DifferentialActionEmailCommand.php b/src/applications/differential/command/DifferentialActionEmailCommand.php
new file mode 100644
--- /dev/null
+++ b/src/applications/differential/command/DifferentialActionEmailCommand.php
@@ -0,0 +1,92 @@
+<?php
+
+final class DifferentialActionEmailCommand
+ extends MetaMTAEmailTransactionCommand {
+
+ private $command;
+ private $action;
+ private $aliases;
+
+ public function getCommand() {
+ return $this->command;
+ }
+
+ private function setCommand($command) {
+ $this->command = $command;
+ return $this;
+ }
+
+ private function setAction($action) {
+ $this->action = $action;
+ return $this;
+ }
+
+ private function getAction() {
+ return $this->action;
+ }
+
+ private function setCommandAliases(array $aliases) {
+ $this->aliases = $aliases;
+ return $this;
+ }
+
+ public function getCommandAliases() {
+ return $this->aliases;
+ }
+
+ public function getCommandObjects() {
+ $actions = array(
+ DifferentialAction::ACTION_REJECT => 'request',
+ DifferentialAction::ACTION_ABANDON => 'abandon',
+ DifferentialAction::ACTION_RECLAIM => 'reclaim',
+ DifferentialAction::ACTION_RESIGN => 'resign',
+ DifferentialAction::ACTION_RETHINK => 'rethink',
+ DifferentialAction::ACTION_CLAIM => 'commandeer',
+ );
+
+ if (PhabricatorEnv::getEnvConfig('differential.enable-email-accept')) {
+ $actions[DifferentialAction::ACTION_ACCEPT] = 'accept';
+ }
+
+ $aliases = array(
+ DifferentialAction::ACTION_REJECT => array('reject'),
+ DifferentialAction::ACTION_CLAIM => array('claim'),
+ );
+
+ $objects = array();
+ foreach ($actions as $action => $keyword) {
+ $object = id(new DifferentialActionEmailCommand())
+ ->setCommand($keyword)
+ ->setAction($action);
+
+ if (isset($aliases[$action])) {
+ $object->setCommandAliases($aliases[$action]);
+ }
+
+ $objects[] = $object;
+ }
+
+ return $objects;
+ }
+
+ public function isCommandSupportedForObject(
+ PhabricatorApplicationTransactionInterface $object) {
+ return ($object instanceof DifferentialRevision);
+ }
+
+ public function buildTransactions(
+ PhabricatorUser $viewer,
+ PhabricatorApplicationTransactionInterface $object,
+ PhabricatorMetaMTAReceivedMail $mail,
+ $command,
+ array $argv) {
+ $xactions = array();
+
+ $xactions[] = $object->getApplicationTransactionTemplate()
+ ->setTransactionType(DifferentialTransaction::TYPE_ACTION)
+ ->setNewValue($this->getAction());
+
+ return $xactions;
+ }
+
+}
diff --git a/src/applications/differential/mail/DifferentialReplyHandler.php b/src/applications/differential/mail/DifferentialReplyHandler.php
--- a/src/applications/differential/mail/DifferentialReplyHandler.php
+++ b/src/applications/differential/mail/DifferentialReplyHandler.php
@@ -1,6 +1,7 @@
<?php
-final class DifferentialReplyHandler extends PhabricatorMailReplyHandler {
+final class DifferentialReplyHandler
+ extends PhabricatorApplicationTransactionReplyHandler {
public function validateMailReceiver($mail_receiver) {
if (!($mail_receiver instanceof DifferentialRevision)) {
@@ -8,100 +9,8 @@
}
}
- public function getPrivateReplyHandlerEmailAddress(
- PhabricatorObjectHandle $handle) {
- return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'D');
- }
-
- public function getPublicReplyHandlerEmailAddress() {
- return $this->getDefaultPublicReplyHandlerEmailAddress('D');
- }
-
- public function getSupportedCommands() {
- $actions = array(
- DifferentialAction::ACTION_COMMENT,
- DifferentialAction::ACTION_REJECT,
- DifferentialAction::ACTION_ABANDON,
- DifferentialAction::ACTION_RECLAIM,
- DifferentialAction::ACTION_RESIGN,
- DifferentialAction::ACTION_RETHINK,
- 'unsubscribe',
- );
-
- if (PhabricatorEnv::getEnvConfig('differential.enable-email-accept')) {
- $actions[] = DifferentialAction::ACTION_ACCEPT;
- }
-
- return $actions;
- }
-
- protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) {
- $revision = $this->getMailReceiver();
- $viewer = $this->getActor();
-
- $body_data = $mail->parseBody();
- $body = $body_data['body'];
- $body = $this->enhanceBodyWithAttachments($body, $mail->getAttachments());
-
- $xactions = array();
- $content_source = PhabricatorContentSource::newForSource(
- PhabricatorContentSource::SOURCE_EMAIL,
- array(
- 'id' => $mail->getID(),
- ));
-
- $template = id(new DifferentialTransaction());
-
- $commands = $body_data['commands'];
- foreach ($commands as $command_argv) {
- $command = head($command_argv);
- switch ($command) {
- case 'unsubscribe':
- $xactions[] = id(clone $template)
- ->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS)
- ->setNewValue(
- array(
- '-' => array($viewer->getPHID()),
- ));
- break;
- case DifferentialAction::ACTION_ACCEPT:
- $accept_key = 'differential.enable-email-accept';
- $can_accept = PhabricatorEnv::getEnvConfig($accept_key);
- if (!$can_accept) {
- throw new Exception(
- pht(
- 'You can not !accept revisions over email because '.
- 'Differential is configured to disallow this.'));
- }
- // Fall through...
- case DifferentialAction::ACTION_REJECT:
- case DifferentialAction::ACTION_ABANDON:
- case DifferentialAction::ACTION_RECLAIM:
- case DifferentialAction::ACTION_RESIGN:
- case DifferentialAction::ACTION_RETHINK:
- case DifferentialAction::ACTION_CLAIM:
- case DifferentialAction::ACTION_REOPEN:
- $xactions[] = id(clone $template)
- ->setTransactionType(DifferentialTransaction::TYPE_ACTION)
- ->setNewValue($command);
- break;
- }
- }
-
- $xactions[] = id(clone $template)
- ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT)
- ->attachComment(
- id(new DifferentialTransactionComment())
- ->setContent($body));
-
- $editor = id(new DifferentialTransactionEditor())
- ->setActor($viewer)
- ->setContentSource($content_source)
- ->setExcludeMailRecipientPHIDs($this->getExcludeMailRecipientPHIDs())
- ->setContinueOnMissingFields(true)
- ->setContinueOnNoEffect(true);
-
- $editor->applyTransactions($revision, $xactions);
+ public function getObjectPrefix() {
+ return 'D';
}
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Mar 26, 12:39 AM (4 w, 20 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7670171
Default Alt Text
D12239.id29409.diff (8 KB)
Attached To
Mode
D12239: Move Differential to modular mail commands
Attached
Detach File
Event Timeline
Log In to Comment