Index: src/applications/differential/mail/DifferentialReplyHandler.php =================================================================== --- src/applications/differential/mail/DifferentialReplyHandler.php +++ src/applications/differential/mail/DifferentialReplyHandler.php @@ -129,28 +129,48 @@ $body = $this->enhanceBodyWithAttachments($body, $attachments); + $xactions = array(); + + if ($command && ($command != DifferentialAction::ACTION_COMMENT)) { + $xactions[] = id(new DifferentialTransaction()) + ->setTransactionType(DifferentialTransaction::TYPE_ACTION) + ->setNewValue($command); + } + + if (strlen($body)) { + $xactions[] = id(new DifferentialTransaction()) + ->setTransactionType(PhabricatorTransactions::TYPE_COMMENT) + ->attachComment( + id(new DifferentialTransactionComment()) + ->setContent($body)); + } + + $editor = id(new DifferentialTransactionEditor()) + ->setActor($actor) + ->setExcludeMailRecipientPHIDs($this->getExcludeMailRecipientPHIDs()) + ->setContinueOnMissingFields(true) + ->setContinueOnNoEffect(true); + + // NOTE: We have to be careful about this because Facebook's + // implementation jumps straight into handleAction() and will not have + // a PhabricatorMetaMTAReceivedMail object. + if ($this->receivedMail) { + $content_source = PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_EMAIL, + array( + 'id' => $this->receivedMail->getID(), + )); + $editor->setContentSource($content_source); + $editor->setParentMessageID($this->receivedMail->getMessageID()); + } else { + $content_source = PhabricatorContentSource::newForSource( + PhabricatorContentSource::SOURCE_LEGACY, + array()); + $editor->setContentSource($content_source); + } + try { - $editor = new DifferentialCommentEditor( - $this->getMailReceiver(), - $command); - $editor->setActor($actor); - $editor->setExcludeMailRecipientPHIDs( - $this->getExcludeMailRecipientPHIDs()); - - // NOTE: We have to be careful about this because Facebook's - // implementation jumps straight into handleAction() and will not have - // a PhabricatorMetaMTAReceivedMail object. - if ($this->receivedMail) { - $content_source = PhabricatorContentSource::newForSource( - PhabricatorContentSource::SOURCE_EMAIL, - array( - 'id' => $this->receivedMail->getID(), - )); - $editor->setContentSource($content_source); - $editor->setParentMessageID($this->receivedMail->getMessageID()); - } - $editor->setMessage($body); - $editor->save(); + $editor->applyTransactions($this->getMailReceiver(), $xactions); } catch (Exception $ex) { if ($this->receivedMail) { $error_body = $this->receivedMail->getRawTextBody(); Index: src/applications/differential/mail/DifferentialRevisionMailReceiver.php =================================================================== --- src/applications/differential/mail/DifferentialRevisionMailReceiver.php +++ src/applications/differential/mail/DifferentialRevisionMailReceiver.php @@ -18,6 +18,7 @@ $results = id(new DifferentialRevisionQuery()) ->setViewer($viewer) ->withIDs(array($id)) + ->needReviewerStatus(true) ->execute(); return head($results);