mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-19 03:50:54 +01:00
Drive differential revision list with custom fields
Summary: Build the revision list table out of custom fields instead of hard-coding it, so installs can add all sorts of zany things to it. NOTE: You may need to implement sortFieldsForRevisionList() if you have a custom DifferentialFieldSelector, or some fields might show up out of order. This implementation will preserve the expected behavior: public function sortFieldsForRevisionList(array $fields) { $default = new DifferentialDefaultFieldSelector(); return $default->sortFieldsForRevisionList($fields); } Test Plan: - Loaded differential revision list, identical to old list. - Profiled page to verify the cost increase isn't significant (it's quite small). Reviewers: jungejason, btrahan Reviewed By: btrahan CC: aran, btrahan, davidreuss, epriestley Maniphest Tasks: T773, T729 Differential Revision: https://secure.phabricator.com/D1388
This commit is contained in:
parent
7a3f33b5c2
commit
92f3ffd811
20 changed files with 387 additions and 76 deletions
|
@ -204,6 +204,8 @@ phutil_register_library_map(array(
|
||||||
'DifferentialCommitsFieldSpecification' => 'applications/differential/field/specification/commits',
|
'DifferentialCommitsFieldSpecification' => 'applications/differential/field/specification/commits',
|
||||||
'DifferentialController' => 'applications/differential/controller/base',
|
'DifferentialController' => 'applications/differential/controller/base',
|
||||||
'DifferentialDAO' => 'applications/differential/storage/base',
|
'DifferentialDAO' => 'applications/differential/storage/base',
|
||||||
|
'DifferentialDateCreatedFieldSpecification' => 'applications/differential/field/specification/datecreated',
|
||||||
|
'DifferentialDateModifiedFieldSpecification' => 'applications/differential/field/specification/datemodified',
|
||||||
'DifferentialDefaultFieldSelector' => 'applications/differential/field/selector/default',
|
'DifferentialDefaultFieldSelector' => 'applications/differential/field/selector/default',
|
||||||
'DifferentialDependenciesFieldSpecification' => 'applications/differential/field/specification/dependencies',
|
'DifferentialDependenciesFieldSpecification' => 'applications/differential/field/specification/dependencies',
|
||||||
'DifferentialDiff' => 'applications/differential/storage/diff',
|
'DifferentialDiff' => 'applications/differential/storage/diff',
|
||||||
|
@ -1033,6 +1035,8 @@ phutil_register_library_map(array(
|
||||||
'DifferentialCommitsFieldSpecification' => 'DifferentialFieldSpecification',
|
'DifferentialCommitsFieldSpecification' => 'DifferentialFieldSpecification',
|
||||||
'DifferentialController' => 'PhabricatorController',
|
'DifferentialController' => 'PhabricatorController',
|
||||||
'DifferentialDAO' => 'PhabricatorLiskDAO',
|
'DifferentialDAO' => 'PhabricatorLiskDAO',
|
||||||
|
'DifferentialDateCreatedFieldSpecification' => 'DifferentialFieldSpecification',
|
||||||
|
'DifferentialDateModifiedFieldSpecification' => 'DifferentialFieldSpecification',
|
||||||
'DifferentialDefaultFieldSelector' => 'DifferentialFieldSelector',
|
'DifferentialDefaultFieldSelector' => 'DifferentialFieldSelector',
|
||||||
'DifferentialDependenciesFieldSpecification' => 'DifferentialFieldSpecification',
|
'DifferentialDependenciesFieldSpecification' => 'DifferentialFieldSpecification',
|
||||||
'DifferentialDiff' => 'DifferentialDAO',
|
'DifferentialDiff' => 'DifferentialDAO',
|
||||||
|
|
|
@ -366,6 +366,10 @@ class DifferentialRevisionListController extends DifferentialController {
|
||||||
private function buildViews($filter, $user_phid, array $revisions) {
|
private function buildViews($filter, $user_phid, array $revisions) {
|
||||||
$user = $this->getRequest()->getUser();
|
$user = $this->getRequest()->getUser();
|
||||||
|
|
||||||
|
$template = id(new DifferentialRevisionListView())
|
||||||
|
->setUser($user)
|
||||||
|
->setFields(DifferentialRevisionListView::getDefaultFields());
|
||||||
|
|
||||||
$views = array();
|
$views = array();
|
||||||
switch ($filter) {
|
switch ($filter) {
|
||||||
case 'active':
|
case 'active':
|
||||||
|
@ -373,18 +377,16 @@ class DifferentialRevisionListController extends DifferentialController {
|
||||||
$revisions,
|
$revisions,
|
||||||
$user_phid);
|
$user_phid);
|
||||||
|
|
||||||
$view = id(new DifferentialRevisionListView())
|
$view = id(clone $template)
|
||||||
->setRevisions($active)
|
->setRevisions($active)
|
||||||
->setUser($user)
|
|
||||||
->setNoDataString("You have no active revisions requiring action.");
|
->setNoDataString("You have no active revisions requiring action.");
|
||||||
$views[] = array(
|
$views[] = array(
|
||||||
'title' => 'Action Required',
|
'title' => 'Action Required',
|
||||||
'view' => $view,
|
'view' => $view,
|
||||||
);
|
);
|
||||||
|
|
||||||
$view = id(new DifferentialRevisionListView())
|
$view = id(clone $template)
|
||||||
->setRevisions($waiting)
|
->setRevisions($waiting)
|
||||||
->setUser($user)
|
|
||||||
->setNoDataString("You have no active revisions waiting on others.");
|
->setNoDataString("You have no active revisions waiting on others.");
|
||||||
$views[] = array(
|
$views[] = array(
|
||||||
'title' => 'Waiting On Others',
|
'title' => 'Waiting On Others',
|
||||||
|
@ -401,9 +403,8 @@ class DifferentialRevisionListController extends DifferentialController {
|
||||||
'subscribed' => 'Revisions by Subscriber',
|
'subscribed' => 'Revisions by Subscriber',
|
||||||
'all' => 'Revisions',
|
'all' => 'Revisions',
|
||||||
);
|
);
|
||||||
$view = id(new DifferentialRevisionListView())
|
$view = id(clone $template)
|
||||||
->setRevisions($revisions)
|
->setRevisions($revisions);
|
||||||
->setUser($user);
|
|
||||||
$views[] = array(
|
$views[] = array(
|
||||||
'title' => idx($titles, $filter),
|
'title' => idx($titles, $filter),
|
||||||
'view' => $view,
|
'view' => $view,
|
||||||
|
@ -412,6 +413,7 @@ class DifferentialRevisionListController extends DifferentialController {
|
||||||
default:
|
default:
|
||||||
throw new Exception("Unknown filter '{$filter}'!");
|
throw new Exception("Unknown filter '{$filter}'!");
|
||||||
}
|
}
|
||||||
|
|
||||||
return $views;
|
return $views;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2011 Facebook, Inc.
|
* Copyright 2012 Facebook, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -30,4 +30,8 @@ abstract class DifferentialFieldSelector {
|
||||||
|
|
||||||
abstract public function getFieldSpecifications();
|
abstract public function getFieldSpecifications();
|
||||||
|
|
||||||
|
public function sortFieldsForRevisionList(array $fields) {
|
||||||
|
return $fields;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,9 +53,33 @@ final class DifferentialDefaultFieldSelector
|
||||||
new DifferentialApplyPatchFieldSpecification(),
|
new DifferentialApplyPatchFieldSpecification(),
|
||||||
new DifferentialRevisionIDFieldSpecification(),
|
new DifferentialRevisionIDFieldSpecification(),
|
||||||
new DifferentialGitSVNIDFieldSpecification(),
|
new DifferentialGitSVNIDFieldSpecification(),
|
||||||
|
new DifferentialDateModifiedFieldSpecification(),
|
||||||
|
new DifferentialDateCreatedFieldSpecification(),
|
||||||
));
|
));
|
||||||
|
|
||||||
return $fields;
|
return $fields;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function sortFieldsForRevisionList(array $fields) {
|
||||||
|
$map = array();
|
||||||
|
foreach ($fields as $field) {
|
||||||
|
$map[get_class($field)] = $field;
|
||||||
|
}
|
||||||
|
|
||||||
|
$map = array_select_keys(
|
||||||
|
$map,
|
||||||
|
array(
|
||||||
|
'DifferentialRevisionIDFieldSpecification',
|
||||||
|
'DifferentialTitleFieldSpecification',
|
||||||
|
'DifferentialRevisionStatusFieldSpecification',
|
||||||
|
'DifferentialAuthorFieldSpecification',
|
||||||
|
'DifferentialReviewersFieldSpecification',
|
||||||
|
'DifferentialDateModifiedFieldSpecification',
|
||||||
|
'DifferentialDateCreatedFieldSpecification',
|
||||||
|
)) + $map;
|
||||||
|
|
||||||
|
return array_values($map);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,8 @@ phutil_require_module('phabricator', 'applications/differential/field/specificat
|
||||||
phutil_require_module('phabricator', 'applications/differential/field/specification/branch');
|
phutil_require_module('phabricator', 'applications/differential/field/specification/branch');
|
||||||
phutil_require_module('phabricator', 'applications/differential/field/specification/ccs');
|
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/datecreated');
|
||||||
|
phutil_require_module('phabricator', 'applications/differential/field/specification/datemodified');
|
||||||
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/gitsvnid');
|
phutil_require_module('phabricator', 'applications/differential/field/specification/gitsvnid');
|
||||||
phutil_require_module('phabricator', 'applications/differential/field/specification/host');
|
phutil_require_module('phabricator', 'applications/differential/field/specification/host');
|
||||||
|
@ -29,5 +31,7 @@ phutil_require_module('phabricator', 'applications/differential/field/specificat
|
||||||
phutil_require_module('phabricator', 'applications/differential/field/specification/unit');
|
phutil_require_module('phabricator', 'applications/differential/field/specification/unit');
|
||||||
phutil_require_module('phabricator', 'infrastructure/env');
|
phutil_require_module('phabricator', 'infrastructure/env');
|
||||||
|
|
||||||
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
||||||
phutil_require_source('DifferentialDefaultFieldSelector.php');
|
phutil_require_source('DifferentialDefaultFieldSelector.php');
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2011 Facebook, Inc.
|
* Copyright 2012 Facebook, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -43,4 +43,21 @@ final class DifferentialAuthorFieldSpecification
|
||||||
return $revision->getAuthorPHID();
|
return $revision->getAuthorPHID();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'Author';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
return $this->getHandle($revision->getAuthorPHID())->renderLink();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredHandlePHIDsForRevisionList(
|
||||||
|
DifferentialRevision $revision) {
|
||||||
|
return array($revision->getAuthorPHID());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
* @task storage Field Storage
|
* @task storage Field Storage
|
||||||
* @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 list Extending the Revision List Interface
|
||||||
* @task conduit Extending the Conduit View Interface
|
* @task conduit Extending the Conduit View Interface
|
||||||
* @task commit Extending Commit Messages
|
* @task commit Extending Commit Messages
|
||||||
* @task load Loading Additional Data
|
* @task load Loading Additional Data
|
||||||
|
@ -264,6 +265,59 @@ abstract class DifferentialFieldSpecification {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* -( Extending the Revision List Interface )------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine if this field should appear in the table on the revision list
|
||||||
|
* interface.
|
||||||
|
*
|
||||||
|
* @return bool True if this field should appear in the table.
|
||||||
|
*
|
||||||
|
* @task list
|
||||||
|
*/
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a column header for revision list tables.
|
||||||
|
*
|
||||||
|
* @return string Column header.
|
||||||
|
*
|
||||||
|
* @task list
|
||||||
|
*/
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
throw new DifferentialFieldSpecificationIncompleteException($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Optionally, return a column class for revision list tables.
|
||||||
|
*
|
||||||
|
* @return string CSS class for table cells.
|
||||||
|
*
|
||||||
|
* @task list
|
||||||
|
*/
|
||||||
|
public function getColumnClassForRevisionList() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a table cell value for revision list tables.
|
||||||
|
*
|
||||||
|
* @param DifferentialRevision The revision to render a value for.
|
||||||
|
* @return string Table cell value.
|
||||||
|
*
|
||||||
|
* @task list
|
||||||
|
*/
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
throw new DifferentialFieldSpecificationIncompleteException($this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* -( Extending the Conduit Interface )------------------------------------ */
|
/* -( Extending the Conduit Interface )------------------------------------ */
|
||||||
|
|
||||||
|
|
||||||
|
@ -483,6 +537,7 @@ abstract class DifferentialFieldSpecification {
|
||||||
return array();
|
return array();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specify which @{class:PhabricatorObjectHandles} need to be loaded for your
|
* Specify which @{class:PhabricatorObjectHandles} need to be loaded for your
|
||||||
* field to render correctly on the view interface.
|
* field to render correctly on the view interface.
|
||||||
|
@ -498,6 +553,25 @@ abstract class DifferentialFieldSpecification {
|
||||||
return $this->getRequiredHandlePHIDs();
|
return $this->getRequiredHandlePHIDs();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify which @{class:PhabricatorObjectHandles} need to be loaded for your
|
||||||
|
* field to render correctly on the list interface.
|
||||||
|
*
|
||||||
|
* This is a more specific version of @{method:getRequiredHandlePHIDs} which
|
||||||
|
* can be overridden to improve field performance by loading only data you
|
||||||
|
* need.
|
||||||
|
*
|
||||||
|
* @param DifferentialRevision The revision to pull PHIDs for.
|
||||||
|
* @return list List of PHIDs to load handles for.
|
||||||
|
* @task load
|
||||||
|
*/
|
||||||
|
public function getRequiredHandlePHIDsForRevisionList(
|
||||||
|
DifferentialRevision $revision) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specify which @{class:PhabricatorObjectHandles} need to be loaded for your
|
* Specify which @{class:PhabricatorObjectHandles} need to be loaded for your
|
||||||
* field to render correctly on the edit interface.
|
* field to render correctly on the edit interface.
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2012 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 DifferentialDateCreatedFieldSpecification
|
||||||
|
extends DifferentialFieldSpecification {
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'Created';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getColumnClassForRevisionList() {
|
||||||
|
return 'right';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
return phabricator_date($revision->getDateCreated(), $this->getUser());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?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', 'view/utils');
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('DifferentialDateCreatedFieldSpecification.php');
|
|
@ -0,0 +1,38 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright 2012 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 DifferentialDateModifiedFieldSpecification
|
||||||
|
extends DifferentialFieldSpecification {
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'Updated';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getColumnClassForRevisionList() {
|
||||||
|
return 'right';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
return phabricator_datetime($revision->getDateModified(), $this->getUser());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
<?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', 'view/utils');
|
||||||
|
|
||||||
|
|
||||||
|
phutil_require_source('DifferentialDateModifiedFieldSpecification.php');
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2011 Facebook, Inc.
|
* Copyright 2012 Facebook, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -32,4 +32,20 @@ final class DifferentialLinesFieldSpecification
|
||||||
return phutil_escape_html(number_format($diff->getLineCount()));
|
return phutil_escape_html(number_format($diff->getLineCount()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'Lines';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getColumnClassForRevisionList() {
|
||||||
|
return 'n';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
return number_format($revision->getLineCount());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2011 Facebook, Inc.
|
* Copyright 2012 Facebook, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -140,4 +140,36 @@ final class DifferentialReviewersFieldSpecification
|
||||||
return $this->parseCommitMessageUserList($value);
|
return $this->parseCommitMessageUserList($value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'Reviewers';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
$reviewer_phids = $revision->getReviewers();
|
||||||
|
if ($reviewer_phids) {
|
||||||
|
$first = reset($reviewer_phids);
|
||||||
|
if (count($reviewer_phids) > 1) {
|
||||||
|
$suffix = ' (+'.(count($reviewer_phids) - 1).')';
|
||||||
|
} else {
|
||||||
|
$suffix = null;
|
||||||
|
}
|
||||||
|
return $this->getHandle($first)->renderLink().$suffix;
|
||||||
|
} else {
|
||||||
|
return '<em>None</em>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRequiredHandlePHIDsForRevisionList(
|
||||||
|
DifferentialRevision $revision) {
|
||||||
|
$reviewer_phids = $revision->getReviewers();
|
||||||
|
if ($reviewer_phids) {
|
||||||
|
return array(reset($reviewer_phids));
|
||||||
|
}
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,4 +92,16 @@ final class DifferentialRevisionIDFieldSpecification
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'ID';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
return 'D'.$revision->getID();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,4 +54,17 @@ final class DifferentialRevisionStatusFieldSpecification
|
||||||
return '<strong>'.$status.'</strong>'.$next_step;
|
return '<strong>'.$status.'</strong>'.$next_step;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'Status';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
return ArcanistDifferentialRevisionStatus::getNameForRevisionStatus(
|
||||||
|
$revision->getStatus());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copyright 2011 Facebook, Inc.
|
* Copyright 2012 Facebook, Inc.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
|
@ -86,4 +86,25 @@ final class DifferentialTitleFieldSpecification
|
||||||
return preg_replace('/\s*\n\s*/', ' ', $value);
|
return preg_replace('/\s*\n\s*/', ' ', $value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function shouldAppearOnRevisionList() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderHeaderForRevisionList() {
|
||||||
|
return 'Revision';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getColumnClassForRevisionList() {
|
||||||
|
return 'wide pri';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function renderValueForRevisionList(DifferentialRevision $revision) {
|
||||||
|
return phutil_render_tag(
|
||||||
|
'a',
|
||||||
|
array(
|
||||||
|
'href' => '/D'.$revision->getID(),
|
||||||
|
),
|
||||||
|
phutil_escape_html($revision->getTitle()));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ phutil_require_module('phabricator', 'applications/differential/field/exception/
|
||||||
phutil_require_module('phabricator', 'applications/differential/field/specification/base');
|
phutil_require_module('phabricator', 'applications/differential/field/specification/base');
|
||||||
phutil_require_module('phabricator', 'view/form/control/textarea');
|
phutil_require_module('phabricator', 'view/form/control/textarea');
|
||||||
|
|
||||||
|
phutil_require_module('phutil', 'markup');
|
||||||
phutil_require_module('phutil', 'utils');
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,12 @@ final class DifferentialRevisionListView extends AphrontView {
|
||||||
private $handles;
|
private $handles;
|
||||||
private $user;
|
private $user;
|
||||||
private $noDataString;
|
private $noDataString;
|
||||||
|
private $fields;
|
||||||
|
|
||||||
|
public function setFields(array $fields) {
|
||||||
|
$this->fields = $fields;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
public function setRevisions(array $revisions) {
|
public function setRevisions(array $revisions) {
|
||||||
$this->revisions = $revisions;
|
$this->revisions = $revisions;
|
||||||
|
@ -33,14 +39,12 @@ final class DifferentialRevisionListView extends AphrontView {
|
||||||
|
|
||||||
public function getRequiredHandlePHIDs() {
|
public function getRequiredHandlePHIDs() {
|
||||||
$phids = array();
|
$phids = array();
|
||||||
foreach ($this->revisions as $revision) {
|
foreach ($this->fields as $field) {
|
||||||
$phids[] = $revision->getAuthorPHID();
|
foreach ($this->revisions as $revision) {
|
||||||
$reviewers = $revision->getReviewers();
|
$phids[] = $field->getRequiredHandlePHIDsForRevisionList($revision);
|
||||||
if ($reviewers) {
|
|
||||||
$phids[] = head($reviewers);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $phids;
|
return array_mergev($phids);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setHandles(array $handles) {
|
public function setHandles(array $handles) {
|
||||||
|
@ -65,67 +69,30 @@ final class DifferentialRevisionListView extends AphrontView {
|
||||||
throw new Exception("Call setUser() before render()!");
|
throw new Exception("Call setUser() before render()!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach ($this->fields as $field) {
|
||||||
|
$field->setUser($this->user);
|
||||||
|
$field->setHandles($this->handles);
|
||||||
|
}
|
||||||
|
|
||||||
$rows = array();
|
$rows = array();
|
||||||
foreach ($this->revisions as $revision) {
|
foreach ($this->revisions as $revision) {
|
||||||
$status = $revision->getStatus();
|
$row = array();
|
||||||
$status =
|
foreach ($this->fields as $field) {
|
||||||
ArcanistDifferentialRevisionStatus::getNameForRevisionStatus($status);
|
$row[] = $field->renderValueForRevisionList($revision);
|
||||||
|
|
||||||
$reviewer_phids = $revision->getReviewers();
|
|
||||||
if ($reviewer_phids) {
|
|
||||||
$first = reset($reviewer_phids);
|
|
||||||
if (count($reviewer_phids) > 1) {
|
|
||||||
$suffix = ' (+'.(count($reviewer_phids) - 1).')';
|
|
||||||
} else {
|
|
||||||
$suffix = null;
|
|
||||||
}
|
|
||||||
$reviewers = $this->handles[$first]->renderLink().$suffix;
|
|
||||||
} else {
|
|
||||||
$reviewers = '<em>None</em>';
|
|
||||||
}
|
}
|
||||||
|
$rows[] = $row;
|
||||||
|
}
|
||||||
|
|
||||||
$link = phutil_render_tag(
|
$headers = array();
|
||||||
'a',
|
$classes = array();
|
||||||
array(
|
foreach ($this->fields as $field) {
|
||||||
'href' => '/D'.$revision->getID(),
|
$headers[] = $field->renderHeaderForRevisionList();
|
||||||
),
|
$classes[] = $field->getColumnClassForRevisionList();
|
||||||
phutil_escape_html($revision->getTitle()));
|
|
||||||
|
|
||||||
$rows[] = array(
|
|
||||||
'D'.$revision->getID(),
|
|
||||||
$link,
|
|
||||||
phutil_escape_html($status),
|
|
||||||
number_format($revision->getLineCount()),
|
|
||||||
$this->handles[$revision->getAuthorPHID()]->renderLink(),
|
|
||||||
$reviewers,
|
|
||||||
phabricator_datetime($revision->getDateModified(), $user),
|
|
||||||
phabricator_date($revision->getDateCreated(), $user),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$table = new AphrontTableView($rows);
|
$table = new AphrontTableView($rows);
|
||||||
$table->setHeaders(
|
$table->setHeaders($headers);
|
||||||
array(
|
$table->setColumnClasses($classes);
|
||||||
'ID',
|
|
||||||
'Revision',
|
|
||||||
'Status',
|
|
||||||
'Lines',
|
|
||||||
'Author',
|
|
||||||
'Reviewers',
|
|
||||||
'Modified',
|
|
||||||
'Created',
|
|
||||||
));
|
|
||||||
$table->setColumnClasses(
|
|
||||||
array(
|
|
||||||
null,
|
|
||||||
'wide pri',
|
|
||||||
null,
|
|
||||||
'n',
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
'right',
|
|
||||||
'right',
|
|
||||||
));
|
|
||||||
|
|
||||||
if ($this->noDataString) {
|
if ($this->noDataString) {
|
||||||
$table->setNoDataString($this->noDataString);
|
$table->setNoDataString($this->noDataString);
|
||||||
|
@ -134,4 +101,22 @@ final class DifferentialRevisionListView extends AphrontView {
|
||||||
return $table->render();
|
return $table->render();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getDefaultFields() {
|
||||||
|
$selector = DifferentialFieldSelector::newSelector();
|
||||||
|
$fields = $selector->getFieldSpecifications();
|
||||||
|
foreach ($fields as $key => $field) {
|
||||||
|
if (!$field->shouldAppearOnRevisionList()) {
|
||||||
|
unset($fields[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!$fields) {
|
||||||
|
throw new Exception(
|
||||||
|
"Phabricator configuration has no fields that appear on the list ".
|
||||||
|
"interface!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return $selector->sortFieldsForRevisionList($fields);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,13 +6,10 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
phutil_require_module('arcanist', 'differential/constants/revisionstatus');
|
phutil_require_module('phabricator', 'applications/differential/field/selector/base');
|
||||||
|
|
||||||
phutil_require_module('phabricator', 'view/base');
|
phutil_require_module('phabricator', 'view/base');
|
||||||
phutil_require_module('phabricator', 'view/control/table');
|
phutil_require_module('phabricator', 'view/control/table');
|
||||||
phutil_require_module('phabricator', 'view/utils');
|
|
||||||
|
|
||||||
phutil_require_module('phutil', 'markup');
|
|
||||||
phutil_require_module('phutil', 'utils');
|
phutil_require_module('phutil', 'utils');
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -292,8 +292,11 @@ class PhabricatorDirectoryMainController
|
||||||
"View Active Revisions \xC2\xBB"));
|
"View Active Revisions \xC2\xBB"));
|
||||||
|
|
||||||
if ($active) {
|
if ($active) {
|
||||||
|
$fields =
|
||||||
|
|
||||||
$revision_view = id(new DifferentialRevisionListView())
|
$revision_view = id(new DifferentialRevisionListView())
|
||||||
->setRevisions($active)
|
->setRevisions($active)
|
||||||
|
->setFields(DifferentialRevisionListView::getDefaultFields())
|
||||||
->setUser($user);
|
->setUser($user);
|
||||||
$phids = array_merge(
|
$phids = array_merge(
|
||||||
array($user_phid),
|
array($user_phid),
|
||||||
|
|
Loading…
Reference in a new issue