1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-12-19 03:50:54 +01:00

Move Differential's remaining field views to extensble field schema

Summary:
Move all the rest of the fields into the custom field schema, for revision
views.

I left a couple of stubs in here (willWriteRevision, didWriteRevision) since I'd
planned to do edits here too, but this diff is sort of big-ish already. I'll do
all the edit fields in the next revision.

Depends on D808.

Test Plan: Viewed, edited and conduit'ed some revisions.
Reviewed By: jungejason
Reviewers: jungejason, tuomaspelkonen, aran
CC: aran, jungejason, epriestley
Differential Revision: 809
This commit is contained in:
epriestley 2011-08-14 13:55:30 -07:00
parent 5038b26018
commit 442d1dbeaa
17 changed files with 598 additions and 188 deletions

View file

@ -139,6 +139,7 @@ phutil_register_library_map(array(
'DifferentialAuxiliaryField' => 'applications/differential/storage/auxiliaryfield', 'DifferentialAuxiliaryField' => 'applications/differential/storage/auxiliaryfield',
'DifferentialBlameRevisionFieldSpecification' => 'applications/differential/field/specification/blamerev', 'DifferentialBlameRevisionFieldSpecification' => 'applications/differential/field/specification/blamerev',
'DifferentialCCWelcomeMail' => 'applications/differential/mail/ccwelcome', 'DifferentialCCWelcomeMail' => 'applications/differential/mail/ccwelcome',
'DifferentialCCsFieldSpecification' => 'applications/differential/field/specification/ccs',
'DifferentialChangeType' => 'applications/differential/constants/changetype', 'DifferentialChangeType' => 'applications/differential/constants/changetype',
'DifferentialChangeset' => 'applications/differential/storage/changeset', 'DifferentialChangeset' => 'applications/differential/storage/changeset',
'DifferentialChangesetDetailView' => 'applications/differential/view/changesetdetailview', 'DifferentialChangesetDetailView' => 'applications/differential/view/changesetdetailview',
@ -180,6 +181,7 @@ phutil_register_library_map(array(
'DifferentialInlineCommentPreviewController' => 'applications/differential/controller/inlinecommentpreview', 'DifferentialInlineCommentPreviewController' => 'applications/differential/controller/inlinecommentpreview',
'DifferentialInlineCommentView' => 'applications/differential/view/inlinecomment', 'DifferentialInlineCommentView' => 'applications/differential/view/inlinecomment',
'DifferentialLinesFieldSpecification' => 'applications/differential/field/specification/lines', 'DifferentialLinesFieldSpecification' => 'applications/differential/field/specification/lines',
'DifferentialLintFieldSpecification' => 'applications/differential/field/specification/lint',
'DifferentialLintStatus' => 'applications/differential/constants/lintstatus', 'DifferentialLintStatus' => 'applications/differential/constants/lintstatus',
'DifferentialMail' => 'applications/differential/mail/base', 'DifferentialMail' => 'applications/differential/mail/base',
'DifferentialManiphestTasksFieldSpecification' => 'applications/differential/field/specification/maniphesttasks', 'DifferentialManiphestTasksFieldSpecification' => 'applications/differential/field/specification/maniphesttasks',
@ -189,6 +191,7 @@ phutil_register_library_map(array(
'DifferentialReplyHandler' => 'applications/differential/replyhandler', 'DifferentialReplyHandler' => 'applications/differential/replyhandler',
'DifferentialRevertPlanFieldSpecification' => 'applications/differential/field/specification/revertplan', 'DifferentialRevertPlanFieldSpecification' => 'applications/differential/field/specification/revertplan',
'DifferentialReviewRequestMail' => 'applications/differential/mail/reviewrequest', 'DifferentialReviewRequestMail' => 'applications/differential/mail/reviewrequest',
'DifferentialReviewersFieldSpecification' => 'applications/differential/field/specification/reviewers',
'DifferentialRevision' => 'applications/differential/storage/revision', 'DifferentialRevision' => 'applications/differential/storage/revision',
'DifferentialRevisionCommentListView' => 'applications/differential/view/revisioncommentlist', 'DifferentialRevisionCommentListView' => 'applications/differential/view/revisioncommentlist',
'DifferentialRevisionCommentView' => 'applications/differential/view/revisioncomment', 'DifferentialRevisionCommentView' => 'applications/differential/view/revisioncomment',
@ -200,10 +203,12 @@ phutil_register_library_map(array(
'DifferentialRevisionListController' => 'applications/differential/controller/revisionlist', 'DifferentialRevisionListController' => 'applications/differential/controller/revisionlist',
'DifferentialRevisionListData' => 'applications/differential/data/revisionlist', 'DifferentialRevisionListData' => 'applications/differential/data/revisionlist',
'DifferentialRevisionStatus' => 'applications/differential/constants/revisionstatus', 'DifferentialRevisionStatus' => 'applications/differential/constants/revisionstatus',
'DifferentialRevisionStatusFieldSpecification' => 'applications/differential/field/specification/revisionstatus',
'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/revisionupdatehistory', 'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/revisionupdatehistory',
'DifferentialRevisionViewController' => 'applications/differential/controller/revisionview', 'DifferentialRevisionViewController' => 'applications/differential/controller/revisionview',
'DifferentialSubscribeController' => 'applications/differential/controller/subscribe', 'DifferentialSubscribeController' => 'applications/differential/controller/subscribe',
'DifferentialTasksAttacher' => 'applications/differential/tasks', 'DifferentialTasksAttacher' => 'applications/differential/tasks',
'DifferentialUnitFieldSpecification' => 'applications/differential/field/specification/unit',
'DifferentialUnitStatus' => 'applications/differential/constants/unitstatus', 'DifferentialUnitStatus' => 'applications/differential/constants/unitstatus',
'DifferentialUnitTestResult' => 'applications/differential/constants/unittestresult', 'DifferentialUnitTestResult' => 'applications/differential/constants/unittestresult',
'DifferentialViewTime' => 'applications/differential/storage/viewtime', 'DifferentialViewTime' => 'applications/differential/storage/viewtime',
@ -792,6 +797,7 @@ phutil_register_library_map(array(
'DifferentialAuxiliaryField' => 'DifferentialDAO', 'DifferentialAuxiliaryField' => 'DifferentialDAO',
'DifferentialBlameRevisionFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialBlameRevisionFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail', 'DifferentialCCWelcomeMail' => 'DifferentialReviewRequestMail',
'DifferentialCCsFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialChangeset' => 'DifferentialDAO', 'DifferentialChangeset' => 'DifferentialDAO',
'DifferentialChangesetDetailView' => 'AphrontView', 'DifferentialChangesetDetailView' => 'AphrontView',
'DifferentialChangesetListView' => 'AphrontView', 'DifferentialChangesetListView' => 'AphrontView',
@ -820,6 +826,7 @@ phutil_register_library_map(array(
'DifferentialInlineCommentPreviewController' => 'DifferentialController', 'DifferentialInlineCommentPreviewController' => 'DifferentialController',
'DifferentialInlineCommentView' => 'AphrontView', 'DifferentialInlineCommentView' => 'AphrontView',
'DifferentialLinesFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialLinesFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialLintFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialManiphestTasksFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialManiphestTasksFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialNewDiffMail' => 'DifferentialReviewRequestMail', 'DifferentialNewDiffMail' => 'DifferentialReviewRequestMail',
'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialPathFieldSpecification' => 'DifferentialFieldSpecification',
@ -827,15 +834,18 @@ phutil_register_library_map(array(
'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler', 'DifferentialReplyHandler' => 'PhabricatorMailReplyHandler',
'DifferentialRevertPlanFieldSpecification' => 'DifferentialFieldSpecification', 'DifferentialRevertPlanFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialReviewRequestMail' => 'DifferentialMail', 'DifferentialReviewRequestMail' => 'DifferentialMail',
'DifferentialReviewersFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialRevision' => 'DifferentialDAO', 'DifferentialRevision' => 'DifferentialDAO',
'DifferentialRevisionCommentListView' => 'AphrontView', 'DifferentialRevisionCommentListView' => 'AphrontView',
'DifferentialRevisionCommentView' => 'AphrontView', 'DifferentialRevisionCommentView' => 'AphrontView',
'DifferentialRevisionDetailView' => 'AphrontView', 'DifferentialRevisionDetailView' => 'AphrontView',
'DifferentialRevisionEditController' => 'DifferentialController', 'DifferentialRevisionEditController' => 'DifferentialController',
'DifferentialRevisionListController' => 'DifferentialController', 'DifferentialRevisionListController' => 'DifferentialController',
'DifferentialRevisionStatusFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialRevisionUpdateHistoryView' => 'AphrontView', 'DifferentialRevisionUpdateHistoryView' => 'AphrontView',
'DifferentialRevisionViewController' => 'DifferentialController', 'DifferentialRevisionViewController' => 'DifferentialController',
'DifferentialSubscribeController' => 'DifferentialController', 'DifferentialSubscribeController' => 'DifferentialController',
'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialViewTime' => 'DifferentialDAO', 'DifferentialViewTime' => 'DifferentialDAO',
'DiffusionBranchTableView' => 'DiffusionView', 'DiffusionBranchTableView' => 'DiffusionView',
'DiffusionBrowseController' => 'DiffusionController', 'DiffusionBrowseController' => 'DiffusionController',

View file

@ -58,10 +58,7 @@ class DifferentialRevisionViewController extends DifferentialController {
$diff_vs = null; $diff_vs = null;
} }
$aux_fields = $this->loadAuxiliaryFields($revision); $aux_fields = $this->loadAuxiliaryFields($revision, $target);
foreach ($aux_fields as $aux_field) {
$aux_field->setDiff($target);
}
list($changesets, $vs_map, $rendering_references) = list($changesets, $vs_map, $rendering_references) =
$this->loadChangesetsAndVsMap($diffs, $diff_vs, $target); $this->loadChangesetsAndVsMap($diffs, $diff_vs, $target);
@ -156,47 +153,31 @@ class DifferentialRevisionViewController extends DifferentialController {
$visible_changesets = $changesets; $visible_changesets = $changesets;
} }
$diff_properties = id(new DifferentialDiffProperty())->loadAllWhere(
'diffID = %d AND name IN (%Ls)',
$target->getID(),
array(
'arc:lint',
'arc:unit',
));
$diff_properties = mpull($diff_properties, 'getData', 'getName');
$revision_detail = new DifferentialRevisionDetailView(); $revision_detail = new DifferentialRevisionDetailView();
$revision_detail->setRevision($revision); $revision_detail->setRevision($revision);
$revision_detail->setAuxiliaryFields($aux_fields); $revision_detail->setAuxiliaryFields($aux_fields);
$actions = $this->getRevisionActions($revision);
$custom_renderer_class = PhabricatorEnv::getEnvConfig( $custom_renderer_class = PhabricatorEnv::getEnvConfig(
'differential.revision-custom-detail-renderer'); 'differential.revision-custom-detail-renderer');
if ($custom_renderer_class) { if ($custom_renderer_class) {
// TODO: Either deprecate generateProperties() or build a better version
// of the action links and deprecate the whole class. Custom fields
// now provide a much more powerful version of generateProperties().
PhutilSymbolLoader::loadClass($custom_renderer_class); PhutilSymbolLoader::loadClass($custom_renderer_class);
$custom_renderer = $custom_renderer =
newv($custom_renderer_class, array()); newv($custom_renderer_class, array());
} else { $properties = $custom_renderer->generateProperties($revision, $target);
$custom_renderer = null;
}
$properties = $this->getRevisionProperties(
$revision,
$target,
$handles,
$diff_properties);
if ($custom_renderer) {
$properties = array_merge(
$properties,
$custom_renderer->generateProperties($revision, $target));
}
$revision_detail->setProperties($properties); $revision_detail->setProperties($properties);
$actions = $this->getRevisionActions($revision);
if ($custom_renderer) {
$actions = array_merge( $actions = array_merge(
$actions, $actions,
$custom_renderer->generateActionLinks($revision, $target)); $custom_renderer->generateActionLinks($revision, $target));
} else {
$revision_detail->setProperties(array());
} }
$whitespace = $request->getStr( $whitespace = $request->getStr(
@ -307,143 +288,6 @@ class DifferentialRevisionViewController extends DifferentialController {
return $comments; return $comments;
} }
private function getRevisionProperties(
DifferentialRevision $revision,
DifferentialDiff $diff,
array $handles,
array $diff_properties) {
$properties = array();
$status = $revision->getStatus();
$next_step = null;
if ($status == DifferentialRevisionStatus::ACCEPTED) {
switch ($diff->getSourceControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$next_step = 'arc amend --revision '.$revision->getID();
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$next_step = 'arc commit --revision '.$revision->getID();
break;
}
if ($next_step) {
$next_step =
' · '.
'Next step: <tt>'.phutil_escape_html($next_step).'</tt>';
}
}
$status = DifferentialRevisionStatus::getNameForRevisionStatus($status);
$properties['Revision Status'] = '<strong>'.$status.'</strong>'.$next_step;
$properties['Reviewers'] = $this->renderHandleLinkList(
array_select_keys(
$handles,
$revision->getReviewers()));
$properties['CCs'] = $this->renderHandleLinkList(
array_select_keys(
$handles,
$revision->getCCPHIDs()));
$lstar = DifferentialRevisionUpdateHistoryView::renderDiffLintStar($diff);
$lmsg = DifferentialRevisionUpdateHistoryView::getDiffLintMessage($diff);
$ldata = idx($diff_properties, 'arc:lint');
$ltail = null;
if ($ldata) {
$ldata = igroup($ldata, 'path');
$lint_messages = array();
foreach ($ldata as $path => $messages) {
$message_markup = array();
foreach ($messages as $message) {
$path = idx($message, 'path');
$line = idx($message, 'line');
$code = idx($message, 'code');
$severity = idx($message, 'severity');
$name = idx($message, 'name');
$description = idx($message, 'description');
$message_markup[] =
'<li>'.
'<span class="lint-severity-'.phutil_escape_html($severity).'">'.
phutil_escape_html(ucwords($severity)).
'</span>'.
' '.
'('.phutil_escape_html($code).') '.
phutil_escape_html($name).
' at line '.phutil_escape_html($line).
'<p>'.phutil_escape_html($description).'</p>'.
'</li>';
}
$lint_messages[] =
'<li class="lint-file-block">'.
'Lint for <strong>'.phutil_escape_html($path).'</strong>'.
'<ul>'.implode("\n", $message_markup).'</ul>'.
'</li>';
}
$ltail =
'<div class="differential-lint-block">'.
'<ul>'.
implode("\n", $lint_messages).
'</ul>'.
'</div>';
}
$properties['Lint'] = $lstar.' '.$lmsg.$ltail;
$ustar = DifferentialRevisionUpdateHistoryView::renderDiffUnitStar($diff);
$umsg = DifferentialRevisionUpdateHistoryView::getDiffUnitMessage($diff);
$postponed_count = 0;
$udata = idx($diff_properties, 'arc:unit');
$utail = null;
if ($udata) {
$unit_messages = array();
foreach ($udata as $test) {
$name = phutil_escape_html(idx($test, 'name'));
$result = phutil_escape_html(idx($test, 'result'));
if ($result != DifferentialUnitTestResult::RESULT_POSTPONED &&
$result != DifferentialUnitTestResult::RESULT_PASS) {
$userdata = phutil_escape_html(idx($test, 'userdata'));
if (strlen($userdata) > 256) {
$userdata = substr($userdata, 0, 256).'...';
}
$userdata = str_replace("\n", '<br />', $userdata);
$unit_messages[] =
'<tr>'.
'<th>'.$name.'</th>'.
'<th class="unit-test-result">'.
'<div class="result-'.$result.'">'.
strtoupper($result).
'</div>'.
'</th>'.
'<td>'.$userdata.'</td>'.
'</tr>';
$utail =
'<div class="differential-unit-block">'.
'<table class="differential-unit-table">'.
implode("\n", $unit_messages).
'</table>'.
'</div>';
} else if ($result == DifferentialUnitTestResult::RESULT_POSTPONED) {
$postponed_count++;
}
}
}
if ($postponed_count > 0 &&
$diff->getUnitStatus() == DifferentialUnitStatus::UNIT_POSTPONED) {
$umsg = $postponed_count.' '.$umsg;
}
$properties['Unit'] = $ustar.' '.$umsg.$utail;
return $properties;
}
private function getRevisionActions(DifferentialRevision $revision) { private function getRevisionActions(DifferentialRevision $revision) {
$viewer_phid = $this->getRequest()->getUser()->getPHID(); $viewer_phid = $this->getRequest()->getUser()->getPHID();
$viewer_is_owner = ($revision->getAuthorPHID() == $viewer_phid); $viewer_is_owner = ($revision->getAuthorPHID() == $viewer_phid);
@ -512,14 +356,6 @@ class DifferentialRevisionViewController extends DifferentialController {
return $links; return $links;
} }
private function renderHandleLinkList(array $list) {
if (empty($list)) {
return '<em>None</em>';
}
return implode(', ', mpull($list, 'renderLink'));
}
private function getRevisionCommentActions(DifferentialRevision $revision) { private function getRevisionCommentActions(DifferentialRevision $revision) {
$actions = array( $actions = array(
@ -674,7 +510,9 @@ class DifferentialRevisionViewController extends DifferentialController {
->replace(); ->replace();
} }
private function loadAuxiliaryFields(DifferentialRevision $revision) { private function loadAuxiliaryFields(
DifferentialRevision $revision,
DifferentialDiff $diff) {
$aux_fields = DifferentialFieldSelector::newSelector() $aux_fields = DifferentialFieldSelector::newSelector()
->getFieldSpecifications(); ->getFieldSpecifications();
foreach ($aux_fields as $key => $aux_field) { foreach ($aux_fields as $key => $aux_field) {
@ -683,9 +521,42 @@ class DifferentialRevisionViewController extends DifferentialController {
} }
} }
return DifferentialAuxiliaryField::loadFromStorage( $aux_fields = DifferentialAuxiliaryField::loadFromStorage(
$revision, $revision,
$aux_fields); $aux_fields);
$aux_props = array();
foreach ($aux_fields as $key => $aux_field) {
$aux_field->setDiff($diff);
$aux_props[$key] = $aux_field->getRequiredDiffProperties();
} }
$required_properties = array_mergev($aux_props);
$property_map = array();
if ($required_properties) {
$properties = id(new DifferentialDiffProperty())->loadAllWhere(
'diffID = %d AND name IN (%Ls)',
$diff->getID(),
$required_properties);
$property_map = mpull($properties, 'getData', 'getName');
}
foreach ($aux_fields as $key => $aux_field) {
// Give each field only the properties it specifically required, and
// set 'null' for each requested key which we didn't actually load a
// value for (otherwise, getDiffProperty() will throw).
if ($aux_props[$key]) {
$props = array_select_keys($property_map, $aux_props[$key]) +
array_fill_keys($aux_props[$key], null);
} else {
$props = array();
}
$aux_field->setDiffProperties($props);
}
return $aux_fields;
}
} }

View file

@ -9,8 +9,6 @@
phutil_require_module('phabricator', 'aphront/response/404'); phutil_require_module('phabricator', 'aphront/response/404');
phutil_require_module('phabricator', 'applications/differential/constants/action'); phutil_require_module('phabricator', 'applications/differential/constants/action');
phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus'); phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus');
phutil_require_module('phabricator', 'applications/differential/constants/unitstatus');
phutil_require_module('phabricator', 'applications/differential/constants/unittestresult');
phutil_require_module('phabricator', 'applications/differential/controller/base'); phutil_require_module('phabricator', 'applications/differential/controller/base');
phutil_require_module('phabricator', 'applications/differential/field/selector/base'); phutil_require_module('phabricator', 'applications/differential/field/selector/base');
phutil_require_module('phabricator', 'applications/differential/parser/changeset'); phutil_require_module('phabricator', 'applications/differential/parser/changeset');
@ -30,7 +28,6 @@ phutil_require_module('phabricator', 'applications/differential/view/revisiondet
phutil_require_module('phabricator', 'applications/differential/view/revisionupdatehistory'); phutil_require_module('phabricator', 'applications/differential/view/revisionupdatehistory');
phutil_require_module('phabricator', 'applications/draft/storage/draft'); phutil_require_module('phabricator', 'applications/draft/storage/draft');
phutil_require_module('phabricator', 'applications/phid/handle/data'); phutil_require_module('phabricator', 'applications/phid/handle/data');
phutil_require_module('phabricator', 'applications/repository/constants/repositorytype');
phutil_require_module('phabricator', 'infrastructure/celerity/api'); phutil_require_module('phabricator', 'infrastructure/celerity/api');
phutil_require_module('phabricator', 'infrastructure/env'); phutil_require_module('phabricator', 'infrastructure/env');
phutil_require_module('phabricator', 'infrastructure/javelin/api'); phutil_require_module('phabricator', 'infrastructure/javelin/api');

View file

@ -165,12 +165,25 @@ class DifferentialRevisionEditor {
if ($revision->getAuthorPHID() === null) { if ($revision->getAuthorPHID() === null) {
$revision->setAuthorPHID($this->getActorPHID()); $revision->setAuthorPHID($this->getActorPHID());
} }
if ($revision->getRevertPlan() === null) {
$revision->setRevertPlan('');
}
if ($revision->getBlameRevision() === null) {
$revision->setBlameRevision('');
}
if ($revision->getSummary() === null) {
$revision->setSummary('');
}
if ($revision->getTestPlan() === null) {
$revision->setTestPlan('');
}
$revision->save(); $revision->save();
} }
$revision->loadRelationships(); $revision->loadRelationships();
$this->willWriteRevision();
if ($this->reviewers === null) { if ($this->reviewers === null) {
$this->reviewers = $revision->getReviewers(); $this->reviewers = $revision->getReviewers();
} }
@ -368,6 +381,8 @@ class DifferentialRevisionEditor {
$revision->save(); $revision->save();
$this->didWriteRevision();
$event_data = array( $event_data = array(
'revision_id' => $revision->getID(), 'revision_id' => $revision->getID(),
'revision_phid' => $revision->getPHID(), 'revision_phid' => $revision->getPHID(),
@ -689,6 +704,17 @@ class DifferentialRevisionEditor {
} }
} }
private function willWriteRevision() {
foreach ($this->auxiliaryFields as $aux_field) {
$aux_field->willWriteRevision($this);
}
}
private function didWriteRevision() {
foreach ($this->auxiliaryFields as $aux_field) {
$aux_field->didWriteRevision($this);
}
}
} }

View file

@ -21,10 +21,15 @@ final class DifferentialDefaultFieldSelector
public function getFieldSpecifications() { public function getFieldSpecifications() {
return array( return array(
new DifferentialRevisionStatusFieldSpecification(),
new DifferentialAuthorFieldSpecification(), new DifferentialAuthorFieldSpecification(),
new DifferentialReviewersFieldSpecification(),
new DifferentialCCsFieldSpecification(),
new DifferentialUnitFieldSpecification(),
new DifferentialLintFieldSpecification(),
new DifferentialCommitsFieldSpecification(),
new DifferentialDependenciesFieldSpecification(), new DifferentialDependenciesFieldSpecification(),
new DifferentialManiphestTasksFieldSpecification(), new DifferentialManiphestTasksFieldSpecification(),
new DifferentialCommitsFieldSpecification(),
new DifferentialHostFieldSpecification(), new DifferentialHostFieldSpecification(),
new DifferentialPathFieldSpecification(), new DifferentialPathFieldSpecification(),
new DifferentialLinesFieldSpecification(), new DifferentialLinesFieldSpecification(),

View file

@ -10,13 +10,18 @@ phutil_require_module('phabricator', 'applications/differential/field/selector/b
phutil_require_module('phabricator', 'applications/differential/field/specification/applypatch'); phutil_require_module('phabricator', 'applications/differential/field/specification/applypatch');
phutil_require_module('phabricator', 'applications/differential/field/specification/arcanistproject'); phutil_require_module('phabricator', 'applications/differential/field/specification/arcanistproject');
phutil_require_module('phabricator', 'applications/differential/field/specification/author'); phutil_require_module('phabricator', 'applications/differential/field/specification/author');
phutil_require_module('phabricator', 'applications/differential/field/specification/ccs');
phutil_require_module('phabricator', 'applications/differential/field/specification/commits'); phutil_require_module('phabricator', 'applications/differential/field/specification/commits');
phutil_require_module('phabricator', 'applications/differential/field/specification/dependencies'); phutil_require_module('phabricator', 'applications/differential/field/specification/dependencies');
phutil_require_module('phabricator', 'applications/differential/field/specification/exportpatch'); phutil_require_module('phabricator', 'applications/differential/field/specification/exportpatch');
phutil_require_module('phabricator', 'applications/differential/field/specification/host'); phutil_require_module('phabricator', 'applications/differential/field/specification/host');
phutil_require_module('phabricator', 'applications/differential/field/specification/lines'); phutil_require_module('phabricator', 'applications/differential/field/specification/lines');
phutil_require_module('phabricator', 'applications/differential/field/specification/lint');
phutil_require_module('phabricator', 'applications/differential/field/specification/maniphesttasks'); phutil_require_module('phabricator', 'applications/differential/field/specification/maniphesttasks');
phutil_require_module('phabricator', 'applications/differential/field/specification/path'); phutil_require_module('phabricator', 'applications/differential/field/specification/path');
phutil_require_module('phabricator', 'applications/differential/field/specification/reviewers');
phutil_require_module('phabricator', 'applications/differential/field/specification/revisionstatus');
phutil_require_module('phabricator', 'applications/differential/field/specification/unit');
phutil_require_source('DifferentialDefaultFieldSelector.php'); phutil_require_source('DifferentialDefaultFieldSelector.php');

View file

@ -28,7 +28,7 @@
* @task edit Extending the Revision Edit Interface * @task edit Extending the Revision Edit Interface
* @task view Extending the Revision View Interface * @task view Extending the Revision View Interface
* @task conduit Extending the Conduit View Interface * @task conduit Extending the Conduit View Interface
* @task handles Loading Handles * @task load Loading Additional Data
* @task context Contextual Data * @task context Contextual Data
*/ */
abstract class DifferentialFieldSpecification { abstract class DifferentialFieldSpecification {
@ -36,6 +36,7 @@ abstract class DifferentialFieldSpecification {
private $revision; private $revision;
private $diff; private $diff;
private $handles; private $handles;
private $diffProperties;
/* -( Storage )------------------------------------------------------------ */ /* -( Storage )------------------------------------------------------------ */
@ -174,11 +175,34 @@ abstract class DifferentialFieldSpecification {
return; return;
} }
/**
* @task edit
*/
public function willWriteRevision(DifferentialRevisionEditor $editor) {
return;
}
/**
* @task edit
*/
public function didWriteRevision(DifferentialRevisionEditor $editor) {
return;
}
/* -( Extending the Revision View Interface )------------------------------ */ /* -( Extending the Revision View Interface )------------------------------ */
/** /**
* Determine if this field should appear on the revision detail view
* interface. One use of this interface is to add purely informational
* fields to the revision view, without any sort of backing storage.
*
* If you return true from this method, you must implement the methods
* @{method:renderLabelForRevisionView} and
* @{method:renderValueForRevisionView}.
*
* @return bool True if this field should appear when viewing a revision.
* @task view * @task view
*/ */
public function shouldAppearOnRevisionView() { public function shouldAppearOnRevisionView() {
@ -187,6 +211,13 @@ abstract class DifferentialFieldSpecification {
/** /**
* Return a string field label which will appear in the revision detail
* table.
*
* You must implement this method if you return true from
* @{method:shouldAppearOnRevisionView}.
*
* @return string Label for field in revision detail view.
* @task view * @task view
*/ */
public function renderLabelForRevisionView() { public function renderLabelForRevisionView() {
@ -195,6 +226,16 @@ abstract class DifferentialFieldSpecification {
/** /**
* Return a markup block representing the field for the revision detail
* view. Note that you can return null to suppress display (for instance,
* if the field shows related objects of some type and the revision doesn't
* have any related objects).
*
* You must implement this method if you return true from
* @{method:shouldAppearOnRevisionView}.
*
* @return string|null Display markup for field value, or null to suppress
* field rendering.
* @task view * @task view
*/ */
public function renderValueForRevisionView() { public function renderValueForRevisionView() {
@ -231,7 +272,7 @@ abstract class DifferentialFieldSpecification {
} }
/* -( Loading Handles )---------------------------------------------------- */ /* -( Loading Additional Data )-------------------------------------------- */
/** /**
@ -248,7 +289,7 @@ abstract class DifferentialFieldSpecification {
* You can later retrieve these handles by calling @{method:getHandle}. * You can later retrieve these handles by calling @{method:getHandle}.
* *
* @return list List of PHIDs to load handles for. * @return list List of PHIDs to load handles for.
* @task handles * @task load
*/ */
protected function getRequiredHandlePHIDs() { protected function getRequiredHandlePHIDs() {
return array(); return array();
@ -263,7 +304,7 @@ abstract class DifferentialFieldSpecification {
* need. * need.
* *
* @return list List of PHIDs to load handles for. * @return list List of PHIDs to load handles for.
* @task handles * @task load
*/ */
public function getRequiredHandlePHIDsForRevisionView() { public function getRequiredHandlePHIDsForRevisionView() {
return $this->getRequiredHandlePHIDs(); return $this->getRequiredHandlePHIDs();
@ -278,13 +319,24 @@ abstract class DifferentialFieldSpecification {
* need. * need.
* *
* @return list List of PHIDs to load handles for. * @return list List of PHIDs to load handles for.
* @task handles * @task load
*/ */
public function getRequiredHandlePHIDsForEdit() { public function getRequiredHandlePHIDsForEdit() {
return $this->getRequiredHandlePHIDs(); return $this->getRequiredHandlePHIDs();
} }
/**
* Specify which diff properties this field needs to load.
*
* @return list List of diff property keys this field requires.
* @task load
*/
public function getRequiredDiffProperties() {
return array();
}
/* -( Contextual Data )---------------------------------------------------- */ /* -( Contextual Data )---------------------------------------------------- */
@ -312,6 +364,14 @@ abstract class DifferentialFieldSpecification {
return $this; return $this;
} }
/**
* @task context
*/
final public function setDiffProperties(array $diff_properties) {
$this->diffProperties = $diff_properties;
return $this;
}
/** /**
* @task context * @task context
*/ */
@ -341,6 +401,9 @@ abstract class DifferentialFieldSpecification {
* @task context * @task context
*/ */
final protected function getHandle($phid) { final protected function getHandle($phid) {
if ($this->handles === null) {
throw new DifferentialFieldDataNotAvailableException($this);
}
if (empty($this->handles[$phid])) { if (empty($this->handles[$phid])) {
$class = get_class($this); $class = get_class($this);
throw new Exception( throw new Exception(
@ -351,4 +414,30 @@ abstract class DifferentialFieldSpecification {
return $this->handles[$phid]; return $this->handles[$phid];
} }
/**
* Get a diff property which this field previously requested by returning
* the key from @{method:getRequiredDiffProperties}.
*
* @param string Diff property key.
* @return string|null Diff property, or null if the property does not have
* a value.
* @task context
*/
final public function getDiffProperty($key) {
if ($this->diffProperties === null) {
// This will be set to some (possibly empty) array if we've loaded
// properties, so null means diff properties aren't available in this
// context.
throw new DifferentialFieldDataNotAvailableException($this);
}
if (!array_key_exists($key, $this->diffProperties)) {
$class = get_class($this);
throw new Exception(
"A differential field (of class '{$class}') is attempting to retrieve ".
"a diff property ('{$key}') which it did not request. Return all ".
"diff property keys you need from getRequiredDiffProperties().");
}
return $this->diffProperties[$key];
}
} }

View file

@ -0,0 +1,53 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
final class DifferentialCCsFieldSpecification
extends DifferentialFieldSpecification {
public function shouldAppearOnRevisionView() {
return true;
}
public function getRequiredHandlePHIDsForRevisionView() {
return $this->getCCPHIDs();
}
public function renderLabelForRevisionView() {
return 'CCs:';
}
public function renderValueForRevisionView() {
$cc_phids = $this->getCCPHIDs();
if (!$cc_phids) {
return '<em>None</em>';
}
$links = array();
foreach ($cc_phids as $cc_phid) {
$links[] = $this->getHandle($cc_phid)->renderLink();
}
return implode(', ', $links);
}
private function getCCPHIDs() {
$revision = $this->getRevision();
return $revision->getCCPHIDs();
}
}

View file

@ -0,0 +1,12 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/differential/field/specification/base');
phutil_require_source('DifferentialCCsFieldSpecification.php');

View file

@ -0,0 +1,84 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
final class DifferentialLintFieldSpecification
extends DifferentialFieldSpecification {
public function shouldAppearOnRevisionView() {
return true;
}
public function renderLabelForRevisionView() {
return 'Lint:';
}
public function getRequiredDiffProperties() {
return array('arc:lint');
}
public function renderValueForRevisionView() {
$diff = $this->getDiff();
$lstar = DifferentialRevisionUpdateHistoryView::renderDiffLintStar($diff);
$lmsg = DifferentialRevisionUpdateHistoryView::getDiffLintMessage($diff);
$ldata = $this->getDiffProperty('arc:lint');
$ltail = null;
if ($ldata) {
$ldata = igroup($ldata, 'path');
$lint_messages = array();
foreach ($ldata as $path => $messages) {
$message_markup = array();
foreach ($messages as $message) {
$path = idx($message, 'path');
$line = idx($message, 'line');
$code = idx($message, 'code');
$severity = idx($message, 'severity');
$name = idx($message, 'name');
$description = idx($message, 'description');
$message_markup[] =
'<li>'.
'<span class="lint-severity-'.phutil_escape_html($severity).'">'.
phutil_escape_html(ucwords($severity)).
'</span>'.
' '.
'('.phutil_escape_html($code).') '.
phutil_escape_html($name).
' at line '.phutil_escape_html($line).
'<p>'.phutil_escape_html($description).'</p>'.
'</li>';
}
$lint_messages[] =
'<li class="lint-file-block">'.
'Lint for <strong>'.phutil_escape_html($path).'</strong>'.
'<ul>'.implode("\n", $message_markup).'</ul>'.
'</li>';
}
$ltail =
'<div class="differential-lint-block">'.
'<ul>'.
implode("\n", $lint_messages).
'</ul>'.
'</div>';
}
return $lstar.' '.$lmsg.$ltail;
}
}

View file

@ -0,0 +1,16 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/differential/field/specification/base');
phutil_require_module('phabricator', 'applications/differential/view/revisionupdatehistory');
phutil_require_module('phutil', 'markup');
phutil_require_module('phutil', 'utils');
phutil_require_source('DifferentialLintFieldSpecification.php');

View file

@ -0,0 +1,53 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
final class DifferentialReviewersFieldSpecification
extends DifferentialFieldSpecification {
public function shouldAppearOnRevisionView() {
return true;
}
public function getRequiredHandlePHIDsForRevisionView() {
return $this->getReviewerPHIDs();
}
public function renderLabelForRevisionView() {
return 'Reviewers:';
}
public function renderValueForRevisionView() {
$reviewer_phids = $this->getReviewerPHIDs();
if (!$reviewer_phids) {
return '<em>None</em>';
}
$links = array();
foreach ($reviewer_phids as $reviewer_phid) {
$links[] = $this->getHandle($reviewer_phid)->renderLink();
}
return implode(', ', $links);
}
private function getReviewerPHIDs() {
$revision = $this->getRevision();
return $revision->getReviewers();
}
}

View file

@ -0,0 +1,12 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/differential/field/specification/base');
phutil_require_source('DifferentialReviewersFieldSpecification.php');

View file

@ -0,0 +1,55 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
final class DifferentialRevisionStatusFieldSpecification
extends DifferentialFieldSpecification {
public function shouldAppearOnRevisionView() {
return true;
}
public function renderLabelForRevisionView() {
return 'Revision Status:';
}
public function renderValueForRevisionView() {
$revision = $this->getRevision();
$diff = $this->getDiff();
$status = $revision->getStatus();
$next_step = null;
if ($status == DifferentialRevisionStatus::ACCEPTED) {
switch ($diff->getSourceControlSystem()) {
case PhabricatorRepositoryType::REPOSITORY_TYPE_GIT:
$next_step = 'arc amend --revision '.$revision->getID();
break;
case PhabricatorRepositoryType::REPOSITORY_TYPE_SVN:
$next_step = 'arc commit --revision '.$revision->getID();
break;
}
if ($next_step) {
$next_step =
' &middot; '.
'Next step: <tt>'.phutil_escape_html($next_step).'</tt>';
}
}
$status = DifferentialRevisionStatus::getNameForRevisionStatus($status);
return '<strong>'.$status.'</strong>'.$next_step;
}
}

View file

@ -0,0 +1,16 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/differential/constants/revisionstatus');
phutil_require_module('phabricator', 'applications/differential/field/specification/base');
phutil_require_module('phabricator', 'applications/repository/constants/repositorytype');
phutil_require_module('phutil', 'markup');
phutil_require_source('DifferentialRevisionStatusFieldSpecification.php');

View file

@ -0,0 +1,88 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
final class DifferentialUnitFieldSpecification
extends DifferentialFieldSpecification {
public function shouldAppearOnRevisionView() {
return true;
}
public function renderLabelForRevisionView() {
return 'Unit:';
}
public function getRequiredDiffProperties() {
return array('arc:unit');
}
public function renderValueForRevisionView() {
$diff = $this->getDiff();
$ustar = DifferentialRevisionUpdateHistoryView::renderDiffUnitStar($diff);
$umsg = DifferentialRevisionUpdateHistoryView::getDiffUnitMessage($diff);
$postponed_count = 0;
$udata = $this->getDiffProperty('arc:unit');
$utail = null;
if ($udata) {
$unit_messages = array();
foreach ($udata as $test) {
$name = phutil_escape_html(idx($test, 'name'));
$result = phutil_escape_html(idx($test, 'result'));
if ($result != DifferentialUnitTestResult::RESULT_POSTPONED &&
$result != DifferentialUnitTestResult::RESULT_PASS) {
$userdata = phutil_escape_html(idx($test, 'userdata'));
if (strlen($userdata) > 256) {
$userdata = substr($userdata, 0, 256).'...';
}
$userdata = str_replace("\n", '<br />', $userdata);
$unit_messages[] =
'<tr>'.
'<th>'.$name.'</th>'.
'<th class="unit-test-result">'.
'<div class="result-'.$result.'">'.
strtoupper($result).
'</div>'.
'</th>'.
'<td>'.$userdata.'</td>'.
'</tr>';
$utail =
'<div class="differential-unit-block">'.
'<table class="differential-unit-table">'.
implode("\n", $unit_messages).
'</table>'.
'</div>';
} else if ($result == DifferentialUnitTestResult::RESULT_POSTPONED) {
$postponed_count++;
}
}
}
if ($postponed_count > 0 &&
$diff->getUnitStatus() == DifferentialUnitStatus::UNIT_POSTPONED) {
$umsg = $postponed_count.' '.$umsg;
}
return $ustar.' '.$umsg.$utail;
}
}

View file

@ -0,0 +1,18 @@
<?php
/**
* This file is automatically generated. Lint this module to rebuild it.
* @generated
*/
phutil_require_module('phabricator', 'applications/differential/constants/unitstatus');
phutil_require_module('phabricator', 'applications/differential/constants/unittestresult');
phutil_require_module('phabricator', 'applications/differential/field/specification/base');
phutil_require_module('phabricator', 'applications/differential/view/revisionupdatehistory');
phutil_require_module('phutil', 'markup');
phutil_require_module('phutil', 'utils');
phutil_require_source('DifferentialUnitFieldSpecification.php');