mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-16 03:42:41 +01:00
023dee0d3b
Summary: Ref T5655. Rename Conduit classes and provide a `getAPIMethodName` method to declare the API method. Test Plan: ``` > echo '{}' | arc --conduit-uri='http://phabricator.joshuaspence.com' call-conduit user.whoami Waiting for JSON parameters on stdin... {"error":null,"errorMessage":null,"response":{"phid":"PHID-USER-lioqffnwn6y475mu5ndb","userName":"josh","realName":"Joshua Spence","image":"http:\/\/phabricator.joshuaspence.com\/res\/1404425321T\/phabricator\/3eb28cd9\/rsrc\/image\/avatar.png","uri":"http:\/\/phabricator.joshuaspence.com\/p\/josh\/","roles":["admin","verified","approved","activated"]}} ``` Reviewers: epriestley, #blessed_reviewers Reviewed By: epriestley, #blessed_reviewers Subscribers: epriestley, Korvin, hach-que Maniphest Tasks: T5655 Differential Revision: https://secure.phabricator.com/D9991
156 lines
4.1 KiB
PHP
156 lines
4.1 KiB
PHP
<?php
|
|
|
|
final class DiffusionLastModifiedQueryConduitAPIMethod
|
|
extends DiffusionQueryConduitAPIMethod {
|
|
|
|
public function getAPIMethodName() {
|
|
return 'diffusion.lastmodifiedquery';
|
|
}
|
|
|
|
public function getMethodDescription() {
|
|
return pht('Get the commits at which paths were last modified.');
|
|
}
|
|
|
|
public function defineReturnType() {
|
|
return 'map<string, string>';
|
|
}
|
|
|
|
protected function defineCustomParamTypes() {
|
|
return array(
|
|
'paths' => 'required map<string, string>',
|
|
);
|
|
}
|
|
|
|
protected function getGitResult(ConduitAPIRequest $request) {
|
|
$drequest = $this->getDiffusionRequest();
|
|
$repository = $drequest->getRepository();
|
|
|
|
$paths = $request->getValue('paths');
|
|
$results = $this->loadCommitsFromCache($paths);
|
|
|
|
foreach ($paths as $path => $commit) {
|
|
if (array_key_exists($path, $results)) {
|
|
continue;
|
|
}
|
|
list($hash) = $repository->execxLocalCommand(
|
|
'log -n1 --format=%%H %s -- %s',
|
|
$commit,
|
|
$path);
|
|
$results[$path] = trim($hash);
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
protected function getSVNResult(ConduitAPIRequest $request) {
|
|
$drequest = $this->getDiffusionRequest();
|
|
$repository = $drequest->getRepository();
|
|
|
|
$results = array();
|
|
foreach ($request->getValue('paths') as $path => $commit) {
|
|
$history_result = DiffusionQuery::callConduitWithDiffusionRequest(
|
|
$request->getUser(),
|
|
$drequest,
|
|
'diffusion.historyquery',
|
|
array(
|
|
'commit' => $commit,
|
|
'path' => $path,
|
|
'limit' => 1,
|
|
'offset' => 0,
|
|
'needDirectChanges' => true,
|
|
'needChildChanges' => true,
|
|
));
|
|
|
|
$history_array = DiffusionPathChange::newFromConduit(
|
|
$history_result['pathChanges']);
|
|
if ($history_array) {
|
|
$results[$path] = head($history_array)
|
|
->getCommit()
|
|
->getCommitIdentifier();
|
|
}
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
protected function getMercurialResult(ConduitAPIRequest $request) {
|
|
$drequest = $this->getDiffusionRequest();
|
|
$repository = $drequest->getRepository();
|
|
|
|
$paths = $request->getValue('paths');
|
|
$results = $this->loadCommitsFromCache($paths);
|
|
|
|
foreach ($paths as $path => $commit) {
|
|
if (array_key_exists($path, $results)) {
|
|
continue;
|
|
}
|
|
|
|
list($hash) = $repository->execxLocalCommand(
|
|
'log --template %s --limit 1 --removed --rev %s -- %s',
|
|
'{node}',
|
|
hgsprintf('reverse(ancestors(%s))', $commit),
|
|
nonempty(ltrim($path, '/'), '.'));
|
|
$results[$path] = trim($hash);
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
private function loadCommitsFromCache(array $map) {
|
|
$drequest = $this->getDiffusionRequest();
|
|
$repository = $drequest->getRepository();
|
|
|
|
$path_map = id(new DiffusionPathIDQuery(array_keys($map)))
|
|
->loadPathIDs();
|
|
|
|
$commit_query = id(new DiffusionCommitQuery())
|
|
->setViewer($drequest->getUser())
|
|
->withRepository($repository)
|
|
->withIdentifiers(array_values($map));
|
|
$commit_query->execute();
|
|
|
|
$commit_map = $commit_query->getIdentifierMap();
|
|
$commit_map = mpull($commit_map, 'getID');
|
|
|
|
$graph_cache = new PhabricatorRepositoryGraphCache();
|
|
|
|
$results = array();
|
|
foreach ($map as $path => $commit) {
|
|
$path_id = idx($path_map, $path);
|
|
if (!$path_id) {
|
|
continue;
|
|
}
|
|
$commit_id = idx($commit_map, $commit);
|
|
if (!$commit_id) {
|
|
continue;
|
|
}
|
|
|
|
$cache_result = $graph_cache->loadLastModifiedCommitID(
|
|
$commit_id,
|
|
$path_id);
|
|
|
|
if ($cache_result !== false) {
|
|
$results[$path] = $cache_result;
|
|
}
|
|
}
|
|
|
|
if ($results) {
|
|
$commits = id(new DiffusionCommitQuery())
|
|
->setViewer($drequest->getUser())
|
|
->withRepository($repository)
|
|
->withIDs($results)
|
|
->execute();
|
|
foreach ($results as $path => $id) {
|
|
$commit = idx($commits, $id);
|
|
if ($commit) {
|
|
$results[$path] = $commit->getCommitIdentifier();
|
|
} else {
|
|
unset($results[$path]);
|
|
}
|
|
}
|
|
}
|
|
|
|
return $results;
|
|
}
|
|
|
|
}
|