mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-30 01:10:58 +01:00
Make @mentions add CCs as a side effect
Summary: When a user gets @mentioned in Differential, add them as a CC. No Maniphest hookup yet since I want to make that one a little more formal. Depends on D518. Test Plan: @mentioned a user and they were added as a CC. Reviewed By: jungejason Reviewers: tomo, mroch, jsp, jungejason, aran, tuomaspelkonen CC: aran, jungejason Differential Revision: 519
This commit is contained in:
parent
bb4cf7d6b3
commit
07b64dc01f
5 changed files with 65 additions and 4 deletions
|
@ -273,7 +273,7 @@ class DifferentialCommentEditor {
|
||||||
|
|
||||||
$current_ccs = $revision->getCCPHIDs();
|
$current_ccs = $revision->getCCPHIDs();
|
||||||
if ($current_ccs) {
|
if ($current_ccs) {
|
||||||
$current_ccs = array_combine($current_ccs, $current_ccs);
|
$current_ccs = array_fill_keys($current_ccs, true);
|
||||||
foreach ($added_ccs as $k => $cc) {
|
foreach ($added_ccs as $k => $cc) {
|
||||||
if (isset($current_ccs[$cc])) {
|
if (isset($current_ccs[$cc])) {
|
||||||
unset($added_ccs[$k]);
|
unset($added_ccs[$k]);
|
||||||
|
@ -307,9 +307,6 @@ class DifferentialCommentEditor {
|
||||||
$this->actorPHID);
|
$this->actorPHID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reload relationships to pick up any reviewer/CC changes.
|
|
||||||
$revision->loadRelationships();
|
|
||||||
|
|
||||||
$inline_comments = array();
|
$inline_comments = array();
|
||||||
if ($this->attachInlineComments) {
|
if ($this->attachInlineComments) {
|
||||||
$inline_comments = id(new DifferentialInlineComment())->loadAllWhere(
|
$inline_comments = id(new DifferentialInlineComment())->loadAllWhere(
|
||||||
|
@ -341,6 +338,43 @@ class DifferentialCommentEditor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find any "@mentions" in the comment blocks.
|
||||||
|
$content_blocks = array($comment->getContent());
|
||||||
|
foreach ($inline_comments as $inline) {
|
||||||
|
$content_blocks[] = $inline->getContent();
|
||||||
|
}
|
||||||
|
$mention_ccs = DifferentialMarkupEngineFactory::extractPHIDsFromMentions(
|
||||||
|
$content_blocks);
|
||||||
|
if ($mention_ccs) {
|
||||||
|
$current_ccs = $revision->getCCPHIDs();
|
||||||
|
if ($current_ccs) {
|
||||||
|
$current_ccs = array_fill_keys($current_ccs, true);
|
||||||
|
foreach ($mention_ccs as $key => $mention_cc) {
|
||||||
|
if (isset($current_ccs[$mention_cc])) {
|
||||||
|
unset($mention_ccs);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ($mention_ccs) {
|
||||||
|
$metadata = $comment->getMetadata();
|
||||||
|
$metacc = idx(
|
||||||
|
$metadata,
|
||||||
|
DifferentialComment::METADATA_ADDED_CCS,
|
||||||
|
array());
|
||||||
|
foreach ($mention_ccs as $cc_phid) {
|
||||||
|
DifferentialRevisionEditor::addCC(
|
||||||
|
$revision,
|
||||||
|
$cc_phid,
|
||||||
|
$this->actorPHID);
|
||||||
|
$metacc[] = $cc_phid;
|
||||||
|
}
|
||||||
|
$metadata[DifferentialComment::METADATA_ADDED_CCS] = $metacc;
|
||||||
|
|
||||||
|
$comment->setMetadata($metadata);
|
||||||
|
$comment->save();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
$phids = array($this->actorPHID);
|
$phids = array($this->actorPHID);
|
||||||
$handles = id(new PhabricatorObjectHandleData($phids))
|
$handles = id(new PhabricatorObjectHandleData($phids))
|
||||||
->loadHandles();
|
->loadHandles();
|
||||||
|
|
|
@ -10,6 +10,7 @@ phutil_require_module('phabricator', 'applications/differential/constants/action
|
||||||
phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus');
|
phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus');
|
||||||
phutil_require_module('phabricator', 'applications/differential/editor/revision');
|
phutil_require_module('phabricator', 'applications/differential/editor/revision');
|
||||||
phutil_require_module('phabricator', 'applications/differential/mail/comment');
|
phutil_require_module('phabricator', 'applications/differential/mail/comment');
|
||||||
|
phutil_require_module('phabricator', 'applications/differential/parser/markup');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/changeset');
|
phutil_require_module('phabricator', 'applications/differential/storage/changeset');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/comment');
|
phutil_require_module('phabricator', 'applications/differential/storage/comment');
|
||||||
phutil_require_module('phabricator', 'applications/differential/storage/inlinecomment');
|
phutil_require_module('phabricator', 'applications/differential/storage/inlinecomment');
|
||||||
|
|
|
@ -600,6 +600,8 @@ class DifferentialRevisionEditor {
|
||||||
implode(', ', $sql));
|
implode(', ', $sql));
|
||||||
}
|
}
|
||||||
$conn_w->saveTransaction();
|
$conn_w->saveTransaction();
|
||||||
|
|
||||||
|
$revision->loadRelationships();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,23 @@
|
||||||
|
|
||||||
class DifferentialMarkupEngineFactory {
|
class DifferentialMarkupEngineFactory {
|
||||||
|
|
||||||
|
public static function extractPHIDsFromMentions(array $content_blocks) {
|
||||||
|
$mentions = array();
|
||||||
|
|
||||||
|
$factory = new DifferentialMarkupEngineFactory();
|
||||||
|
$engine = $factory->newDifferentialCommentMarkupEngine();
|
||||||
|
|
||||||
|
foreach ($content_blocks as $content_block) {
|
||||||
|
$engine->markupText($content_block);
|
||||||
|
$phids = $engine->getTextMetadata(
|
||||||
|
'phabricator.mentioned-user-phids',
|
||||||
|
array());
|
||||||
|
$mentions += $phids;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $mentions;
|
||||||
|
}
|
||||||
|
|
||||||
public function newDifferentialCommentMarkupEngine() {
|
public function newDifferentialCommentMarkupEngine() {
|
||||||
$engine = new PhutilRemarkupEngine();
|
$engine = new PhutilRemarkupEngine();
|
||||||
|
|
||||||
|
|
|
@ -48,10 +48,17 @@ class PhabricatorRemarkupRuleMention
|
||||||
$user_table->getTableName(),
|
$user_table->getTableName(),
|
||||||
$usernames);
|
$usernames);
|
||||||
|
|
||||||
|
$engine = $this->getEngine();
|
||||||
|
$metadata_key = 'phabricator.mentioned-user-phids';
|
||||||
|
$mentioned = $engine->getTextMetadata($metadata_key, array());
|
||||||
|
|
||||||
foreach ($real_user_names as $row) {
|
foreach ($real_user_names as $row) {
|
||||||
$this->actualUsers[strtolower($row['username'])] = $row;
|
$this->actualUsers[strtolower($row['username'])] = $row;
|
||||||
|
$mentioned[$row['phid']] = $row['phid'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$engine->setTextMetadata($metadata_key, $mentioned);
|
||||||
|
|
||||||
return preg_replace_callback(
|
return preg_replace_callback(
|
||||||
$regexp,
|
$regexp,
|
||||||
array($this, 'markupMention'),
|
array($this, 'markupMention'),
|
||||||
|
|
Loading…
Reference in a new issue