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:
parent
baa0a71e55
commit
eb3ed9bbc9
2 changed files with 63 additions and 2 deletions
|
@ -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.')),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue