@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Move Differential to modular mail commands

Summary: Ref T7199. Convert Differential to modern modular commands.

Test Plan: Used `bin/mail receive-test` to send command and comment mail to Differential.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T7199

Differential Revision: https://secure.phabricator.com/D12239

+99 -96
+3 -1
src/__phutil_library_map__.php
··· 287 287 'DatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DatabaseConfigurationProvider.php', 288 288 'DefaultDatabaseConfigurationProvider' => 'infrastructure/storage/configuration/DefaultDatabaseConfigurationProvider.php', 289 289 'DifferentialAction' => 'applications/differential/constants/DifferentialAction.php', 290 + 'DifferentialActionEmailCommand' => 'applications/differential/command/DifferentialActionEmailCommand.php', 290 291 'DifferentialActionMenuEventListener' => 'applications/differential/event/DifferentialActionMenuEventListener.php', 291 292 'DifferentialAddCommentView' => 'applications/differential/view/DifferentialAddCommentView.php', 292 293 'DifferentialAffectedPath' => 'applications/differential/storage/DifferentialAffectedPath.php', ··· 3459 3460 'DarkConsoleServicesPlugin' => 'DarkConsolePlugin', 3460 3461 'DarkConsoleXHProfPlugin' => 'DarkConsolePlugin', 3461 3462 'DefaultDatabaseConfigurationProvider' => 'DatabaseConfigurationProvider', 3463 + 'DifferentialActionEmailCommand' => 'MetaMTAEmailTransactionCommand', 3462 3464 'DifferentialActionMenuEventListener' => 'PhabricatorEventListener', 3463 3465 'DifferentialAddCommentView' => 'AphrontView', 3464 3466 'DifferentialAffectedPath' => 'DifferentialDAO', ··· 3578 3580 'DifferentialQueryConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3579 3581 'DifferentialQueryDiffsConduitAPIMethod' => 'DifferentialConduitAPIMethod', 3580 3582 'DifferentialRemarkupRule' => 'PhabricatorObjectRemarkupRule', 3581 - 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', 3583 + 'DifferentialReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 3582 3584 'DifferentialRepositoryField' => 'DifferentialCoreCustomField', 3583 3585 'DifferentialRepositoryLookup' => 'Phobject', 3584 3586 'DifferentialRequiredSignaturesField' => 'DifferentialCoreCustomField',
+92
src/applications/differential/command/DifferentialActionEmailCommand.php
··· 1 + <?php 2 + 3 + final class DifferentialActionEmailCommand 4 + extends MetaMTAEmailTransactionCommand { 5 + 6 + private $command; 7 + private $action; 8 + private $aliases; 9 + 10 + public function getCommand() { 11 + return $this->command; 12 + } 13 + 14 + private function setCommand($command) { 15 + $this->command = $command; 16 + return $this; 17 + } 18 + 19 + private function setAction($action) { 20 + $this->action = $action; 21 + return $this; 22 + } 23 + 24 + private function getAction() { 25 + return $this->action; 26 + } 27 + 28 + private function setCommandAliases(array $aliases) { 29 + $this->aliases = $aliases; 30 + return $this; 31 + } 32 + 33 + public function getCommandAliases() { 34 + return $this->aliases; 35 + } 36 + 37 + public function getCommandObjects() { 38 + $actions = array( 39 + DifferentialAction::ACTION_REJECT => 'request', 40 + DifferentialAction::ACTION_ABANDON => 'abandon', 41 + DifferentialAction::ACTION_RECLAIM => 'reclaim', 42 + DifferentialAction::ACTION_RESIGN => 'resign', 43 + DifferentialAction::ACTION_RETHINK => 'rethink', 44 + DifferentialAction::ACTION_CLAIM => 'commandeer', 45 + ); 46 + 47 + if (PhabricatorEnv::getEnvConfig('differential.enable-email-accept')) { 48 + $actions[DifferentialAction::ACTION_ACCEPT] = 'accept'; 49 + } 50 + 51 + $aliases = array( 52 + DifferentialAction::ACTION_REJECT => array('reject'), 53 + DifferentialAction::ACTION_CLAIM => array('claim'), 54 + ); 55 + 56 + $objects = array(); 57 + foreach ($actions as $action => $keyword) { 58 + $object = id(new DifferentialActionEmailCommand()) 59 + ->setCommand($keyword) 60 + ->setAction($action); 61 + 62 + if (isset($aliases[$action])) { 63 + $object->setCommandAliases($aliases[$action]); 64 + } 65 + 66 + $objects[] = $object; 67 + } 68 + 69 + return $objects; 70 + } 71 + 72 + public function isCommandSupportedForObject( 73 + PhabricatorApplicationTransactionInterface $object) { 74 + return ($object instanceof DifferentialRevision); 75 + } 76 + 77 + public function buildTransactions( 78 + PhabricatorUser $viewer, 79 + PhabricatorApplicationTransactionInterface $object, 80 + PhabricatorMetaMTAReceivedMail $mail, 81 + $command, 82 + array $argv) { 83 + $xactions = array(); 84 + 85 + $xactions[] = $object->getApplicationTransactionTemplate() 86 + ->setTransactionType(DifferentialTransaction::TYPE_ACTION) 87 + ->setNewValue($this->getAction()); 88 + 89 + return $xactions; 90 + } 91 + 92 + }
+4 -95
src/applications/differential/mail/DifferentialReplyHandler.php
··· 1 1 <?php 2 2 3 - final class DifferentialReplyHandler extends PhabricatorMailReplyHandler { 3 + final class DifferentialReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof DifferentialRevision)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'D'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('D'); 18 - } 19 - 20 - public function getSupportedCommands() { 21 - $actions = array( 22 - DifferentialAction::ACTION_COMMENT, 23 - DifferentialAction::ACTION_REJECT, 24 - DifferentialAction::ACTION_ABANDON, 25 - DifferentialAction::ACTION_RECLAIM, 26 - DifferentialAction::ACTION_RESIGN, 27 - DifferentialAction::ACTION_RETHINK, 28 - 'unsubscribe', 29 - ); 30 - 31 - if (PhabricatorEnv::getEnvConfig('differential.enable-email-accept')) { 32 - $actions[] = DifferentialAction::ACTION_ACCEPT; 33 - } 34 - 35 - return $actions; 36 - } 37 - 38 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 39 - $revision = $this->getMailReceiver(); 40 - $viewer = $this->getActor(); 41 - 42 - $body_data = $mail->parseBody(); 43 - $body = $body_data['body']; 44 - $body = $this->enhanceBodyWithAttachments($body, $mail->getAttachments()); 45 - 46 - $xactions = array(); 47 - $content_source = PhabricatorContentSource::newForSource( 48 - PhabricatorContentSource::SOURCE_EMAIL, 49 - array( 50 - 'id' => $mail->getID(), 51 - )); 52 - 53 - $template = id(new DifferentialTransaction()); 54 - 55 - $commands = $body_data['commands']; 56 - foreach ($commands as $command_argv) { 57 - $command = head($command_argv); 58 - switch ($command) { 59 - case 'unsubscribe': 60 - $xactions[] = id(clone $template) 61 - ->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS) 62 - ->setNewValue( 63 - array( 64 - '-' => array($viewer->getPHID()), 65 - )); 66 - break; 67 - case DifferentialAction::ACTION_ACCEPT: 68 - $accept_key = 'differential.enable-email-accept'; 69 - $can_accept = PhabricatorEnv::getEnvConfig($accept_key); 70 - if (!$can_accept) { 71 - throw new Exception( 72 - pht( 73 - 'You can not !accept revisions over email because '. 74 - 'Differential is configured to disallow this.')); 75 - } 76 - // Fall through... 77 - case DifferentialAction::ACTION_REJECT: 78 - case DifferentialAction::ACTION_ABANDON: 79 - case DifferentialAction::ACTION_RECLAIM: 80 - case DifferentialAction::ACTION_RESIGN: 81 - case DifferentialAction::ACTION_RETHINK: 82 - case DifferentialAction::ACTION_CLAIM: 83 - case DifferentialAction::ACTION_REOPEN: 84 - $xactions[] = id(clone $template) 85 - ->setTransactionType(DifferentialTransaction::TYPE_ACTION) 86 - ->setNewValue($command); 87 - break; 88 - } 89 - } 90 - 91 - $xactions[] = id(clone $template) 92 - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 93 - ->attachComment( 94 - id(new DifferentialTransactionComment()) 95 - ->setContent($body)); 96 - 97 - $editor = id(new DifferentialTransactionEditor()) 98 - ->setActor($viewer) 99 - ->setContentSource($content_source) 100 - ->setExcludeMailRecipientPHIDs($this->getExcludeMailRecipientPHIDs()) 101 - ->setContinueOnMissingFields(true) 102 - ->setContinueOnNoEffect(true); 103 - 104 - $editor->applyTransactions($revision, $xactions); 12 + public function getObjectPrefix() { 13 + return 'D'; 105 14 } 106 15 107 16 }