Path: blob/master/src/applications/diffusion/conduit/DiffusionLastModifiedQueryConduitAPIMethod.php
12242 views
<?php12final class DiffusionLastModifiedQueryConduitAPIMethod3extends DiffusionQueryConduitAPIMethod {45public function getAPIMethodName() {6return 'diffusion.lastmodifiedquery';7}89public function getMethodDescription() {10return pht('Get the commits at which paths were last modified.');11}1213protected function defineReturnType() {14return 'map<string, string>';15}1617protected function defineCustomParamTypes() {18return array(19'paths' => 'required map<string, string>',20);21}2223protected function getGitResult(ConduitAPIRequest $request) {24$drequest = $this->getDiffusionRequest();25$repository = $drequest->getRepository();2627$paths = $request->getValue('paths');28$results = $this->loadCommitsFromCache($paths);2930foreach ($paths as $path => $commit) {31if (array_key_exists($path, $results)) {32continue;33}34list($hash) = $repository->execxLocalCommand(35'log -n1 %s %s -- %s',36'--format=%H',37gitsprintf('%s', $commit),38$path);39$results[$path] = trim($hash);40}4142return $results;43}4445protected function getSVNResult(ConduitAPIRequest $request) {46$drequest = $this->getDiffusionRequest();47$repository = $drequest->getRepository();4849$results = array();50foreach ($request->getValue('paths') as $path => $commit) {51$history_result = DiffusionQuery::callConduitWithDiffusionRequest(52$request->getUser(),53$drequest,54'diffusion.historyquery',55array(56'commit' => $commit,57'path' => $path,58'limit' => 1,59'offset' => 0,60'needDirectChanges' => true,61'needChildChanges' => true,62));6364$history_array = DiffusionPathChange::newFromConduit(65$history_result['pathChanges']);66if ($history_array) {67$results[$path] = head($history_array)68->getCommit()69->getCommitIdentifier();70}71}7273return $results;74}7576protected function getMercurialResult(ConduitAPIRequest $request) {77$drequest = $this->getDiffusionRequest();78$repository = $drequest->getRepository();7980$paths = $request->getValue('paths');81$results = $this->loadCommitsFromCache($paths);8283foreach ($paths as $path => $commit) {84if (array_key_exists($path, $results)) {85continue;86}8788list($hash) = $repository->execxLocalCommand(89'log --template %s --limit 1 --removed --rev %s -- %s',90'{node}',91hgsprintf('reverse(ancestors(%s))', $commit),92nonempty(ltrim($path, '/'), '.'));93$results[$path] = trim($hash);94}9596return $results;97}9899private function loadCommitsFromCache(array $map) {100$drequest = $this->getDiffusionRequest();101$repository = $drequest->getRepository();102103$path_map = id(new DiffusionPathIDQuery(array_keys($map)))104->loadPathIDs();105106$commit_query = id(new DiffusionCommitQuery())107->setViewer($drequest->getUser())108->withRepository($repository)109->withIdentifiers(array_values($map));110$commit_query->execute();111112$commit_map = $commit_query->getIdentifierMap();113$commit_map = mpull($commit_map, 'getID');114115$graph_cache = new PhabricatorRepositoryGraphCache();116117$results = array();118119// Spend no more than this many total seconds trying to satisfy queries120// via the graph cache.121$remaining_time = 10.0;122foreach ($map as $path => $commit) {123$path_id = idx($path_map, $path);124if (!$path_id) {125continue;126}127$commit_id = idx($commit_map, $commit);128if (!$commit_id) {129continue;130}131132$t_start = microtime(true);133$cache_result = $graph_cache->loadLastModifiedCommitID(134$commit_id,135$path_id,136$remaining_time);137$t_end = microtime(true);138139if ($cache_result !== false) {140$results[$path] = $cache_result;141}142143$remaining_time -= ($t_end - $t_start);144if ($remaining_time <= 0) {145break;146}147}148149if ($results) {150$commits = id(new DiffusionCommitQuery())151->setViewer($drequest->getUser())152->withRepository($repository)153->withIDs($results)154->execute();155foreach ($results as $path => $id) {156$commit = idx($commits, $id);157if ($commit) {158$results[$path] = $commit->getCommitIdentifier();159} else {160unset($results[$path]);161}162}163}164165return $results;166}167168}169170171