Index: src/__phutil_library_map__.php =================================================================== --- src/__phutil_library_map__.php +++ 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', Index: src/applications/diffusion/conduit/ConduitAPI_diffusion_querypaths_Method.php =================================================================== --- /dev/null +++ src/applications/diffusion/conduit/ConduitAPI_diffusion_querypaths_Method.php @@ -0,0 +1,87 @@ +'; + } + + 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; + } +} Index: src/applications/diffusion/controller/DiffusionBrowseController.php =================================================================== --- src/applications/diffusion/controller/DiffusionBrowseController.php +++ 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; } Index: src/applications/diffusion/controller/DiffusionBrowseSearchController.php =================================================================== --- src/applications/diffusion/controller/DiffusionBrowseSearchController.php +++ 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 != '') { Index: src/view/form/control/PHUIFormMultiSubmitControl.php =================================================================== --- src/view/form/control/PHUIFormMultiSubmitControl.php +++ src/view/form/control/PHUIFormMultiSubmitControl.php @@ -41,6 +41,7 @@ 'class' => $class, 'disabled' => $this->getDisabled() ? 'disabled' : null, )); + return $this; } protected function getCustomControlClass() {