1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2025-02-16 16:58:38 +01:00

Make Arcanist workflow names explicit

Summary:
Currently, adding a new workflow requires you to override ArcanistConfiguration, which is messy. Instead, just load everything that extends ArcanistBaseWorkflow.

Remove all the rules tying workflow names to class names through arcane incantations.

This has a very small performance cost in that we need to load every Workflow class every time now, but we don't hit __init__ and such anymore and it was pretty negligible on my machine (98ms vs 104ms or something).

Test Plan: Ran "arc help", "arc which", "arc diff", etc.

Reviewers: edward, vrana, btrahan

Reviewed By: edward

CC: aran, zeeg

Differential Revision: https://secure.phabricator.com/D3691
This commit is contained in:
epriestley 2012-10-17 08:35:03 -07:00
parent 2d269aefed
commit 4c476c0201
36 changed files with 157 additions and 44 deletions

View file

@ -45,53 +45,29 @@ class ArcanistConfiguration {
$command = 'help'; $command = 'help';
} }
if ($command == 'base') { return idx($this->buildAllWorkflows(), $command);
return null;
}
$workflow_class = 'Arcanist'.ucfirst($command).'Workflow';
$workflow_class = preg_replace_callback(
'/-([a-z])/',
array(
'ArcanistConfiguration',
'replaceClassnameHyphens',
),
$workflow_class);
$symbols = id(new PhutilSymbolLoader())
->setType('class')
->setName($workflow_class)
->setLibrary('arcanist')
->selectAndLoadSymbols();
if (!$symbols) {
return null;
}
return newv($workflow_class, array());
} }
public function buildAllWorkflows() { public function buildAllWorkflows() {
$symbols = id(new PhutilSymbolLoader()) $symbols = id(new PhutilSymbolLoader())
->setType('class') ->setType('class')
->setAncestorClass('ArcanistBaseWorkflow') ->setAncestorClass('ArcanistBaseWorkflow')
->setLibrary('arcanist')
->selectAndLoadSymbols(); ->selectAndLoadSymbols();
$workflows = array(); $workflows = array();
foreach ($symbols as $symbol) { foreach ($symbols as $symbol) {
$class = $symbol['name']; $class = $symbol['name'];
$name = preg_replace('/^Arcanist(\w+)Workflow$/', '\1', $class); $workflow = newv($class, array());
$name[0] = strtolower($name[0]); $name = $workflow->getWorkflowName();
$name = preg_replace_callback(
'/[A-Z]/', if (isset($workflows[$name])) {
array( $other = get_class($workflows[$name]);
'ArcanistConfiguration', throw new Exception(
'replaceClassnameUppers', "Workflows {$class} and {$other} both implement workflows named ".
), "{$name}.");
$name); }
$name = strtolower($name);
$workflows[$name] = newv($class, array()); $workflows[$workflow->getWorkflowName()] = $workflow;
} }
return $workflows; return $workflows;
@ -114,12 +90,4 @@ class ArcanistConfiguration {
return array(); return array();
} }
public static function replaceClassnameHyphens($m) {
return strtoupper($m[1]);
}
public static function replaceClassnameUppers($m) {
return '-'.strtolower($m[0]);
}
} }

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistAliasWorkflow extends ArcanistBaseWorkflow { final class ArcanistAliasWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'alias';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**alias** **alias**

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistAmendWorkflow extends ArcanistBaseWorkflow { final class ArcanistAmendWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'amend';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**amend** [--revision __revision_id__] [--show] **amend** [--revision __revision_id__] [--show]

View file

@ -21,6 +21,10 @@
*/ */
final class ArcanistAnoidWorkflow extends ArcanistBaseWorkflow { final class ArcanistAnoidWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'anoid';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**anoid** **anoid**

View file

@ -83,6 +83,14 @@ abstract class ArcanistBaseWorkflow {
abstract public function run(); abstract public function run();
/**
* Return the command used to invoke this workflow from the command like,
* e.g. "help" for @{class:ArcanistHelpWorkflow}.
*
* @return string The command a user types to invoke this workflow.
*/
abstract public function getWorkflowName();
/* -( Conduit )------------------------------------------------------------ */ /* -( Conduit )------------------------------------------------------------ */

View file

@ -25,6 +25,10 @@ final class ArcanistBranchWorkflow extends ArcanistBaseWorkflow {
private $branches; private $branches;
public function getWorkflowName() {
return 'branch';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**branch** [__options__] **branch** [__options__]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistCallConduitWorkflow extends ArcanistBaseWorkflow { final class ArcanistCallConduitWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'call-conduit';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**call-conduit** __method__ **call-conduit** __method__

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistCloseRevisionWorkflow extends ArcanistBaseWorkflow { final class ArcanistCloseRevisionWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'close-revision';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**close-revision** [__options__] __revision__ **close-revision** [__options__] __revision__

View file

@ -33,6 +33,11 @@ final class ArcanistCloseWorkflow extends ArcanistBaseWorkflow {
"open" => 0 "open" => 0
); );
public function getWorkflowName() {
return 'close';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**close** __task_id__ [__options__] **close** __task_id__ [__options__]

View file

@ -25,6 +25,10 @@ final class ArcanistCommitWorkflow extends ArcanistBaseWorkflow {
private $revisionID; private $revisionID;
public function getWorkflowName() {
return 'commit';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**commit** [--revision __revision_id__] [--show] **commit** [--revision __revision_id__] [--show]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistCoverWorkflow extends ArcanistBaseWorkflow { final class ArcanistCoverWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'cover';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**cover** [--rev __revision__] [__path__ ...] **cover** [--rev __revision__] [__path__ ...]

View file

@ -41,6 +41,10 @@ final class ArcanistDiffWorkflow extends ArcanistBaseWorkflow {
private $diffPropertyFutures = array(); private $diffPropertyFutures = array();
private $commitMessageFromRevision; private $commitMessageFromRevision;
public function getWorkflowName() {
return 'diff';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**diff** [__paths__] (svn) **diff** [__paths__] (svn)

View file

@ -27,6 +27,10 @@ final class ArcanistDownloadWorkflow extends ArcanistBaseWorkflow {
private $saveAs; private $saveAs;
private $show; private $show;
public function getWorkflowName() {
return 'download';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**download** __file__ [--as __name__] [--show] **download** __file__ [--as __name__] [--show]

View file

@ -35,6 +35,10 @@ final class ArcanistExportWorkflow extends ArcanistBaseWorkflow {
private $sourceID; private $sourceID;
private $format; private $format;
public function getWorkflowName() {
return 'export';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**export** [__paths__] __format__ (svn) **export** [__paths__] __format__ (svn)

View file

@ -43,6 +43,10 @@ final class ArcanistFlagWorkflow extends ArcanistBaseWorkflow {
'checkered' => 7, 'c' => 7, 7 => 7, 'checkered' => 7, 'c' => 7, 7 => 7,
); );
public function getWorkflowName() {
return 'flag';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**flag** [__object__ ...] **flag** [__object__ ...]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistGetConfigWorkflow extends ArcanistBaseWorkflow { final class ArcanistGetConfigWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'get-config';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**get-config** -- [__name__ ...] **get-config** -- [__name__ ...]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistGitHookPreReceiveWorkflow extends ArcanistBaseWorkflow { final class ArcanistGitHookPreReceiveWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'git-hook-pre-receive';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**git-hook-pre-receive** **git-hook-pre-receive**

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistHelpWorkflow extends ArcanistBaseWorkflow { final class ArcanistHelpWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'help';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**help** [__command__] **help** [__command__]

View file

@ -21,6 +21,10 @@
*/ */
final class ArcanistInlinesWorkflow extends ArcanistBaseWorkflow { final class ArcanistInlinesWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'inlines';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**inlines** [--revision __revision_id__] **inlines** [--revision __revision_id__]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistInstallCertificateWorkflow extends ArcanistBaseWorkflow { final class ArcanistInstallCertificateWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'install-certificate';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**install-certificate** [uri] **install-certificate** [uri]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistLandWorkflow extends ArcanistBaseWorkflow { final class ArcanistLandWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'land';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**land** [__options__] [__branch__] [--onto __master__] **land** [__options__] [__branch__] [--onto __master__]

View file

@ -29,6 +29,10 @@
*/ */
final class ArcanistLiberateWorkflow extends ArcanistBaseWorkflow { final class ArcanistLiberateWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'liberate';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**liberate** [__path__] **liberate** [__path__]

View file

@ -36,6 +36,10 @@ class ArcanistLintWorkflow extends ArcanistBaseWorkflow {
private $engine; private $engine;
private $postponedLinters; private $postponedLinters;
public function getWorkflowName() {
return 'lint';
}
public function setShouldAmendChanges($should_amend) { public function setShouldAmendChanges($should_amend) {
$this->shouldAmendChanges = $should_amend; $this->shouldAmendChanges = $should_amend;
return $this; return $this;

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistListWorkflow extends ArcanistBaseWorkflow { final class ArcanistListWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'list';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**list** **list**

View file

@ -21,6 +21,10 @@
*/ */
final class ArcanistMarkCommittedWorkflow extends ArcanistBaseWorkflow { final class ArcanistMarkCommittedWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'mark-committed';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**mark-committed** (DEPRECATED) **mark-committed** (DEPRECATED)

View file

@ -28,6 +28,10 @@ final class ArcanistPasteWorkflow extends ArcanistBaseWorkflow {
private $title; private $title;
private $json; private $json;
public function getWorkflowName() {
return 'paste';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**paste** [--title __title__] [--lang __language__] [--json] **paste** [--title __title__] [--lang __language__] [--json]

View file

@ -31,6 +31,10 @@ final class ArcanistPatchWorkflow extends ArcanistBaseWorkflow {
private $source; private $source;
private $sourceParam; private $sourceParam;
public function getWorkflowName() {
return 'patch';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**patch** __D12345__ **patch** __D12345__

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistSetConfigWorkflow extends ArcanistBaseWorkflow { final class ArcanistSetConfigWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'set-config';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**set-config** [__options__] -- __name__ __value__ **set-config** [__options__] -- __name__ __value__

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistShellCompleteWorkflow extends ArcanistBaseWorkflow { final class ArcanistShellCompleteWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'shell-complete';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**shell-complete** __--current__ __N__ -- [__argv__] **shell-complete** __--current__ __N__ -- [__argv__]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistSvnHookPreCommitWorkflow extends ArcanistBaseWorkflow { final class ArcanistSvnHookPreCommitWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'svn-hook-pre-commit';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**svn-hook-pre-commit** __repository__ __transaction__ **svn-hook-pre-commit** __repository__ __transaction__

View file

@ -25,6 +25,10 @@ final class ArcanistTasksWorkflow extends ArcanistBaseWorkflow {
private $tasks; private $tasks;
public function getWorkflowName() {
return 'tasks';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**tasks** [__options__] **tasks** [__options__]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistTodoWorkflow extends ArcanistBaseWorkflow { final class ArcanistTodoWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'todo';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**todo** __summary__ [__options__] **todo** __summary__ [__options__]

View file

@ -33,6 +33,10 @@ final class ArcanistUnitWorkflow extends ArcanistBaseWorkflow {
private $testResults; private $testResults;
private $engine; private $engine;
public function getWorkflowName() {
return 'unit';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**unit** [__options__] [__paths__] **unit** [__options__] [__paths__]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistUpgradeWorkflow extends ArcanistBaseWorkflow { final class ArcanistUpgradeWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'upgrade';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**upgrade** **upgrade**

View file

@ -26,6 +26,10 @@ final class ArcanistUploadWorkflow extends ArcanistBaseWorkflow {
private $paths; private $paths;
private $json; private $json;
public function getWorkflowName() {
return 'upload';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**upload** __file__ [__file__ ...] [--json] **upload** __file__ [__file__ ...] [--json]

View file

@ -23,6 +23,10 @@
*/ */
final class ArcanistWhichWorkflow extends ArcanistBaseWorkflow { final class ArcanistWhichWorkflow extends ArcanistBaseWorkflow {
public function getWorkflowName() {
return 'which';
}
public function getCommandSynopses() { public function getCommandSynopses() {
return phutil_console_format(<<<EOTEXT return phutil_console_format(<<<EOTEXT
**which** (svn) **which** (svn)