@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.

Add datasources to allow search revisions by project.

Summary:
When having lots of repos, seeing "all revisions in this project" is hard, and we ended up adding herald rules to basically copy project tags to the revisions on a per-project basis. Adding a "tagged: project" function to the Repositories search field allows users to find differentials within a project.

Fix T10850.

Test Plan: search differentials by tagging project and repository in the Repository field

Reviewers: avivey, epriestley, #blessed_reviewers

Reviewed By: avivey, epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

Maniphest Tasks: T10850

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

authored by

Shijie Feng and committed by
neonbadger
aaf36986 e78488f6

+130 -1
+4
src/__phutil_library_map__.php
··· 489 489 'DifferentialReleephRequestFieldSpecification' => 'applications/releeph/differential/DifferentialReleephRequestFieldSpecification.php', 490 490 'DifferentialRemarkupRule' => 'applications/differential/remarkup/DifferentialRemarkupRule.php', 491 491 'DifferentialReplyHandler' => 'applications/differential/mail/DifferentialReplyHandler.php', 492 + 'DifferentialRepositoryDatasource' => 'applications/differential/typeahead/DifferentialRepositoryDatasource.php', 492 493 'DifferentialRepositoryField' => 'applications/differential/customfield/DifferentialRepositoryField.php', 493 494 'DifferentialRepositoryLookup' => 'applications/differential/query/DifferentialRepositoryLookup.php', 494 495 'DifferentialRequiredSignaturesField' => 'applications/differential/customfield/DifferentialRequiredSignaturesField.php', ··· 821 822 'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php', 822 823 'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php', 823 824 'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php', 825 + 'DiffusionTaggedRepositoriesFunctionDatasource' => 'applications/diffusion/typeahead/DiffusionTaggedRepositoriesFunctionDatasource.php', 824 826 'DiffusionTagsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionTagsQueryConduitAPIMethod.php', 825 827 'DiffusionURIEditConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionURIEditConduitAPIMethod.php', 826 828 'DiffusionURIEditEngine' => 'applications/diffusion/editor/DiffusionURIEditEngine.php', ··· 4788 4790 'DifferentialReleephRequestFieldSpecification' => 'Phobject', 4789 4791 'DifferentialRemarkupRule' => 'PhabricatorObjectRemarkupRule', 4790 4792 'DifferentialReplyHandler' => 'PhabricatorApplicationTransactionReplyHandler', 4793 + 'DifferentialRepositoryDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 4791 4794 'DifferentialRepositoryField' => 'DifferentialCoreCustomField', 4792 4795 'DifferentialRepositoryLookup' => 'Phobject', 4793 4796 'DifferentialRequiredSignaturesField' => 'DifferentialCoreCustomField', ··· 5138 5141 'DiffusionSymbolQuery' => 'PhabricatorOffsetPagedQuery', 5139 5142 'DiffusionTagListController' => 'DiffusionController', 5140 5143 'DiffusionTagListView' => 'DiffusionView', 5144 + 'DiffusionTaggedRepositoriesFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 5141 5145 'DiffusionTagsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 5142 5146 'DiffusionURIEditConduitAPIMethod' => 'PhabricatorEditEngineAPIMethod', 5143 5147 'DiffusionURIEditEngine' => 'PhabricatorEditEngine',
+1 -1
src/applications/differential/query/DifferentialRevisionSearchEngine.php
··· 75 75 ->setLabel(pht('Repositories')) 76 76 ->setKey('repositoryPHIDs') 77 77 ->setAliases(array('repository', 'repositories', 'repositoryPHID')) 78 - ->setDatasource(new DiffusionRepositoryDatasource()) 78 + ->setDatasource(new DifferentialRepositoryDatasource()) 79 79 ->setDescription( 80 80 pht('Find revisions from specific repositories.')), 81 81 id(new PhabricatorSearchSelectField())
+25
src/applications/differential/typeahead/DifferentialRepositoryDatasource.php
··· 1 + <?php 2 + 3 + final class DifferentialRepositoryDatasource 4 + extends PhabricatorTypeaheadCompositeDatasource { 5 + 6 + public function getBrowseTitle() { 7 + return pht('Browse Repositories'); 8 + } 9 + 10 + public function getPlaceholderText() { 11 + return pht('Type a repository name or function...'); 12 + } 13 + 14 + public function getDatasourceApplicationClass() { 15 + return 'PhabricatorDifferentialApplication'; 16 + } 17 + 18 + public function getComponentDatasources() { 19 + return array( 20 + new DiffusionTaggedRepositoriesFunctionDatasource(), 21 + new DiffusionRepositoryDatasource(), 22 + ); 23 + } 24 + 25 + }
+100
src/applications/diffusion/typeahead/DiffusionTaggedRepositoriesFunctionDatasource.php
··· 1 + <?php 2 + 3 + final class DiffusionTaggedRepositoriesFunctionDatasource 4 + extends PhabricatorTypeaheadCompositeDatasource { 5 + 6 + public function getBrowseTitle() { 7 + return pht('Browse Repositories'); 8 + } 9 + 10 + public function getPlaceholderText() { 11 + return pht('Type tagged(<project>)...'); 12 + } 13 + 14 + public function getDatasourceApplicationClass() { 15 + return 'PhabricatorProjectApplication'; 16 + } 17 + 18 + public function getComponentDatasources() { 19 + return array( 20 + new PhabricatorProjectDatasource(), 21 + ); 22 + } 23 + 24 + public function getDatasourceFunctions() { 25 + return array( 26 + 'tagged' => array( 27 + 'name' => pht('Repositories: ...'), 28 + 'arguments' => pht('project'), 29 + 'summary' => pht('Find results for repositories of a project.'), 30 + 'description' => pht( 31 + 'This function allows you to find results for any of the `. 32 + `repositories of a project:'. 33 + "\n\n". 34 + '> tagged(engineering)'), 35 + ), 36 + ); 37 + } 38 + 39 + protected function didLoadResults(array $results) { 40 + foreach ($results as $result) { 41 + $result 42 + ->setTokenType(PhabricatorTypeaheadTokenView::TYPE_FUNCTION) 43 + ->setColor(null) 44 + ->setPHID('tagged('.$result->getPHID().')') 45 + ->setDisplayName(pht('Tagged: %s', $result->getDisplayName())) 46 + ->setName('tagged '.$result->getName()); 47 + } 48 + 49 + return $results; 50 + } 51 + 52 + protected function evaluateFunction($function, array $argv_list) { 53 + $phids = array(); 54 + foreach ($argv_list as $argv) { 55 + $phids[] = head($argv); 56 + } 57 + 58 + $repositories = id(new PhabricatorRepositoryQuery()) 59 + ->setViewer($this->getViewer()) 60 + ->withEdgeLogicPHIDs( 61 + PhabricatorProjectObjectHasProjectEdgeType::EDGECONST, 62 + PhabricatorQueryConstraint::OPERATOR_OR, 63 + $phids) 64 + ->execute(); 65 + 66 + $results = array(); 67 + 68 + foreach ($repositories as $repository) { 69 + $results[] = $repository->getPHID(); 70 + } 71 + 72 + return $results; 73 + } 74 + 75 + public function renderFunctionTokens($function, array $argv_list) { 76 + $phids = array(); 77 + foreach ($argv_list as $argv) { 78 + $phids[] = head($argv); 79 + } 80 + 81 + $tokens = $this->renderTokens($phids); 82 + foreach ($tokens as $token) { 83 + // Remove any project color on this token. 84 + $token->setColor(null); 85 + 86 + if ($token->isInvalid()) { 87 + $token 88 + ->setValue(pht('Repositories: Invalid Project')); 89 + } else { 90 + $token 91 + ->setTokenType(PhabricatorTypeaheadTokenView::TYPE_FUNCTION) 92 + ->setKey('tagged('.$token->getKey().')') 93 + ->setValue(pht('Tagged: %s', $token->getValue())); 94 + } 95 + } 96 + 97 + return $tokens; 98 + } 99 + 100 + }