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

Modernize Diffusion `commitparentsquery`

Summary: Ref T4195. Ref T2783. We have an old-school implementation of this; move it into a LowLevel query and make callers all run through Conduit. I need the LowLevel query for hooks, to implement an "is merge commit" Herald rule.

Test Plan:
- Ran query via Conduit for SVN, Mercurial, Git.
- Parsed a commit which closed a revision, attach/closed worked correctly.
- Browsed Diffusion.

Reviewers: btrahan

Reviewed By: btrahan

CC: aran

Maniphest Tasks: T4195, T2783

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

+129 -122
+2 -8
src/__phutil_library_map__.php
··· 481 481 'DiffusionCommitHash' => 'applications/diffusion/data/DiffusionCommitHash.php', 482 482 'DiffusionCommitHookEngine' => 'applications/diffusion/engine/DiffusionCommitHookEngine.php', 483 483 'DiffusionCommitHookRejectException' => 'applications/diffusion/exception/DiffusionCommitHookRejectException.php', 484 - 'DiffusionCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionCommitParentsQuery.php', 485 484 'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php', 486 485 'DiffusionCommitRef' => 'applications/diffusion/data/DiffusionCommitRef.php', 487 486 'DiffusionCommitTagsController' => 'applications/diffusion/controller/DiffusionCommitTagsController.php', ··· 494 493 'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionFileContentQuery.php', 495 494 'DiffusionGitBranch' => 'applications/diffusion/data/DiffusionGitBranch.php', 496 495 'DiffusionGitBranchTestCase' => 'applications/diffusion/data/__tests__/DiffusionGitBranchTestCase.php', 497 - 'DiffusionGitCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionGitCommitParentsQuery.php', 498 496 'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionGitFileContentQuery.php', 499 497 'DiffusionGitRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionGitRawDiffQuery.php', 500 498 'DiffusionGitRequest' => 'applications/diffusion/request/DiffusionGitRequest.php', ··· 512 510 'DiffusionLowLevelCommitQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelCommitQuery.php', 513 511 'DiffusionLowLevelGitRefQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelGitRefQuery.php', 514 512 'DiffusionLowLevelMercurialBranchesQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelMercurialBranchesQuery.php', 513 + 'DiffusionLowLevelParentsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelParentsQuery.php', 515 514 'DiffusionLowLevelQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelQuery.php', 516 515 'DiffusionLowLevelResolveRefsQuery' => 'applications/diffusion/query/lowlevel/DiffusionLowLevelResolveRefsQuery.php', 517 - 'DiffusionMercurialCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionMercurialCommitParentsQuery.php', 518 516 'DiffusionMercurialFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionMercurialFileContentQuery.php', 519 517 'DiffusionMercurialRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionMercurialRawDiffQuery.php', 520 518 'DiffusionMercurialRequest' => 'applications/diffusion/request/DiffusionMercurialRequest.php', ··· 572 570 'DiffusionSetupException' => 'applications/diffusion/exception/DiffusionSetupException.php', 573 571 'DiffusionSubversionWireProtocol' => 'applications/diffusion/protocol/DiffusionSubversionWireProtocol.php', 574 572 'DiffusionSubversionWireProtocolTestCase' => 'applications/diffusion/protocol/__tests__/DiffusionSubversionWireProtocolTestCase.php', 575 - 'DiffusionSvnCommitParentsQuery' => 'applications/diffusion/query/parents/DiffusionSvnCommitParentsQuery.php', 576 573 'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionSvnFileContentQuery.php', 577 574 'DiffusionSvnRawDiffQuery' => 'applications/diffusion/query/rawdiff/DiffusionSvnRawDiffQuery.php', 578 575 'DiffusionSvnRequest' => 'applications/diffusion/request/DiffusionSvnRequest.php', ··· 2871 2868 'DiffusionCommitHash' => 'Phobject', 2872 2869 'DiffusionCommitHookEngine' => 'Phobject', 2873 2870 'DiffusionCommitHookRejectException' => 'Exception', 2874 - 'DiffusionCommitParentsQuery' => 'DiffusionQuery', 2875 2871 'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 2876 2872 'DiffusionCommitRef' => 'Phobject', 2877 2873 'DiffusionCommitTagsController' => 'DiffusionController', ··· 2882 2878 'DiffusionExternalController' => 'DiffusionController', 2883 2879 'DiffusionFileContentQuery' => 'DiffusionQuery', 2884 2880 'DiffusionGitBranchTestCase' => 'PhabricatorTestCase', 2885 - 'DiffusionGitCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2886 2881 'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery', 2887 2882 'DiffusionGitRawDiffQuery' => 'DiffusionRawDiffQuery', 2888 2883 'DiffusionGitRequest' => 'DiffusionRequest', ··· 2899 2894 'DiffusionLowLevelCommitQuery' => 'DiffusionLowLevelQuery', 2900 2895 'DiffusionLowLevelGitRefQuery' => 'DiffusionLowLevelQuery', 2901 2896 'DiffusionLowLevelMercurialBranchesQuery' => 'DiffusionLowLevelQuery', 2897 + 'DiffusionLowLevelParentsQuery' => 'DiffusionLowLevelQuery', 2902 2898 'DiffusionLowLevelQuery' => 'Phobject', 2903 2899 'DiffusionLowLevelResolveRefsQuery' => 'DiffusionLowLevelQuery', 2904 - 'DiffusionMercurialCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2905 2900 'DiffusionMercurialFileContentQuery' => 'DiffusionFileContentQuery', 2906 2901 'DiffusionMercurialRawDiffQuery' => 'DiffusionRawDiffQuery', 2907 2902 'DiffusionMercurialRequest' => 'DiffusionRequest', ··· 2957 2952 'DiffusionSetupException' => 'AphrontUsageException', 2958 2953 'DiffusionSubversionWireProtocol' => 'Phobject', 2959 2954 'DiffusionSubversionWireProtocolTestCase' => 'PhabricatorTestCase', 2960 - 'DiffusionSvnCommitParentsQuery' => 'DiffusionCommitParentsQuery', 2961 2955 'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery', 2962 2956 'DiffusionSvnRawDiffQuery' => 'DiffusionRawDiffQuery', 2963 2957 'DiffusionSvnRequest' => 'DiffusionRequest',
+9 -7
src/applications/diffusion/conduit/ConduitAPI_diffusion_commitparentsquery_Method.php
··· 7 7 extends ConduitAPI_diffusion_abstractquery_Method { 8 8 9 9 public function getMethodDescription() { 10 - return 11 - 'Commit parent(s) information for a commit in a repository.'; 10 + return pht( 11 + "Get the commit identifiers for a commit's parent or parents."); 12 12 } 13 13 14 14 public function defineReturnType() { 15 - return 'array'; 15 + return 'list<string>'; 16 16 } 17 17 18 18 protected function defineCustomParamTypes() { ··· 22 22 } 23 23 24 24 protected function getResult(ConduitAPIRequest $request) { 25 - $drequest = $this->getDiffusionRequest(); 25 + $repository = $this->getRepository($request); 26 26 27 - $query = DiffusionCommitParentsQuery::newFromDiffusionRequest($drequest); 28 - $parents = $query->loadParents(); 29 - return $parents; 27 + return id(new DiffusionLowLevelParentsQuery()) 28 + ->setRepository($repository) 29 + ->withIdentifier($request->getValue('commit')) 30 + ->execute(); 30 31 } 32 + 31 33 }
+7 -7
src/applications/diffusion/controller/DiffusionBrowseFileController.php
··· 857 857 // NOTE: We need to get the grandparent so we can capture filename changes 858 858 // in the parent. 859 859 860 - $parent = $this->loadParentRevisionOf($before); 860 + $parent = $this->loadParentCommitOf($before); 861 861 $old_filename = null; 862 862 $was_created = false; 863 863 if ($parent) { 864 - $grandparent = $this->loadParentRevisionOf( 865 - $parent->getCommitIdentifier()); 864 + $grandparent = $this->loadParentCommitOf($parent); 866 865 867 866 if ($grandparent) { 868 867 $rename_query = new DiffusionRenameHistoryQuery(); 869 868 $rename_query->setRequest($drequest); 870 - $rename_query->setOldCommit($grandparent->getCommitIdentifier()); 869 + $rename_query->setOldCommit($grandparent); 871 870 $rename_query->setViewer($request->getUser()); 872 871 $old_filename = $rename_query->loadOldFilename(); 873 872 $was_created = $rename_query->getWasCreated(); ··· 955 954 return $line; 956 955 } 957 956 958 - private function loadParentRevisionOf($commit) { 957 + private function loadParentCommitOf($commit) { 959 958 $drequest = $this->getDiffusionRequest(); 960 959 $user = $this->getRequest()->getUser(); 961 960 ··· 963 962 array( 964 963 'user' => $user, 965 964 'repository' => $drequest->getRepository(), 966 - 'commit' => $commit, 965 + 'commit' => $commit, 967 966 )); 968 967 969 968 $parents = DiffusionQuery::callConduitWithDiffusionRequest( ··· 971 970 $before_req, 972 971 'diffusion.commitparentsquery', 973 972 array( 974 - 'commit' => $commit)); 973 + 'commit' => $commit, 974 + )); 975 975 976 976 return head($parents); 977 977 }
+8
src/applications/diffusion/controller/DiffusionCommitController.php
··· 102 102 'diffusion.commitparentsquery', 103 103 array('commit' => $drequest->getCommit())); 104 104 105 + if ($parents) { 106 + $parents = id(new DiffusionCommitQuery()) 107 + ->setViewer($user) 108 + ->withRepository($repository) 109 + ->withIdentifiers($parents) 110 + ->execute(); 111 + } 112 + 105 113 $headsup_view = id(new PHUIHeaderView()) 106 114 ->setHeader(nonempty($commit->getSummary(), pht('Commit Detail'))); 107 115
+84
src/applications/diffusion/query/lowlevel/DiffusionLowLevelParentsQuery.php
··· 1 + <?php 2 + 3 + final class DiffusionLowLevelParentsQuery 4 + extends DiffusionLowLevelQuery { 5 + 6 + private $identifier; 7 + 8 + public function withIdentifier($identifier) { 9 + $this->identifier = $identifier; 10 + return $this; 11 + } 12 + 13 + public function executeQuery() { 14 + if (!strlen($this->identifier)) { 15 + throw new Exception( 16 + pht('You must provide an identifier with withIdentifier()!')); 17 + } 18 + 19 + $type = $this->getRepository()->getVersionControlSystem(); 20 + switch ($type) { 21 + case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: 22 + $result = $this->loadGitParents(); 23 + break; 24 + case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: 25 + $result = $this->loadMercurialParents(); 26 + break; 27 + case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: 28 + $result = $this->loadSubversionParents(); 29 + break; 30 + default: 31 + throw new Exception(pht('Unsupported repository type "%s"!', $type)); 32 + } 33 + 34 + return $result; 35 + } 36 + 37 + private function loadGitParents() { 38 + $repository = $this->getRepository(); 39 + 40 + list($stdout) = $repository->execxLocalCommand( 41 + 'log -n 1 --format=%s %s', 42 + '%P', 43 + $this->identifier); 44 + 45 + return preg_split('/\s+/', trim($stdout)); 46 + } 47 + 48 + private function loadMercurialParents() { 49 + $repository = $this->getRepository(); 50 + 51 + list($stdout) = $repository->execxLocalCommand( 52 + 'log --debug --limit 1 --template={parents} --rev %s', 53 + $this->identifier); 54 + $stdout = PhabricatorRepository::filterMercurialDebugOutput($stdout); 55 + 56 + $hashes = preg_split('/\s+/', trim($stdout)); 57 + foreach ($hashes as $key => $value) { 58 + // Mercurial parents look like "23:ad9f769d6f786fad9f76d9a" -- we want 59 + // to strip out the local rev part. 60 + list($local, $global) = explode(':', $value); 61 + $hashes[$key] = $global; 62 + 63 + // With --debug we get 40-character hashes but also get the "000000..." 64 + // hash for missing parents; ignore it. 65 + if (preg_match('/^0+$/', $global)) { 66 + unset($hashes[$key]); 67 + } 68 + } 69 + 70 + return $hashes; 71 + } 72 + 73 + private function loadSubversionParents() { 74 + $n = (int)$this->identifier; 75 + if ($n > 1) { 76 + $ids = array($n - 1); 77 + } else { 78 + $ids = array(); 79 + } 80 + 81 + return $ids; 82 + } 83 + 84 + }
-14
src/applications/diffusion/query/parents/DiffusionCommitParentsQuery.php
··· 1 - <?php 2 - 3 - abstract class DiffusionCommitParentsQuery extends DiffusionQuery { 4 - 5 - final public static function newFromDiffusionRequest( 6 - DiffusionRequest $request) { 7 - return self::newQueryObject(__CLASS__, $request); 8 - } 9 - 10 - final public function loadParents() { 11 - return $this->executeQuery(); 12 - } 13 - 14 - }
-19
src/applications/diffusion/query/parents/DiffusionGitCommitParentsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionGitCommitParentsQuery 4 - extends DiffusionCommitParentsQuery { 5 - 6 - protected function executeQuery() { 7 - $drequest = $this->getRequest(); 8 - $repository = $drequest->getRepository(); 9 - 10 - list($stdout) = $repository->execxLocalCommand( 11 - 'log -n 1 --format=%s %s', 12 - '%P', 13 - $drequest->getStableCommitName()); 14 - 15 - $hashes = preg_split('/\s+/', trim($stdout)); 16 - 17 - return self::loadCommitsByIdentifiers($hashes, $drequest); 18 - } 19 - }
-31
src/applications/diffusion/query/parents/DiffusionMercurialCommitParentsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionMercurialCommitParentsQuery 4 - extends DiffusionCommitParentsQuery { 5 - 6 - protected function executeQuery() { 7 - $drequest = $this->getRequest(); 8 - $repository = $drequest->getRepository(); 9 - 10 - list($stdout) = $repository->execxLocalCommand( 11 - 'log --debug --limit 1 --template={parents} --rev %s', 12 - $drequest->getStableCommitName()); 13 - $stdout = PhabricatorRepository::filterMercurialDebugOutput($stdout); 14 - 15 - $hashes = preg_split('/\s+/', trim($stdout)); 16 - foreach ($hashes as $key => $value) { 17 - // Mercurial parents look like "23:ad9f769d6f786fad9f76d9a" -- we want 18 - // to strip out the local rev part. 19 - list($local, $global) = explode(':', $value); 20 - $hashes[$key] = $global; 21 - 22 - // With --debug we get 40-character hashes but also get the "000000..." 23 - // hash for missing parents; ignore it. 24 - if (preg_match('/^0+$/', $global)) { 25 - unset($hashes[$key]); 26 - } 27 - } 28 - 29 - return self::loadCommitsByIdentifiers($hashes, $drequest); 30 - } 31 - }
-22
src/applications/diffusion/query/parents/DiffusionSvnCommitParentsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionSvnCommitParentsQuery 4 - extends DiffusionCommitParentsQuery { 5 - 6 - protected function executeQuery() { 7 - $drequest = $this->getRequest(); 8 - $repository = $drequest->getRepository(); 9 - 10 - // TODO: With merge properties in recent versions of SVN, can we do 11 - // a better job of this? 12 - 13 - $n = $drequest->getStableCommitName(); 14 - if ($n > 1) { 15 - $ids = array($n - 1); 16 - } else { 17 - $ids = array(); 18 - } 19 - 20 - return self::loadCommitsByIdentifiers($ids, $drequest); 21 - } 22 - }
+1 -6
src/applications/harbormaster/step/WaitForPreviousBuildStepImplementation.php
··· 82 82 $call->setUser(PhabricatorUser::getOmnipotentUser()); 83 83 $parents = $call->execute(); 84 84 85 - $hashes = array(); 86 - foreach ($parents as $parent => $obj) { 87 - $hashes[] = $parent; 88 - } 89 - 90 85 $parents = id(new DiffusionCommitQuery()) 91 86 ->setViewer(PhabricatorUser::getOmnipotentUser()) 92 87 ->withRepository($commit->getRepository()) 93 - ->withIdentifiers($hashes) 88 + ->withIdentifiers($parents) 94 89 ->execute(); 95 90 96 91 $blockers = array();
+18 -8
src/applications/repository/worker/commitmessageparser/PhabricatorRepositoryCommitMessageParserWorker.php
··· 205 205 DifferentialRevision $revision, 206 206 $actor_phid) { 207 207 208 + $viewer = PhabricatorUser::getOmnipotentUser(); 209 + 208 210 $drequest = DiffusionRequest::newFromDictionary(array( 209 - 'user' => PhabricatorUser::getOmnipotentUser(), 210 - 'initFromConduit' => false, 211 + 'user' => $viewer, 211 212 'repository' => $this->repository, 212 - 'commit' => $this->commit->getCommitIdentifier(), 213 213 )); 214 214 215 - $raw_diff = DiffusionRawDiffQuery::newFromDiffusionRequest($drequest) 216 - ->loadRawDiff(); 215 + $raw_diff = DiffusionQuery::callConduitWithDiffusionRequest( 216 + $viewer, 217 + $drequest, 218 + 'diffusion.rawdiffquery', 219 + array( 220 + 'commit' => $this->commit->getCommitIdentifier(), 221 + )); 217 222 218 223 // TODO: Support adds, deletes and moves under SVN. 219 224 if (strlen($raw_diff)) { ··· 248 253 $diff->setArcanistProjectPHID($arcanist_project->getPHID()); 249 254 } 250 255 251 - $parents = DiffusionCommitParentsQuery::newFromDiffusionRequest($drequest) 252 - ->loadParents(); 256 + $parents = DiffusionQuery::callConduitWithDiffusionRequest( 257 + $viewer, 258 + $drequest, 259 + 'diffusion.commitparentsquery', 260 + array( 261 + 'commit' => $this->commit->getCommitIdentifier(), 262 + )); 253 263 if ($parents) { 254 - $diff->setSourceControlBaseRevision(head_key($parents)); 264 + $diff->setSourceControlBaseRevision(head($parents)); 255 265 } 256 266 257 267 // TODO: Attach binary files.