diff --git a/src/applications/differential/editor/DifferentialRevisionEditEngine.php b/src/applications/differential/editor/DifferentialRevisionEditEngine.php --- a/src/applications/differential/editor/DifferentialRevisionEditEngine.php +++ b/src/applications/differential/editor/DifferentialRevisionEditEngine.php @@ -302,24 +302,14 @@ protected function newAutomaticCommentTransactions($object) { $viewer = $this->getViewer(); - $xactions = array(); - - $inlines = DifferentialTransactionQuery::loadUnsubmittedInlineComments( - $viewer, - $object); - $inlines = msort($inlines, 'getID'); $editor = $object->getApplicationTransactionEditor() ->setActor($viewer); - $query_template = id(new DifferentialDiffInlineCommentQuery()) - ->withRevisionPHIDs(array($object->getPHID())); - $xactions = $editor->newAutomaticInlineTransactions( $object, - $inlines, DifferentialTransaction::TYPE_INLINE, - $query_template); + new DifferentialDiffInlineCommentQuery()); return $xactions; } diff --git a/src/applications/differential/engine/DifferentialRevisionDraftEngine.php b/src/applications/differential/engine/DifferentialRevisionDraftEngine.php --- a/src/applications/differential/engine/DifferentialRevisionDraftEngine.php +++ b/src/applications/differential/engine/DifferentialRevisionDraftEngine.php @@ -7,9 +7,11 @@ $viewer = $this->getViewer(); $revision = $this->getObject(); - $inlines = DifferentialTransactionQuery::loadUnsubmittedInlineComments( - $viewer, - $revision); + $inlines = id(new DifferentialDiffInlineCommentQuery()) + ->setViewer($viewer) + ->withRevisionPHIDs(array($revision->getPHID())) + ->withPublishableComments(true) + ->execute(); return (bool)$inlines; } diff --git a/src/applications/differential/query/DifferentialTransactionQuery.php b/src/applications/differential/query/DifferentialTransactionQuery.php --- a/src/applications/differential/query/DifferentialTransactionQuery.php +++ b/src/applications/differential/query/DifferentialTransactionQuery.php @@ -7,49 +7,4 @@ return new DifferentialTransaction(); } - public static function loadUnsubmittedInlineComments( - PhabricatorUser $viewer, - DifferentialRevision $revision) { - - $inlines = id(new DifferentialDiffInlineCommentQuery()) - ->setViewer($viewer) - ->withRevisionPHIDs(array($revision->getPHID())) - ->withAuthorPHIDs(array($viewer->getPHID())) - ->withHasTransaction(false) - ->withIsDeleted(false) - ->needReplyToComments(true) - ->execute(); - - foreach ($inlines as $key => $inline) { - $inlines[$key] = DifferentialInlineComment::newFromModernComment( - $inline); - } - - PhabricatorInlineComment::loadAndAttachVersionedDrafts( - $viewer, - $inlines); - - // Don't count void inlines when considering draft state. - foreach ($inlines as $key => $inline) { - if ($inline->isVoidComment($viewer)) { - unset($inlines[$key]); - continue; - } - - // For other inlines: if they have a nonempty draft state, set their - // content to the draft state content. We want to submit the comment - // as it is currently shown to the user, not as it was stored the last - // time they clicked "Save". - - $draft_content = $inline->getContentForEdit($viewer); - if (strlen($draft_content)) { - $inline->setContent($draft_content); - } - } - - $inlines = mpull($inlines, 'getStorageObject'); - - return $inlines; - } - } diff --git a/src/applications/diffusion/editor/DiffusionCommitEditEngine.php b/src/applications/diffusion/editor/DiffusionCommitEditEngine.php --- a/src/applications/diffusion/editor/DiffusionCommitEditEngine.php +++ b/src/applications/diffusion/editor/DiffusionCommitEditEngine.php @@ -126,27 +126,14 @@ protected function newAutomaticCommentTransactions($object) { $viewer = $this->getViewer(); - $xactions = array(); - - $inlines = id(new DiffusionDiffInlineCommentQuery()) - ->setViewer($viewer) - ->withObjectPHIDs(array($object->getPHID())) - ->withPublishableComments(true) - ->needReplyToComments(true) - ->execute(); - $inlines = msort($inlines, 'getID'); $editor = $object->getApplicationTransactionEditor() ->setActor($viewer); - $query_template = id(new DiffusionDiffInlineCommentQuery()) - ->withCommitPHIDs(array($object->getPHID())); - $xactions = $editor->newAutomaticInlineTransactions( $object, - $inlines, PhabricatorAuditActionConstants::INLINE, - $query_template); + new DiffusionDiffInlineCommentQuery()); return $xactions; } diff --git a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php --- a/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php +++ b/src/applications/transactions/editor/PhabricatorApplicationTransactionEditor.php @@ -5027,18 +5027,23 @@ public function newAutomaticInlineTransactions( PhabricatorLiskDAO $object, - array $inlines, $transaction_type, PhabricatorCursorPagedPolicyAwareQuery $query_template) { + $actor = $this->getActor(); + + $inlines = id(clone $query_template) + ->setViewer($actor) + ->withObjectPHIDs(array($object->getPHID())) + ->withPublishableComments(true) + ->needAppliedDrafts(true) + ->needReplyToComments(true) + ->execute(); + $inlines = msort($inlines, 'getID'); + $xactions = array(); foreach ($inlines as $key => $inline) { - if ($inline->isEmptyInlineComment()) { - unset($inlines[$key]); - continue; - } - $xactions[] = $object->getApplicationTransactionTemplate() ->setTransactionType($transaction_type) ->attachComment($inline); @@ -5065,31 +5070,17 @@ $state_map = PhabricatorTransactions::getInlineStateMap(); - $query = id(clone $query_template) + $inline_query = id(clone $query_template) ->setViewer($this->getActor()) - ->withFixedStates(array_keys($state_map)); - - $inlines = array(); - - $inlines[] = id(clone $query) - ->withAuthorPHIDs(array($actor_phid)) - ->withHasTransaction(false) - ->execute(); + ->withObjectPHIDs(array($object->getPHID())) + ->withFixedStates(array_keys($state_map)) + ->withPublishableComments(true); if ($actor_is_author) { - $inlines[] = id(clone $query) - ->withHasTransaction(true) - ->execute(); + $inline_query->withPublishedComments(true); } - $inlines = array_mergev($inlines); - - foreach ($inlines as $key => $inline) { - if ($inline->isEmptyInlineComment()) { - unset($inlines[$key]); - continue; - } - } + $inlines = $inline_query->execute(); if (!$inlines) { return null; diff --git a/src/infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php b/src/infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php --- a/src/infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php +++ b/src/infrastructure/diff/query/PhabricatorDiffInlineCommentQuery.php @@ -8,6 +8,7 @@ private $publishedComments; private $publishableComments; private $needHidden; + private $needAppliedDrafts; abstract protected function buildInlineCommentWhereClauseParts( AphrontDatabaseConnection $conn); @@ -41,6 +42,11 @@ return $this; } + final public function needAppliedDrafts($need_applied) { + $this->needAppliedDrafts = $need_applied; + return $this; + } + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { $where = parent::buildWhereClauseParts($conn); $alias = $this->getPrimaryTableAlias(); @@ -124,65 +130,121 @@ return $where; } - protected function willFilterPage(array $comments) { + protected function willFilterPage(array $inlines) { + $viewer = $this->getViewer(); + if ($this->needReplyToComments) { $reply_phids = array(); - foreach ($comments as $comment) { - $reply_phid = $comment->getReplyToCommentPHID(); + foreach ($inlines as $inline) { + $reply_phid = $inline->getReplyToCommentPHID(); if ($reply_phid) { $reply_phids[] = $reply_phid; } } if ($reply_phids) { - $reply_comments = newv(get_class($this), array()) + $reply_inlines = newv(get_class($this), array()) ->setViewer($this->getViewer()) ->setParentQuery($this) ->withPHIDs($reply_phids) ->execute(); - $reply_comments = mpull($reply_comments, null, 'getPHID'); + $reply_inlines = mpull($reply_inlines, null, 'getPHID'); } else { - $reply_comments = array(); + $reply_inlines = array(); } - foreach ($comments as $key => $comment) { - $reply_phid = $comment->getReplyToCommentPHID(); + foreach ($inlines as $key => $inline) { + $reply_phid = $inline->getReplyToCommentPHID(); if (!$reply_phid) { - $comment->attachReplyToComment(null); + $inline->attachReplyToComment(null); continue; } - $reply = idx($reply_comments, $reply_phid); + $reply = idx($reply_inlines, $reply_phid); if (!$reply) { - $this->didRejectResult($comment); - unset($comments[$key]); + $this->didRejectResult($inline); + unset($inlines[$key]); continue; } - $comment->attachReplyToComment($reply); + $inline->attachReplyToComment($reply); } } - if (!$comments) { - return $comments; + if (!$inlines) { + return $inlines; } if ($this->needHidden) { - $viewer = $this->getViewer(); $viewer_phid = $viewer->getPHID(); if ($viewer_phid) { $hidden = $this->loadHiddenCommentIDs( $viewer_phid, - $comments); + $inlines); } else { $hidden = array(); } - foreach ($comments as $inline) { + foreach ($inlines as $inline) { $inline->attachIsHidden(isset($hidden[$inline->getID()])); } } - return $comments; + if (!$inlines) { + return $inlines; + } + + $need_drafts = $this->needAppliedDrafts; + $drop_void = $this->publishableComments; + $convert_objects = ($need_drafts || $drop_void); + + if ($convert_objects) { + $inlines = mpull($inlines, 'newInlineCommentObject'); + + PhabricatorInlineComment::loadAndAttachVersionedDrafts( + $viewer, + $inlines); + + if ($need_drafts) { + // Don't count void inlines when considering draft state. + foreach ($inlines as $key => $inline) { + if ($inline->isVoidComment($viewer)) { + $this->didRejectResult($inline->getStorageObject()); + unset($inlines[$key]); + continue; + } + + // For other inlines: if they have a nonempty draft state, set their + // content to the draft state content. We want to submit the comment + // as it is currently shown to the user, not as it was stored the last + // time they clicked "Save". + + $draft_content = $inline->getContentForEdit($viewer); + if (strlen($draft_content)) { + $inline->setContent($draft_content); + } + } + } + + // If we're loading publishable comments, discard any comments that are + // empty. + if ($drop_void) { + foreach ($inlines as $key => $inline) { + if ($inline->getTransactionPHID()) { + continue; + } + + if ($inline->isVoidComment($viewer)) { + $this->didRejectResult($inline->getStorageObject()); + unset($inlines[$key]); + continue; + } + } + } + + $inlines = mpull($inlines, 'getStorageObject'); + } + + return $inlines; } }