Don't fatal on duplicate field in commit message

Summary:
If the actual commit message has a duplicate field and we shouldAutoclose it then the commit message parser fails.
Put the error in `$errors` instead.

Test Plan:
Reparsed commit with duplicate field in message.
Tried to `arc diff` message with duplicate field.

Reviewers: epriestley, nh

Reviewed By: epriestley

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D3470
This commit is contained in:
vrana
2012-09-10 17:09:10 -07:00
parent 99949bec8d
commit d28c591e74

View File

@@ -22,6 +22,8 @@
final class ConduitAPI_differential_parsecommitmessage_Method final class ConduitAPI_differential_parsecommitmessage_Method
extends ConduitAPIMethod { extends ConduitAPIMethod {
private $errors;
public function getMethodDescription() { public function getMethodDescription() {
return "Parse commit messages for Differential fields."; return "Parse commit messages for Differential fields.";
} }
@@ -58,13 +60,14 @@ final class ConduitAPI_differential_parsecommitmessage_Method
$aux_fields = mpull($aux_fields, null, 'getCommitMessageKey'); $aux_fields = mpull($aux_fields, null, 'getCommitMessageKey');
$this->errors = array();
// Build a map from labels (like "Test Plan") to field keys // Build a map from labels (like "Test Plan") to field keys
// (like "testPlan"). // (like "testPlan").
$label_map = $this->buildLabelMap($aux_fields); $label_map = $this->buildLabelMap($aux_fields);
$field_map = $this->parseCommitMessage($corpus, $label_map); $field_map = $this->parseCommitMessage($corpus, $label_map);
$fields = array(); $fields = array();
$errors = array();
foreach ($field_map as $field_key => $field_value) { foreach ($field_map as $field_key => $field_value) {
$field = $aux_fields[$field_key]; $field = $aux_fields[$field_key];
try { try {
@@ -72,7 +75,8 @@ final class ConduitAPI_differential_parsecommitmessage_Method
$field->setValueFromParsedCommitMessage($fields[$field_key]); $field->setValueFromParsedCommitMessage($fields[$field_key]);
} catch (DifferentialFieldParseException $ex) { } catch (DifferentialFieldParseException $ex) {
$field_label = $field->renderLabelForCommitMessage(); $field_label = $field->renderLabelForCommitMessage();
$errors[] = "Error parsing field '{$field_label}': ".$ex->getMessage(); $this->errors[] =
"Error parsing field '{$field_label}': ".$ex->getMessage();
} }
} }
@@ -82,7 +86,7 @@ final class ConduitAPI_differential_parsecommitmessage_Method
$aux_field->validateField(); $aux_field->validateField();
} catch (DifferentialFieldValidationException $ex) { } catch (DifferentialFieldValidationException $ex) {
$field_label = $aux_field->renderLabelForCommitMessage(); $field_label = $aux_field->renderLabelForCommitMessage();
$errors[] = $this->errors[] =
"Invalid or missing field '{$field_label}': ". "Invalid or missing field '{$field_label}': ".
$ex->getMessage(); $ex->getMessage();
} }
@@ -90,7 +94,7 @@ final class ConduitAPI_differential_parsecommitmessage_Method
} }
return array( return array(
'errors' => $errors, 'errors' => $this->errors,
'fields' => $fields, 'fields' => $fields,
); );
} }
@@ -144,8 +148,7 @@ final class ConduitAPI_differential_parsecommitmessage_Method
$lines[$key] = trim($match['text']); $lines[$key] = trim($match['text']);
$field = $label_map[strtolower($match['field'])]; $field = $label_map[strtolower($match['field'])];
if (!empty($seen[$field])) { if (!empty($seen[$field])) {
throw new Exception( $this->errors[] = "Field '{$field}' occurs twice in commit message!";
"Field '{$field}' occurs twice in commit message!");
} }
$seen[$field] = true; $seen[$field] = true;
} }