Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14051772
D16333.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
7 KB
Referenced Files
None
Subscribers
None
D16333.diff
View Options
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
@@ -41,7 +41,6 @@
'ArcanistBraceFormattingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistBraceFormattingXHPASTLinterRule.php',
'ArcanistBraceFormattingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistBraceFormattingXHPASTLinterRuleTestCase.php',
'ArcanistBranchWorkflow' => 'workflow/ArcanistBranchWorkflow.php',
- 'ArcanistBritishTestCase' => 'configuration/__tests__/ArcanistBritishTestCase.php',
'ArcanistBrowseWorkflow' => 'workflow/ArcanistBrowseWorkflow.php',
'ArcanistBundle' => 'parser/ArcanistBundle.php',
'ArcanistBundleTestCase' => 'parser/__tests__/ArcanistBundleTestCase.php',
@@ -456,7 +455,6 @@
'ArcanistBraceFormattingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
'ArcanistBraceFormattingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
'ArcanistBranchWorkflow' => 'ArcanistFeatureWorkflow',
- 'ArcanistBritishTestCase' => 'PhutilTestCase',
'ArcanistBrowseWorkflow' => 'ArcanistWorkflow',
'ArcanistBundle' => 'Phobject',
'ArcanistBundleTestCase' => 'PhutilTestCase',
diff --git a/src/configuration/ArcanistConfiguration.php b/src/configuration/ArcanistConfiguration.php
--- a/src/configuration/ArcanistConfiguration.php
+++ b/src/configuration/ArcanistConfiguration.php
@@ -144,7 +144,8 @@
// We haven't found a real command, alias, or unique prefix. Try similar
// spellings.
- $corrected = self::correctCommandSpelling($command, $all, 2);
+ $corrected = PhutilArgumentSpellingCorrector::newCommandCorrector()
+ ->correctSpelling($command, $all);
if (count($corrected) == 1) {
$console->writeErr(
pht(
@@ -183,78 +184,4 @@
return array_keys($is_prefix);
}
- public static function correctCommandSpelling(
- $command,
- array $options,
- $max_distance) {
-
- // Adjust to the scaled edit costs we use below, so "2" roughly means
- // "2 edits".
- $max_distance = $max_distance * 3;
-
- // These costs are somewhat made up, but the theory is that it is far more
- // likely you will mis-strike a key ("lans" for "land") or press two keys
- // out of order ("alnd" for "land") than omit keys or press extra keys.
- $matrix = id(new PhutilEditDistanceMatrix())
- ->setInsertCost(4)
- ->setDeleteCost(4)
- ->setReplaceCost(3)
- ->setTransposeCost(2);
-
- return self::correctSpelling($command, $options, $matrix, $max_distance);
- }
-
- public static function correctArgumentSpelling($command, array $options) {
- $max_distance = 1;
-
- // We are stricter with arguments - we allow only one inserted or deleted
- // character. It is mainly to handle cases like --no-lint versus --nolint
- // or --reviewer versus --reviewers.
- $matrix = id(new PhutilEditDistanceMatrix())
- ->setInsertCost(1)
- ->setDeleteCost(1)
- ->setReplaceCost(10);
-
- return self::correctSpelling($command, $options, $matrix, $max_distance);
- }
-
- public static function correctSpelling(
- $input,
- array $options,
- PhutilEditDistanceMatrix $matrix,
- $max_distance) {
-
- $distances = array();
- $inputv = str_split($input);
- foreach ($options as $option) {
- $optionv = str_split($option);
- $matrix->setSequences($optionv, $inputv);
- $distances[$option] = $matrix->getEditDistance();
- }
-
- asort($distances);
- $best = min($max_distance, reset($distances));
- foreach ($distances as $option => $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) < $distance) {
- unset($distances[$option]);
- }
- }
-
- return array_keys($distances);
- }
-
}
diff --git a/src/configuration/__tests__/ArcanistBritishTestCase.php b/src/configuration/__tests__/ArcanistBritishTestCase.php
deleted file mode 100644
--- a/src/configuration/__tests__/ArcanistBritishTestCase.php
+++ /dev/null
@@ -1,97 +0,0 @@
-<?php
-
-final class ArcanistBritishTestCase extends PhutilTestCase {
-
- public function testCommandCompletion() {
- $this->assertCommandCompletion(
- array('land'),
- 'alnd',
- array('land', 'amend'));
-
- $this->assertCommandCompletion(
- array('branch'),
- 'brnach',
- array('branch', 'browse'));
-
- $this->assertCommandCompletion(
- array(),
- 'test',
- array('list', 'unit'));
-
- $this->assertCommandCompletion(
- array('list'),
- 'lists',
- array('list'));
-
- $this->assertCommandCompletion(
- array('diff'),
- 'dfif',
- array('diff'));
-
- $this->assertCommandCompletion(
- array('unit'),
- 'uint',
- array('unit', 'lint', 'list'));
-
- $this->assertCommandCompletion(
- array('list', 'lint'),
- 'nilt',
- array('unit', 'lint', 'list'));
- }
-
- private function assertCommandCompletion($expect, $input, $commands) {
- $result = ArcanistConfiguration::correctCommandSpelling(
- $input,
- $commands,
- 2);
-
- sort($result);
- sort($expect);
-
- $commands = implode(', ', $commands);
-
- $this->assertEqual(
- $expect,
- $result,
- pht('Correction of %s against: %s', $input, $commands));
- }
-
- public function testArgumentCompletion() {
- $this->assertArgumentCompletion(
- array('nolint'),
- 'no-lint',
- array('nolint', 'nounit'));
-
- $this->assertArgumentCompletion(
- array('reviewers'),
- 'reviewer',
- array('reviewers', 'cc'));
-
- $this->assertArgumentCompletion(
- array(),
- 'onlint',
- array('nolint'));
-
- $this->assertArgumentCompletion(
- array(),
- 'nolind',
- array('nolint'));
- }
-
- private function assertArgumentCompletion($expect, $input, $arguments) {
- $result = ArcanistConfiguration::correctArgumentSpelling(
- $input,
- $arguments);
-
- sort($result);
- sort($expect);
-
- $arguments = implode(', ', $arguments);
-
- $this->assertEqual(
- $expect,
- $result,
- pht('Correction of %s against: %s', $input, $arguments));
- }
-
-}
diff --git a/src/workflow/ArcanistWorkflow.php b/src/workflow/ArcanistWorkflow.php
--- a/src/workflow/ArcanistWorkflow.php
+++ b/src/workflow/ArcanistWorkflow.php
@@ -673,9 +673,8 @@
}
if (!array_key_exists($arg_key, $spec)) {
- $corrected = ArcanistConfiguration::correctArgumentSpelling(
- $arg_key,
- array_keys($spec));
+ $corrected = PhutilArgumentSpellingCorrector::newFlagCorrector()
+ ->correctSpelling($arg_key, array_keys($spec));
if (count($corrected) == 1) {
PhutilConsole::getConsole()->writeErr(
pht(
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Nov 16, 3:45 AM (2 d, 18 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
6752956
Default Alt Text
D16333.diff (7 KB)
Attached To
Mode
D16333: Remove command spelling correction from Arcanist
Attached
Detach File
Event Timeline
Log In to Comment