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

DiffusionBranchQuery => Conduit

Summary: ref T2784. This one had a few fun spots where I had to move data around. Also, is there some common object (or should I add it?) that can do this toDictionary newFromConduit stuff? Also, this assumes D5803 is largely correct at the time of this diff.

Test Plan: browsed mercurial and git repository page. saw the branches i expected.

Reviewers: epriestley

Reviewed By: epriestley

CC: chad, aran, Korvin

Maniphest Tasks: T2784

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

+139 -164
+6 -8
src/__phutil_library_map__.php
··· 145 145 'ConduitAPI_differential_updateunitresults_Method' => 'applications/differential/conduit/ConduitAPI_differential_updateunitresults_Method.php', 146 146 'ConduitAPI_diffusion_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_Method.php', 147 147 'ConduitAPI_diffusion_abstractquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_abstractquery_Method.php', 148 + 'ConduitAPI_diffusion_branchquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_branchquery_Method.php', 148 149 'ConduitAPI_diffusion_existsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_existsquery_Method.php', 149 150 'ConduitAPI_diffusion_findsymbols_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_findsymbols_Method.php', 150 151 'ConduitAPI_diffusion_getcommits_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getcommits_Method.php', ··· 397 398 'DifferentialUnitStatus' => 'applications/differential/constants/DifferentialUnitStatus.php', 398 399 'DifferentialUnitTestResult' => 'applications/differential/constants/DifferentialUnitTestResult.php', 399 400 'DiffusionBranchInformation' => 'applications/diffusion/data/DiffusionBranchInformation.php', 400 - 'DiffusionBranchQuery' => 'applications/diffusion/query/branch/DiffusionBranchQuery.php', 401 401 'DiffusionBranchTableController' => 'applications/diffusion/controller/DiffusionBranchTableController.php', 402 402 'DiffusionBranchTableView' => 'applications/diffusion/view/DiffusionBranchTableView.php', 403 403 'DiffusionBrowseController' => 'applications/diffusion/controller/DiffusionBrowseController.php', ··· 423 423 'DiffusionExternalController' => 'applications/diffusion/controller/DiffusionExternalController.php', 424 424 'DiffusionFileContent' => 'applications/diffusion/data/DiffusionFileContent.php', 425 425 'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionFileContentQuery.php', 426 - 'DiffusionGitBranchQuery' => 'applications/diffusion/query/branch/DiffusionGitBranchQuery.php', 427 - 'DiffusionGitBranchQueryTestCase' => 'applications/diffusion/query/branch/__tests__/DiffusionGitBranchQueryTestCase.php', 426 + 'DiffusionGitBranch' => 'applications/diffusion/data/DiffusionGitBranch.php', 427 + 'DiffusionGitBranchTestCase' => 'applications/diffusion/data/__tests__/DiffusionGitBranchTestCase.php', 428 428 'DiffusionGitBrowseQuery' => 'applications/diffusion/query/browse/DiffusionGitBrowseQuery.php', 429 429 'DiffusionGitCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionGitCommitParentsQuery.php', 430 430 'DiffusionGitCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionGitCommitTagsQuery.php', ··· 449 449 'DiffusionLintController' => 'applications/diffusion/controller/DiffusionLintController.php', 450 450 'DiffusionLintDetailsController' => 'applications/diffusion/controller/DiffusionLintDetailsController.php', 451 451 'DiffusionLintSaveRunner' => 'applications/diffusion/DiffusionLintSaveRunner.php', 452 - 'DiffusionMercurialBranchQuery' => 'applications/diffusion/query/branch/DiffusionMercurialBranchQuery.php', 453 452 'DiffusionMercurialBrowseQuery' => 'applications/diffusion/query/browse/DiffusionMercurialBrowseQuery.php', 454 453 'DiffusionMercurialCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionMercurialCommitParentsQuery.php', 455 454 'DiffusionMercurialCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionMercurialCommitTagsQuery.php', ··· 477 476 'DiffusionRenameHistoryQuery' => 'applications/diffusion/query/DiffusionRenameHistoryQuery.php', 478 477 'DiffusionRepositoryController' => 'applications/diffusion/controller/DiffusionRepositoryController.php', 479 478 'DiffusionRepositoryPath' => 'applications/diffusion/data/DiffusionRepositoryPath.php', 480 - 'DiffusionRepositoryTag' => 'applications/diffusion/DiffusionRepositoryTag.php', 479 + 'DiffusionRepositoryTag' => 'applications/diffusion/data/DiffusionRepositoryTag.php', 481 480 'DiffusionRequest' => 'applications/diffusion/request/DiffusionRequest.php', 482 481 'DiffusionSetupException' => 'applications/diffusion/exception/DiffusionSetupException.php', 483 482 'DiffusionSvnBrowseQuery' => 'applications/diffusion/query/browse/DiffusionSvnBrowseQuery.php', ··· 1912 1911 'ConduitAPI_differential_updateunitresults_Method' => 'ConduitAPIMethod', 1913 1912 'ConduitAPI_diffusion_Method' => 'ConduitAPIMethod', 1914 1913 'ConduitAPI_diffusion_abstractquery_Method' => 'ConduitAPI_diffusion_Method', 1914 + 'ConduitAPI_diffusion_branchquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1915 1915 'ConduitAPI_diffusion_existsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1916 1916 'ConduitAPI_diffusion_findsymbols_Method' => 'ConduitAPI_diffusion_Method', 1917 1917 'ConduitAPI_diffusion_getcommits_Method' => 'ConduitAPI_diffusion_Method', ··· 2178 2178 'DiffusionEmptyResultView' => 'DiffusionView', 2179 2179 'DiffusionExternalController' => 'DiffusionController', 2180 2180 'DiffusionFileContentQuery' => 'DiffusionQuery', 2181 - 'DiffusionGitBranchQuery' => 'DiffusionBranchQuery', 2182 - 'DiffusionGitBranchQueryTestCase' => 'PhabricatorTestCase', 2181 + 'DiffusionGitBranchTestCase' => 'PhabricatorTestCase', 2183 2182 'DiffusionGitBrowseQuery' => 'DiffusionBrowseQuery', 2184 2183 'DiffusionGitCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2185 2184 'DiffusionGitCommitTagsQuery' => 'DiffusionCommitTagsQuery', ··· 2203 2202 'DiffusionLastModifiedQuery' => 'DiffusionQuery', 2204 2203 'DiffusionLintController' => 'DiffusionController', 2205 2204 'DiffusionLintDetailsController' => 'DiffusionController', 2206 - 'DiffusionMercurialBranchQuery' => 'DiffusionBranchQuery', 2207 2205 'DiffusionMercurialBrowseQuery' => 'DiffusionBrowseQuery', 2208 2206 'DiffusionMercurialCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2209 2207 'DiffusionMercurialCommitTagsQuery' => 'DiffusionCommitTagsQuery',
src/applications/diffusion/DiffusionRepositoryTag.php src/applications/diffusion/data/DiffusionRepositoryTag.php
+95
src/applications/diffusion/conduit/ConduitAPI_diffusion_branchquery_Method.php
··· 1 + <?php 2 + 3 + /** 4 + * @group conduit 5 + */ 6 + final class ConduitAPI_diffusion_branchquery_Method 7 + extends ConduitAPI_diffusion_abstractquery_Method { 8 + 9 + public function getMethodDescription() { 10 + return 'Determine what branches exist for a repository.'; 11 + } 12 + 13 + public function defineReturnType() { 14 + return 'array'; 15 + } 16 + 17 + protected function defineCustomParamTypes() { 18 + return array( 19 + 'limit' => 'optional int', 20 + 'offset' => 'optional int' 21 + ); 22 + } 23 + 24 + protected function getGitResult(ConduitAPIRequest $request) { 25 + $drequest = $this->getDiffusionRequest(); 26 + $repository = $drequest->getRepository(); 27 + $limit = $request->getValue('limit'); 28 + $offset = $request->getValue('offset'); 29 + 30 + // We need to add 1 in case we pick up HEAD. 31 + $count = $offset + $limit + 1; 32 + 33 + list($stdout) = $repository->execxLocalCommand( 34 + 'for-each-ref %C --sort=-creatordate --format=%s refs/remotes', 35 + $count ? '--count='.(int)$count : null, 36 + '%(refname:short) %(objectname)'); 37 + 38 + $branch_list = DiffusionGitBranch::parseRemoteBranchOutput( 39 + $stdout, 40 + $only_this_remote = DiffusionBranchInformation::DEFAULT_GIT_REMOTE); 41 + 42 + $branches = array(); 43 + foreach ($branch_list as $name => $head) { 44 + if (!$repository->shouldTrackBranch($name)) { 45 + continue; 46 + } 47 + 48 + $branch = new DiffusionBranchInformation(); 49 + $branch->setName($name); 50 + $branch->setHeadCommitIdentifier($head); 51 + $branches[] = $branch->toDictionary(); 52 + } 53 + 54 + if ($offset) { 55 + $branches = array_slice($branches, $offset); 56 + } 57 + 58 + // We might have too many even after offset slicing, if there was no HEAD 59 + // for some reason. 60 + if ($limit) { 61 + $branches = array_slice($branches, 0, $limit); 62 + } 63 + 64 + return $branches; 65 + } 66 + 67 + protected function getMercurialResult(ConduitAPIRequest $request) { 68 + $drequest = $this->getDiffusionRequest(); 69 + $repository = $drequest->getRepository(); 70 + $offset = $request->getValue('offset'); 71 + $limit = $request->getValue('limit'); 72 + 73 + list($stdout) = $repository->execxLocalCommand( 74 + '--debug branches'); 75 + $branch_info = ArcanistMercurialParser::parseMercurialBranches($stdout); 76 + 77 + $branches = array(); 78 + foreach ($branch_info as $name => $info) { 79 + $branch = new DiffusionBranchInformation(); 80 + $branch->setName($name); 81 + $branch->setHeadCommitIdentifier($info['rev']); 82 + $branches[] = $branch->toDictionary(); 83 + } 84 + 85 + if ($offset) { 86 + $branches = array_slice($branches, $offset); 87 + } 88 + 89 + if ($limit) { 90 + $branches = array_slice($branches, 0, $limit); 91 + } 92 + 93 + return $branches; 94 + } 95 + }
+7 -5
src/applications/diffusion/controller/DiffusionBranchTableController.php
··· 14 14 $pager->setOffset($request->getInt('offset')); 15 15 16 16 // TODO: Add support for branches that contain commit 17 - $query = DiffusionBranchQuery::newFromDiffusionRequest($drequest); 18 - $query->setOffset($pager->getOffset()); 19 - $query->setLimit($pager->getPageSize() + 1); 20 - $branches = $query->loadBranches(); 21 - 17 + $branches = DiffusionBranchInformation::newFromConduit( 18 + $this->callConduitWithDiffusionRequest( 19 + 'diffusion.branchquery', 20 + array( 21 + 'offset' => $pager->getOffset(), 22 + 'limit' => $pager->getPageSize() + 1 23 + ))); 22 24 $branches = $pager->sliceResults($branches); 23 25 24 26 $content = null;
+7 -5
src/applications/diffusion/controller/DiffusionRepositoryController.php
··· 154 154 if ($drequest->getBranch() !== null) { 155 155 $limit = 15; 156 156 157 - $branch_query = DiffusionBranchQuery::newFromDiffusionRequest($drequest); 158 - $branch_query->setLimit($limit + 1); 159 - $branches = $branch_query->loadBranches(); 160 - 157 + $branches = DiffusionBranchInformation::newFromConduit( 158 + $this->callConduitWithDiffusionRequest( 159 + 'diffusion.branchquery', 160 + array( 161 + 'limit' => $limit 162 + ))); 161 163 if (!$branches) { 162 - return null; 164 + return null; 163 165 } 164 166 165 167 $more_branches = (count($branches) > $limit);
+17
src/applications/diffusion/data/DiffusionBranchInformation.php
··· 25 25 return $this->headCommitIdentifier; 26 26 } 27 27 28 + public static function newFromConduit(array $dicts) { 29 + $branches = array(); 30 + foreach ($dicts as $dict) { 31 + $branches[] = id(new DiffusionBranchInformation()) 32 + ->setName($dict['name']) 33 + ->setHeadCommitIdentifier($dict['head_commit_identifier']); 34 + } 35 + return $branches; 36 + } 37 + 38 + public function toDictionary() { 39 + return array( 40 + 'name' => $this->getName(), 41 + 'head_commit_identifier' => $this->getHeadCommitIdentifier() 42 + ); 43 + } 44 + 28 45 }
-61
src/applications/diffusion/query/branch/DiffusionBranchQuery.php
··· 1 - <?php 2 - 3 - abstract class DiffusionBranchQuery { 4 - 5 - private $request; 6 - private $limit; 7 - private $offset; 8 - 9 - public function setOffset($offset) { 10 - $this->offset = $offset; 11 - return $this; 12 - } 13 - 14 - public function getOffset() { 15 - return $this->offset; 16 - } 17 - 18 - public function setLimit($limit) { 19 - $this->limit = $limit; 20 - return $this; 21 - } 22 - 23 - protected function getLimit() { 24 - return $this->limit; 25 - } 26 - 27 - final private function __construct() { 28 - // <private> 29 - } 30 - 31 - final public static function newFromDiffusionRequest( 32 - DiffusionRequest $request) { 33 - 34 - $repository = $request->getRepository(); 35 - 36 - switch ($repository->getVersionControlSystem()) { 37 - case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: 38 - $query = new DiffusionGitBranchQuery(); 39 - break; 40 - case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: 41 - $query = new DiffusionMercurialBranchQuery(); 42 - break; 43 - default: 44 - throw new Exception("Unsupported VCS!"); 45 - } 46 - 47 - $query->request = $request; 48 - 49 - return $query; 50 - } 51 - 52 - final protected function getRequest() { 53 - return $this->request; 54 - } 55 - 56 - final public function loadBranches() { 57 - return $this->executeQuery(); 58 - } 59 - 60 - abstract protected function executeQuery(); 61 - }
+2 -48
src/applications/diffusion/query/branch/DiffusionGitBranchQuery.php src/applications/diffusion/data/DiffusionGitBranch.php
··· 1 1 <?php 2 2 3 - final class DiffusionGitBranchQuery extends DiffusionBranchQuery { 4 - 5 - protected function executeQuery() { 6 - $drequest = $this->getRequest(); 7 - $repository = $drequest->getRepository(); 8 - 9 - // We need to add 1 in case we pick up HEAD. 10 - 11 - $count = $this->getOffset() + $this->getLimit() + 1; 12 - 13 - list($stdout) = $repository->execxLocalCommand( 14 - 'for-each-ref %C --sort=-creatordate --format=%s refs/remotes', 15 - $count ? '--count='.(int)$count : null, 16 - '%(refname:short) %(objectname)'); 17 - 18 - $branch_list = self::parseGitRemoteBranchOutput( 19 - $stdout, 20 - $only_this_remote = DiffusionBranchInformation::DEFAULT_GIT_REMOTE); 21 - 22 - $branches = array(); 23 - foreach ($branch_list as $name => $head) { 24 - if (!$repository->shouldTrackBranch($name)) { 25 - continue; 26 - } 27 - 28 - $branch = new DiffusionBranchInformation(); 29 - $branch->setName($name); 30 - $branch->setHeadCommitIdentifier($head); 31 - $branches[] = $branch; 32 - } 33 - 34 - $offset = $this->getOffset(); 35 - if ($offset) { 36 - $branches = array_slice($branches, $offset); 37 - } 38 - 39 - // We might have too many even after offset slicing, if there was no HEAD 40 - // for some reason. 41 - $limit = $this->getLimit(); 42 - if ($limit) { 43 - $branches = array_slice($branches, 0, $limit); 44 - } 45 - 46 - return $branches; 47 - } 48 - 3 + final class DiffusionGitBranch { 49 4 50 5 /** 51 6 * Parse the output of 'git branch -r --verbose --no-abbrev' or similar into ··· 66 21 * @param string Filter branches to those on a specific remote. 67 22 * @return map Map of 'branch' or 'remote/branch' to hash at HEAD. 68 23 */ 69 - public static function parseGitRemoteBranchOutput( 24 + public static function parseRemoteBranchOutput( 70 25 $stdout, 71 26 $only_this_remote = null) { 72 27 $map = array(); ··· 115 70 116 71 return $map; 117 72 } 118 - 119 73 }
-32
src/applications/diffusion/query/branch/DiffusionMercurialBranchQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionMercurialBranchQuery extends DiffusionBranchQuery { 4 - 5 - protected function executeQuery() { 6 - $drequest = $this->getRequest(); 7 - $repository = $drequest->getRepository(); 8 - 9 - list($stdout) = $repository->execxLocalCommand( 10 - '--debug branches'); 11 - $branch_info = ArcanistMercurialParser::parseMercurialBranches($stdout); 12 - 13 - $branches = array(); 14 - foreach ($branch_info as $name => $info) { 15 - $branch = new DiffusionBranchInformation(); 16 - $branch->setName($name); 17 - $branch->setHeadCommitIdentifier($info['rev']); 18 - $branches[] = $branch; 19 - } 20 - 21 - if ($this->getOffset()) { 22 - $branches = array_slice($branches, $this->getOffset()); 23 - } 24 - 25 - if ($this->getLimit()) { 26 - $branches = array_slice($branches, 0, $this->getLimit()); 27 - } 28 - 29 - return $branches; 30 - } 31 - 32 - }
+3 -3
src/applications/diffusion/query/branch/__tests__/DiffusionGitBranchQueryTestCase.php src/applications/diffusion/data/__tests__/DiffusionGitBranchTestCase.php
··· 1 1 <?php 2 2 3 - final class DiffusionGitBranchQueryTestCase 3 + final class DiffusionGitBranchTestCase 4 4 extends PhabricatorTestCase { 5 5 6 6 public function testRemoteBranchParser() { ··· 26 26 'origin/weekend-refactoring' => '6e947ab0498b82075ca6195ac168385a11326c4b', 27 27 'alternate/release-1.0.0' => '9ddd5d67962dd89fa167f9989954468b6c517b87', 28 28 ), 29 - DiffusionGitBranchQuery::parseGitRemoteBranchOutput($output)); 29 + DiffusionGitBranch::parseRemoteBranchOutput($output)); 30 30 31 31 $this->assertEqual( 32 32 array( ··· 35 35 'master' => '713f1fc54f9cfc830acbf6bbdb46a2883f772896', 36 36 'weekend-refactoring' => '6e947ab0498b82075ca6195ac168385a11326c4b', 37 37 ), 38 - DiffusionGitBranchQuery::parseGitRemoteBranchOutput($output, 'origin')); 38 + DiffusionGitBranch::parseRemoteBranchOutput($output, 'origin')); 39 39 } 40 40 41 41 }
+1 -1
src/applications/diffusion/query/contains/DiffusionGitContainsQuery.php
··· 10 10 'branch -r --verbose --no-abbrev --contains %s', 11 11 $request->getCommit()); 12 12 13 - return DiffusionGitBranchQuery::parseGitRemoteBranchOutput( 13 + return DiffusionGitBranch::parseRemoteBranchOutput( 14 14 $contains, 15 15 DiffusionBranchInformation::DEFAULT_GIT_REMOTE); 16 16 }
+1 -1
src/applications/repository/daemon/PhabricatorRepositoryPullLocalDaemon.php
··· 606 606 list($stdout) = $repository->execxLocalCommand( 607 607 'branch -r --verbose --no-abbrev'); 608 608 609 - $branches = DiffusionGitBranchQuery::parseGitRemoteBranchOutput( 609 + $branches = DiffusionGitBranch::parseRemoteBranchOutput( 610 610 $stdout, 611 611 $only_this_remote = DiffusionBranchInformation::DEFAULT_GIT_REMOTE); 612 612