Path: blob/master/src/applications/diffusion/engineextension/DiffusionDatasourceEngineExtension.php
12242 views
<?php12final class DiffusionDatasourceEngineExtension3extends PhabricatorDatasourceEngineExtension {45public function newQuickSearchDatasources() {6return array(7new DiffusionRepositoryDatasource(),8new DiffusionSymbolDatasource(),9);10}1112public function newJumpURI($query) {13$viewer = $this->getViewer();1415// Send "r" to Diffusion.16if (preg_match('/^r\z/i', $query)) {17return '/diffusion/';18}1920// Send "a" to the commit list ("Audit").21if (preg_match('/^a\z/i', $query)) {22return '/diffusion/commit/';23}2425// Send "r <string>" to a search for a matching repository.26$matches = null;27if (preg_match('/^r\s+(.+)\z/i', $query, $matches)) {28$raw_query = $matches[1];2930$engine = id(new PhabricatorRepository())31->newFerretEngine();3233$compiler = id(new PhutilSearchQueryCompiler())34->setEnableFunctions(true);3536$raw_tokens = $compiler->newTokens($raw_query);3738$fulltext_tokens = array();39foreach ($raw_tokens as $raw_token) {40$fulltext_token = id(new PhabricatorFulltextToken())41->setToken($raw_token);42$fulltext_tokens[] = $fulltext_token;43}4445$repositories = id(new PhabricatorRepositoryQuery())46->setViewer($viewer)47->withFerretConstraint($engine, $fulltext_tokens)48->execute();49if (count($repositories) == 1) {50// Just one match, jump to repository.51return head($repositories)->getURI();52} else {53// More than one match, jump to search.54return urisprintf(55'/diffusion/?order=relevance&query=%s#R',56$raw_query);57}58}5960// Send "s <string>" to a symbol search.61$matches = null;62if (preg_match('/^s\s+(.+)\z/i', $query, $matches)) {63$symbol = $matches[1];6465$parts = null;66if (preg_match('/(.*)(?:\\.|::|->)(.*)/', $symbol, $parts)) {67return urisprintf(68'/diffusion/symbol/%p/?jump=true&context=%s',69$parts[2],70$parts[1]);71} else {72return urisprintf(73'/diffusion/symbol/%p/?jump=true',74$symbol);75}76}7778return null;79}8081}828384