mirror of
https://we.phorge.it/source/arcanist.git
synced 2024-11-25 16:22:42 +01:00
Add "--conduit-timeout" to arc
and modernize argument parsing
Summary: We added "repeat" to PhutilArgumentParser a while ago, so we can modernize the rest of the argument parsing (allow multiple --load-phutil-library flags). Add a "--conduit-timeout" flag to allow users to set the timeout. See D2602. Test Plan: $ arc diff --conduit-timeout=0.01 Exception [cURL/28] <CURLE_OPERATION_TIMEOUTED> The request took too long to complete. (Run with --trace for a full exception trace.) $ arc diff --conduit-version 33 Exception ERR-BAD-VERSION: Your 'arc' client version is '33', which is newer than the server version, '5'. Upgrade your Phabricator install. (Run with --trace for a full exception trace.) $ arc diff --conduit-uri http://derp.derp/ Usage Exception: YOU NEED TO INSTALL A CERTIFICATE TO LOGIN TO PHABRICATOR You are trying to connect to 'http://derp.derp/api/' but do not have a certificate installed for this host. Run: $ arc install-certificate ...to install one. $ arc diff --load-phutil-library src --load-phutil-library ../phabricator/src --trace Loading phutil library '0' from '/INSECURE/devtools/arcanist/src'... Loading phutil library '1' from '/INSECURE/devtools/phabricator/src'... Reviewers: phleet, vrana, btrahan Reviewed By: btrahan CC: aran Differential Revision: https://secure.phabricator.com/D2603
This commit is contained in:
parent
35b60d7562
commit
d016f81135
3 changed files with 84 additions and 25 deletions
|
@ -26,31 +26,41 @@ ini_set('memory_limit', -1);
|
||||||
$original_argv = $argv;
|
$original_argv = $argv;
|
||||||
$args = new PhutilArgumentParser($argv);
|
$args = new PhutilArgumentParser($argv);
|
||||||
$args->parseStandardArguments();
|
$args->parseStandardArguments();
|
||||||
|
$args->parsePartial(
|
||||||
|
array(
|
||||||
|
array(
|
||||||
|
'name' => 'load-phutil-library',
|
||||||
|
'param' => 'path',
|
||||||
|
'help' => 'Load a libphutil library.',
|
||||||
|
'repeat' => true,
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'conduit-uri',
|
||||||
|
'param' => 'uri',
|
||||||
|
'help' => 'Connect to Phabricator install specified by __uri__.',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'conduit-version',
|
||||||
|
'param' => 'version',
|
||||||
|
'help' => '(Developers) Mock client version in protocol handshake.',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'conduit-timeout',
|
||||||
|
'param' => 'timeout',
|
||||||
|
'help' => 'Set Conduit timeout (in seconds).',
|
||||||
|
),
|
||||||
|
));
|
||||||
|
|
||||||
$argv = $args->getUnconsumedArgumentVector();
|
|
||||||
$config_trace_mode = $args->getArg('trace');
|
$config_trace_mode = $args->getArg('trace');
|
||||||
|
|
||||||
$force_conduit = null;
|
$force_conduit = $args->getArg('conduit-uri');
|
||||||
$force_conduit_version = null;
|
$force_conduit_version = $args->getArg('conduit-version');
|
||||||
$args = $argv;
|
$conduit_timeout = $args->getArg('conduit-timeout');
|
||||||
$load = array();
|
$load = $args->getArg('load-phutil-library');
|
||||||
$matches = null;
|
|
||||||
foreach ($args as $key => $arg) {
|
$argv = $args->getUnconsumedArgumentVector();
|
||||||
if ($arg == '--') {
|
$args = array_values($argv);
|
||||||
break;
|
|
||||||
} else if (preg_match('/^--load-phutil-library=(.*)$/', $arg, $matches)) {
|
|
||||||
unset($args[$key]);
|
|
||||||
$load[] = $matches[1];
|
|
||||||
} else if (preg_match('/^--conduit-uri=(.*)$/', $arg, $matches)) {
|
|
||||||
unset($args[$key]);
|
|
||||||
$force_conduit = $matches[1];
|
|
||||||
} else if (preg_match('/^--conduit-version=(.*)$/', $arg, $matches)) {
|
|
||||||
unset($args[$key]);
|
|
||||||
$force_conduit_version = $matches[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$args = array_values($args);
|
|
||||||
$working_directory = getcwd();
|
$working_directory = getcwd();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -170,6 +180,9 @@ try {
|
||||||
if ($force_conduit_version) {
|
if ($force_conduit_version) {
|
||||||
$workflow->forceConduitVersion($force_conduit_version);
|
$workflow->forceConduitVersion($force_conduit_version);
|
||||||
}
|
}
|
||||||
|
if ($conduit_timeout) {
|
||||||
|
$workflow->setConduitTimeout($conduit_timeout);
|
||||||
|
}
|
||||||
|
|
||||||
$need_working_copy = $workflow->requiresWorkingCopy();
|
$need_working_copy = $workflow->requiresWorkingCopy();
|
||||||
$need_conduit = $workflow->requiresConduit();
|
$need_conduit = $workflow->requiresConduit();
|
||||||
|
@ -289,7 +302,7 @@ try {
|
||||||
}
|
}
|
||||||
|
|
||||||
echo phutil_console_format(
|
echo phutil_console_format(
|
||||||
"\n**Exception:**\n%s\n%s\n",
|
"**Exception**\n%s\n%s\n",
|
||||||
$ex->getMessage(),
|
$ex->getMessage(),
|
||||||
"(Run with --trace for a full exception trace.)");
|
"(Run with --trace for a full exception trace.)");
|
||||||
|
|
||||||
|
|
|
@ -57,6 +57,7 @@ abstract class ArcanistBaseWorkflow {
|
||||||
private $conduitCredentials;
|
private $conduitCredentials;
|
||||||
private $conduitAuthenticated;
|
private $conduitAuthenticated;
|
||||||
private $forcedConduitVersion;
|
private $forcedConduitVersion;
|
||||||
|
private $conduitTimeout;
|
||||||
|
|
||||||
private $userPHID;
|
private $userPHID;
|
||||||
private $userName;
|
private $userName;
|
||||||
|
@ -146,6 +147,10 @@ abstract class ArcanistBaseWorkflow {
|
||||||
|
|
||||||
$this->conduit = new ConduitClient($this->conduitURI);
|
$this->conduit = new ConduitClient($this->conduitURI);
|
||||||
|
|
||||||
|
if ($this->conduitTimeout) {
|
||||||
|
$this->conduit->setTimeout($this->conduitTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,15 +184,54 @@ abstract class ArcanistBaseWorkflow {
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Force arc to identify with a specific Conduit version during the
|
||||||
|
* protocol handshake. This is primarily useful for development (especially
|
||||||
|
* for sending diffs which bump the client Conduit version), since the client
|
||||||
|
* still actually speaks the builtin version of the protocol.
|
||||||
|
*
|
||||||
|
* Controlled by the --conduit-version flag.
|
||||||
|
*
|
||||||
|
* @param int Version the client should pretend to be.
|
||||||
|
* @return this
|
||||||
|
* @task conduit
|
||||||
|
*/
|
||||||
public function forceConduitVersion($version) {
|
public function forceConduitVersion($version) {
|
||||||
$this->forcedConduitVersion = $version;
|
$this->forcedConduitVersion = $version;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the protocol version the client should identify with.
|
||||||
|
*
|
||||||
|
* @return int Version the client should claim to be.
|
||||||
|
* @task conduit
|
||||||
|
*/
|
||||||
public function getConduitVersion() {
|
public function getConduitVersion() {
|
||||||
return nonempty($this->forcedConduitVersion, 5);
|
return nonempty($this->forcedConduitVersion, 5);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Override the default timeout for Conduit.
|
||||||
|
*
|
||||||
|
* Controlled by the --conduit-timeout flag.
|
||||||
|
*
|
||||||
|
* @param float Timeout, in seconds.
|
||||||
|
* @return this
|
||||||
|
* @task conduit
|
||||||
|
*/
|
||||||
|
public function setConduitTimeout($timeout) {
|
||||||
|
$this->conduitTimeout = $timeout;
|
||||||
|
if ($this->conduit) {
|
||||||
|
$this->conduit->setConduitTimeout($timeout);
|
||||||
|
}
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Open and authenticate a conduit connection to a Phabricator server using
|
* Open and authenticate a conduit connection to a Phabricator server using
|
||||||
* provided credentials. Normally, Arcanist does this for you automatically
|
* provided credentials. Normally, Arcanist does this for you automatically
|
||||||
|
@ -307,7 +351,7 @@ abstract class ArcanistBaseWorkflow {
|
||||||
* @task conduit
|
* @task conduit
|
||||||
*/
|
*/
|
||||||
final protected function isConduitAuthenticated() {
|
final protected function isConduitAuthenticated() {
|
||||||
return (bool) $this->conduitAuthenticated;
|
return (bool)$this->conduitAuthenticated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -195,15 +195,17 @@ EOTEXT
|
||||||
Ignore libraries listed in .arcconfig and explicitly load specified
|
Ignore libraries listed in .arcconfig and explicitly load specified
|
||||||
libraries instead. Mostly useful for Arcanist development.
|
libraries instead. Mostly useful for Arcanist development.
|
||||||
|
|
||||||
__--conduit-uri=...__
|
__--conduit-uri__ __uri__
|
||||||
Ignore configured Conduit URI and use an explicit one instead. Mostly
|
Ignore configured Conduit URI and use an explicit one instead. Mostly
|
||||||
useful for Arcanist development.
|
useful for Arcanist development.
|
||||||
|
|
||||||
__--conduit-version=...__
|
__--conduit-version__ __version__
|
||||||
Ignore software version and claim to be running some other version
|
Ignore software version and claim to be running some other version
|
||||||
instead. Mostly useful for Arcanist development. May cause bad things
|
instead. Mostly useful for Arcanist development. May cause bad things
|
||||||
to happen.
|
to happen.
|
||||||
|
|
||||||
|
__--conduit-timeout__ __timeout__
|
||||||
|
Override the default Conduit timeout. Specified in seconds.
|
||||||
|
|
||||||
EOTEXT
|
EOTEXT
|
||||||
);
|
);
|
||||||
|
|
Loading…
Reference in a new issue