Index: src/applications/differential/conduit/ConduitAPI_differential_createcomment_Method.php =================================================================== --- src/applications/differential/conduit/ConduitAPI_differential_createcomment_Method.php +++ src/applications/differential/conduit/ConduitAPI_differential_createcomment_Method.php @@ -7,7 +7,7 @@ extends ConduitAPIMethod { public function getMethodDescription() { - return "Add a comment to a Differential revision."; + return pht("Add a comment to a Differential revision."); } public function defineParamTypes() { @@ -31,32 +31,55 @@ } protected function execute(ConduitAPIRequest $request) { + $viewer = $request->getUser(); + $revision = id(new DifferentialRevisionQuery()) - ->setViewer($request->getUser()) + ->setViewer($viewer) ->withIDs(array($request->getValue('revision_id'))) + ->needReviewerStatus(true) ->executeOne(); if (!$revision) { throw new ConduitException('ERR_BAD_REVISION'); } - $content_source = PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_CONDUIT, - array()); + $xactions = array(); $action = $request->getValue('action'); - if (!$action) { - $action = 'none'; + if ($action && ($action != 'comment')) { + $xactions[] = id(new DifferentialTransaction()) + ->setTransactionType(DifferentialTransaction::TYPE_ACTION) + ->setNewValue($action); + } + + $content = $request->getValue('message'); + if (strlen($content)) { + $xactions[] = id(new DifferentialTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) + ->attachComment( + id(new DifferentialTransactionComment()) + ->setContent($content)); } - $editor = new DifferentialCommentEditor( - $revision, - $action); - $editor->setActor($request->getUser()); - $editor->setContentSource($content_source); - $editor->setMessage($request->getValue('message')); - $editor->setNoEmail($request->getValue('silent')); - $editor->setAttachInlineComments($request->getValue('attach_inlines')); - $editor->save(); + if ($request->getValue('attach_inlines')) { + $type_inline = DifferentialTransaction::TYPE_INLINE; + $inlines = DifferentialTransactionQuery::loadUnsubmittedInlineComments( + $viewer, + $revision); + foreach ($inlines as $inline) { + $xactions[] = id(new DifferentialTransaction()) + ->setTransactionType($type_inline) + ->attachComment($inline); + } + } + + $editor = id(new DifferentialTransactionEditor()) + ->setActor($viewer) + ->setDisableEmail($request->getValue('silent')) + ->setContentSourceFromConduitRequest($request) + ->setContinueOnNoEffect(true) + ->setContinueOnMissingFields(true); + + $editor->applyTransactions($revision, $xactions); return array( 'revisionid' => $revision->getID(), Index: src/applications/differential/controller/DifferentialCommentSaveController.php =================================================================== --- src/applications/differential/controller/DifferentialCommentSaveController.php +++ src/applications/differential/controller/DifferentialCommentSaveController.php @@ -87,17 +87,9 @@ ->setNewValue(array('+' => $reviewer_edges)); } - $inline_phids = $this->loadUnsubmittedInlinePHIDs($revision); - if ($inline_phids) { - $inlines = id(new PhabricatorApplicationTransactionCommentQuery()) - ->setTemplate(new DifferentialTransactionComment()) - ->setViewer($viewer) - ->withPHIDs($inline_phids) - ->execute(); - } else { - $inlines = array(); - } - + $inlines = DifferentialTransactionQuery::loadUnsubmittedInlineComments( + $viewer, + $revision); foreach ($inlines as $inline) { $xactions[] = id(new DifferentialTransaction()) ->setTransactionType($type_inline) @@ -153,30 +145,4 @@ ->setURI('/D'.$revision->getID()); } - - private function loadUnsubmittedInlinePHIDs(DifferentialRevision $revision) { - $viewer = $this->getRequest()->getUser(); - - // TODO: This probably needs to move somewhere more central as we move - // away from DifferentialInlineCommentQuery, but - // PhabricatorApplicationTransactionCommentQuery is currently `final` and - // I'm not yet decided on how to approach that. For now, just get the PHIDs - // and then execute a PHID-based query through the standard stack. - - $table = new DifferentialTransactionComment(); - $conn_r = $table->establishConnection('r'); - - $phids = queryfx_all( - $conn_r, - 'SELECT phid FROM %T - WHERE revisionPHID = %s - AND authorPHID = %s - AND transactionPHID IS NULL', - $table->getTableName(), - $revision->getPHID(), - $viewer->getPHID()); - - return ipull($phids, 'phid'); - } - } Index: src/applications/differential/query/DifferentialTransactionQuery.php =================================================================== --- src/applications/differential/query/DifferentialTransactionQuery.php +++ src/applications/differential/query/DifferentialTransactionQuery.php @@ -7,4 +7,39 @@ return new DifferentialTransaction(); } + public static function loadUnsubmittedInlineComments( + PhabricatorUser $viewer, + DifferentialRevision $revision) { + + // TODO: This probably needs to move somewhere more central as we move + // away from DifferentialInlineCommentQuery, but + // PhabricatorApplicationTransactionCommentQuery is currently `final` and + // I'm not yet decided on how to approach that. For now, just get the PHIDs + // and then execute a PHID-based query through the standard stack. + + $table = new DifferentialTransactionComment(); + $conn_r = $table->establishConnection('r'); + + $phids = queryfx_all( + $conn_r, + 'SELECT phid FROM %T + WHERE revisionPHID = %s + AND authorPHID = %s + AND transactionPHID IS NULL', + $table->getTableName(), + $revision->getPHID(), + $viewer->getPHID()); + + $phids = ipull($phids, 'phid'); + if (!$phids) { + return array(); + } + + return id(new PhabricatorApplicationTransactionCommentQuery()) + ->setTemplate(new DifferentialTransactionComment()) + ->setViewer($viewer) + ->withPHIDs($phids) + ->execute(); + } + } Index: src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php =================================================================== --- src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php +++ src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php @@ -25,6 +25,7 @@ private $isPreview; private $isHeraldEditor; private $actingAsPHID; + private $disableEmail; public function setActingAsPHID($acting_as_phid) { $this->actingAsPHID = $acting_as_phid; @@ -128,6 +129,21 @@ return $this->isHeraldEditor; } + /** + * Prevent this editor from generating email when applying transactions. + * + * @param bool True to disable email. + * @return this + */ + public function setDisableEmail($disable_email) { + $this->disableEmail = $disable_email; + return $this; + } + + public function getDisableEmail() { + return $this->disableEmail; + } + public function getTransactionTypes() { $types = array(); @@ -682,8 +698,10 @@ $this->loadHandles($xactions); $mail = null; - if ($this->shouldSendMail($object, $xactions)) { - $mail = $this->sendMail($object, $xactions); + if (!$this->getDisableEmail()) { + if ($this->shouldSendMail($object, $xactions)) { + $mail = $this->sendMail($object, $xactions); + } } if ($this->supportsSearch()) {