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

Add "internal.commit.search" to replace the cache bypass mode of "diffusion.querycommits"

Summary:
Ref T13552. Commit parsers currently invoke a special mode of "diffusion.querycommits", which is an older frozen method.

The replacement, "diffusion.commit.search", is not really appropriate for low-level access. This mode of having a single method which operates in "cache" or "non-cache" modes also ends up in a lot of unnecessary field shuffling.

Provide "internal.commit.search" as a modern equivalent that returns a "DiffusionCommitRef"-compatible structure.

Test Plan: Executed "internal.commit.search", got sensible low-level commit results.

Maniphest Tasks: T13552

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

+202 -15
+4
src/__phutil_library_map__.php
··· 873 873 'DiffusionIdentityViewController' => 'applications/diffusion/controller/DiffusionIdentityViewController.php', 874 874 'DiffusionInlineCommentController' => 'applications/diffusion/controller/DiffusionInlineCommentController.php', 875 875 'DiffusionInternalAncestorsConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionInternalAncestorsConduitAPIMethod.php', 876 + 'DiffusionInternalCommitSearchConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionInternalCommitSearchConduitAPIMethod.php', 877 + 'DiffusionInternalCommitSearchEngine' => 'applications/audit/query/DiffusionInternalCommitSearchEngine.php', 876 878 'DiffusionInternalGitRawDiffQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionInternalGitRawDiffQueryConduitAPIMethod.php', 877 879 'DiffusionLastModifiedController' => 'applications/diffusion/controller/DiffusionLastModifiedController.php', 878 880 'DiffusionLastModifiedQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionLastModifiedQueryConduitAPIMethod.php', ··· 6976 6978 'DiffusionIdentityViewController' => 'DiffusionController', 6977 6979 'DiffusionInlineCommentController' => 'PhabricatorInlineCommentController', 6978 6980 'DiffusionInternalAncestorsConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 6981 + 'DiffusionInternalCommitSearchConduitAPIMethod' => 'PhabricatorSearchEngineAPIMethod', 6982 + 'DiffusionInternalCommitSearchEngine' => 'PhabricatorApplicationSearchEngine', 6979 6983 'DiffusionInternalGitRawDiffQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 6980 6984 'DiffusionLastModifiedController' => 'DiffusionController', 6981 6985 'DiffusionLastModifiedQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod',
+75
src/applications/audit/query/DiffusionInternalCommitSearchEngine.php
··· 1 + <?php 2 + 3 + final class DiffusionInternalCommitSearchEngine 4 + extends PhabricatorApplicationSearchEngine { 5 + 6 + public function getResultTypeDescription() { 7 + return pht('Diffusion Raw Commits'); 8 + } 9 + 10 + public function getApplicationClassName() { 11 + return 'PhabricatorDiffusionApplication'; 12 + } 13 + 14 + public function newQuery() { 15 + return new DiffusionCommitQuery(); 16 + } 17 + 18 + protected function buildQueryFromParameters(array $map) { 19 + $query = $this->newQuery(); 20 + 21 + if ($map['repositoryPHIDs']) { 22 + $query->withRepositoryPHIDs($map['repositoryPHIDs']); 23 + } 24 + 25 + return $query; 26 + } 27 + 28 + protected function buildCustomSearchFields() { 29 + return array( 30 + id(new PhabricatorSearchDatasourceField()) 31 + ->setLabel(pht('Repositories')) 32 + ->setKey('repositoryPHIDs') 33 + ->setDatasource(new DiffusionRepositoryFunctionDatasource()) 34 + ->setDescription(pht('Find commits in particular repositories.')), 35 + ); 36 + } 37 + 38 + protected function getURI($path) { 39 + return null; 40 + } 41 + 42 + protected function renderResultList( 43 + array $commits, 44 + PhabricatorSavedQuery $query, 45 + array $handles) { 46 + return null; 47 + } 48 + 49 + protected function getObjectWireFieldsForConduit( 50 + $object, 51 + array $field_extensions, 52 + array $extension_data) { 53 + 54 + $commit = $object; 55 + $viewer = $this->requireViewer(); 56 + 57 + $repository = $commit->getRepository(); 58 + $identifier = $commit->getCommitIdentifier(); 59 + 60 + id(new DiffusionRepositoryClusterEngine()) 61 + ->setViewer($viewer) 62 + ->setRepository($repository) 63 + ->synchronizeWorkingCopyBeforeRead(); 64 + 65 + $ref = id(new DiffusionLowLevelCommitQuery()) 66 + ->setRepository($repository) 67 + ->withIdentifier($identifier) 68 + ->execute(); 69 + 70 + return array( 71 + 'ref' => $ref->newDictionary(), 72 + ); 73 + } 74 + 75 + }
+58
src/applications/diffusion/conduit/DiffusionInternalCommitSearchConduitAPIMethod.php
··· 1 + <?php 2 + 3 + final class DiffusionInternalCommitSearchConduitAPIMethod 4 + extends PhabricatorSearchEngineAPIMethod { 5 + 6 + public function getAPIMethodName() { 7 + return 'internal.commit.search'; 8 + } 9 + 10 + public function newSearchEngine() { 11 + return new DiffusionInternalCommitSearchEngine(); 12 + } 13 + 14 + public function getMethodSummary() { 15 + return pht('Read raw information about commits.'); 16 + } 17 + 18 + protected function newConduitCallProxyClient(ConduitAPIRequest $request) { 19 + $viewer = $request->getViewer(); 20 + 21 + $constraints = $request->getValue('constraints'); 22 + if (is_array($constraints)) { 23 + $repository_phids = idx($constraints, 'repositoryPHIDs'); 24 + } else { 25 + $repository_phids = array(); 26 + } 27 + 28 + $repository_phid = null; 29 + if (is_array($repository_phids)) { 30 + if (phutil_is_natural_list($repository_phids)) { 31 + if (count($repository_phids) === 1) { 32 + $value = head($repository_phids); 33 + if (is_string($value)) { 34 + $repository_phid = $value; 35 + } 36 + } 37 + } 38 + } 39 + 40 + if ($repository_phid === null) { 41 + throw new Exception( 42 + pht( 43 + 'This internal method must be invoked with a "repositoryPHIDs" '. 44 + 'constraint with exactly one value.')); 45 + } 46 + 47 + $repository = id(new PhabricatorRepositoryQuery()) 48 + ->setViewer($viewer) 49 + ->withPHIDs(array($repository_phid)) 50 + ->executeOne(); 51 + if (!$repository) { 52 + return array(); 53 + } 54 + 55 + return $repository->newConduitClientForRequest($request); 56 + } 57 + 58 + }
+17
src/applications/diffusion/data/DiffusionCommitHash.php
··· 34 34 } 35 35 return $hash_objects; 36 36 } 37 + 38 + public static function newFromDictionary(array $map) { 39 + $hash_type = idx($map, 'type'); 40 + $hash_value = idx($map, 'value'); 41 + 42 + return id(new self()) 43 + ->setHashType($hash_type) 44 + ->setHashValue($hash_value); 45 + } 46 + 47 + public function newDictionary() { 48 + return array( 49 + 'type' => $this->hashType, 50 + 'value' => $this->hashValue, 51 + ); 52 + } 53 + 37 54 }
+39 -15
src/applications/diffusion/data/DiffusionCommitRef.php
··· 10 10 private $committerEmail; 11 11 private $hashes = array(); 12 12 13 - public static function newFromConduitResult(array $result) { 14 - $ref = id(new DiffusionCommitRef()) 15 - ->setAuthorEpoch(idx($result, 'authorEpoch')) 16 - ->setCommitterEmail(idx($result, 'committerEmail')) 17 - ->setCommitterName(idx($result, 'committerName')) 18 - ->setAuthorEmail(idx($result, 'authorEmail')) 19 - ->setAuthorName(idx($result, 'authorName')) 20 - ->setMessage(idx($result, 'message')); 13 + public function newDictionary() { 14 + $hashes = $this->getHashes(); 15 + $hashes = mpull($hashes, 'newDictionary'); 16 + $hashes = array_values($hashes); 21 17 22 - $hashes = array(); 23 - foreach (idx($result, 'hashes', array()) as $hash_result) { 24 - $hashes[] = id(new DiffusionCommitHash()) 25 - ->setHashType(idx($hash_result, 'type')) 26 - ->setHashValue(idx($hash_result, 'value')); 18 + return array( 19 + 'authorEpoch' => $this->authorEpoch, 20 + 'authorName' => $this->authorName, 21 + 'authorEmail' => $this->authorEmail, 22 + 'committerName' => $this->committerName, 23 + 'committerEmail' => $this->committerEmail, 24 + 'message' => $this->message, 25 + 'hashes' => $hashes, 26 + ); 27 + } 28 + 29 + public static function newFromDictionary(array $map) { 30 + $hashes = idx($map, 'hashes', array()); 31 + foreach ($hashes as $key => $hash_map) { 32 + $hashes[$key] = DiffusionCommitHash::newFromDictionary($hash_map); 27 33 } 34 + $hashes = array_values($hashes); 28 35 29 - $ref->setHashes($hashes); 36 + $author_epoch = idx($map, 'authorEpoch'); 37 + $author_name = idx($map, 'authorName'); 38 + $author_email = idx($map, 'authorEmail'); 39 + $committer_name = idx($map, 'committerName'); 40 + $committer_email = idx($map, 'committerEmail'); 41 + $message = idx($map, 'message'); 42 + 43 + return id(new self()) 44 + ->setAuthorEpoch($author_epoch) 45 + ->setAuthorName($author_name) 46 + ->setAuthorEmail($author_email) 47 + ->setCommitterName($committer_name) 48 + ->setCommitterEmail($committer_email) 49 + ->setMessage($message) 50 + ->setHashes($hashes); 51 + } 30 52 31 - return $ref; 53 + public static function newFromConduitResult(array $result) { 54 + return self::newFromDictionary($result); 32 55 } 33 56 34 57 public function setHashes(array $hashes) { 58 + assert_instances_of($hashes, 'DiffusionCommitHash'); 35 59 $this->hashes = $hashes; 36 60 return $this; 37 61 }
+9
src/applications/repository/storage/PhabricatorRepositoryCommitData.php
··· 92 92 return array_values($holds); 93 93 } 94 94 95 + public function setCommitRef(DiffusionCommitRef $ref) { 96 + $this->setCommitDetail('commitRef', $ref->newDictionary()); 97 + } 98 + 99 + public function newCommitRef() { 100 + $map = $this->getCommitDetail('commitRef', array()); 101 + return DiffusionCommitRef::neWFromDictionary($map); 102 + } 103 + 95 104 }