} final public static function newFromDiffusionRequest( DiffusionRequest $request) { $repository = $request->getRepository(); switch ($repository->getVersionControlSystem()) { case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT: $class = 'DiffusionGitFileContentQuery'; break; case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN: $class = 'DiffusionSvnFileContentQuery'; break; default: throw new Exception("Unsupported VCS!"); } PhutilSymbolLoader::loadClass($class); $query = new $class(); $query->request = $request; return $query; } final protected function getRequest() { return $this->request; } final public function loadFileContent() { $this->fileContent = $this->executeQuery(); } abstract protected function executeQuery(); final public function getRawData() { return $this->fileContent->getCorpus(); } final public function getBlameData() { $raw_data = $this->getRawData(); $text_list = array(); $rev_list = array(); $blame_dict = array(); if (!$this->getNeedsBlame()) { $text_list = explode("\n", rtrim($raw_data)); } else { foreach (explode("\n", rtrim($raw_data)) as $k => $line) { list($rev_id, $author, $text) = $this->tokenizeLine($line); $text_list[$k] = $text; $rev_list[$k] = $rev_id; if (!isset($blame_dict[$rev_id]) && !isset($blame_dict[$rev_id]['author'] )) { $blame_dict[$rev_id]['author'] = $author; } } $repository = $this->getRequest()->getRepository(); $commits = id(new PhabricatorRepositoryCommit())->loadAllWhere( 'repositoryID = %d AND commitIdentifier IN (%Ls)', $repository->getID(), array_unique($rev_list)); foreach ($commits as $commit) { $commitIdentifier = $commit->getCommitIdentifier(); $epoch = $commit->getEpoch(); $blame_dict[$commitIdentifier]['epoch'] = $epoch; } } return array($text_list, $rev_list, $blame_dict); } abstract protected function tokenizeLine($line); public function setNeedsBlame($needs_blame) { $this->needsBlame = $needs_blame; } public function getNeedsBlame() { return $this->needsBlame; } }