@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 DiffusionExistsQuery to work over conduit

Summary: le title. However, this also "is the first" conversion so sets the precedence for how this will all work. See comments in the code. I think this helps us keep the new code we're writing to a minimum. Wondering if the conduit end point could be more generic, and rather than have a switch statement on VCS type, one can just implement the "handleSubversion" version and have that called? Ref T2784

Test Plan: slapped an "or true" in the conditional protecting this code path. verified it worked on all 3 vcs systems, including typing in garbage and getting a 404

Reviewers: epriestley

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T2784

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

+197 -78
+4 -8
src/__phutil_library_map__.php
··· 144 144 'ConduitAPI_differential_updaterevision_Method' => 'applications/differential/conduit/ConduitAPI_differential_updaterevision_Method.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 + 'ConduitAPI_diffusion_abstractquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_abstractquery_Method.php', 148 + 'ConduitAPI_diffusion_existsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_existsquery_Method.php', 147 149 'ConduitAPI_diffusion_findsymbols_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_findsymbols_Method.php', 148 150 'ConduitAPI_diffusion_getcommits_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getcommits_Method.php', 149 151 'ConduitAPI_diffusion_getlintmessages_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_getlintmessages_Method.php', ··· 418 420 'DiffusionDiffController' => 'applications/diffusion/controller/DiffusionDiffController.php', 419 421 'DiffusionDiffQuery' => 'applications/diffusion/query/diff/DiffusionDiffQuery.php', 420 422 'DiffusionEmptyResultView' => 'applications/diffusion/view/DiffusionEmptyResultView.php', 421 - 'DiffusionExistsQuery' => 'applications/diffusion/query/exists/DiffusionExistsQuery.php', 422 423 'DiffusionExternalController' => 'applications/diffusion/controller/DiffusionExternalController.php', 423 424 'DiffusionFileContent' => 'applications/diffusion/data/DiffusionFileContent.php', 424 425 'DiffusionFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionFileContentQuery.php', ··· 429 430 'DiffusionGitCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionGitCommitTagsQuery.php', 430 431 'DiffusionGitContainsQuery' => 'applications/diffusion/query/contains/DiffusionGitContainsQuery.php', 431 432 'DiffusionGitDiffQuery' => 'applications/diffusion/query/diff/DiffusionGitDiffQuery.php', 432 - 'DiffusionGitExistsQuery' => 'applications/diffusion/query/exists/DiffusionGitExistsQuery.php', 433 433 'DiffusionGitFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionGitFileContentQuery.php', 434 434 'DiffusionGitHistoryQuery' => 'applications/diffusion/query/history/DiffusionGitHistoryQuery.php', 435 435 'DiffusionGitLastModifiedQuery' => 'applications/diffusion/query/lastmodified/DiffusionGitLastModifiedQuery.php', ··· 455 455 'DiffusionMercurialCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionMercurialCommitTagsQuery.php', 456 456 'DiffusionMercurialContainsQuery' => 'applications/diffusion/query/contains/DiffusionMercurialContainsQuery.php', 457 457 'DiffusionMercurialDiffQuery' => 'applications/diffusion/query/diff/DiffusionMercurialDiffQuery.php', 458 - 'DiffusionMercurialExistsQuery' => 'applications/diffusion/query/exists/DiffusionMercurialExistsQuery.php', 459 458 'DiffusionMercurialFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionMercurialFileContentQuery.php', 460 459 'DiffusionMercurialHistoryQuery' => 'applications/diffusion/query/history/DiffusionMercurialHistoryQuery.php', 461 460 'DiffusionMercurialLastModifiedQuery' => 'applications/diffusion/query/lastmodified/DiffusionMercurialLastModifiedQuery.php', ··· 486 485 'DiffusionSvnCommitTagsQuery' => 'applications/diffusion/query/committags/DiffusionSvnCommitTagsQuery.php', 487 486 'DiffusionSvnContainsQuery' => 'applications/diffusion/query/contains/DiffusionSvnContainsQuery.php', 488 487 'DiffusionSvnDiffQuery' => 'applications/diffusion/query/diff/DiffusionSvnDiffQuery.php', 489 - 'DiffusionSvnExistsQuery' => 'applications/diffusion/query/exists/DiffusionSvnExistsQuery.php', 490 488 'DiffusionSvnFileContentQuery' => 'applications/diffusion/query/filecontent/DiffusionSvnFileContentQuery.php', 491 489 'DiffusionSvnHistoryQuery' => 'applications/diffusion/query/history/DiffusionSvnHistoryQuery.php', 492 490 'DiffusionSvnLastModifiedQuery' => 'applications/diffusion/query/lastmodified/DiffusionSvnLastModifiedQuery.php', ··· 1913 1911 'ConduitAPI_differential_updaterevision_Method' => 'ConduitAPIMethod', 1914 1912 'ConduitAPI_differential_updateunitresults_Method' => 'ConduitAPIMethod', 1915 1913 'ConduitAPI_diffusion_Method' => 'ConduitAPIMethod', 1914 + 'ConduitAPI_diffusion_abstractquery_Method' => 'ConduitAPI_diffusion_Method', 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', 1918 1918 'ConduitAPI_diffusion_getlintmessages_Method' => 'ConduitAPI_diffusion_Method', ··· 2176 2176 'DiffusionDiffController' => 'DiffusionController', 2177 2177 'DiffusionDiffQuery' => 'DiffusionQuery', 2178 2178 'DiffusionEmptyResultView' => 'DiffusionView', 2179 - 'DiffusionExistsQuery' => 'DiffusionQuery', 2180 2179 'DiffusionExternalController' => 'DiffusionController', 2181 2180 'DiffusionFileContentQuery' => 'DiffusionQuery', 2182 2181 'DiffusionGitBranchQuery' => 'DiffusionBranchQuery', ··· 2186 2185 'DiffusionGitCommitTagsQuery' => 'DiffusionCommitTagsQuery', 2187 2186 'DiffusionGitContainsQuery' => 'DiffusionContainsQuery', 2188 2187 'DiffusionGitDiffQuery' => 'DiffusionDiffQuery', 2189 - 'DiffusionGitExistsQuery' => 'DiffusionExistsQuery', 2190 2188 'DiffusionGitFileContentQuery' => 'DiffusionFileContentQuery', 2191 2189 'DiffusionGitHistoryQuery' => 'DiffusionHistoryQuery', 2192 2190 'DiffusionGitLastModifiedQuery' => 'DiffusionLastModifiedQuery', ··· 2211 2209 'DiffusionMercurialCommitTagsQuery' => 'DiffusionCommitTagsQuery', 2212 2210 'DiffusionMercurialContainsQuery' => 'DiffusionContainsQuery', 2213 2211 'DiffusionMercurialDiffQuery' => 'DiffusionDiffQuery', 2214 - 'DiffusionMercurialExistsQuery' => 'DiffusionExistsQuery', 2215 2212 'DiffusionMercurialFileContentQuery' => 'DiffusionFileContentQuery', 2216 2213 'DiffusionMercurialHistoryQuery' => 'DiffusionHistoryQuery', 2217 2214 'DiffusionMercurialLastModifiedQuery' => 'DiffusionLastModifiedQuery', ··· 2234 2231 'DiffusionSvnCommitTagsQuery' => 'DiffusionCommitTagsQuery', 2235 2232 'DiffusionSvnContainsQuery' => 'DiffusionContainsQuery', 2236 2233 'DiffusionSvnDiffQuery' => 'DiffusionDiffQuery', 2237 - 'DiffusionSvnExistsQuery' => 'DiffusionExistsQuery', 2238 2234 'DiffusionSvnFileContentQuery' => 'DiffusionFileContentQuery', 2239 2235 'DiffusionSvnHistoryQuery' => 'DiffusionHistoryQuery', 2240 2236 'DiffusionSvnLastModifiedQuery' => 'DiffusionLastModifiedQuery',
+101
src/applications/diffusion/conduit/ConduitAPI_diffusion_abstractquery_Method.php
··· 1 + <?php 2 + 3 + /** 4 + * @group conduit 5 + */ 6 + abstract class ConduitAPI_diffusion_abstractquery_Method 7 + extends ConduitAPI_diffusion_Method { 8 + 9 + private $diffusionRequest; 10 + protected function setDiffusionRequest(DiffusionRequest $request) { 11 + $this->diffusionRequest = $request; 12 + return $this; 13 + } 14 + protected function getDiffusionRequest() { 15 + return $this->diffusionRequest; 16 + } 17 + 18 + final public function defineErrorTypes() { 19 + return $this->defineCustomErrorTypes() + 20 + array( 21 + 'ERR-UNKNOWN-REPOSITORY-VCS' => 22 + pht('Unknown repository VCS type.'), 23 + 'ERR-UNSUPPORTED-VCS' => 24 + pht('VCS is not supported for this method.')); 25 + } 26 + /** 27 + * Subclasses should override this to specify custom error types. 28 + */ 29 + protected function defineCustomErrorTypes() { 30 + return array(); 31 + } 32 + 33 + final public function defineParamTypes() { 34 + return $this->defineCustomParamTypes() + 35 + array( 36 + 'callsign' => 'required string'); 37 + } 38 + /** 39 + * Subclasses should override this to specify custom param types. 40 + */ 41 + protected function defineCustomParamTypes() { 42 + return array(); 43 + } 44 + 45 + /** 46 + * Subclasses should override these methods with the proper result for the 47 + * pertinent version control system, e.g. getGitResult for Git. 48 + * 49 + * If the result is not supported for that VCS, do not implement it. e.g. 50 + * Subversion (SVN) does not support branches. 51 + */ 52 + protected function getGitResult(ConduitAPIRequest $request) { 53 + throw new ConduitException('ERR-UNSUPPORTED-VCS'); 54 + } 55 + protected function getSVNResult(ConduitAPIRequest $request) { 56 + throw new ConduitException('ERR-UNSUPPORTED-VCS'); 57 + } 58 + protected function getMercurialResult(ConduitAPIRequest $request) { 59 + throw new ConduitException('ERR-UNSUPPORTED-VCS'); 60 + } 61 + 62 + /** 63 + * This method is final because each query will need to construct a 64 + * @{class:DiffusionRequest} and use it. Consolidating this codepath and 65 + * enforcing @{method:getDiffusionRequest} works when we need it is good. 66 + * 67 + * @{method:getResult} should be overridden by subclasses as necessary, e.g. 68 + * there is a common operation across all version control systems that 69 + * should occur after @{method:getResult}, like formatting a timestamp. 70 + */ 71 + final protected function execute(ConduitAPIRequest $request) { 72 + $drequest = DiffusionRequest::newFromDictionary( 73 + array( 74 + 'callsign' => $request->getValue('callsign'), 75 + )); 76 + $this->setDiffusionRequest($drequest); 77 + 78 + return $this->getResult($request); 79 + } 80 + 81 + protected function getResult(ConduitAPIRequest $request) { 82 + $drequest = $this->getDiffusionRequest(); 83 + $repository = $drequest->getRepository(); 84 + $result = null; 85 + switch ($repository->getVersionControlSystem()) { 86 + case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: 87 + $result = $this->getGitResult($request); 88 + break; 89 + case PhabricatorRepositoryType::REPOSITORY_TYPE_MERCURIAL: 90 + $result = $this->getMercurialResult($request); 91 + break; 92 + case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: 93 + $result = $this->getSVNResult($request); 94 + break; 95 + default: 96 + throw new ConduitException('ERR-UNKNOWN-REPOSITORY-VCS'); 97 + break; 98 + } 99 + return $result; 100 + } 101 + }
+55
src/applications/diffusion/conduit/ConduitAPI_diffusion_existsquery_Method.php
··· 1 + <?php 2 + 3 + /** 4 + * @group conduit 5 + */ 6 + final class ConduitAPI_diffusion_existsquery_Method 7 + extends ConduitAPI_diffusion_abstractquery_Method { 8 + 9 + public function getMethodDescription() { 10 + return "Determine if code exists in a version control system."; 11 + } 12 + 13 + public function defineReturnType() { 14 + return 'bool'; 15 + } 16 + 17 + protected function defineCustomParamTypes() { 18 + return array( 19 + 'commit' => 'required string' 20 + ); 21 + } 22 + 23 + protected function getGitResult(ConduitAPIRequest $request) { 24 + $repository = $this->getDiffusionRequest()->getRepository(); 25 + $commit = $request->getValue('commit'); 26 + list($err, $merge_base) = $repository->execLocalCommand( 27 + 'cat-file -t %s', 28 + $commit); 29 + return !$err; 30 + } 31 + 32 + protected function getSVNResult(ConduitAPIRequest $request) { 33 + $repository = $this->getDiffusionRequest()->getRepository(); 34 + $commit = $request->getValue('commit'); 35 + list($info) = $repository->execxRemoteCommand( 36 + 'info %s', 37 + $repository->getRemoteURI()); 38 + $exists = false; 39 + $matches = null; 40 + if (preg_match('/^Revision: (\d+)$/m', $info, $matches)) { 41 + $base_revision = $matches[1]; 42 + $exists = $base_revision >= $commit; 43 + } 44 + return $exists; 45 + } 46 + 47 + protected function getMercurialResult(ConduitAPIRequest $request) { 48 + $repository = $this->getDiffusionRequest()->getRepository(); 49 + $commit = $request->getValue('commit'); 50 + list($err, $stdout) = $repository->execLocalCommand( 51 + 'id --rev %s', 52 + $commit); 53 + return !$err; 54 + } 55 + }
+3 -2
src/applications/diffusion/controller/DiffusionCommitController.php
··· 30 30 $commit = $drequest->loadCommit(); 31 31 32 32 if (!$commit) { 33 - $query = DiffusionExistsQuery::newFromDiffusionRequest($drequest); 34 - $exists = $query->loadExistentialData(); 33 + $exists = $this->callConduitWithDiffusionRequest( 34 + 'diffusion.existsquery', 35 + array('commit' => $drequest->getCommit())); 35 36 if (!$exists) { 36 37 return new Aphront404Response(); 37 38 }
+13
src/applications/diffusion/controller/DiffusionController.php
··· 321 321 return $crumb_list; 322 322 } 323 323 324 + protected function callConduitWithDiffusionRequest( 325 + $method, 326 + array $params = array()) { 327 + 328 + $user = $this->getRequest()->getUser(); 329 + $drequest = $this->getDiffusionRequest(); 330 + 331 + return DiffusionQuery::callConduitWithDiffusionRequest( 332 + $user, 333 + $drequest, 334 + $method, 335 + $params); 336 + } 324 337 }
+21
src/applications/diffusion/query/DiffusionQuery.php
··· 36 36 return $this->request; 37 37 } 38 38 39 + final public static function callConduitWithDiffusionRequest( 40 + PhabricatorUser $user, 41 + DiffusionRequest $drequest, 42 + $method, 43 + array $params = array()) { 44 + 45 + $repository = $drequest->getRepository(); 46 + 47 + $core_params = array( 48 + 'callsign' => $repository->getCallsign() 49 + ); 50 + $params = $params + $core_params; 51 + 52 + return id(new ConduitCall( 53 + $method, 54 + $params 55 + )) 56 + ->setUser($user) 57 + ->execute(); 58 + } 59 + 39 60 public function execute() { 40 61 return $this->executeQuery(); 41 62 }
-13
src/applications/diffusion/query/exists/DiffusionExistsQuery.php
··· 1 - <?php 2 - 3 - abstract class DiffusionExistsQuery extends DiffusionQuery { 4 - 5 - final public static function newFromDiffusionRequest( 6 - DiffusionRequest $request) { 7 - return self::newQueryObject(__CLASS__, $request); 8 - } 9 - 10 - final public function loadExistentialData() { 11 - return $this->executeQuery(); 12 - } 13 - }
-16
src/applications/diffusion/query/exists/DiffusionGitExistsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionGitExistsQuery extends DiffusionExistsQuery { 4 - 5 - final protected function executeQuery() { 6 - $request = $this->getRequest(); 7 - $repository = $request->getRepository(); 8 - 9 - list($err, $merge_base) = $repository->execLocalCommand( 10 - 'cat-file -t %s', 11 - $request->getCommit()); 12 - 13 - return !$err; 14 - } 15 - 16 - }
-16
src/applications/diffusion/query/exists/DiffusionMercurialExistsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionMercurialExistsQuery extends DiffusionExistsQuery { 4 - 5 - protected function executeQuery() { 6 - $request = $this->getRequest(); 7 - $repository = $request->getRepository(); 8 - 9 - list($err, $stdout) = $repository->execLocalCommand( 10 - 'id --rev %s', 11 - $request->getCommit()); 12 - 13 - return !$err; 14 - 15 - } 16 - }
-23
src/applications/diffusion/query/exists/DiffusionSvnExistsQuery.php
··· 1 - <?php 2 - 3 - final class DiffusionSvnExistsQuery extends DiffusionExistsQuery { 4 - 5 - protected function executeQuery() { 6 - $request = $this->getRequest(); 7 - $repository = $request->getRepository(); 8 - 9 - list($info) = $repository->execxRemoteCommand( 10 - 'info %s', 11 - $repository->getRemoteURI()); 12 - 13 - $matches = null; 14 - $exists = false; 15 - if (preg_match('/^Revision: (\d+)$/m', $info, $matches)) { 16 - $base_revision = $matches[1]; 17 - $exists = $base_revision >= $request->getCommit(); 18 - } 19 - 20 - return $exists; 21 - } 22 - 23 - }