@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.

Subclass most ReplyHandlers from TransactionReplyHandler

Summary: Ref T7199. Half of these aren't even reachable, but make some progress toward reducing the amount of nonsense and garbage in mail handling.

Test Plan: Tested all reachable handlers with `bin/mail receive-test`.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T7199

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

+57 -252
+10 -10
src/__phutil_library_map__.php
··· 3943 3943 'FileInfoConduitAPIMethod' => 'FileConduitAPIMethod', 3944 3944 'FileMailReceiver' => 'PhabricatorObjectMailReceiver', 3945 3945 'FileQueryChunksConduitAPIMethod' => 'FileConduitAPIMethod', 3946 - 'FileReplyHandler' => 'PhabricatorMailReplyHandler', 3946 + 'FileReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 3947 3947 'FileUploadChunkConduitAPIMethod' => 'FileConduitAPIMethod', 3948 3948 'FileUploadConduitAPIMethod' => 'FileConduitAPIMethod', 3949 3949 'FileUploadHashConduitAPIMethod' => 'FileConduitAPIMethod', ··· 3990 3990 'FundInitiativePHIDType' => 'PhabricatorPHIDType', 3991 3991 'FundInitiativeQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 3992 3992 'FundInitiativeRemarkupRule' => 'PhabricatorObjectRemarkupRule', 3993 - 'FundInitiativeReplyHandler' => 'PhabricatorMailReplyHandler', 3993 + 'FundInitiativeReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 3994 3994 'FundInitiativeSearchEngine' => 'PhabricatorApplicationSearchEngine', 3995 3995 'FundInitiativeTransaction' => 'PhabricatorApplicationTransaction', 3996 3996 'FundInitiativeTransactionQuery' => 'PhabricatorApplicationTransactionQuery', ··· 4217 4217 'LegalpadDocumentSignatureViewController' => 'LegalpadController', 4218 4218 'LegalpadMockMailReceiver' => 'PhabricatorObjectMailReceiver', 4219 4219 'LegalpadObjectNeedsSignatureEdgeType' => 'PhabricatorEdgeType', 4220 - 'LegalpadReplyHandler' => 'PhabricatorMailReplyHandler', 4220 + 'LegalpadReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 4221 4221 'LegalpadSchemaSpec' => 'PhabricatorConfigSchemaSpec', 4222 4222 'LegalpadSignatureNeededByObjectEdgeType' => 'PhabricatorEdgeType', 4223 4223 'LegalpadTransaction' => 'PhabricatorApplicationTransaction', ··· 4613 4613 'PhabricatorAuditManagementDeleteWorkflow' => 'PhabricatorAuditManagementWorkflow', 4614 4614 'PhabricatorAuditManagementWorkflow' => 'PhabricatorManagementWorkflow', 4615 4615 'PhabricatorAuditPreviewController' => 'PhabricatorAuditController', 4616 - 'PhabricatorAuditReplyHandler' => 'PhabricatorMailReplyHandler', 4616 + 'PhabricatorAuditReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 4617 4617 'PhabricatorAuditTransaction' => 'PhabricatorApplicationTransaction', 4618 4618 'PhabricatorAuditTransactionComment' => 'PhabricatorApplicationTransactionComment', 4619 4619 'PhabricatorAuditTransactionQuery' => 'PhabricatorApplicationTransactionQuery', ··· 5278 5278 'PhabricatorMacroMemeController' => 'PhabricatorMacroController', 5279 5279 'PhabricatorMacroMemeDialogController' => 'PhabricatorMacroController', 5280 5280 'PhabricatorMacroQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 5281 - 'PhabricatorMacroReplyHandler' => 'PhabricatorMailReplyHandler', 5281 + 'PhabricatorMacroReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 5282 5282 'PhabricatorMacroSearchEngine' => 'PhabricatorApplicationSearchEngine', 5283 5283 'PhabricatorMacroTransaction' => 'PhabricatorApplicationTransaction', 5284 5284 'PhabricatorMacroTransactionComment' => 'PhabricatorApplicationTransactionComment', ··· 6193 6193 'PholioMockThumbGridView' => 'AphrontView', 6194 6194 'PholioMockViewController' => 'PholioController', 6195 6195 'PholioRemarkupRule' => 'PhabricatorObjectRemarkupRule', 6196 - 'PholioReplyHandler' => 'PhabricatorMailReplyHandler', 6196 + 'PholioReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 6197 6197 'PholioSchemaSpec' => 'PhabricatorConfigSchemaSpec', 6198 6198 'PholioSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 6199 6199 'PholioTransaction' => 'PhabricatorApplicationTransaction', ··· 6229 6229 'PhortuneCartListController' => 'PhortuneController', 6230 6230 'PhortuneCartPHIDType' => 'PhabricatorPHIDType', 6231 6231 'PhortuneCartQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6232 - 'PhortuneCartReplyHandler' => 'PhabricatorMailReplyHandler', 6232 + 'PhortuneCartReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 6233 6233 'PhortuneCartSearchEngine' => 'PhabricatorApplicationSearchEngine', 6234 6234 'PhortuneCartTransaction' => 'PhabricatorApplicationTransaction', 6235 6235 'PhortuneCartTransactionQuery' => 'PhabricatorApplicationTransactionQuery', ··· 6425 6425 'PhrictionMoveController' => 'PhrictionController', 6426 6426 'PhrictionNewController' => 'PhrictionController', 6427 6427 'PhrictionRemarkupRule' => 'PhutilRemarkupRule', 6428 - 'PhrictionReplyHandler' => 'PhabricatorMailReplyHandler', 6428 + 'PhrictionReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 6429 6429 'PhrictionSchemaSpec' => 'PhabricatorConfigSchemaSpec', 6430 6430 'PhrictionSearchEngine' => 'PhabricatorApplicationSearchEngine', 6431 6431 'PhrictionSearchIndexer' => 'PhabricatorSearchDocumentIndexer', ··· 6481 6481 'PonderQuestionMailReceiver' => 'PhabricatorObjectMailReceiver', 6482 6482 'PonderQuestionPHIDType' => 'PhabricatorPHIDType', 6483 6483 'PonderQuestionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6484 - 'PonderQuestionReplyHandler' => 'PhabricatorMailReplyHandler', 6484 + 'PonderQuestionReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 6485 6485 'PonderQuestionSearchEngine' => 'PhabricatorApplicationSearchEngine', 6486 6486 'PonderQuestionStatus' => 'PonderConstants', 6487 6487 'PonderQuestionStatusController' => 'PonderController', ··· 6594 6594 'ReleephRequestMailReceiver' => 'PhabricatorObjectMailReceiver', 6595 6595 'ReleephRequestPHIDType' => 'PhabricatorPHIDType', 6596 6596 'ReleephRequestQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 6597 - 'ReleephRequestReplyHandler' => 'PhabricatorMailReplyHandler', 6597 + 'ReleephRequestReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 6598 6598 'ReleephRequestSearchEngine' => 'PhabricatorApplicationSearchEngine', 6599 6599 'ReleephRequestTransaction' => 'PhabricatorApplicationTransaction', 6600 6600 'ReleephRequestTransactionComment' => 'PhabricatorApplicationTransactionComment',
+6 -38
src/applications/audit/mail/PhabricatorAuditReplyHandler.php
··· 1 1 <?php 2 2 3 - final class PhabricatorAuditReplyHandler extends PhabricatorMailReplyHandler { 3 + final class PhabricatorAuditReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof PhabricatorRepositoryCommit)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'C'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('C'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - $commit = $this->getMailReceiver(); 22 - $actor = $this->getActor(); 23 - $message = $mail->getCleanTextBody(); 24 - 25 - $content_source = PhabricatorContentSource::newForSource( 26 - PhabricatorContentSource::SOURCE_EMAIL, 27 - array( 28 - 'id' => $mail->getID(), 29 - )); 30 - 31 - // TODO: Support !raise, !accept, etc. 32 - 33 - $xactions = array(); 34 - 35 - $xactions[] = id(new PhabricatorAuditTransaction()) 36 - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 37 - ->attachComment( 38 - id(new PhabricatorAuditTransactionComment()) 39 - ->setCommitPHID($commit->getPHID()) 40 - ->setContent($message)); 41 - 42 - $editor = id(new PhabricatorAuditEditor()) 43 - ->setActor($actor) 44 - ->setContentSource($content_source) 45 - ->setExcludeMailRecipientPHIDs($this->getExcludeMailRecipientPHIDs()) 46 - ->setContinueOnMissingFields(true) 47 - ->applyTransactions($commit, $xactions); 12 + public function getObjectPrefix() { 13 + // TODO: This conflicts with Countdown and will probably need to be 14 + // changed eventually. 15 + return 'C'; 48 16 } 49 17 50 18 }
+7 -35
src/applications/files/mail/FileReplyHandler.php
··· 1 1 <?php 2 2 3 - final class FileReplyHandler extends PhabricatorMailReplyHandler { 3 + final class FileReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof PhabricatorFile)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'F'); 12 + public function getObjectPrefix() { 13 + return 'F'; 14 14 } 15 15 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('F'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - $actor = $this->getActor(); 22 - $file = $this->getMailReceiver(); 23 - 24 - $body_data = $mail->parseBody(); 25 - $body = $body_data['body']; 26 - $body = $this->enhanceBodyWithAttachments($body, $mail->getAttachments()); 27 - 28 - $content_source = PhabricatorContentSource::newForSource( 29 - PhabricatorContentSource::SOURCE_EMAIL, 30 - array( 31 - 'id' => $mail->getID(), 32 - )); 16 + protected function processMailCommands(array $commands) { 17 + $actor = $this->getActor(); 33 18 34 19 $xactions = array(); 35 - $commands = $body_data['commands']; 36 20 foreach ($commands as $command) { 37 21 switch (head($command)) { 38 22 case 'unsubscribe': ··· 44 28 } 45 29 } 46 30 47 - $xactions[] = id(new PhabricatorFileTransaction()) 48 - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 49 - ->attachComment( 50 - id(new PhabricatorFileTransactionComment()) 51 - ->setContent($body)); 52 - 53 - $editor = id(new PhabricatorFileEditor()) 54 - ->setActor($actor) 55 - ->setContentSource($content_source) 56 - ->setContinueOnNoEffect(true) 57 - ->setIsPreview(false); 58 - 59 - $editor->applyTransactions($file, $xactions); 31 + return $xactions; 60 32 } 61 33 62 34 }
+4 -13
src/applications/fund/mail/FundInitiativeReplyHandler.php
··· 1 1 <?php 2 2 3 - final class FundInitiativeReplyHandler extends PhabricatorMailReplyHandler { 3 + final class FundInitiativeReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof FundInitiative)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'I'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('I'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - // TODO: Implement. 22 - return null; 12 + public function getObjectPrefix() { 13 + return 'I'; 23 14 } 24 15 25 16 }
+4 -54
src/applications/legalpad/mail/LegalpadReplyHandler.php
··· 1 1 <?php 2 2 3 - final class LegalpadReplyHandler extends PhabricatorMailReplyHandler { 3 + final class LegalpadReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof LegalpadDocument)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'L'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('L'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - $actor = $this->getActor(); 22 - $document = $this->getMailReceiver(); 23 - 24 - $body_data = $mail->parseBody(); 25 - $body = $body_data['body']; 26 - $body = $this->enhanceBodyWithAttachments($body, $mail->getAttachments()); 27 - 28 - $content_source = PhabricatorContentSource::newForSource( 29 - PhabricatorContentSource::SOURCE_EMAIL, 30 - array( 31 - 'id' => $mail->getID(), 32 - )); 33 - 34 - $xactions = array(); 35 - 36 - $commands = $body_data['commands']; 37 - foreach ($commands as $command) { 38 - switch (head($command)) { 39 - case 'unsubscribe': 40 - $xaction = id(new LegalpadTransaction()) 41 - ->setTransactionType(PhabricatorTransactions::TYPE_SUBSCRIBERS) 42 - ->setNewValue(array('-' => array($actor->getPHID()))); 43 - $xactions[] = $xaction; 44 - break; 45 - } 46 - } 47 - 48 - $xactions[] = id(new LegalpadTransaction()) 49 - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 50 - ->attachComment( 51 - id(new LegalpadTransactionComment()) 52 - ->setDocumentID($document->getID()) 53 - ->setLineNumber(0) 54 - ->setLineLength(0) 55 - ->setContent($body)); 56 - 57 - $editor = id(new LegalpadDocumentEditor()) 58 - ->setActor($actor) 59 - ->setContentSource($content_source) 60 - ->setContinueOnNoEffect(true) 61 - ->setIsPreview(false); 62 - 63 - $editor->applyTransactions($document, $xactions); 12 + public function getObjectPrefix() { 13 + return 'L'; 64 14 } 65 15 66 16 }
+2 -2
src/applications/legalpad/storage/LegalpadTransactionComment.php
··· 4 4 extends PhabricatorApplicationTransactionComment { 5 5 6 6 protected $documentID; 7 - protected $lineNumber; 8 - protected $lineLength; 7 + protected $lineNumber = 0; 8 + protected $lineLength = 0; 9 9 protected $fixedState; 10 10 protected $hasReplies = 0; 11 11 protected $replyToCommentPHID;
+4 -13
src/applications/macro/mail/PhabricatorMacroReplyHandler.php
··· 1 1 <?php 2 2 3 - final class PhabricatorMacroReplyHandler extends PhabricatorMailReplyHandler { 3 + final class PhabricatorMacroReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof PhabricatorFileImageMacro)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'MCRO'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('MCRO'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - // TODO: Implement this. 22 - return null; 12 + public function getObjectPrefix() { 13 + return 'MCRO'; 23 14 } 24 15 25 16 }
+4 -13
src/applications/pholio/mail/PholioReplyHandler.php
··· 1 1 <?php 2 2 3 - final class PholioReplyHandler extends PhabricatorMailReplyHandler { 3 + final class PholioReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof PholioMock)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'M'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('M'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - // TODO: Implement this. 22 - return null; 12 + public function getObjectPrefix() { 13 + return 'M'; 23 14 } 24 15 25 16 }
+4 -13
src/applications/phortune/mail/PhortuneCartReplyHandler.php
··· 1 1 <?php 2 2 3 - final class PhortuneCartReplyHandler extends PhabricatorMailReplyHandler { 3 + final class PhortuneCartReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof PhortuneCart)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'CART'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('CART'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - // TODO: Implement. 22 - return null; 12 + public function getObjectPrefix() { 13 + return 'CART'; 23 14 } 24 15 25 16 }
+4 -16
src/applications/phriction/mail/PhrictionReplyHandler.php
··· 1 1 <?php 2 2 3 - final class PhrictionReplyHandler extends PhabricatorMailReplyHandler { 3 + final class PhrictionReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof PhrictionDocument)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress( 14 - $handle, 15 - PhrictionDocumentPHIDType::TYPECONST); 16 - } 17 - 18 - public function getPublicReplyHandlerEmailAddress() { 19 - return $this->getDefaultPublicReplyHandlerEmailAddress( 20 - PhrictionDocumentPHIDType::TYPECONST); 21 - } 22 - 23 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 24 - // TODO: Implement. 25 - return null; 12 + public function getObjectPrefix() { 13 + return PhrictionDocumentPHIDType::TYPECONST; 26 14 } 27 15 28 16 }
+4 -11
src/applications/ponder/mail/PonderQuestionReplyHandler.php
··· 1 1 <?php 2 2 3 - final class PonderQuestionReplyHandler extends PhabricatorMailReplyHandler { 3 + final class PonderQuestionReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof PonderQuestion)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'Q'); 12 + public function getObjectPrefix() { 13 + return 'Q'; 14 14 } 15 15 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('Q'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - // ignore this entirely for now 22 - } 23 16 }
+4 -34
src/applications/releeph/mail/ReleephRequestReplyHandler.php
··· 1 1 <?php 2 2 3 - final class ReleephRequestReplyHandler extends PhabricatorMailReplyHandler { 3 + final class ReleephRequestReplyHandler 4 + extends PhabricatorApplicationTransactionReplyHandler { 4 5 5 6 public function validateMailReceiver($mail_receiver) { 6 7 if (!($mail_receiver instanceof ReleephRequest)) { ··· 8 9 } 9 10 } 10 11 11 - public function getPrivateReplyHandlerEmailAddress( 12 - PhabricatorObjectHandle $handle) { 13 - return $this->getDefaultPrivateReplyHandlerEmailAddress($handle, 'Y'); 14 - } 15 - 16 - public function getPublicReplyHandlerEmailAddress() { 17 - return $this->getDefaultPublicReplyHandlerEmailAddress('Y'); 18 - } 19 - 20 - protected function receiveEmail(PhabricatorMetaMTAReceivedMail $mail) { 21 - $rq = $this->getMailReceiver(); 22 - $user = $this->getActor(); 23 - 24 - $content_source = PhabricatorContentSource::newForSource( 25 - PhabricatorContentSource::SOURCE_EMAIL, 26 - array( 27 - 'id' => $mail->getID(), 28 - )); 29 - 30 - $body = $mail->getCleanTextBody(); 31 - 32 - $xactions = array(); 33 - $xactions[] = id(new ReleephRequestTransaction()) 34 - ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) 35 - ->attachComment($body); 36 - 37 - $editor = id(new ReleephRequestTransactionalEditor()) 38 - ->setActor($user) 39 - ->setContentSource($content_source) 40 - ->setContinueOnNoEffect(true) 41 - ->setParentMessageID($mail->getMessageID()); 42 - 43 - $editor->applyTransactions($rq, $xactions); 12 + public function getObjectPrefix() { 13 + return 'Y'; 44 14 } 45 15 46 16 }