1
0
Fork 0
mirror of https://we.phorge.it/source/arcanist.git synced 2024-11-22 14:52:40 +01:00

Improve argument parsing for "arc patch --revision Dxxx"

Summary: See PHI527. Ref T13116. The `--revision` flag currently fails if the argument is in the form `D123` instead of `123`. Normalize monogram arguments.

Test Plan: Ran `arc patch --revision Dxxx`, `arc patch --revision xxx`, `arc patch --revision xxx --diff yyy`, `arc patch`; got good behavior on the good ones and sensible error messages on the other ones.

Maniphest Tasks: T13116

Differential Revision: https://secure.phabricator.com/D19292
This commit is contained in:
epriestley 2018-04-03 10:31:39 -07:00
parent b8c9c385a7
commit e44a2d3ac0

View file

@ -115,66 +115,59 @@ EOTEXT
}
protected function didParseArguments() {
$source = null;
$requested = 0;
if ($this->getArgument('revision')) {
$source = self::SOURCE_REVISION;
$requested++;
}
if ($this->getArgument('diff')) {
$source = self::SOURCE_DIFF;
$requested++;
}
if ($this->getArgument('arcbundle')) {
$source = self::SOURCE_BUNDLE;
$requested++;
}
if ($this->getArgument('patch')) {
$source = self::SOURCE_PATCH;
$requested++;
$arguments = array(
'revision' => self::SOURCE_REVISION,
'diff' => self::SOURCE_DIFF,
'arcbundle' => self::SOURCE_BUNDLE,
'patch' => self::SOURCE_PATCH,
'name' => self::SOURCE_REVISION,
);
$sources = array();
foreach ($arguments as $key => $source_type) {
$value = $this->getArgument($key);
if (!$value) {
continue;
}
$use_revision_id = null;
if ($this->getArgument('name')) {
$namev = $this->getArgument('name');
if (count($namev) > 1) {
switch ($key) {
case 'revision':
$value = $this->normalizeRevisionID($value);
break;
case 'name':
if (count($value) > 1) {
throw new ArcanistUsageException(
pht('Specify at most one revision name.'));
}
$source = self::SOURCE_REVISION;
$requested++;
$use_revision_id = $this->normalizeRevisionID(head($namev));
$value = $this->normalizeRevisionID(head($value));
break;
}
if ($requested === 0) {
throw new ArcanistUsageException(
pht(
"Specify one of '%s', '%s' (to select the current changes attached ".
"to a Differential revision), '%s' (to select a specific, ".
"out-of-date diff or a diff which is not attached to a revision), ".
"'%s' or '%s' to choose a patch source.",
'D12345',
'--revision <revision_id>',
'--diff <diff_id>',
'--arcbundle <file>',
'--patch <file>'));
} else if ($requested > 1) {
throw new ArcanistUsageException(
pht(
"Options '%s', '%s', '%s', '%s' and '%s' are not compatible. ".
"Choose exactly one patch source.",
'D12345',
'--revision',
'--diff',
'--arcbundle',
'--patch'));
$sources[] = array(
$source_type,
$value,
);
}
$this->source = $source;
$this->sourceParam = nonempty(
$use_revision_id,
$this->getArgument($source));
if (!$sources) {
throw new ArcanistUsageException(
pht(
'You must specify changes to apply to the working copy with '.
'"D12345", "--revision", "--diff", "--arcbundle", or "--patch".'));
}
if (count($sources) > 1) {
throw new ArcanistUsageException(
pht(
'Options "D12345", "--revision", "--diff", "--arcbundle" and '.
'"--patch" are mutually exclusive. Choose exactly one patch '.
'source.'));
}
$source = head($sources);
$this->source = $source[0];
$this->sourceParam = $source[1];
}
public function requiresConduit() {