Something went wrong. Try again.
@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
Something went wrong. Try again.
2.2 kB · 82 lines
PHP
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283<?php
final class DiffusionDatasourceEngineExtension extends PhabricatorDatasourceEngineExtension {
public function newQuickSearchDatasources() { return array( new DiffusionRepositoryDatasource(), new DiffusionSymbolDatasource(), ); }
public function newJumpURI($query) { $viewer = $this->getViewer();
// Send "r" to Diffusion. if (preg_match('/^r\z/i', $query)) { return '/diffusion/'; }
// Send "a" to the commit list ("Audit"). if (preg_match('/^a\z/i', $query)) { return '/diffusion/commit/'; }
// Send "r <string>" to a search for a matching repository. $matches = null; if (preg_match('/^r\s+(.+)\z/i', $query, $matches)) { $raw_query = $matches[1];
$engine = id(new PhabricatorRepository()) ->newFerretEngine();
$compiler = id(new PhutilSearchQueryCompiler()) ->setEnableFunctions(true);
$raw_tokens = $compiler->newTokens($raw_query);
$fulltext_tokens = array(); foreach ($raw_tokens as $raw_token) { $fulltext_token = id(new PhabricatorFulltextToken()) ->setToken($raw_token); $fulltext_tokens[] = $fulltext_token; }
$repositories = id(new PhabricatorRepositoryQuery()) ->setViewer($viewer) ->withFerretConstraint($engine, $fulltext_tokens) ->execute(); if (count($repositories) == 1) { // Just one match, jump to repository. return head($repositories)->getURI(); } else { // More than one match, jump to search. return urisprintf( '/diffusion/?order=relevance&query=%s#R', $raw_query); } }
// Send "s <string>" to a symbol search. $matches = null; if (preg_match('/^s\s+(.+)\z/i', $query, $matches)) { $symbol = $matches[1];
$parts = null; if (preg_match('/(.*)(?:\\.|::|->)(.*)/', $symbol, $parts)) { return urisprintf( '/diffusion/symbol/%p/?jump=true&context=%s', $parts[2], $parts[1]); } else { return urisprintf( '/diffusion/symbol/%p/?jump=true', $symbol); } }
return null; }
}