mirror of
https://we.phorge.it/source/arcanist.git
synced 2025-01-04 03:41:01 +01:00
Modularize Arcanist settings, let users pick between ambiguous interpretations of arc browse ...
Summary: Ref T10895. This modularizes Arcanist settings, but doesn't do anything with them yet. When users type `arc browse X`, and only provide one "X", and there are several ways to interpret it, prompt them to choose one. Test Plan: Created a file named `T234`, ran `arc browse T234`, was prompted to interpret it as an object or a path. Reviewers: chad Reviewed By: chad Maniphest Tasks: T10895 Differential Revision: https://secure.phabricator.com/D16928
This commit is contained in:
parent
909668082e
commit
dc4e0f788d
4 changed files with 101 additions and 7 deletions
|
@ -350,6 +350,7 @@ phutil_register_library_map(array(
|
||||||
'ArcanistSemicolonSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistSemicolonSpacingXHPASTLinterRule.php',
|
'ArcanistSemicolonSpacingXHPASTLinterRule' => 'lint/linter/xhpast/rules/ArcanistSemicolonSpacingXHPASTLinterRule.php',
|
||||||
'ArcanistSemicolonSpacingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistSemicolonSpacingXHPASTLinterRuleTestCase.php',
|
'ArcanistSemicolonSpacingXHPASTLinterRuleTestCase' => 'lint/linter/xhpast/rules/__tests__/ArcanistSemicolonSpacingXHPASTLinterRuleTestCase.php',
|
||||||
'ArcanistSetConfigWorkflow' => 'workflow/ArcanistSetConfigWorkflow.php',
|
'ArcanistSetConfigWorkflow' => 'workflow/ArcanistSetConfigWorkflow.php',
|
||||||
|
'ArcanistSetting' => 'configuration/ArcanistSetting.php',
|
||||||
'ArcanistSettings' => 'configuration/ArcanistSettings.php',
|
'ArcanistSettings' => 'configuration/ArcanistSettings.php',
|
||||||
'ArcanistShellCompleteWorkflow' => 'workflow/ArcanistShellCompleteWorkflow.php',
|
'ArcanistShellCompleteWorkflow' => 'workflow/ArcanistShellCompleteWorkflow.php',
|
||||||
'ArcanistSingleLintEngine' => 'lint/engine/ArcanistSingleLintEngine.php',
|
'ArcanistSingleLintEngine' => 'lint/engine/ArcanistSingleLintEngine.php',
|
||||||
|
@ -787,6 +788,7 @@ phutil_register_library_map(array(
|
||||||
'ArcanistSemicolonSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
|
'ArcanistSemicolonSpacingXHPASTLinterRule' => 'ArcanistXHPASTLinterRule',
|
||||||
'ArcanistSemicolonSpacingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
|
'ArcanistSemicolonSpacingXHPASTLinterRuleTestCase' => 'ArcanistXHPASTLinterRuleTestCase',
|
||||||
'ArcanistSetConfigWorkflow' => 'ArcanistWorkflow',
|
'ArcanistSetConfigWorkflow' => 'ArcanistWorkflow',
|
||||||
|
'ArcanistSetting' => 'Phobject',
|
||||||
'ArcanistSettings' => 'Phobject',
|
'ArcanistSettings' => 'Phobject',
|
||||||
'ArcanistShellCompleteWorkflow' => 'ArcanistWorkflow',
|
'ArcanistShellCompleteWorkflow' => 'ArcanistWorkflow',
|
||||||
'ArcanistSingleLintEngine' => 'ArcanistLintEngine',
|
'ArcanistSingleLintEngine' => 'ArcanistLintEngine',
|
||||||
|
|
|
@ -154,6 +154,9 @@ EOTEXT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$pick_map = array();
|
||||||
|
$pick_selection = null;
|
||||||
|
$pick_id = 0;
|
||||||
if ($many_hits) {
|
if ($many_hits) {
|
||||||
foreach ($many_hits as $ref) {
|
foreach ($many_hits as $ref) {
|
||||||
$token = $ref->getToken();
|
$token = $ref->getToken();
|
||||||
|
@ -166,8 +169,17 @@ EOTEXT
|
||||||
$this->writeWarn(pht('AMBIGUOUS'), $message);
|
$this->writeWarn(pht('AMBIGUOUS'), $message);
|
||||||
}
|
}
|
||||||
|
|
||||||
$table = id(new PhutilConsoleTable())
|
$is_single_ref = (count($refs) == 1);
|
||||||
->addColumn('argument', array('title' => pht('Argument')))
|
|
||||||
|
$table = id(new PhutilConsoleTable());
|
||||||
|
|
||||||
|
if ($is_single_ref) {
|
||||||
|
$table->addColumn('pick', array('title' => pht('Pick')));
|
||||||
|
} else {
|
||||||
|
$table->addColumn('argument', array('title' => pht('Argument')));
|
||||||
|
}
|
||||||
|
|
||||||
|
$table
|
||||||
->addColumn('type', array('title' => pht('Type')))
|
->addColumn('type', array('title' => pht('Type')))
|
||||||
->addColumn('uri', array('title' => pht('URI')));
|
->addColumn('uri', array('title' => pht('URI')));
|
||||||
|
|
||||||
|
@ -178,7 +190,11 @@ EOTEXT
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($ref->getURIs() as $uri) {
|
foreach ($ref->getURIs() as $uri) {
|
||||||
|
++$pick_id;
|
||||||
|
$pick_map[$pick_id] = $uri;
|
||||||
|
|
||||||
$row = array(
|
$row = array(
|
||||||
|
'pick' => $pick_id,
|
||||||
'argument' => $token_display,
|
'argument' => $token_display,
|
||||||
'type' => $uri->getType(),
|
'type' => $uri->getType(),
|
||||||
'uri' => $uri->getURI(),
|
'uri' => $uri->getURI(),
|
||||||
|
@ -190,9 +206,17 @@ EOTEXT
|
||||||
|
|
||||||
$table->draw();
|
$table->draw();
|
||||||
|
|
||||||
$this->writeInfo(
|
if ($is_single_ref) {
|
||||||
pht('CHOOSE'),
|
$pick_selection = phutil_console_select(
|
||||||
pht('Use "--types" to select between alternatives.'));
|
pht('Which URI do you want to open?'),
|
||||||
|
1,
|
||||||
|
$pick_id);
|
||||||
|
$open_uris[] = $ref;
|
||||||
|
} else {
|
||||||
|
$this->writeInfo(
|
||||||
|
pht('CHOOSE'),
|
||||||
|
pht('Use "--types" to select between alternatives.'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If anything failed to resolve, this is also an error.
|
// If anything failed to resolve, this is also an error.
|
||||||
|
@ -212,7 +236,17 @@ EOTEXT
|
||||||
|
|
||||||
$uris = array();
|
$uris = array();
|
||||||
foreach ($open_uris as $ref) {
|
foreach ($open_uris as $ref) {
|
||||||
$ref_uri = head($ref->getURIs());
|
$ref_uris = $ref->getURIs();
|
||||||
|
|
||||||
|
if (count($ref_uris) > 1) {
|
||||||
|
foreach ($ref_uris as $uri_key => $uri) {
|
||||||
|
if ($pick_map[$pick_selection] !== $uri) {
|
||||||
|
unset($ref_uris[$uri_key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ref_uri = head($ref_uris);
|
||||||
$uris[] = $ref_uri->getURI();
|
$uris[] = $ref_uri->getURI();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
48
src/configuration/ArcanistSetting.php
Normal file
48
src/configuration/ArcanistSetting.php
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
abstract class ArcanistSetting
|
||||||
|
extends Phobject {
|
||||||
|
|
||||||
|
final public function getSettingKey() {
|
||||||
|
return $this->getPhobjectClassConstant('SETTINGKEY', 32);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAliases() {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
abstract public function getHelp();
|
||||||
|
abstract public function getType();
|
||||||
|
|
||||||
|
public function getExample() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
final public function getLegacyDictionary() {
|
||||||
|
$result = array(
|
||||||
|
'type' => $this->getType(),
|
||||||
|
'help' => $this->getHelp(),
|
||||||
|
);
|
||||||
|
|
||||||
|
$example = $this->getExample();
|
||||||
|
if ($example !== null) {
|
||||||
|
$result['example'] = $example;
|
||||||
|
}
|
||||||
|
|
||||||
|
$aliases = $this->getAliases();
|
||||||
|
if ($aliases) {
|
||||||
|
$result['legacy'] = head($aliases);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
final public static function getAllSettings() {
|
||||||
|
return id(new PhutilClassMapQuery())
|
||||||
|
->setAncestorClass(__CLASS__)
|
||||||
|
->setUniqueMethod('getSettingKey')
|
||||||
|
->setSortMethod('getSettingKey')
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -3,7 +3,7 @@
|
||||||
final class ArcanistSettings extends Phobject {
|
final class ArcanistSettings extends Phobject {
|
||||||
|
|
||||||
private function getOptions() {
|
private function getOptions() {
|
||||||
return array(
|
$legacy_builtins = array(
|
||||||
'default' => array(
|
'default' => array(
|
||||||
'type' => 'string',
|
'type' => 'string',
|
||||||
'help' => pht(
|
'help' => pht(
|
||||||
|
@ -175,6 +175,16 @@ final class ArcanistSettings extends Phobject {
|
||||||
'Configured command aliases. Use "arc alias" to define aliases.'),
|
'Configured command aliases. Use "arc alias" to define aliases.'),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$settings = ArcanistSetting::getAllSettings();
|
||||||
|
foreach ($settings as $key => $setting) {
|
||||||
|
$settings[$key] = $setting->getLegacyDictionary();
|
||||||
|
}
|
||||||
|
|
||||||
|
$results = $settings + $legacy_builtins;
|
||||||
|
ksort($results);
|
||||||
|
|
||||||
|
return $results;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function getOption($key) {
|
private function getOption($key) {
|
||||||
|
|
Loading…
Reference in a new issue