mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-12-23 05:50:54 +01:00
Fix filter/sort order of operations for british spellings
Summary: Currently, if we match "alnd" to "land" and "amend" equally (distance 2), we drop "land" with the other part of the rule. Stop doing that. Test Plan: Unit tests. Also: ``` $ arc alnd Usage Exception: Unknown command 'alnd'. Try 'arc help'. Did you mean: amend land ``` Reviewers: vrana Reviewed By: vrana CC: aran Differential Revision: https://secure.phabricator.com/D5033
This commit is contained in:
parent
5e7a458053
commit
e96db54125
3 changed files with 59 additions and 3 deletions
|
@ -23,6 +23,7 @@ phutil_register_library_map(array(
|
|||
'ArcanistBaseXHPASTLinter' => 'lint/linter/ArcanistBaseXHPASTLinter.php',
|
||||
'ArcanistBookmarkWorkflow' => 'workflow/ArcanistBookmarkWorkflow.php',
|
||||
'ArcanistBranchWorkflow' => 'workflow/ArcanistBranchWorkflow.php',
|
||||
'ArcanistBritishTestCase' => 'configuration/__tests__/ArcanistBritishTestCase.php',
|
||||
'ArcanistBrowseWorkflow' => 'workflow/ArcanistBrowseWorkflow.php',
|
||||
'ArcanistBundle' => 'parser/ArcanistBundle.php',
|
||||
'ArcanistBundleTestCase' => 'parser/__tests__/ArcanistBundleTestCase.php',
|
||||
|
@ -181,6 +182,7 @@ phutil_register_library_map(array(
|
|||
'ArcanistBaseXHPASTLinter' => 'ArcanistLinter',
|
||||
'ArcanistBookmarkWorkflow' => 'ArcanistFeatureWorkflow',
|
||||
'ArcanistBranchWorkflow' => 'ArcanistFeatureWorkflow',
|
||||
'ArcanistBritishTestCase' => 'ArcanistTestCase',
|
||||
'ArcanistBrowseWorkflow' => 'ArcanistBaseWorkflow',
|
||||
'ArcanistBundleTestCase' => 'ArcanistTestCase',
|
||||
'ArcanistCallConduitWorkflow' => 'ArcanistBaseWorkflow',
|
||||
|
|
|
@ -152,7 +152,7 @@ class ArcanistConfiguration {
|
|||
|
||||
// We haven't found a real command, alias, or unique prefix. Try similar
|
||||
// spellings.
|
||||
$corrected = $this->correctCommandSpelling($command, $all, 2);
|
||||
$corrected = self::correctCommandSpelling($command, $all, 2);
|
||||
if (count($corrected) == 1) {
|
||||
$console->writeErr(
|
||||
pht(
|
||||
|
@ -191,7 +191,7 @@ class ArcanistConfiguration {
|
|||
return array_keys($is_prefix);
|
||||
}
|
||||
|
||||
private function correctCommandSpelling(
|
||||
public static function correctCommandSpelling(
|
||||
$command,
|
||||
array $options,
|
||||
$max_distance) {
|
||||
|
@ -204,7 +204,21 @@ class ArcanistConfiguration {
|
|||
asort($distances);
|
||||
$best = min($max_distance, reset($distances));
|
||||
foreach ($distances as $option => $distance) {
|
||||
if ($distance > $best || strlen($option) <= 2 * $distance) {
|
||||
if ($distance > $best) {
|
||||
unset($distances[$option]);
|
||||
}
|
||||
}
|
||||
|
||||
// Before filtering, check if we have multiple equidistant matches and
|
||||
// return them if we do. This prevents us from, e.g., matching "alnd" with
|
||||
// both "land" and "amend", then dropping "land" for being too short, and
|
||||
// incorrectly completing to "amend".
|
||||
if (count($distances) > 1) {
|
||||
return array_keys($distances);
|
||||
}
|
||||
|
||||
foreach ($distances as $option => $distance) {
|
||||
if (strlen($option) <= 2 * $distance) {
|
||||
unset($distances[$option]);
|
||||
}
|
||||
}
|
||||
|
|
40
src/configuration/__tests__/ArcanistBritishTestCase.php
Normal file
40
src/configuration/__tests__/ArcanistBritishTestCase.php
Normal file
|
@ -0,0 +1,40 @@
|
|||
<?php
|
||||
|
||||
final class ArcanistBritishTestCase extends ArcanistTestCase {
|
||||
|
||||
public function testCompletion() {
|
||||
$this->assertCompletion(
|
||||
array('land', 'amend'),
|
||||
'alnd',
|
||||
array('land', 'amend'));
|
||||
|
||||
$this->assertCompletion(
|
||||
array('branch'),
|
||||
'brnach',
|
||||
array('branch', 'browse'));
|
||||
|
||||
$this->assertCompletion(
|
||||
array(),
|
||||
'test',
|
||||
array('list', 'unit'));
|
||||
}
|
||||
|
||||
private function assertCompletion($expect, $input, $commands) {
|
||||
$result = ArcanistConfiguration::correctCommandSpelling(
|
||||
$input,
|
||||
$commands,
|
||||
2);
|
||||
|
||||
sort($result);
|
||||
sort($expect);
|
||||
|
||||
$commands = implode(', ', $commands);
|
||||
|
||||
$this->assertEqual(
|
||||
$expect,
|
||||
$result,
|
||||
"Correction of {$input} against: {$commands}");
|
||||
}
|
||||
|
||||
|
||||
}
|
Loading…
Reference in a new issue