mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-19 13:22:42 +01:00
Render inline comments in "Pro" mail
Summary: Ref T2222. This enriches mail a little bit to get these rendering pretty much like they do now. Test Plan: {F118255} Reviewers: btrahan Reviewed By: btrahan CC: aran Maniphest Tasks: T2222 Differential Revision: https://secure.phabricator.com/D8343
This commit is contained in:
parent
64d15c344e
commit
424ba2e588
4 changed files with 141 additions and 6 deletions
|
@ -776,10 +776,26 @@ final class DifferentialTransactionEditor
|
|||
|
||||
$body = parent::buildMailBody($object, $xactions);
|
||||
|
||||
$type_inline = DifferentialTransaction::TYPE_INLINE;
|
||||
|
||||
$inlines = array();
|
||||
foreach ($xactions as $xaction) {
|
||||
if ($xaction->getTransactionType() == $type_inline) {
|
||||
$inlines[] = $xaction;
|
||||
}
|
||||
}
|
||||
|
||||
if ($inlines) {
|
||||
$body->addTextSection(
|
||||
pht('INLINE COMMENTS'),
|
||||
$this->renderInlineCommentsForMail($object, $inlines));
|
||||
}
|
||||
|
||||
$body->addTextSection(
|
||||
pht('REVISION DETAIL'),
|
||||
PhabricatorEnv::getProductionURI('/D'.$object->getID()));
|
||||
|
||||
|
||||
return $body;
|
||||
}
|
||||
|
||||
|
@ -797,4 +813,76 @@ final class DifferentialTransactionEditor
|
|||
return parent::extractFilePHIDsFromCustomTransaction($object, $xaction);
|
||||
}
|
||||
|
||||
private function renderInlineCommentsForMail(
|
||||
PhabricatorLiskDAO $object,
|
||||
array $inlines) {
|
||||
|
||||
$context_key = 'metamta.differential.unified-comment-context';
|
||||
$show_context = PhabricatorEnv::getEnvConfig($context_key);
|
||||
|
||||
$changeset_ids = array();
|
||||
foreach ($inlines as $inline) {
|
||||
$id = $inline->getComment()->getChangesetID();
|
||||
$changeset_ids[$id] = $id;
|
||||
}
|
||||
|
||||
// TODO: We should write a proper Query class for this eventually.
|
||||
$changesets = id(new DifferentialChangeset())->loadAllWhere(
|
||||
'id IN (%Ld)',
|
||||
$changeset_ids);
|
||||
if ($show_context) {
|
||||
$hunk_parser = new DifferentialHunkParser();
|
||||
foreach ($changesets as $changeset) {
|
||||
$changeset->attachHunks($changeset->loadHunks());
|
||||
}
|
||||
}
|
||||
|
||||
$inline_groups = DifferentialTransactionComment::sortAndGroupInlines(
|
||||
$inlines,
|
||||
$changesets);
|
||||
|
||||
$result = array();
|
||||
foreach ($inline_groups as $changeset_id => $group) {
|
||||
$changeset = idx($changesets, $changeset_id);
|
||||
if (!$changeset) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($group as $inline) {
|
||||
$comment = $inline->getComment();
|
||||
$file = $changeset->getFilename();
|
||||
$start = $comment->getLineNumber();
|
||||
$len = $comment->getLineLength();
|
||||
if ($len) {
|
||||
$range = $start.'-'.($start + $len);
|
||||
} else {
|
||||
$range = $start;
|
||||
}
|
||||
|
||||
$inline_content = $comment->getContent();
|
||||
|
||||
if (!$show_context) {
|
||||
$result[] = "{$file}:{$range} {$inline_content}";
|
||||
} else {
|
||||
$result[] = "================";
|
||||
$result[] = "Comment at: " . $file . ":" . $range;
|
||||
$result[] = $hunk_parser->makeContextDiff(
|
||||
$changeset->getHunks(),
|
||||
$comment->getIsNewFile(),
|
||||
$comment->getLineNumber(),
|
||||
$comment->getLineLength(),
|
||||
1);
|
||||
$result[] = "----------------";
|
||||
|
||||
$result[] = $inline_content;
|
||||
$result[] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return implode("\n", $result);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -41,6 +41,36 @@ final class DifferentialTransaction extends PhabricatorApplicationTransaction {
|
|||
return false;
|
||||
}
|
||||
|
||||
public function shouldHideForMail(array $xactions) {
|
||||
switch ($this->getTransactionType()) {
|
||||
case self::TYPE_INLINE:
|
||||
// Hide inlines when rendering mail transactions if any other
|
||||
// transaction type exists.
|
||||
foreach ($xactions as $xaction) {
|
||||
if ($xaction->getTransactionType() != self::TYPE_INLINE) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
// If only inline transactions exist, we just render the first one.
|
||||
return ($this !== head($xactions));
|
||||
}
|
||||
|
||||
return $this->shouldHide();
|
||||
}
|
||||
|
||||
public function getBodyForMail() {
|
||||
switch ($this->getTransactionType()) {
|
||||
case self::TYPE_INLINE:
|
||||
// Don't render inlines into the mail body; they render into a special
|
||||
// section immediately after the body instead.
|
||||
return null;
|
||||
}
|
||||
|
||||
return parent::getBodyForMail();
|
||||
}
|
||||
|
||||
|
||||
public function getTitle() {
|
||||
$author_phid = $this->getAuthorPHID();
|
||||
$author_handle = $this->renderHandleLink($author_phid);
|
||||
|
|
|
@ -1592,13 +1592,18 @@ abstract class PhabricatorApplicationTransactionEditor
|
|||
$comments = array();
|
||||
|
||||
foreach ($xactions as $xaction) {
|
||||
if ($xaction->shouldHideForMail()) {
|
||||
if ($xaction->shouldHideForMail($xactions)) {
|
||||
continue;
|
||||
}
|
||||
$headers[] = id(clone $xaction)->setRenderingTarget('text')->getTitle();
|
||||
$comment = $xaction->getComment();
|
||||
if ($comment && strlen($comment->getContent())) {
|
||||
$comments[] = $comment->getContent();
|
||||
|
||||
$header = $xaction->getTitleForMail();
|
||||
if ($header !== null) {
|
||||
$headers[] = $header;
|
||||
}
|
||||
|
||||
$comment = $xaction->getBodyForMail();
|
||||
if ($comment !== null) {
|
||||
$comments[] = $comment;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -318,10 +318,22 @@ abstract class PhabricatorApplicationTransaction
|
|||
return false;
|
||||
}
|
||||
|
||||
public function shouldHideForMail() {
|
||||
public function shouldHideForMail(array $xactions) {
|
||||
return $this->shouldHide();
|
||||
}
|
||||
|
||||
public function getTitleForMail() {
|
||||
return id(clone $this)->setRenderingTarget('text')->getTitle();
|
||||
}
|
||||
|
||||
public function getBodyForMail() {
|
||||
$comment = $this->getComment();
|
||||
if ($comment && strlen($comment->getContent())) {
|
||||
return $comment->getContent();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public function getNoEffectDescription() {
|
||||
|
||||
switch ($this->getTransactionType()) {
|
||||
|
|
Loading…
Reference in a new issue