@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 merged commits query to happen over conduit.

Summary: Ref T2784. Also sneaks in a fix for branch query -- forgot to catch the unsupported VCS exception. One strange thing is I have test Phabricator repositories and the mercurial one is showing different data than git for the same commit. The data shown is consistent pre and post this diff though so its an existing issue. Also note the mercurial is an import of git so maybe its busted-ish?

Test Plan: viewed commits in mercurial, svn, and git that were merge commits. saw the right stuff in mercurial and git.

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T2784

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

+131 -137
+2 -8
src/__phutil_library_map__.php
··· 158 158 'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getrecentcommitsbypath_Method.php', 159 159 'ConduitAPI_diffusion_historyquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_historyquery_Method.php', 160 160 'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_lastmodifiedquery_Method.php', 161 + 'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_mergedcommitsquery_Method.php', 161 162 'ConduitAPI_diffusion_rawdiffquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_rawdiffquery_Method.php', 162 163 'ConduitAPI_diffusion_refsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_refsquery_Method.php', 163 164 'ConduitAPI_diffusion_searchquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_searchquery_Method.php', ··· 444 445 'DiffusionGitCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionGitCommitParentsQuery.php', 445 446 'DiffusionGitExpandShortNameQuery' => 'applications/diffusion/query/expandshortname/DiffusionGitExpandShortNameQuery.php', 446 447 'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionGitFileContentQuery.php', 447 - 'DiffusionGitMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionGitMergedCommitsQuery.php', 448 448 'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionGitRawDiffQuery.php', 449 449 'DiffusionGitRequest' => 'applications/diffusion/request/DiffusionGitRequest.php', 450 450 'DiffusionGitStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionGitStableCommitNameQuery.php', ··· 461 461 'DiffusionMercurialCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionMercurialCommitParentsQuery.php', 462 462 'DiffusionMercurialExpandShortNameQuery' => 'applications/diffusion/query/expandshortname/DiffusionMercurialExpandShortNameQuery.php', 463 463 'DiffusionMercurialFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionMercurialFileContentQuery.php', 464 - 'DiffusionMercurialMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionMercurialMergedCommitsQuery.php', 465 464 'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionMercurialRawDiffQuery.php', 466 465 'DiffusionMercurialRequest' => 'applications/diffusion/request/DiffusionMercurialRequest.php', 467 466 'DiffusionMercurialStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionMercurialStableCommitNameQuery.php', 468 - 'DiffusionMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionMergedCommitsQuery.php', 469 467 'DiffusionPathChange' => 'applications/diffusion/data/DiffusionPathChange.php', 470 468 'DiffusionPathChangeQuery' => 'applications/diffusion/query/pathchange/DiffusionPathChangeQuery.php', 471 469 'DiffusionPathCompleteController' => 'applications/diffusion/controller/DiffusionPathCompleteController.php', ··· 486 484 'DiffusionStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionStableCommitNameQuery.php', 487 485 'DiffusionSvnCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionSvnCommitParentsQuery.php', 488 486 'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionSvnFileContentQuery.php', 489 - 'DiffusionSvnMergedCommitsQuery' => 'applications/diffusion/query/mergedcommits/DiffusionSvnMergedCommitsQuery.php', 490 487 'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionSvnRawDiffQuery.php', 491 488 'DiffusionSvnRequest' => 'applications/diffusion/request/DiffusionSvnRequest.php', 492 489 'DiffusionSvnStableCommitNameQuery' => 'applications/diffusion/query/stablecommitname/DiffusionSvnStableCommitNameQuery.php', ··· 1968 1965 'ConduitAPI_diffusion_getrecentcommitsbypath_Method' => 'ConduitAPI_diffusion_Method', 1969 1966 'ConduitAPI_diffusion_historyquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1970 1967 'ConduitAPI_diffusion_lastmodifiedquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1968 + 'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1971 1969 'ConduitAPI_diffusion_rawdiffquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1972 1970 'ConduitAPI_diffusion_refsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', 1973 1971 'ConduitAPI_diffusion_searchquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method', ··· 2242 2240 'DiffusionGitCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2243 2241 'DiffusionGitExpandShortNameQuery' => 'DiffusionExpandShortNameQuery', 2244 2242 'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery', 2245 - 'DiffusionGitMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 2246 2243 'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery', 2247 2244 'DiffusionGitRequest' => 'DiffusionRequest', 2248 2245 'DiffusionGitStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', ··· 2258 2255 'DiffusionMercurialCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2259 2256 'DiffusionMercurialExpandShortNameQuery' => 'DiffusionExpandShortNameQuery', 2260 2257 'DiffusionMercurialFileContentQuery' => 'DiffusionFileContentQuery', 2261 - 'DiffusionMercurialMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 2262 2258 'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery', 2263 2259 'DiffusionMercurialRequest' => 'DiffusionRequest', 2264 2260 'DiffusionMercurialStableCommitNameQuery' => 'DiffusionStableCommitNameQuery', 2265 - 'DiffusionMergedCommitsQuery' => 'DiffusionQuery', 2266 2261 'DiffusionPathCompleteController' => 'DiffusionController', 2267 2262 'DiffusionPathQueryTestCase' => 'PhabricatorTestCase', 2268 2263 'DiffusionPathValidateController' => 'DiffusionController', ··· 2275 2270 'DiffusionStableCommitNameQuery' => 'DiffusionQuery', 2276 2271 'DiffusionSvnCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2277 2272 'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery', 2278 - 'DiffusionSvnMergedCommitsQuery' => 'DiffusionMergedCommitsQuery', 2279 2273 'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery', 2280 2274 'DiffusionSvnRequest' => 'DiffusionRequest', 2281 2275 'DiffusionSvnStableCommitNameQuery' => 'DiffusionStableCommitNameQuery',
+107
src/applications/diffusion/conduit/ConduitAPI_diffusion_mergedcommitsquery_Method.php
··· 1 + <?php 2 + 3 + /** 4 + * @group conduit 5 + */ 6 + final class ConduitAPI_diffusion_mergedcommitsquery_Method 7 + extends ConduitAPI_diffusion_abstractquery_Method { 8 + 9 + public function getMethodDescription() { 10 + return 11 + 'Merged commit information for a specific commit in a repository.'; 12 + } 13 + 14 + public function defineReturnType() { 15 + return 'array'; 16 + } 17 + 18 + protected function defineCustomParamTypes() { 19 + return array( 20 + 'commit' => 'required string', 21 + 'limit' => 'optional int', 22 + ); 23 + } 24 + 25 + private function getLimit(ConduitAPIRequest $request) { 26 + return $request->getValue('limit', PHP_INT_MAX); 27 + } 28 + 29 + protected function getGitResult(ConduitAPIRequest $request) { 30 + $drequest = $this->getDiffusionRequest(); 31 + $repository = $drequest->getRepository(); 32 + $commit = $request->getValue('commit'); 33 + $limit = $this->getLimit($request); 34 + 35 + list($parents) = $repository->execxLocalCommand( 36 + 'log -n 1 --format=%s %s', 37 + '%P', 38 + $commit); 39 + 40 + $parents = preg_split('/\s+/', trim($parents)); 41 + if (count($parents) < 2) { 42 + // This is not a merge commit, so it doesn't merge anything. 43 + return array(); 44 + } 45 + 46 + // Get all of the commits which are not reachable from the first parent. 47 + // These are the commits this change merges. 48 + 49 + $first_parent = head($parents); 50 + list($logs) = $repository->execxLocalCommand( 51 + 'log -n %d --format=%s %s %s --', 52 + // NOTE: "+ 1" accounts for the merge commit itself. 53 + $limit + 1, 54 + '%H', 55 + $commit, 56 + '^'.$first_parent); 57 + 58 + $hashes = explode("\n", trim($logs)); 59 + 60 + // Remove the merge commit. 61 + $hashes = array_diff($hashes, array($commit)); 62 + 63 + return DiffusionQuery::loadHistoryForCommitIdentifiers( 64 + $hashes, 65 + $drequest); 66 + } 67 + 68 + protected function getMercurialResult(ConduitAPIRequest $request) { 69 + $drequest = $this->getDiffusionRequest(); 70 + $repository = $drequest->getRepository(); 71 + $commit = $request->getValue('commit'); 72 + $limit = $this->getLimit($request); 73 + 74 + list($parents) = $repository->execxLocalCommand( 75 + 'parents --template=%s --rev %s', 76 + '{node}\\n', 77 + $commit); 78 + $parents = explode("\n", trim($parents)); 79 + 80 + if (count($parents) < 2) { 81 + // Not a merge commit. 82 + return array(); 83 + } 84 + 85 + // NOTE: In Git, the first parent is the "mainline". In Mercurial, the 86 + // second parent is the "mainline" (the way 'git merge' and 'hg merge' 87 + // work is also reversed). 88 + 89 + $last_parent = last($parents); 90 + list($logs) = $repository->execxLocalCommand( 91 + 'log --template=%s --follow --limit %d --rev %s:0 --prune %s --', 92 + '{node}\\n', 93 + $limit + 1, 94 + $commit, 95 + $last_parent); 96 + 97 + $hashes = explode("\n", trim($logs)); 98 + 99 + // Remove the merge commit. 100 + $hashes = array_diff($hashes, array($commit)); 101 + 102 + return DiffusionQuery::loadHistoryForCommitIdentifiers( 103 + $hashes, 104 + $drequest); 105 + } 106 + 107 + }
+10 -3
src/applications/diffusion/controller/DiffusionCommitBranchesController.php
··· 10 10 public function processRequest() { 11 11 $request = $this->getDiffusionRequest(); 12 12 13 - $branches = $this->callConduitWithDiffusionRequest( 14 - 'diffusion.commitbranchesquery', 15 - array('commit' => $request->getCommit())); 13 + $branches = array(); 14 + try { 15 + $branches = $this->callConduitWithDiffusionRequest( 16 + 'diffusion.commitbranchesquery', 17 + array('commit' => $request->getCommit())); 18 + } catch (ConduitException $ex) { 19 + if ($ex->getMessage() != 'ERR-UNSUPPORTED-VCS') { 20 + throw $ex; 21 + } 22 + } 16 23 17 24 $branch_links = array(); 18 25 foreach ($branches as $branch => $commit) {
+12 -5
src/applications/diffusion/controller/DiffusionCommitController.php
··· 803 803 804 804 private function buildMergesTable(PhabricatorRepositoryCommit $commit) { 805 805 $drequest = $this->getDiffusionRequest(); 806 - 807 806 $limit = 50; 808 807 809 - $merge_query = DiffusionMergedCommitsQuery::newFromDiffusionRequest( 810 - $drequest); 811 - $merge_query->setLimit($limit + 1); 812 - $merges = $merge_query->loadMergedCommits(); 808 + $merges = array(); 809 + try { 810 + $merges = $this->callConduitWithDiffusionRequest( 811 + 'diffusion.mergedcommitsquery', 812 + array( 813 + 'commit' => $drequest->getCommit(), 814 + 'limit' => $limit + 1)); 815 + } catch (ConduitException $ex) { 816 + if ($ex->getMessage() != 'ERR-UNSUPPORTED-VCS') { 817 + throw $ex; 818 + } 819 + } 813 820 814 821 if (!$merges) { 815 822 return null;
-41
src/applications/diffusion/query/mergedcommits/DiffusionGitMergedCommitsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionGitMergedCommitsQuery extends DiffusionMergedCommitsQuery { 4 - 5 - protected function executeQuery() { 6 - $request = $this->getRequest(); 7 - $repository = $request->getRepository(); 8 - 9 - list($parents) = $repository->execxLocalCommand( 10 - 'log -n 1 --format=%s %s', 11 - '%P', 12 - $request->getCommit()); 13 - $parents = preg_split('/\s+/', trim($parents)); 14 - if (count($parents) < 2) { 15 - // This is not a merge commit, so it doesn't merge anything. 16 - return array(); 17 - } 18 - 19 - // Get all of the commits which are not reachable from the first parent. 20 - // These are the commits this change merges. 21 - 22 - $first_parent = head($parents); 23 - list($logs) = $repository->execxLocalCommand( 24 - 'log -n %d --format=%s %s %s --', 25 - // NOTE: "+ 1" accounts for the merge commit itself. 26 - $this->getLimit() + 1, 27 - '%H', 28 - $request->getCommit(), 29 - '^'.$first_parent); 30 - 31 - $hashes = explode("\n", trim($logs)); 32 - 33 - // Remove the merge commit. 34 - $hashes = array_diff($hashes, array($request->getCommit())); 35 - 36 - return DiffusionQuery::loadHistoryForCommitIdentifiers( 37 - $hashes, 38 - $request); 39 - } 40 - 41 - }
-43
src/applications/diffusion/query/mergedcommits/DiffusionMercurialMergedCommitsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionMercurialMergedCommitsQuery 4 - extends DiffusionMergedCommitsQuery { 5 - 6 - protected function executeQuery() { 7 - $request = $this->getRequest(); 8 - $repository = $request->getRepository(); 9 - 10 - list($parents) = $repository->execxLocalCommand( 11 - 'parents --template=%s --rev %s', 12 - '{node}\\n', 13 - $request->getCommit()); 14 - $parents = explode("\n", trim($parents)); 15 - 16 - if (count($parents) < 2) { 17 - // Not a merge commit. 18 - return array(); 19 - } 20 - 21 - // NOTE: In Git, the first parent is the "mainline". In Mercurial, the 22 - // second parent is the "mainline" (the way 'git merge' and 'hg merge' 23 - // work is also reversed). 24 - 25 - $last_parent = last($parents); 26 - list($logs) = $repository->execxLocalCommand( 27 - 'log --template=%s --follow --limit %d --rev %s:0 --prune %s --', 28 - '{node}\\n', 29 - $this->getLimit() + 1, 30 - $request->getCommit(), 31 - $last_parent); 32 - 33 - $hashes = explode("\n", trim($logs)); 34 - 35 - // Remove the merge commit. 36 - $hashes = array_diff($hashes, array($request->getCommit())); 37 - 38 - return DiffusionQuery::loadHistoryForCommitIdentifiers( 39 - $hashes, 40 - $request); 41 - } 42 - 43 - }
-26
src/applications/diffusion/query/mergedcommits/DiffusionMergedCommitsQuery.php
··· 1 - <?php 2 - 3 - abstract class DiffusionMergedCommitsQuery extends DiffusionQuery { 4 - 5 - private $limit = PHP_INT_MAX; 6 - 7 - final public static function newFromDiffusionRequest( 8 - DiffusionRequest $request) { 9 - 10 - return self::newQueryObject(__CLASS__, $request); 11 - } 12 - 13 - final public function loadMergedCommits() { 14 - return $this->executeQuery(); 15 - } 16 - 17 - final public function setLimit($limit) { 18 - $this->limit = $limit; 19 - return $this; 20 - } 21 - 22 - final public function getLimit() { 23 - return $this->limit; 24 - } 25 - 26 - }
-11
src/applications/diffusion/query/mergedcommits/DiffusionSvnMergedCommitsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionSvnMergedCommitsQuery extends DiffusionMergedCommitsQuery { 4 - 5 - protected function executeQuery() { 6 - // TODO: It might be possible to do something reasonable in recent versions 7 - // of SVN. 8 - return array(); 9 - } 10 - 11 - }