@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
at upstream/main 57 lines 1.5 kB view raw
1<?php 2 3final class ProjectDatasourceEngineExtension 4 extends PhabricatorDatasourceEngineExtension { 5 6 public function newQuickSearchDatasources() { 7 return array( 8 new PhabricatorProjectDatasource(), 9 ); 10 } 11 12 public function newJumpURI($query) { 13 $viewer = $this->getViewer(); 14 15 // Send "p" to Projects. 16 if (preg_match('/^p\z/i', $query)) { 17 return '/diffusion/'; 18 } 19 20 // Send "p <string>" to a search for similar projects. 21 $matches = null; 22 if (preg_match('/^p\s+(.+)\z/i', $query, $matches)) { 23 $raw_query = $matches[1]; 24 25 $engine = id(new PhabricatorProject()) 26 ->newFerretEngine(); 27 28 $compiler = id(new PhutilSearchQueryCompiler()) 29 ->setEnableFunctions(true); 30 31 $raw_tokens = $compiler->newTokens($raw_query); 32 33 $fulltext_tokens = array(); 34 foreach ($raw_tokens as $raw_token) { 35 $fulltext_token = id(new PhabricatorFulltextToken()) 36 ->setToken($raw_token); 37 $fulltext_tokens[] = $fulltext_token; 38 } 39 40 $projects = id(new PhabricatorProjectQuery()) 41 ->setViewer($viewer) 42 ->withFerretConstraint($engine, $fulltext_tokens) 43 ->execute(); 44 if (count($projects) == 1) { 45 // Just one match, jump to project. 46 return head($projects)->getURI(); 47 } else { 48 // More than one match, jump to search. 49 return urisprintf( 50 '/project/?order=relevance&query=%s#R', 51 $raw_query); 52 } 53 } 54 55 return null; 56 } 57}