@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Diffusion - make projects work properly with commits

Summary: Fixes T3189. Now if you say #projects in a commit message they will associate nicely with the commit. Also we record transactions about all this project editing fun.

Test Plan: tested migration by associating some projects with commits and verifying they still showed up post migration. tested adding / removing projects by doing so from the UI, noting transactions written nicely as well

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin, epriestley

Projects: #projects

Maniphest Tasks: T3189

Differential Revision: https://secure.phabricator.com/D10877

+49 -64
+11
resources/sql/autopatches/20141119.commitpedge.sql
··· 1 + INSERT IGNORE INTO {$NAMESPACE}_repository.edge 2 + (src, type, dst, dateCreated, seq) 3 + SELECT src, 41, dst, dateCreated, seq 4 + FROM {$NAMESPACE}_repository.edge 5 + WHERE type = 15; 6 + 7 + INSERT IGNORE INTO {$NAMESPACE}_project.edge 8 + (src, type, dst, dateCreated, seq) 9 + SELECT src, 42, dst, dateCreated, seq 10 + FROM {$NAMESPACE}_project.edge 11 + WHERE type = 16;
-12
src/applications/diffusion/controller/DiffusionCommitController.php
··· 420 420 ->withSourcePHIDs(array($commit_phid)) 421 421 ->withEdgeTypes(array( 422 422 DiffusionCommitHasTaskEdgeType::EDGECONST, 423 - PhabricatorEdgeConfig::TYPE_COMMIT_HAS_PROJECT, 424 423 PhabricatorEdgeConfig::TYPE_COMMIT_HAS_DREV, 425 424 )); 426 425 ··· 428 427 429 428 $task_phids = array_keys( 430 429 $edges[$commit_phid][DiffusionCommitHasTaskEdgeType::EDGECONST]); 431 - $proj_phids = array_keys( 432 - $edges[$commit_phid][PhabricatorEdgeConfig::TYPE_COMMIT_HAS_PROJECT]); 433 430 $revision_phid = key( 434 431 $edges[$commit_phid][PhabricatorEdgeConfig::TYPE_COMMIT_HAS_DREV]); 435 432 ··· 627 624 } 628 625 $task_list = phutil_implode_html(phutil_tag('br'), $task_list); 629 626 $props['Tasks'] = $task_list; 630 - } 631 - 632 - if ($proj_phids) { 633 - $proj_list = array(); 634 - foreach ($proj_phids as $phid) { 635 - $proj_list[] = $handles[$phid]->renderLink(); 636 - } 637 - $proj_list = phutil_implode_html(phutil_tag('br'), $proj_list); 638 - $props['Projects'] = $proj_list; 639 627 } 640 628 641 629 return $props;
+11 -17
src/applications/diffusion/controller/DiffusionCommitEditController.php
··· 22 22 } 23 23 24 24 $commit_phid = $commit->getPHID(); 25 - $edge_type = PhabricatorEdgeConfig::TYPE_COMMIT_HAS_PROJECT; 25 + $edge_type = PhabricatorProjectObjectHasProjectEdgeType::EDGECONST; 26 26 $current_proj_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( 27 27 $commit_phid, 28 28 $edge_type); ··· 30 30 $proj_t_values = $handles; 31 31 32 32 if ($request->isFormPost()) { 33 + $xactions = array(); 33 34 $proj_phids = $request->getArr('projects'); 34 - $new_proj_phids = array_values($proj_phids); 35 - $rem_proj_phids = array_diff($current_proj_phids, 36 - $new_proj_phids); 37 - 38 - $editor = id(new PhabricatorEdgeEditor()); 39 - foreach ($rem_proj_phids as $phid) { 40 - $editor->removeEdge($commit_phid, $edge_type, $phid); 41 - } 42 - foreach ($new_proj_phids as $phid) { 43 - $editor->addEdge($commit_phid, $edge_type, $phid); 44 - } 45 - $editor->save(); 46 - 47 - id(new PhabricatorSearchIndexer()) 48 - ->queueDocumentForIndexing($commit->getPHID()); 49 - 35 + $xactions[] = id(new PhabricatorAuditTransaction()) 36 + ->setTransactionType(PhabricatorTransactions::TYPE_EDGE) 37 + ->setMetadataValue('edge:type', $edge_type) 38 + ->setNewValue(array('=' => array_fuse($proj_phids))); 39 + $editor = id(new PhabricatorAuditEditor()) 40 + ->setActor($user) 41 + ->setContinueOnNoEffect(true) 42 + ->setContentSourceFromRequest($request); 43 + $xactions = $editor->applyTransactions($commit, $xactions); 50 44 return id(new AphrontRedirectResponse()) 51 45 ->setURI('/r'.$callsign.$commit->getCommitIdentifier()); 52 46 }
-8
src/applications/maniphest/search/ManiphestSearchIndexer.php
··· 39 39 new ManiphestTransactionQuery(), 40 40 array($phid)); 41 41 42 - foreach ($task->getProjectPHIDs() as $phid) { 43 - $doc->addRelationship( 44 - PhabricatorSearchRelationship::RELATIONSHIP_PROJECT, 45 - $phid, 46 - PhabricatorProjectProjectPHIDType::TYPECONST, 47 - $task->getDateModified()); // Bogus. 48 - } 49 - 50 42 $owner = $task->getOwnerPHID(); 51 43 if ($owner) { 52 44 $doc->addRelationship(
-13
src/applications/repository/search/PhabricatorRepositoryCommitSearchIndexer.php
··· 47 47 $date_created); 48 48 } 49 49 50 - $project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( 51 - $commit->getPHID(), 52 - PhabricatorEdgeConfig::TYPE_COMMIT_HAS_PROJECT); 53 - if ($project_phids) { 54 - foreach ($project_phids as $project_phid) { 55 - $doc->addRelationship( 56 - PhabricatorSearchRelationship::RELATIONSHIP_PROJECT, 57 - $project_phid, 58 - PhabricatorProjectProjectPHIDType::TYPECONST, 59 - $date_created); 60 - } 61 - } 62 - 63 50 $doc->addRelationship( 64 51 PhabricatorSearchRelationship::RELATIONSHIP_REPOSITORY, 65 52 $repository->getPHID(),
+1
src/applications/repository/storage/PhabricatorRepositoryCommit.php
··· 5 5 implements 6 6 PhabricatorPolicyInterface, 7 7 PhabricatorFlaggableInterface, 8 + PhabricatorProjectInterface, 8 9 PhabricatorTokenReceiverInterface, 9 10 PhabricatorSubscribableInterface, 10 11 PhabricatorMentionableInterface,
+23
src/applications/search/index/PhabricatorSearchDocumentIndexer.php
··· 47 47 $this->indexSubscribers($document); 48 48 } 49 49 50 + // Automatically build project relationships 51 + if ($object instanceof PhabricatorProjectInterface) { 52 + $this->indexProjects($document, $object); 53 + } 54 + 50 55 $engine = PhabricatorSearchEngineSelector::newSelector()->newEngine(); 51 56 try { 52 57 $engine->reindexAbstractDocument($document); ··· 90 95 $phid, 91 96 $handle->getType(), 92 97 $doc->getDocumentModified()); // Bogus timestamp. 98 + } 99 + } 100 + 101 + protected function indexProjects( 102 + PhabricatorSearchAbstractDocument $doc, 103 + PhabricatorProjectInterface $object) { 104 + 105 + $project_phids = PhabricatorEdgeQuery::loadDestinationPHIDs( 106 + $object->getPHID(), 107 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST); 108 + if ($project_phids) { 109 + foreach ($project_phids as $project_phid) { 110 + $doc->addRelationship( 111 + PhabricatorSearchRelationship::RELATIONSHIP_PROJECT, 112 + $project_phid, 113 + PhabricatorProjectProjectPHIDType::TYPECONST, 114 + $doc->getDocumentModified()); // Bogus timestamp. 115 + } 93 116 } 94 117 } 95 118
+3 -14
src/infrastructure/edges/constants/PhabricatorEdgeConfig.php
··· 19 19 const TYPE_PROJ_MEMBER = 13; 20 20 const TYPE_MEMBER_OF_PROJ = 14; 21 21 22 - const TYPE_COMMIT_HAS_PROJECT = 15; 23 - const TYPE_PROJECT_HAS_COMMIT = 16; 24 - 25 22 const TYPE_QUESTION_HAS_VOTING_USER = 17; 26 23 const TYPE_VOTING_USER_HAS_QUESTION = 18; 27 24 const TYPE_ANSWER_HAS_VOTING_USER = 19; ··· 100 97 array(9000), 101 98 range(80000, 80005)); 102 99 100 + $exclude[] = 15; // Was TYPE_COMMIT_HAS_PROJECT 101 + $exclude[] = 16; // Was TYPE_PROJECT_HAS_COMMIT 102 + 103 103 $exclude[] = 27; // Was TYPE_ACCOUNT_HAS_MEMBER 104 104 $exclude[] = 28; // Was TYPE_MEMBER_HAS_ACCOUNT 105 105 ··· 144 144 145 145 self::TYPE_PROJ_MEMBER => self::TYPE_MEMBER_OF_PROJ, 146 146 self::TYPE_MEMBER_OF_PROJ => self::TYPE_PROJ_MEMBER, 147 - 148 - self::TYPE_COMMIT_HAS_PROJECT => self::TYPE_PROJECT_HAS_COMMIT, 149 - self::TYPE_PROJECT_HAS_COMMIT => self::TYPE_COMMIT_HAS_PROJECT, 150 147 151 148 self::TYPE_QUESTION_HAS_VOTING_USER => 152 149 self::TYPE_VOTING_USER_HAS_QUESTION, ··· 239 236 240 237 public static function getEditStringForEdgeType($type) { 241 238 switch ($type) { 242 - case self::TYPE_PROJECT_HAS_COMMIT: 243 239 case self::TYPE_DREV_HAS_COMMIT: 244 240 return '%s edited commit(s), added %d: %s; removed %d: %s.'; 245 241 case self::TYPE_TASK_DEPENDS_ON_TASK: ··· 261 257 case self::TYPE_PROJ_MEMBER: 262 258 return '%s edited member(s), added %d: %s; removed %d: %s.'; 263 259 case self::TYPE_MEMBER_OF_PROJ: 264 - case self::TYPE_COMMIT_HAS_PROJECT: 265 260 return '%s edited project(s), added %d: %s; removed %d: %s.'; 266 261 case self::TYPE_QUESTION_HAS_VOTING_USER: 267 262 case self::TYPE_ANSWER_HAS_VOTING_USER: ··· 307 302 308 303 public static function getAddStringForEdgeType($type) { 309 304 switch ($type) { 310 - case self::TYPE_PROJECT_HAS_COMMIT: 311 305 case self::TYPE_DREV_HAS_COMMIT: 312 306 return '%s added %d commit(s): %s.'; 313 307 case self::TYPE_TASK_DEPENDS_ON_TASK: ··· 332 326 case self::TYPE_PROJ_MEMBER: 333 327 return '%s added %d member(s): %s.'; 334 328 case self::TYPE_MEMBER_OF_PROJ: 335 - case self::TYPE_COMMIT_HAS_PROJECT: 336 329 return '%s added %d project(s): %s.'; 337 330 case self::TYPE_QUESTION_HAS_VOTING_USER: 338 331 case self::TYPE_ANSWER_HAS_VOTING_USER: ··· 377 370 378 371 public static function getRemoveStringForEdgeType($type) { 379 372 switch ($type) { 380 - case self::TYPE_PROJECT_HAS_COMMIT: 381 373 case self::TYPE_DREV_HAS_COMMIT: 382 374 return '%s removed %d commit(s): %s.'; 383 375 case self::TYPE_TASK_DEPENDS_ON_TASK: ··· 401 393 case self::TYPE_PROJ_MEMBER: 402 394 return '%s removed %d member(s): %s.'; 403 395 case self::TYPE_MEMBER_OF_PROJ: 404 - case self::TYPE_COMMIT_HAS_PROJECT: 405 396 return '%s removed %d project(s): %s.'; 406 397 case self::TYPE_QUESTION_HAS_VOTING_USER: 407 398 case self::TYPE_ANSWER_HAS_VOTING_USER: ··· 444 435 445 436 public static function getFeedStringForEdgeType($type) { 446 437 switch ($type) { 447 - case self::TYPE_PROJECT_HAS_COMMIT: 448 438 case self::TYPE_DREV_HAS_COMMIT: 449 439 return '%s updated commits of %s.'; 450 440 case self::TYPE_TASK_DEPENDS_ON_TASK: ··· 466 456 case self::TYPE_PROJ_MEMBER: 467 457 return '%s updated members of %s.'; 468 458 case self::TYPE_MEMBER_OF_PROJ: 469 - case self::TYPE_COMMIT_HAS_PROJECT: 470 459 return '%s updated projects of %s.'; 471 460 case self::TYPE_QUESTION_HAS_VOTING_USER: 472 461 case self::TYPE_ANSWER_HAS_VOTING_USER: