2011-01-10 00:22:25 +01:00
|
|
|
#!/usr/bin/env php
|
|
|
|
<?php
|
|
|
|
|
[Wilds] Rewrite "arc" entrypoints for toolsets
Summary:
Ref T13098. Depends on D19675. This change is headed to the `untamed-wilds` branch.
This change prevents `arc` from running `arc diff`, so I'm copy/pasting it.
This change also completely breaks `arc`, but I'm just generally trying to do this rewrite step-by-step so we have at least a bit of context to refer to in the future.
The major change here is to turn both `arc` and `phage` into scripts which start an `ArcanistRuntime`. This runtime then decides which workflows (like "diff", "patch", or "remote") are available based on `$argv[0]`. This turns `arc` into more of a CLI tools platform: we can build `phage` on it, third parties can build `my-companion-tool-thing`, etc. But all the different entry points can share a lot of infrastructure like: `help`, `alias`, shell-complete, configuration, Conduit, prompting, `--trace`, extension infrastructure, and so on.
`ArcanistRuntime` is roughly a slightly more modern version of `scripts/arcanist.php`. That will be removed eventually, but not everything has ported yet.
Test Plan: This code basically doesn't run yet, although the next patch runs at least a little bit.
Reviewers: amckinley
Reviewed By: amckinley
Maniphest Tasks: T13098
Differential Revision: https://secure.phabricator.com/D19677
2018-09-14 20:26:56 +02:00
|
|
|
if (function_exists('pcntl_async_signals')) {
|
|
|
|
pcntl_async_signals(true);
|
|
|
|
} else {
|
|
|
|
declare(ticks = 1);
|
|
|
|
}
|
|
|
|
|
|
|
|
require_once dirname(dirname(__FILE__)).'/scripts/init/init-arcanist.php';
|
|
|
|
|
|
|
|
$runtime = new ArcanistRuntime();
|
|
|
|
return $runtime->execute($argv);
|
|
|
|
|
2012-03-08 21:20:26 +01:00
|
|
|
|
2014-06-17 00:28:04 +02:00
|
|
|
$config_trace_mode = $base_args->getArg('trace');
|
2012-06-03 17:31:49 +02:00
|
|
|
|
2014-06-17 00:28:04 +02:00
|
|
|
$force_conduit = $base_args->getArg('conduit-uri');
|
2015-05-05 23:02:54 +02:00
|
|
|
$force_token = $base_args->getArg('conduit-token');
|
Begin modernizing the Arcanist interaction with Conduit
Summary:
Ref T10895.
NOTE: I'm going to land this and other changes to a new `experimental` branch until `arc` is more substantially rebuilt, since everything I touch feels like it requires me to rebuild 30 other things first.
Currently, many `arc` workflows are unnecessarily slow because they call `conduit.connect` on startup. There's no need to do this with the modern way the API works, and we've generally moved away from explicit version testing to more granular capability testing on specific workflows.
Additionally, some workflows like `arc patch` are huge messes (see T11434) because they're trying to run in anonymous mode but it doesn't really work with all the upfront stuff Conduit does now. It's not possible, in the general case, for a workflow to know upfront if it needs Conduit or not.
And:
- `ArcanistWorkflow` has piles of Conduit logic, but should not.
- Pooling Conduit requests isn't very easy.
- There's a lot of general cruft around the workflow.
- We should drop certificate support.
This pulls out Conduit into a separate on-demand class with modern support, future pooling, less cruft, inline handling of login issues, and generally less garbage.
Also adds an `--anonymous` flag, mostly to make testing easier.
Test Plan: Ran `arc browse`, used `--anonymous` and `--trace`, fiddled with credentials, got approximatley the same behavior that mainline `arc` has.
Reviewers: chad, avivey
Reviewed By: avivey
Subscribers: avivey
Maniphest Tasks: T10895
Differential Revision: https://secure.phabricator.com/D16921
2016-11-23 00:55:18 +01:00
|
|
|
$is_anonymous = $base_args->getArg('anonymous');
|
2014-06-17 00:28:04 +02:00
|
|
|
$load = $base_args->getArg('load-phutil-library');
|
|
|
|
$help = $base_args->getArg('help');
|
|
|
|
$args = array_values($base_args->getUnconsumedArgumentVector());
|
2011-01-10 00:22:25 +01:00
|
|
|
|
2012-07-06 19:05:49 +02:00
|
|
|
$console = PhutilConsole::getConsole();
|
2012-10-30 18:44:49 +01:00
|
|
|
$config = null;
|
2012-12-31 01:01:59 +01:00
|
|
|
$workflow = null;
|
2011-01-10 00:22:25 +01:00
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
$command = strtolower($args[0]);
|
2012-02-21 22:16:52 +01:00
|
|
|
$args = array_slice($args, 1);
|
2013-10-19 01:10:06 +02:00
|
|
|
$workflow = $config->selectWorkflow(
|
|
|
|
$command,
|
|
|
|
$args,
|
|
|
|
$configuration_manager,
|
|
|
|
$console);
|
|
|
|
$workflow->setConfigurationManager($configuration_manager);
|
2011-01-10 00:22:25 +01:00
|
|
|
$workflow->setArcanistConfiguration($config);
|
|
|
|
$workflow->setCommand($command);
|
2011-06-14 21:18:40 +02:00
|
|
|
$workflow->setWorkingDirectory($working_directory);
|
2012-02-21 22:16:52 +01:00
|
|
|
$workflow->parseArguments($args);
|
2011-01-10 00:22:25 +01:00
|
|
|
|
2013-10-10 15:18:37 +02:00
|
|
|
// Write the command into the environment so that scripts (for example, local
|
|
|
|
// Git commit hooks) can detect that they're being run via `arc` and change
|
|
|
|
// their behaviors.
|
|
|
|
putenv('ARCANIST='.$command);
|
|
|
|
|
2015-02-03 21:32:46 +01:00
|
|
|
$need_working_copy = $workflow->requiresWorkingCopy();
|
|
|
|
|
2015-02-02 20:54:22 +01:00
|
|
|
$supported_vcs_types = $workflow->getSupportedRevisionControlSystems();
|
2015-02-03 21:32:46 +01:00
|
|
|
$vcs_type = $working_copy->getVCSType();
|
|
|
|
if ($vcs_type || $need_working_copy) {
|
|
|
|
if (!in_array($vcs_type, $supported_vcs_types)) {
|
|
|
|
throw new ArcanistUsageException(
|
|
|
|
pht(
|
|
|
|
'`%s %s` is only supported under %s.',
|
|
|
|
'arc',
|
|
|
|
$workflow->getWorkflowName(),
|
|
|
|
implode(', ', $supported_vcs_types)));
|
|
|
|
}
|
2015-02-02 20:54:22 +01:00
|
|
|
}
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
$need_conduit = $workflow->requiresConduit();
|
|
|
|
$need_auth = $workflow->requiresAuthentication();
|
|
|
|
$need_repository_api = $workflow->requiresRepositoryAPI();
|
|
|
|
|
2012-06-14 01:02:29 +02:00
|
|
|
$want_repository_api = $workflow->desiresRepositoryAPI();
|
|
|
|
$want_working_copy = $workflow->desiresWorkingCopy() ||
|
|
|
|
$want_repository_api;
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
$need_conduit = $need_conduit ||
|
|
|
|
$need_auth;
|
|
|
|
$need_working_copy = $need_working_copy ||
|
|
|
|
$need_repository_api;
|
|
|
|
|
2012-06-14 01:02:29 +02:00
|
|
|
if ($need_working_copy || $want_working_copy) {
|
2014-03-26 01:32:58 +01:00
|
|
|
if ($need_working_copy && !$working_copy->getVCSType()) {
|
2011-01-14 00:36:15 +01:00
|
|
|
throw new ArcanistUsageException(
|
2015-01-06 13:14:04 +01:00
|
|
|
pht(
|
|
|
|
'This command must be run in a Git, Mercurial or Subversion '.
|
|
|
|
'working copy.'));
|
2011-01-14 00:36:15 +01:00
|
|
|
}
|
2013-10-19 01:10:06 +02:00
|
|
|
$configuration_manager->setWorkingCopyIdentity($working_copy);
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
|
2011-07-14 00:03:40 +02:00
|
|
|
if ($force_conduit) {
|
|
|
|
$conduit_uri = $force_conduit;
|
|
|
|
} else {
|
2014-05-13 20:36:56 +02:00
|
|
|
$conduit_uri = $configuration_manager->getConfigFromAnySource(
|
Allow `arc` to identify repositories without "project_id"
Summary:
Ref T4343. Continues the process of reducing the prominence of Arcanist Projects. Primarily:
- Query Phabricator to identify the working copy based on explicit configuration, or guess based on heuristics.
- Enhance `arc which` to explain the process to the user.
- The `project_id` key is no longer required in `.arcconfig`.
Minor/cleanup changes:
- Rename `project_id` to `project.name` (consistency, clarity).
- Rename `conduit_uri` to `phabricator.uri` (consistency, clairty).
- These both need documentation updates.
- Add `repository.callsign` to explicitly bind to a repository.
- Updated `.arcconfig` for the new values.
- Fix a unit test which broke a while ago when we fixed a rare definition of "unstaged".
- Make `getRepositoryUUID()` generic so we can get rid of one `instanceof`.
Test Plan:
- Ran `arc which`.
- Ran `arc diff`.
- This doesn't really change anything, so the only real risk is version compatibility breaks. This //does// introduce such a break, but the window is very narrow: if you upgrade `arc` after this commit, and try to diff against a Phabricator which was updated after yesterday (D8068) but before D8072 lands, the lookup will work so we'll add `repositoryPHID` to the `differential.creatediff` call, but it won't exist in Phabricator yet. This window is so narrow that I'm not going to try to fix it, as I'd guess there is a significant chance that no users will be affected. I don't see a clever way to fix it that doesn't involve a lot of work, either.
Reviewers: btrahan
Reviewed By: btrahan
CC: aran
Maniphest Tasks: T4343
Differential Revision: https://secure.phabricator.com/D8073
2014-01-27 00:31:30 +01:00
|
|
|
'phabricator.uri');
|
2014-05-13 20:36:56 +02:00
|
|
|
if ($conduit_uri === null) {
|
2015-01-06 13:14:04 +01:00
|
|
|
$conduit_uri = $configuration_manager->getConfigFromAnySource('default');
|
Allow 'arc' to run without '.arcconfig'
Summary:
This is mostly an onboarding thing, but also allows "arc upload", "arc download", and "arc paste" to work anywhere on the system.
- Try to read the Phabricator install URI from arc global config if we can't find ".arcconfig".
- Build a WorkingCopy anyway if we can't find ".arcconfig", as long as we can find ".svn", ".git", or ".hg".
- Make all the workflows handle "no project ID" at least somewhat gracefully.
Test Plan:
- Ran "arc diff" in .arcconfig-less Mercurial, Git, and Subversion working copies.
- Ran "arc upload" and "arc download" from my desktop.
- Ran "arc paste" from somewhere random.
- Cleared my config and hit the error, got useful instructions.
Reviewers: btrahan, csilvers
Reviewed By: csilvers
CC: aran
Differential Revision: https://secure.phabricator.com/D2424
2012-05-08 00:24:58 +02:00
|
|
|
}
|
2011-07-14 00:03:40 +02:00
|
|
|
}
|
2014-05-13 20:36:56 +02:00
|
|
|
|
2011-07-14 00:03:40 +02:00
|
|
|
if ($conduit_uri) {
|
|
|
|
// Set the URI path to '/api/'. TODO: Originally, I contemplated letting
|
|
|
|
// you deploy Phabricator somewhere other than the domain root, but ended
|
|
|
|
// up never pursuing that. We should get rid of all "/api/" silliness
|
|
|
|
// in things users are expected to configure. This is already happening
|
|
|
|
// to some degree, e.g. "arc install-certificate" does it for you.
|
|
|
|
$conduit_uri = new PhutilURI($conduit_uri);
|
|
|
|
$conduit_uri->setPath('/api/');
|
|
|
|
$conduit_uri = (string)$conduit_uri;
|
|
|
|
}
|
|
|
|
$workflow->setConduitURI($conduit_uri);
|
|
|
|
|
2013-08-04 17:21:35 +02:00
|
|
|
// Apply global CA bundle from configs.
|
2013-10-19 01:10:06 +02:00
|
|
|
$ca_bundle = $configuration_manager->getConfigFromAnySource('https.cabundle');
|
|
|
|
if ($ca_bundle) {
|
2013-08-04 17:21:35 +02:00
|
|
|
$ca_bundle = Filesystem::resolvePath(
|
|
|
|
$ca_bundle, $working_copy->getProjectRoot());
|
|
|
|
HTTPSFuture::setGlobalCABundleFromPath($ca_bundle);
|
|
|
|
}
|
|
|
|
|
2013-09-26 00:26:38 +02:00
|
|
|
$blind_key = 'https.blindly-trust-domains';
|
2013-10-19 01:10:06 +02:00
|
|
|
$blind_trust = $configuration_manager->getConfigFromAnySource($blind_key);
|
2013-09-26 00:26:38 +02:00
|
|
|
if ($blind_trust) {
|
2016-06-09 19:48:32 +02:00
|
|
|
$trust_extension = PhutilHTTPEngineExtension::requireExtension(
|
|
|
|
ArcanistBlindlyTrustHTTPEngineExtension::EXTENSIONKEY);
|
|
|
|
$trust_extension->setDomains($blind_trust);
|
2013-09-26 00:26:38 +02:00
|
|
|
}
|
|
|
|
|
2011-07-14 00:03:40 +02:00
|
|
|
if ($need_conduit) {
|
2011-01-10 00:22:25 +01:00
|
|
|
if (!$conduit_uri) {
|
Allow 'arc' to run without '.arcconfig'
Summary:
This is mostly an onboarding thing, but also allows "arc upload", "arc download", and "arc paste" to work anywhere on the system.
- Try to read the Phabricator install URI from arc global config if we can't find ".arcconfig".
- Build a WorkingCopy anyway if we can't find ".arcconfig", as long as we can find ".svn", ".git", or ".hg".
- Make all the workflows handle "no project ID" at least somewhat gracefully.
Test Plan:
- Ran "arc diff" in .arcconfig-less Mercurial, Git, and Subversion working copies.
- Ran "arc upload" and "arc download" from my desktop.
- Ran "arc paste" from somewhere random.
- Cleared my config and hit the error, got useful instructions.
Reviewers: btrahan, csilvers
Reviewed By: csilvers
CC: aran
Differential Revision: https://secure.phabricator.com/D2424
2012-05-08 00:24:58 +02:00
|
|
|
|
|
|
|
$message = phutil_console_format(
|
2015-01-06 13:14:04 +01:00
|
|
|
"%s\n\n - %s\n - %s\n - %s\n",
|
|
|
|
pht(
|
|
|
|
'This command requires arc to connect to a Phabricator install, '.
|
|
|
|
'but no Phabricator installation is configured. To configure a '.
|
|
|
|
'Phabricator URI:'),
|
|
|
|
pht(
|
|
|
|
'set a default location with `%s`; or',
|
|
|
|
'arc set-config default <uri>'),
|
|
|
|
pht(
|
|
|
|
'specify `%s` explicitly; or',
|
|
|
|
'--conduit-uri=uri'),
|
|
|
|
pht(
|
|
|
|
"run `%s` in a working copy with an '%s'.",
|
|
|
|
'arc',
|
|
|
|
'.arcconfig'));
|
Allow 'arc' to run without '.arcconfig'
Summary:
This is mostly an onboarding thing, but also allows "arc upload", "arc download", and "arc paste" to work anywhere on the system.
- Try to read the Phabricator install URI from arc global config if we can't find ".arcconfig".
- Build a WorkingCopy anyway if we can't find ".arcconfig", as long as we can find ".svn", ".git", or ".hg".
- Make all the workflows handle "no project ID" at least somewhat gracefully.
Test Plan:
- Ran "arc diff" in .arcconfig-less Mercurial, Git, and Subversion working copies.
- Ran "arc upload" and "arc download" from my desktop.
- Ran "arc paste" from somewhere random.
- Cleared my config and hit the error, got useful instructions.
Reviewers: btrahan, csilvers
Reviewed By: csilvers
CC: aran
Differential Revision: https://secure.phabricator.com/D2424
2012-05-08 00:24:58 +02:00
|
|
|
|
|
|
|
$message = phutil_console_wrap($message);
|
|
|
|
throw new ArcanistUsageException($message);
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
2011-07-14 00:03:40 +02:00
|
|
|
$workflow->establishConduit();
|
|
|
|
}
|
2011-02-06 08:32:04 +01:00
|
|
|
|
2011-07-14 00:03:40 +02:00
|
|
|
$hosts_config = idx($user_config, 'hosts', array());
|
|
|
|
$host_config = idx($hosts_config, $conduit_uri, array());
|
|
|
|
$user_name = idx($host_config, 'user');
|
|
|
|
$certificate = idx($host_config, 'cert');
|
2014-12-15 20:12:38 +01:00
|
|
|
$conduit_token = idx($host_config, 'token');
|
2015-05-07 20:09:58 +02:00
|
|
|
if ($force_token) {
|
|
|
|
$conduit_token = $force_token;
|
|
|
|
}
|
2011-01-10 00:22:25 +01:00
|
|
|
|
Begin modernizing the Arcanist interaction with Conduit
Summary:
Ref T10895.
NOTE: I'm going to land this and other changes to a new `experimental` branch until `arc` is more substantially rebuilt, since everything I touch feels like it requires me to rebuild 30 other things first.
Currently, many `arc` workflows are unnecessarily slow because they call `conduit.connect` on startup. There's no need to do this with the modern way the API works, and we've generally moved away from explicit version testing to more granular capability testing on specific workflows.
Additionally, some workflows like `arc patch` are huge messes (see T11434) because they're trying to run in anonymous mode but it doesn't really work with all the upfront stuff Conduit does now. It's not possible, in the general case, for a workflow to know upfront if it needs Conduit or not.
And:
- `ArcanistWorkflow` has piles of Conduit logic, but should not.
- Pooling Conduit requests isn't very easy.
- There's a lot of general cruft around the workflow.
- We should drop certificate support.
This pulls out Conduit into a separate on-demand class with modern support, future pooling, less cruft, inline handling of login issues, and generally less garbage.
Also adds an `--anonymous` flag, mostly to make testing easier.
Test Plan: Ran `arc browse`, used `--anonymous` and `--trace`, fiddled with credentials, got approximatley the same behavior that mainline `arc` has.
Reviewers: chad, avivey
Reviewed By: avivey
Subscribers: avivey
Maniphest Tasks: T10895
Differential Revision: https://secure.phabricator.com/D16921
2016-11-23 00:55:18 +01:00
|
|
|
if ($is_anonymous) {
|
|
|
|
$conduit_token = null;
|
|
|
|
}
|
|
|
|
|
2012-03-08 21:20:26 +01:00
|
|
|
$description = implode(' ', $original_argv);
|
2011-07-14 00:03:40 +02:00
|
|
|
$credentials = array(
|
2014-12-15 20:12:38 +01:00
|
|
|
'user' => $user_name,
|
2011-07-14 00:03:40 +02:00
|
|
|
'certificate' => $certificate,
|
|
|
|
'description' => $description,
|
2014-12-15 20:12:38 +01:00
|
|
|
'token' => $conduit_token,
|
2011-07-14 00:03:40 +02:00
|
|
|
);
|
|
|
|
$workflow->setConduitCredentials($credentials);
|
|
|
|
|
Begin modernizing the Arcanist interaction with Conduit
Summary:
Ref T10895.
NOTE: I'm going to land this and other changes to a new `experimental` branch until `arc` is more substantially rebuilt, since everything I touch feels like it requires me to rebuild 30 other things first.
Currently, many `arc` workflows are unnecessarily slow because they call `conduit.connect` on startup. There's no need to do this with the modern way the API works, and we've generally moved away from explicit version testing to more granular capability testing on specific workflows.
Additionally, some workflows like `arc patch` are huge messes (see T11434) because they're trying to run in anonymous mode but it doesn't really work with all the upfront stuff Conduit does now. It's not possible, in the general case, for a workflow to know upfront if it needs Conduit or not.
And:
- `ArcanistWorkflow` has piles of Conduit logic, but should not.
- Pooling Conduit requests isn't very easy.
- There's a lot of general cruft around the workflow.
- We should drop certificate support.
This pulls out Conduit into a separate on-demand class with modern support, future pooling, less cruft, inline handling of login issues, and generally less garbage.
Also adds an `--anonymous` flag, mostly to make testing easier.
Test Plan: Ran `arc browse`, used `--anonymous` and `--trace`, fiddled with credentials, got approximatley the same behavior that mainline `arc` has.
Reviewers: chad, avivey
Reviewed By: avivey
Subscribers: avivey
Maniphest Tasks: T10895
Differential Revision: https://secure.phabricator.com/D16921
2016-11-23 00:55:18 +01:00
|
|
|
$basic_user = $configuration_manager->getConfigFromAnySource(
|
|
|
|
'http.basicauth.user');
|
|
|
|
$basic_pass = $configuration_manager->getConfigFromAnySource(
|
|
|
|
'http.basicauth.pass');
|
|
|
|
|
|
|
|
$engine = id(new ArcanistConduitEngine())
|
|
|
|
->setConduitURI($conduit_uri)
|
|
|
|
->setConduitToken($conduit_token)
|
|
|
|
->setBasicAuthUser($basic_user)
|
|
|
|
->setBasicAuthPass($basic_pass);
|
|
|
|
|
|
|
|
$workflow->setConduitEngine($engine);
|
|
|
|
|
2011-07-14 00:03:40 +02:00
|
|
|
if ($need_auth) {
|
2014-12-15 20:12:38 +01:00
|
|
|
if ((!$user_name || !$certificate) && (!$conduit_token)) {
|
2013-05-25 05:20:20 +02:00
|
|
|
$arc = 'arc';
|
|
|
|
if ($force_conduit) {
|
|
|
|
$arc .= csprintf(' --conduit-uri=%s', $conduit_uri);
|
|
|
|
}
|
|
|
|
|
2014-12-15 20:12:38 +01:00
|
|
|
$conduit_domain = id(new PhutilURI($conduit_uri))->getDomain();
|
|
|
|
|
2011-06-27 05:43:24 +02:00
|
|
|
throw new ArcanistUsageException(
|
|
|
|
phutil_console_format(
|
2015-01-06 13:14:04 +01:00
|
|
|
"%s\n\n%s\n\n%s **%s:**\n\n $ **{$arc} install-certificate**\n",
|
|
|
|
pht('YOU NEED TO AUTHENTICATE TO CONTINUE'),
|
|
|
|
pht(
|
|
|
|
'You are trying to connect to a server (%s) that you '.
|
|
|
|
'do not have any credentials stored for.',
|
|
|
|
$conduit_domain),
|
|
|
|
pht('To retrieve and store credentials for this server,'),
|
|
|
|
pht('run this command')));
|
2011-06-27 05:43:24 +02:00
|
|
|
}
|
2011-07-14 00:03:40 +02:00
|
|
|
$workflow->authenticateConduit();
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
|
2014-03-26 01:32:58 +01:00
|
|
|
if ($need_repository_api ||
|
|
|
|
($want_repository_api && $working_copy->getVCSType())) {
|
2013-10-19 01:10:06 +02:00
|
|
|
$repository_api = ArcanistRepositoryAPI::newAPIFromConfigurationManager(
|
|
|
|
$configuration_manager);
|
2011-01-10 00:22:25 +01:00
|
|
|
$workflow->setRepositoryAPI($repository_api);
|
|
|
|
}
|
|
|
|
|
2013-10-19 01:10:06 +02:00
|
|
|
$listeners = $configuration_manager->getConfigFromAnySource(
|
|
|
|
'events.listeners');
|
2011-11-10 22:47:45 +01:00
|
|
|
if ($listeners) {
|
|
|
|
foreach ($listeners as $listener) {
|
2012-09-05 20:45:54 +02:00
|
|
|
$console->writeLog(
|
2015-01-06 13:14:04 +01:00
|
|
|
"%s\n",
|
|
|
|
pht("Registering event listener '%s'.", $listener));
|
2012-09-05 20:45:54 +02:00
|
|
|
try {
|
|
|
|
id(new $listener())->register();
|
|
|
|
} catch (PhutilMissingSymbolException $ex) {
|
2014-07-12 16:45:38 +02:00
|
|
|
// Continue anyway, since you may otherwise be unable to run commands
|
2012-10-16 19:01:35 +02:00
|
|
|
// like `arc set-config events.listeners` in order to repair the damage
|
2013-11-20 21:46:38 +01:00
|
|
|
// you've caused. We're writing out the entire exception here because
|
|
|
|
// it might not have been triggered by the listener itself (for example,
|
|
|
|
// the listener might use a bad class in its register() method).
|
2012-09-05 20:45:54 +02:00
|
|
|
$console->writeErr(
|
2015-01-06 13:14:04 +01:00
|
|
|
"%s\n",
|
|
|
|
pht(
|
|
|
|
"ERROR: Failed to load event listener '%s': %s",
|
|
|
|
$listener,
|
|
|
|
$ex->getMessage()));
|
2012-09-05 20:45:54 +02:00
|
|
|
}
|
2011-11-10 22:47:45 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
$config->willRunWorkflow($command, $workflow);
|
|
|
|
$workflow->willRunWorkflow();
|
2013-03-21 23:51:39 +01:00
|
|
|
try {
|
|
|
|
$err = $workflow->run();
|
|
|
|
$config->didRunWorkflow($command, $workflow, $err);
|
|
|
|
} catch (Exception $e) {
|
|
|
|
$workflow->finalize();
|
|
|
|
throw $e;
|
|
|
|
}
|
|
|
|
$workflow->finalize();
|
2012-06-14 01:01:29 +02:00
|
|
|
exit((int)$err);
|
2011-01-10 00:22:25 +01:00
|
|
|
|
2013-01-24 23:45:21 +01:00
|
|
|
} catch (ArcanistNoEffectException $ex) {
|
|
|
|
echo $ex->getMessage()."\n";
|
|
|
|
|
2012-10-16 19:21:56 +02:00
|
|
|
} catch (Exception $ex) {
|
|
|
|
$is_usage = ($ex instanceof ArcanistUsageException);
|
|
|
|
if ($is_usage) {
|
2015-05-28 01:10:32 +02:00
|
|
|
fwrite(STDERR, phutil_console_format(
|
2015-01-06 13:14:04 +01:00
|
|
|
"**%s** %s\n",
|
|
|
|
pht('Usage Exception:'),
|
Begin modernizing the Arcanist interaction with Conduit
Summary:
Ref T10895.
NOTE: I'm going to land this and other changes to a new `experimental` branch until `arc` is more substantially rebuilt, since everything I touch feels like it requires me to rebuild 30 other things first.
Currently, many `arc` workflows are unnecessarily slow because they call `conduit.connect` on startup. There's no need to do this with the modern way the API works, and we've generally moved away from explicit version testing to more granular capability testing on specific workflows.
Additionally, some workflows like `arc patch` are huge messes (see T11434) because they're trying to run in anonymous mode but it doesn't really work with all the upfront stuff Conduit does now. It's not possible, in the general case, for a workflow to know upfront if it needs Conduit or not.
And:
- `ArcanistWorkflow` has piles of Conduit logic, but should not.
- Pooling Conduit requests isn't very easy.
- There's a lot of general cruft around the workflow.
- We should drop certificate support.
This pulls out Conduit into a separate on-demand class with modern support, future pooling, less cruft, inline handling of login issues, and generally less garbage.
Also adds an `--anonymous` flag, mostly to make testing easier.
Test Plan: Ran `arc browse`, used `--anonymous` and `--trace`, fiddled with credentials, got approximatley the same behavior that mainline `arc` has.
Reviewers: chad, avivey
Reviewed By: avivey
Subscribers: avivey
Maniphest Tasks: T10895
Differential Revision: https://secure.phabricator.com/D16921
2016-11-23 00:55:18 +01:00
|
|
|
rtrim($ex->getMessage())));
|
2011-01-10 00:22:25 +01:00
|
|
|
}
|
|
|
|
|
2012-10-30 18:44:49 +01:00
|
|
|
if ($config) {
|
|
|
|
$config->didAbortWorkflow($command, $workflow, $ex);
|
|
|
|
}
|
2012-10-16 19:21:56 +02:00
|
|
|
|
2011-01-10 00:22:25 +01:00
|
|
|
if ($config_trace_mode) {
|
2015-05-28 01:10:32 +02:00
|
|
|
fwrite(STDERR, "\n");
|
2011-01-10 00:22:25 +01:00
|
|
|
throw $ex;
|
|
|
|
}
|
|
|
|
|
2012-10-16 19:21:56 +02:00
|
|
|
if (!$is_usage) {
|
2017-04-20 23:50:03 +02:00
|
|
|
fwrite(STDERR, phutil_console_format(
|
|
|
|
"<bg:red>** %s **</bg>\n", pht('Exception')));
|
2014-06-24 01:24:00 +02:00
|
|
|
|
|
|
|
while ($ex) {
|
2015-05-28 01:10:32 +02:00
|
|
|
fwrite(STDERR, $ex->getMessage()."\n");
|
2014-06-24 01:24:00 +02:00
|
|
|
|
|
|
|
if ($ex instanceof PhutilProxyException) {
|
|
|
|
$ex = $ex->getPreviousException();
|
|
|
|
} else {
|
|
|
|
$ex = null;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-01 17:46:17 +02:00
|
|
|
fwrite(STDERR, phutil_console_format(
|
2015-01-06 13:14:04 +01:00
|
|
|
"(%s)\n",
|
2015-05-28 01:10:32 +02:00
|
|
|
pht('Run with `%s` for a full exception trace.', '--trace')));
|
2012-10-16 19:21:56 +02:00
|
|
|
}
|
2011-01-10 00:22:25 +01:00
|
|
|
|
|
|
|
exit(1);
|
|
|
|
}
|
2011-12-22 19:23:29 +01:00
|
|
|
|
|
|
|
|
Allow global config to load libraries and set test engines
Summary:
Khan Academy is looking into lint configuration, but doesn't use ".arcconfig" because they have a large number of repositories. Making configuration more flexible generally gives us more options for onboarding installs.
- Currently, only project config (".arcconfig") can load libraries. Allow user config ("~/.arcrc") to load libraries as well.
- Currently, only project config can set lint/unit engines. Allow user config to set default lint/unit engines.
- Add some type checking to "arc set-config".
- Add "arc set-config --show".
Test Plan:
- **load**
- Ran `arc set-config load xxx`, got error about format.
- Ran `arc set-config load ["apple"]`, got warning on running 'arc' commands (no such library) but was able to run 'arc set-config' again to clear it.
- Ran `arc set-config load ["/path/to/a/lib/src/"]`, worked.
- Ran `arc list --trace`, verified my library loaded in addition to `.arcconfig` libraries.
- Ran `arc list --load-phutil-library=xxx --trace`, verified only that library loaded.
- Ran `arc list --trace --load-phutil-library=apple --trace`, got hard error about bad library.
- Set `.arcconfig` to point at a bad library, verified hard error.
- **lint.engine** / **unit.engine**
- Removed lint engine from `.arcconfig`, ran "arc lint", got a run with specified engine.
- Removed unit engine from `.arcconfig`, ran "arc unit", got a run with specified engine.
- **--show**
- Ran `arc set-config --show`.
- **misc**
- Ran `arc get-config`.
Reviewers: csilvers, btrahan, vrana
Reviewed By: csilvers
CC: aran
Differential Revision: https://secure.phabricator.com/D2618
2012-05-31 20:41:39 +02:00
|
|
|
|
|
|
|
|
|
|
|
|