Page MenuHomePhabricator

D8093.id18374.diff
No OneTemporary

D8093.id18374.diff

diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -169,6 +169,7 @@
'ConduitAPI_diffusion_looksoon_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_looksoon_Method.php',
'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_mergedcommitsquery_Method.php',
'ConduitAPI_diffusion_querycommits_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_querycommits_Method.php',
+ 'ConduitAPI_diffusion_querypaths_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_querypaths_Method.php',
'ConduitAPI_diffusion_rawdiffquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_rawdiffquery_Method.php',
'ConduitAPI_diffusion_readmequery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_readmequery_Method.php',
'ConduitAPI_diffusion_refsquery_Method' => 'applications/diffusion/conduit/ConduitAPI_diffusion_refsquery_Method.php',
@@ -2657,6 +2658,7 @@
'ConduitAPI_diffusion_looksoon_Method' => 'ConduitAPI_diffusion_Method',
'ConduitAPI_diffusion_mergedcommitsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
'ConduitAPI_diffusion_querycommits_Method' => 'ConduitAPI_diffusion_Method',
+ 'ConduitAPI_diffusion_querypaths_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
'ConduitAPI_diffusion_rawdiffquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
'ConduitAPI_diffusion_readmequery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
'ConduitAPI_diffusion_refsquery_Method' => 'ConduitAPI_diffusion_abstractquery_Method',
diff --git a/src/applications/diffusion/conduit/ConduitAPI_diffusion_querypaths_Method.php b/src/applications/diffusion/conduit/ConduitAPI_diffusion_querypaths_Method.php
new file mode 100644
--- /dev/null
+++ b/src/applications/diffusion/conduit/ConduitAPI_diffusion_querypaths_Method.php
@@ -0,0 +1,87 @@
+<?php
+
+final class ConduitAPI_diffusion_querypaths_Method
+ extends ConduitAPI_diffusion_abstractquery_Method {
+
+ public function getMethodDescription() {
+ return pht('Filename search on a repository.');
+ }
+
+ public function defineReturnType() {
+ return 'list<string>';
+ }
+
+ protected function defineCustomParamTypes() {
+ return array(
+ 'path' => 'required string',
+ 'commit' => 'required string',
+ 'pattern' => 'required string',
+ 'limit' => 'optional int',
+ 'offset' => 'optional int',
+ );
+ }
+
+ protected function getResult(ConduitAPIRequest $request) {
+ $results = parent::getResult($request);
+ $offset = $request->getValue('offset');
+ return array_slice($results, $offset);
+ }
+
+ protected function getGitResult(ConduitAPIRequest $request) {
+ $drequest = $this->getDiffusionRequest();
+ $path = $drequest->getPath();
+ $commit = $request->getValue('commit');
+ $repository = $drequest->getRepository();
+
+ // http://comments.gmane.org/gmane.comp.version-control.git/197735
+
+ $future = $repository->getLocalCommandFuture(
+ 'ls-tree --name-only -r -z %s -- %s',
+ $commit,
+ $path);
+
+ $lines = id(new LinesOfALargeExecFuture($future))->setDelimiter("\0");
+ return $this->filterResults($lines, $request);
+ }
+
+ protected function getMercurialResult(ConduitAPIRequest $request) {
+ $drequest = $this->getDiffusionRequest();
+ $repository = $drequest->getRepository();
+ $path = $request->getValue('path');
+ $commit = $request->getValue('commit');
+
+ // Adapted from diffusion.browsequery.
+ list($entire_manifest) = $repository->execxLocalCommand(
+ 'manifest --rev %s',
+ hgsprintf('%s', $commit));
+ $entire_manifest = explode("\n", $entire_manifest);
+
+ $match_against = trim($path, '/');
+ $match_len = strlen($match_against);
+
+ $lines = array();
+ foreach ($entire_manifest as $path) {
+ if (strlen($path) && !strncmp($path, $match_against, $match_len)) {
+ $lines[] = $path;
+ }
+ }
+ return $this->filterResults($lines, $request);
+ }
+
+ protected function filterResults($lines, ConduitAPIRequest $request) {
+ $pattern = $request->getValue('pattern');
+ $limit = $request->getValue('limit');
+ $offset = $request->getValue('offset');
+
+ $results = array();
+ foreach ($lines as $line) {
+ if (preg_match('#'.str_replace('#', '\#', $pattern).'#', $line)) {
+ $results[] = $line;
+ if (count($results) >= $offset + $limit) {
+ break;
+ }
+ }
+ }
+ return $results;
+ }
+}
diff --git a/src/applications/diffusion/controller/DiffusionBrowseController.php b/src/applications/diffusion/controller/DiffusionBrowseController.php
--- a/src/applications/diffusion/controller/DiffusionBrowseController.php
+++ b/src/applications/diffusion/controller/DiffusionBrowseController.php
@@ -26,8 +26,9 @@
->setValue($this->getRequest()->getStr('grep'))
->setCaption(pht('Enter a regular expression.')))
->appendChild(
- id(new AphrontFormSubmitControl())
- ->setValue(pht('Search File Content')));
+ id(new PHUIFormMultiSubmitControl())
+ ->addButton('__ls__', pht('Search File Names'))
+ ->addButton('__grep__', pht('Search File Content')));
break;
}
diff --git a/src/applications/diffusion/controller/DiffusionBrowseSearchController.php b/src/applications/diffusion/controller/DiffusionBrowseSearchController.php
--- a/src/applications/diffusion/controller/DiffusionBrowseSearchController.php
+++ b/src/applications/diffusion/controller/DiffusionBrowseSearchController.php
@@ -53,16 +53,29 @@
$pager->setURI($this->getRequest()->getRequestURI(), 'page');
try {
-
- $results = $this->callConduitWithDiffusionRequest(
- 'diffusion.searchquery',
- array(
- 'grep' => $this->getRequest()->getStr('grep'),
- 'stableCommitName' => $drequest->getStableCommitName(),
- 'path' => $drequest->getPath(),
- 'limit' => $limit + 1,
- 'offset' => $page));
-
+ if ($this->getRequest()->getStr('__grep__')) {
+ $results = $this->callConduitWithDiffusionRequest(
+ 'diffusion.searchquery',
+ array(
+ 'grep' => $this->getRequest()->getStr('grep'),
+ 'stableCommitName' => $drequest->getStableCommitName(),
+ 'path' => $drequest->getPath(),
+ 'limit' => $limit + 1,
+ 'offset' => $page));
+ } else { // Filename search.
+ $results_raw = $this->callConduitWithDiffusionRequest(
+ 'diffusion.querypaths',
+ array(
+ 'pattern' => $this->getRequest()->getStr('grep'),
+ 'commit' => $drequest->getStableCommitName(),
+ 'path' => $drequest->getPath(),
+ 'limit' => $limit + 1,
+ 'offset' => $page));
+ $results = [];
+ foreach ($results_raw as $result) {
+ $results[] = array($result, null, null);
+ }
+ }
} catch (ConduitException $ex) {
$err = $ex->getErrorDescription();
if ($err != '') {
diff --git a/src/view/form/control/PHUIFormMultiSubmitControl.php b/src/view/form/control/PHUIFormMultiSubmitControl.php
--- a/src/view/form/control/PHUIFormMultiSubmitControl.php
+++ b/src/view/form/control/PHUIFormMultiSubmitControl.php
@@ -41,6 +41,7 @@
'class' => $class,
'disabled' => $this->getDisabled() ? 'disabled' : null,
));
+ return $this;
}
protected function getCustomControlClass() {

File Metadata

Mime Type
text/plain
Expires
Mar 20 2025, 5:25 PM (4 w, 4 d ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7713513
Default Alt Text
D8093.id18374.diff (7 KB)

Event Timeline