@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 - move querying for stable commit name to occur over conduit

Summary: Ref T2784. This is a lower-level one from drequest so it gets the conditional initialization treatment. Consolidated SVN as well even though SVN is issuing database queries; I felt better about the code de-duplication despite the small performance hit when we could just query the DB directly in the SVN case.

Test Plan: browsed around my Phabricator repositories in Mercurial, Git, and SVN flavors. Looked good.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T2784

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

+172 -66
+10
src/__phutil_library_map__.php
··· 158 158 'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_lastmodifiedquery_Method.php', 159 159 'ConduitAPI_diffusion_rawdiffquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_rawdiffquery_Method.php', 160 160 'ConduitAPI_diffusion_searchquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_searchquery_Method.php', 161 + 'ConduitAPI_diffusion_stablecommitnamequery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_stablecommitnamequery_Method.php', 161 162 'ConduitAPI_diffusion_tagsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_tagsquery_Method.php', 162 163 'ConduitAPI_feed_Method' => 'applications/feed/conduit/ConduitAPI_feed_Method.php', 163 164 'ConduitAPI_feed_publish_Method' => 'applications/feed/conduit/ConduitAPI_feed_publish_Method.php', ··· 446 447 'DiffusionGitMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionGitMergedCommitsQuery.php', 447 448 'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionGitRawDiffQuery.php', 448 449 'DiffusionGitRequest' => 'applications/diffusion/request/DiffusionGitRequest.php', 450 + 'DiffusionGitStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionGitStableCommitNameQuery.php', 449 451 'DiffusionHistoryController' => 'applications/diffusion/controller/DiffusionHistoryController.php', 450 452 'DiffusionHistoryQuery' => 'applications/diffusion/query/history/DiffusionHistoryQuery.php', 451 453 'DiffusionHistoryTableView' => 'applications/diffusion/view/DiffusionHistoryTableView.php', ··· 465 467 'DiffusionMercurialMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionMercurialMergedCommitsQuery.php', 466 468 'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionMercurialRawDiffQuery.php', 467 469 'DiffusionMercurialRequest' => 'applications/diffusion/request/DiffusionMercurialRequest.php', 470 + 'DiffusionMercurialStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionMercurialStableCommitNameQuery.php', 468 471 'DiffusionMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionMergedCommitsQuery.php', 469 472 'DiffusionPathChange' => 'applications/diffusion/data/DiffusionPathChange.php', 470 473 'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php', ··· 483 486 'DiffusionRepositoryTag' => 'applications/diffusion/data/DiffusionRepositoryTag.php', 484 487 'DiffusionRequest' => 'applications/diffusion/request/DiffusionRequest.php', 485 488 'DiffusionSetupException' => 'applications/diffusion/exception/DiffusionSetupException.php', 489 + 'DiffusionStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionStableCommitNameQuery.php', 486 490 'DiffusionSvnCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionSvnCommitParentsQuery.php', 487 491 'DiffusionSvnContainsQuery' => 'applications/diffusion/query/contains/DiffusionSvnContainsQuery.php', 488 492 'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionSvnFileContentQuery.php', ··· 490 494 'DiffusionSvnMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionSvnMergedCommitsQuery.php', 491 495 'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionSvnRawDiffQuery.php', 492 496 'DiffusionSvnRequest' => 'applications/diffusion/request/DiffusionSvnRequest.php', 497 + 'DiffusionSvnStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionSvnStableCommitNameQuery.php', 493 498 'DiffusionSymbolController' => 'applications/diffusion/controller/DiffusionSymbolController.php', 494 499 'DiffusionSymbolQuery' => 'applications/diffusion/query/DiffusionSymbolQuery.php', 495 500 'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php', ··· 1957 1962 'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1958 1963 'ConduitAPI_diffusion_rawdiffquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1959 1964 'ConduitAPI_diffusion_searchquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1965 + 'ConduitAPI_diffusion_stablecommitnamequery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1960 1966 'ConduitAPI_diffusion_tagsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1961 1967 'ConduitAPI_feed_Method' => 'ConduitAPIMethod', 1962 1968 'ConduitAPI_feed_publish_Method' => 'ConduitAPI_feed_Method', ··· 2233 2239 'DiffusionGitMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 2234 2240 'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery', 2235 2241 'DiffusionGitRequest' => 'DiffusionRequest', 2242 + 'DiffusionGitStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', 2236 2243 'DiffusionHistoryController' => 'DiffusionController', 2237 2244 'DiffusionHistoryQuery' => 'DiffusionQuery', 2238 2245 'DiffusionHistoryTableView' => 'DiffusionView', ··· 2251 2258 'DiffusionMercurialMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 2252 2259 'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery', 2253 2260 'DiffusionMercurialRequest' => 'DiffusionRequest', 2261 + 'DiffusionMercurialStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', 2254 2262 'DiffusionMergedCommitsQuery' => 'DiffusionQuery', 2255 2263 'DiffusionPathCompleteController' => 'DiffusionController', 2256 2264 'DiffusionPathQueryTestCase' => 'PhabricatorTestCase', ··· 2261 2269 'DiffusionRemarkupRule' => 'PhabricatorRemarkupRuleObject', 2262 2270 'DiffusionRepositoryController' => 'DiffusionController', 2263 2271 'DiffusionSetupException' => 'AphrontUsageException', 2272 + 'DiffusionStableCommitNameQuery' => 'DiffusionQuery', 2264 2273 'DiffusionSvnCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2265 2274 'DiffusionSvnContainsQuery' => 'DiffusionContainsQuery', 2266 2275 'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery', ··· 2268 2277 'DiffusionSvnMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 2269 2278 'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery', 2270 2279 'DiffusionSvnRequest' => 'DiffusionRequest', 2280 + 'DiffusionSvnStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', 2271 2281 'DiffusionSymbolController' => 'DiffusionController', 2272 2282 'DiffusionSymbolQuery' => 'PhabricatorOffsetPagedQuery', 2273 2283 'DiffusionTagListController' => 'DiffusionController',
+35
src/applications/diffusion/conduit/ConduitAPI_diffusion_stablecommitnamequery_Method.php
··· 1 + <?php 2 + 3 + /** 4 + * @group conduit 5 + */ 6 + final class ConduitAPI_diffusion_stablecommitnamequery_Method 7 + extends ConduitAPI_diffusion_abstractquery_Method { 8 + 9 + public function __construct() { 10 + $this->setShouldCreateDiffusionRequest(false); 11 + } 12 + 13 + public function getMethodDescription() { 14 + return 15 + 'Identifies the latest commit in a repository. Repositories with '. 16 + 'branch support must specify which branch to look at.'; 17 + } 18 + 19 + public function defineReturnType() { 20 + return 'string'; 21 + } 22 + 23 + protected function defineCustomParamTypes() { 24 + return array( 25 + 'branch' => 'required string', 26 + ); 27 + } 28 + 29 + protected function getResult(ConduitAPIRequest $request) { 30 + $repository = $this->getRepository($request); 31 + $query = DiffusionStableCommitNameQuery::newFromRepository($repository); 32 + $query->setBranch($request->getValue('branch')); 33 + return $query->load(); 34 + } 35 + }
+17
src/applications/diffusion/query/stablecommitname/DiffusionGitStableCommitNameQuery.php
··· 1 + <?php 2 + 3 + final class DiffusionGitStableCommitNameQuery 4 + extends DiffusionStableCommitNameQuery { 5 + 6 + protected function executeQuery() { 7 + $repository = $this->getRepository(); 8 + $branch = $this->getBranch(); 9 + list($stdout) = $repository->execxLocalCommand( 10 + 'rev-parse --verify %s/%s', 11 + DiffusionBranchInformation::DEFAULT_GIT_REMOTE, 12 + $branch); 13 + 14 + $commit = trim($stdout); 15 + return substr($commit, 0, 16); 16 + } 17 + }
+30
src/applications/diffusion/query/stablecommitname/DiffusionMercurialStableCommitNameQuery.php
··· 1 + <?php 2 + 3 + final class DiffusionMercurialStableCommitNameQuery 4 + extends DiffusionStableCommitNameQuery { 5 + 6 + protected function executeQuery() { 7 + $repository = $this->getRepository(); 8 + 9 + // NOTE: For branches with spaces in their name like "a b", this 10 + // does not work properly: 11 + // 12 + // $ hg log --rev 'a b' 13 + // 14 + // We can use revsets instead: 15 + // 16 + // $ hg log --rev branch('a b') 17 + // 18 + // ...but they require a somewhat newer version of Mercurial. Instead, 19 + // use "-b" flag with limit 1 for greatest compatibility across 20 + // versions. 21 + 22 + list($stable_commit_name) = $repository->execxLocalCommand( 23 + 'log --template=%s -b %s --limit 1', 24 + '{node}', 25 + $this->getBranch()); 26 + 27 + return $stable_commit_name; 28 + } 29 + 30 + }
+35
src/applications/diffusion/query/stablecommitname/DiffusionStableCommitNameQuery.php
··· 1 + <?php 2 + 3 + abstract class DiffusionStableCommitNameQuery extends DiffusionQuery { 4 + 5 + private $branch; 6 + private $repository; 7 + 8 + public function setBranch($branch) { 9 + $this->branch = $branch; 10 + return $this; 11 + } 12 + public function getBranch() { 13 + return $this->branch; 14 + } 15 + 16 + public function setRepository(PhabricatorRepository $repository) { 17 + $this->repository = $repository; 18 + return $this; 19 + } 20 + public function getRepository() { 21 + return $this->repository; 22 + } 23 + 24 + final public static function newFromRepository( 25 + PhabricatorRepository $repository) { 26 + 27 + $obj = parent::initQueryObject(__CLASS__, $repository); 28 + $obj->setRepository($repository); 29 + return $obj; 30 + } 31 + 32 + final public function load() { 33 + return $this->executeQuery(); 34 + } 35 + }
+23
src/applications/diffusion/query/stablecommitname/DiffusionSvnStableCommitNameQuery.php
··· 1 + <?php 2 + 3 + final class DiffusionSvnStableCommitNameQuery 4 + extends DiffusionStableCommitNameQuery { 5 + 6 + protected function executeQuery() { 7 + $repository = $this->getRepository(); 8 + 9 + $commit = id(new PhabricatorRepositoryCommit()) 10 + ->loadOneWhere( 11 + 'repositoryID = %d ORDER BY epoch DESC LIMIT 1', 12 + $repository->getID()); 13 + if ($commit) { 14 + $stable_commit_name = $commit->getCommitIdentifier(); 15 + } else { 16 + // For new repositories, we may not have parsed any commits yet. Call 17 + // the stable commit "1" and avoid fataling. 18 + $stable_commit_name = 1; 19 + } 20 + 21 + return $stable_commit_name; 22 + } 23 + }
-16
src/applications/diffusion/request/DiffusionGitRequest.php
··· 35 35 return $remote.'/'.$this->getBranch(); 36 36 } 37 37 38 - public function getStableCommitName() { 39 - if (!$this->stableCommitName) { 40 - if ($this->commit) { 41 - $this->stableCommitName = $this->commit; 42 - } else { 43 - $branch = $this->getBranch(); 44 - list($stdout) = $this->getRepository()->execxLocalCommand( 45 - 'rev-parse --verify %s/%s', 46 - DiffusionBranchInformation::DEFAULT_GIT_REMOTE, 47 - $branch); 48 - $this->stableCommitName = trim($stdout); 49 - } 50 - } 51 - return substr($this->stableCommitName, 0, 16); 52 - } 53 - 54 38 }
-28
src/applications/diffusion/request/DiffusionMercurialRequest.php
··· 42 42 return $this->getBranch(); 43 43 } 44 44 45 - public function getStableCommitName() { 46 - if (!$this->stableCommitName) { 47 - if ($this->commit) { 48 - $this->stableCommitName = $this->commit; 49 - } else { 50 - 51 - // NOTE: For branches with spaces in their name like "a b", this 52 - // does not work properly: 53 - // 54 - // $ hg log --rev 'a b' 55 - // 56 - // We can use revsets instead: 57 - // 58 - // $ hg log --rev branch('a b') 59 - // 60 - // ...but they require a somewhat newer version of Mercurial. Instead, 61 - // use "-b" flag with limit 1 for greatest compatibility across 62 - // versions. 63 - 64 - list($this->stableCommitName) = $this->repository->execxLocalCommand( 65 - 'log --template=%s -b %s --limit 1', 66 - '{node}', 67 - $this->getBranch()); 68 - } 69 - } 70 - return $this->stableCommitName; 71 - } 72 - 73 45 }
+22
src/applications/diffusion/request/DiffusionRequest.php
··· 306 306 * a symbolic commit reference. 307 307 */ 308 308 public function getStableCommitName() { 309 + if (!$this->stableCommitName) { 310 + $this->queryStableCommitName(); 311 + } 309 312 return $this->stableCommitName; 310 313 } 311 314 ··· 628 631 $this->tagContent = $commit_data['tagContent']; 629 632 } 630 633 634 + private function queryStableCommitName() { 635 + if ($this->commit) { 636 + $this->stableCommitName = $this->commit; 637 + } else if ($this->shouldInitFromConduit()) { 638 + $this->stableCommitName = DiffusionQuery::callConduitWithDiffusionRequest( 639 + $this->getUser(), 640 + $this, 641 + 'diffusion.stablecommitnamequery', 642 + array( 643 + 'branch' => $this->getBranch() 644 + )); 645 + } else { 646 + $query = DiffusionStableCommitNameQuery::newFromRepository( 647 + $this->getRepository()); 648 + $query->setBranch($this->getBranch()); 649 + $this->stableCommitName = $query->load(); 650 + } 651 + return $this->stableCommitName; 652 + } 631 653 }
-22
src/applications/diffusion/request/DiffusionSvnRequest.php
··· 22 22 return 'svn'; 23 23 } 24 24 25 - public function getStableCommitName() { 26 - if ($this->commit) { 27 - return $this->commit; 28 - } 29 - 30 - if ($this->stableCommitName === null) { 31 - $commit = id(new PhabricatorRepositoryCommit()) 32 - ->loadOneWhere( 33 - 'repositoryID = %d ORDER BY epoch DESC LIMIT 1', 34 - $this->getRepository()->getID()); 35 - if ($commit) { 36 - $this->stableCommitName = $commit->getCommitIdentifier(); 37 - } else { 38 - // For new repositories, we may not have parsed any commits yet. Call 39 - // the stable commit "1" and avoid fataling. 40 - $this->stableCommitName = 1; 41 - } 42 - } 43 - 44 - return $this->stableCommitName; 45 - } 46 - 47 25 public function getCommit() { 48 26 if ($this->commit) { 49 27 return $this->commit;