1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-20 12:30:56 +01:00

Move revision header warnings into custom fields

Summary:
Ref T5495. We currently show one warning in revision headers, about not having any reviewers.

I want to add a second warning (for missing Legalpad signatures). At least one install would like to add custom warnings (see T5495) which are so specific that we can't reasonably cover them in the upstream.

Generalize these header warnings by moving them to CustomField, so I can implement the Legalpad stuff without making a mess and the install in T5495 can use an extension.

Test Plan:
Hit all three header states, they look exactly like they did before this change:

{F173265}

Reviewers: btrahan, chad

Reviewed By: chad

Subscribers: epriestley

Maniphest Tasks: T5495

Differential Revision: https://secure.phabricator.com/D9793
This commit is contained in:
epriestley 2014-07-02 04:58:51 -07:00
parent 394dcb7900
commit 5a158b5b19
3 changed files with 72 additions and 29 deletions

View file

@ -115,6 +115,22 @@ final class DifferentialRevisionViewController extends DifferentialController {
} }
} }
$field_list = PhabricatorCustomField::getObjectFields(
$revision,
PhabricatorCustomField::ROLE_VIEW);
$field_list->setViewer($user);
$field_list->readFieldsFromStorage($revision);
$warning_handle_map = array();
foreach ($field_list->getFields() as $key => $field) {
$req = $field->getRequiredHandlePHIDsForRevisionHeaderWarnings();
foreach ($req as $phid) {
$warning_handle_map[$key][] = $phid;
$object_phids[] = $phid;
}
}
$handles = $this->loadViewerHandles($object_phids); $handles = $this->loadViewerHandles($object_phids);
$request_uri = $request->getRequestURI(); $request_uri = $request->getRequestURI();
@ -169,13 +185,6 @@ final class DifferentialRevisionViewController extends DifferentialController {
$visible_changesets = $changesets; $visible_changesets = $changesets;
} }
$field_list = PhabricatorCustomField::getObjectFields(
$revision,
PhabricatorCustomField::ROLE_VIEW);
$field_list->setViewer($user);
$field_list->readFieldsFromStorage($revision);
// TODO: This should be in a DiffQuery or similar. // TODO: This should be in a DiffQuery or similar.
$need_props = array(); $need_props = array();
@ -245,8 +254,15 @@ final class DifferentialRevisionViewController extends DifferentialController {
$revision_detail_box = $revision_detail->render(); $revision_detail_box = $revision_detail->render();
$revision_warnings = $this->buildRevisionWarnings($revision, $handles); $revision_warnings = $this->buildRevisionWarnings(
$revision,
$field_list,
$warning_handle_map,
$handles);
if ($revision_warnings) { if ($revision_warnings) {
$revision_warnings = id(new AphrontErrorView())
->setSeverity(AphrontErrorView::SEVERITY_WARNING)
->setErrors($revision_warnings);
$revision_detail_box->setErrorView($revision_warnings); $revision_detail_box->setErrorView($revision_warnings);
} }
@ -935,32 +951,21 @@ final class DifferentialRevisionViewController extends DifferentialController {
private function buildRevisionWarnings( private function buildRevisionWarnings(
DifferentialRevision $revision, DifferentialRevision $revision,
PhabricatorCustomFieldList $field_list,
array $warning_handle_map,
array $handles) { array $handles) {
$status_needs_review = ArcanistDifferentialRevisionStatus::NEEDS_REVIEW; $warnings = array();
if ($revision->getStatus() != $status_needs_review) { foreach ($field_list->getFields() as $key => $field) {
return; $phids = idx($warning_handle_map, $key, array());
} $field_handles = array_select_keys($handles, $phids);
$field_warnings = $field->getWarningsForRevisionHeader($field_handles);
foreach ($revision->getReviewers() as $reviewer) { foreach ($field_warnings as $warning) {
if (!$handles[$reviewer]->isDisabled()) { $warnings[] = $warning;
return;
} }
} }
$warnings = array(); return $warnings;
if ($revision->getReviewers()) {
$warnings[] = pht(
'This revision needs review, but all specified reviewers are '.
'disabled or inactive.');
} else {
$warnings[] = pht(
'This revision needs review, but there are no reviewers specified.');
}
return id(new AphrontErrorView())
->setSeverity(AphrontErrorView::SEVERITY_WARNING)
->setErrors($warnings);
} }
} }

View file

@ -74,6 +74,14 @@ abstract class DifferentialCustomField
return array(); return array();
} }
public function getRequiredHandlePHIDsForRevisionHeaderWarnings() {
return array();
}
public function getWarningsForRevisionHeader(array $handles) {
return array();
}
/* -( Integration with Commit Messages )----------------------------------- */ /* -( Integration with Commit Messages )----------------------------------- */

View file

@ -191,5 +191,35 @@ final class DifferentialReviewersField
} }
} }
public function getRequiredHandlePHIDsForRevisionHeaderWarnings() {
return mpull($this->getValue(), 'getReviewerPHID');
}
public function getWarningsForRevisionHeader(array $handles) {
$revision = $this->getObject();
$status_needs_review = ArcanistDifferentialRevisionStatus::NEEDS_REVIEW;
if ($revision->getStatus() != $status_needs_review) {
return array();
}
foreach ($this->getValue() as $reviewer) {
if (!$handles[$reviewer->getReviewerPHID()]->isDisabled()) {
return array();
}
}
$warnings = array();
if ($this->getValue()) {
$warnings[] = pht(
'This revision needs review, but all specified reviewers are '.
'disabled or inactive.');
} else {
$warnings[] = pht(
'This revision needs review, but there are no reviewers specified.');
}
return $warnings;
}
} }