1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-19 12:00:55 +01:00

Add an option to put comment context into emails.

Summary:
When enabled, this will show the full history of review comments in an
email-compatible threading-view.

Test Plan: Sending emails with the option on and off.

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: epriestley, Korvin

Differential Revision: https://secure.phabricator.com/D10146
This commit is contained in:
Manuel Klimek 2014-08-15 10:14:09 -07:00 committed by epriestley
parent baa0a71e55
commit eb3ed9bbc9
2 changed files with 63 additions and 2 deletions

View file

@ -293,7 +293,7 @@ final class PhabricatorDifferentialConfigOptions
pht( pht(
'Normally, inline comments in emails are shown with a file and '. 'Normally, inline comments in emails are shown with a file and '.
'line but without any diff context. Enabling this option adds '. 'line but without any diff context. Enabling this option adds '.
'diff context.')), 'diff context and the comment thread.')),
); );
} }

View file

@ -1304,6 +1304,38 @@ final class DifferentialTransactionEditor
return $result; return $result;
} }
protected function indentForMail(array $lines) {
$indented = array();
foreach ($lines as $line) {
$indented[] = '> '.$line;
}
return $indented;
}
protected function nestCommentHistory(
DifferentialTransactionComment $comment, array $comments_by_line_number,
array $users_by_phid) {
$nested = array();
$previous_comments = $comments_by_line_number[$comment->getChangesetID()]
[$comment->getLineNumber()];
foreach ($previous_comments as $previous_comment) {
if ($previous_comment->getID() >= $comment->getID())
break;
$nested = $this->indentForMail(
array_merge(
$nested,
explode("\n", $previous_comment->getContent())));
$user = idx($users_by_phid, $previous_comment->getAuthorPHID(), null);
if ($user) {
array_unshift($nested, pht('%s wrote:', $user->getUserName()));
}
}
$nested = array_merge($nested, explode("\n", $comment->getContent()));
return implode("\n", $nested);
}
private function renderInlineCommentsForMail( private function renderInlineCommentsForMail(
PhabricatorLiskDAO $object, PhabricatorLiskDAO $object,
array $inlines) { array $inlines) {
@ -1312,9 +1344,12 @@ final class DifferentialTransactionEditor
$show_context = PhabricatorEnv::getEnvConfig($context_key); $show_context = PhabricatorEnv::getEnvConfig($context_key);
$changeset_ids = array(); $changeset_ids = array();
$line_numbers_by_changeset = array();
foreach ($inlines as $inline) { foreach ($inlines as $inline) {
$id = $inline->getComment()->getChangesetID(); $id = $inline->getComment()->getChangesetID();
$changeset_ids[$id] = $id; $changeset_ids[$id] = $id;
$line_numbers_by_changeset[$id][] =
$inline->getComment()->getLineNumber();
} }
$changesets = id(new DifferentialChangesetQuery()) $changesets = id(new DifferentialChangesetQuery())
@ -1329,6 +1364,30 @@ final class DifferentialTransactionEditor
if ($show_context) { if ($show_context) {
$hunk_parser = new DifferentialHunkParser(); $hunk_parser = new DifferentialHunkParser();
$table = new DifferentialTransactionComment();
$conn_r = $table->establishConnection('r');
$queries = array();
foreach ($line_numbers_by_changeset as $id => $line_numbers) {
$queries[] = qsprintf(
$conn_r,
'(changesetID = %d AND lineNumber IN (%Ld))',
$id, $line_numbers);
}
$all_comments = id(new DifferentialTransactionComment())->loadAllWhere(
'transactionPHID IS NOT NULL AND (%Q)', implode(' OR ', $queries));
$comments_by_line_number = array();
foreach ($all_comments as $comment) {
$comments_by_line_number
[$comment->getChangesetID()]
[$comment->getLineNumber()]
[$comment->getID()] = $comment;
}
$author_phids = mpull($all_comments, 'getAuthorPHID');
$authors = id(new PhabricatorPeopleQuery())
->setViewer($this->getActor())
->withPHIDs($author_phids)
->execute();
$authors_by_phid = mpull($authors, null, 'getPHID');
} }
$section = new PhabricatorMetaMTAMailSection(); $section = new PhabricatorMetaMTAMailSection();
@ -1360,13 +1419,15 @@ final class DifferentialTransactionEditor
$comment->getLineNumber(), $comment->getLineNumber(),
$comment->getLineLength(), $comment->getLineLength(),
1); 1);
$nested_comments = $this->nestCommentHistory(
$inline->getComment(), $comments_by_line_number, $authors_by_phid);
$section->addFragment('================') $section->addFragment('================')
->addFragment('Comment at: '.$file.':'.$range) ->addFragment('Comment at: '.$file.':'.$range)
->addPlaintextFragment($patch) ->addPlaintextFragment($patch)
->addHTMLFragment($this->renderPatchHTMLForMail($patch)) ->addHTMLFragment($this->renderPatchHTMLForMail($patch))
->addFragment('----------------') ->addFragment('----------------')
->addFragment($inline_content) ->addFragment($nested_comments)
->addFragment(null); ->addFragment(null);
} }
} }