Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15415429
D8276.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
19 KB
Referenced Files
None
Subscribers
None
D8276.diff
View Options
Index: src/__phutil_library_map__.php
===================================================================
--- src/__phutil_library_map__.php
+++ src/__phutil_library_map__.php
@@ -355,6 +355,7 @@
'DifferentialCommitsFieldSpecification' => 'applications/differential/field/specification/DifferentialCommitsFieldSpecification.php',
'DifferentialConflictsFieldSpecification' => 'applications/differential/field/specification/DifferentialConflictsFieldSpecification.php',
'DifferentialController' => 'applications/differential/controller/DifferentialController.php',
+ 'DifferentialCustomField' => 'applications/differential/customfield/DifferentialCustomField.php',
'DifferentialCustomFieldDependsOnParser' => 'applications/differential/field/parser/DifferentialCustomFieldDependsOnParser.php',
'DifferentialCustomFieldDependsOnParserTestCase' => 'applications/differential/field/parser/__tests__/DifferentialCustomFieldDependsOnParserTestCase.php',
'DifferentialCustomFieldNumericIndex' => 'applications/differential/storage/DifferentialCustomFieldNumericIndex.php',
@@ -444,6 +445,7 @@
'DifferentialRevisionDetailRenderer' => 'applications/differential/controller/DifferentialRevisionDetailRenderer.php',
'DifferentialRevisionDetailView' => 'applications/differential/view/DifferentialRevisionDetailView.php',
'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php',
+ 'DifferentialRevisionEditControllerPro' => 'applications/differential/controller/DifferentialRevisionEditControllerPro.php',
'DifferentialRevisionEditor' => 'applications/differential/editor/DifferentialRevisionEditor.php',
'DifferentialRevisionIDFieldParserTestCase' => 'applications/differential/field/specification/__tests__/DifferentialRevisionIDFieldParserTestCase.php',
'DifferentialRevisionIDFieldSpecification' => 'applications/differential/field/specification/DifferentialRevisionIDFieldSpecification.php',
@@ -462,9 +464,11 @@
'DifferentialSummaryFieldSpecification' => 'applications/differential/field/specification/DifferentialSummaryFieldSpecification.php',
'DifferentialTasksAttacher' => 'applications/differential/DifferentialTasksAttacher.php',
'DifferentialTestPlanFieldSpecification' => 'applications/differential/field/specification/DifferentialTestPlanFieldSpecification.php',
+ 'DifferentialTitleField' => 'applications/differential/customfield/DifferentialTitleField.php',
'DifferentialTitleFieldSpecification' => 'applications/differential/field/specification/DifferentialTitleFieldSpecification.php',
'DifferentialTransaction' => 'applications/differential/storage/DifferentialTransaction.php',
'DifferentialTransactionComment' => 'applications/differential/storage/DifferentialTransactionComment.php',
+ 'DifferentialTransactionEditor' => 'applications/differential/editor/DifferentialTransactionEditor.php',
'DifferentialTransactionQuery' => 'applications/differential/query/DifferentialTransactionQuery.php',
'DifferentialTransactionView' => 'applications/differential/view/DifferentialTransactionView.php',
'DifferentialUnitFieldSpecification' => 'applications/differential/field/specification/DifferentialUnitFieldSpecification.php',
@@ -2887,6 +2891,7 @@
'DifferentialCommitsFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialConflictsFieldSpecification' => 'DifferentialFieldSpecification',
'DifferentialController' => 'PhabricatorController',
+ 'DifferentialCustomField' => 'PhabricatorCustomField',
'DifferentialCustomFieldDependsOnParser' => 'PhabricatorCustomFieldMonogramParser',
'DifferentialCustomFieldDependsOnParserTestCase' => 'PhabricatorTestCase',
'DifferentialCustomFieldNumericIndex' => 'PhabricatorCustomFieldNumericIndexStorage',
@@ -2975,9 +2980,11 @@
4 => 'PhrequentTrackableInterface',
5 => 'HarbormasterBuildableInterface',
6 => 'PhabricatorSubscribableInterface',
+ 7 => 'PhabricatorCustomFieldInterface',
),
'DifferentialRevisionDetailView' => 'AphrontView',
'DifferentialRevisionEditController' => 'DifferentialController',
+ 'DifferentialRevisionEditControllerPro' => 'DifferentialController',
'DifferentialRevisionEditor' => 'PhabricatorEditor',
'DifferentialRevisionIDFieldParserTestCase' => 'PhabricatorTestCase',
'DifferentialRevisionIDFieldSpecification' => 'DifferentialFieldSpecification',
@@ -2998,9 +3005,11 @@
'DifferentialSubscribeController' => 'DifferentialController',
'DifferentialSummaryFieldSpecification' => 'DifferentialFreeformFieldSpecification',
'DifferentialTestPlanFieldSpecification' => 'DifferentialFieldSpecification',
+ 'DifferentialTitleField' => 'DifferentialCustomField',
'DifferentialTitleFieldSpecification' => 'DifferentialFreeformFieldSpecification',
'DifferentialTransaction' => 'PhabricatorApplicationTransaction',
'DifferentialTransactionComment' => 'PhabricatorApplicationTransactionComment',
+ 'DifferentialTransactionEditor' => 'PhabricatorApplicationTransactionEditor',
'DifferentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
'DifferentialTransactionView' => 'PhabricatorApplicationTransactionView',
'DifferentialUnitFieldSpecification' => 'DifferentialFieldSpecification',
Index: src/applications/differential/application/PhabricatorApplicationDifferential.php
===================================================================
--- src/applications/differential/application/PhabricatorApplicationDifferential.php
+++ src/applications/differential/application/PhabricatorApplicationDifferential.php
@@ -49,6 +49,8 @@
'changeset/' => 'DifferentialChangesetViewController',
'revision/edit/(?:(?P<id>[1-9]\d*)/)?'
=> 'DifferentialRevisionEditController',
+ 'revision/editpro/(?:(?P<id>[1-9]\d*)/)?'
+ => 'DifferentialRevisionEditControllerPro',
'revision/land/(?:(?P<id>[1-9]\d*))/(?P<strategy>[^/]+)/'
=> 'DifferentialRevisionLandController',
'comment/' => array(
Index: src/applications/differential/controller/DifferentialRevisionEditControllerPro.php
===================================================================
--- /dev/null
+++ src/applications/differential/controller/DifferentialRevisionEditControllerPro.php
@@ -0,0 +1,159 @@
+<?php
+
+final class DifferentialRevisionEditControllerPro
+ extends DifferentialController {
+
+ private $id;
+
+ public function willProcessRequest(array $data) {
+ $this->id = idx($data, 'id');
+ }
+
+ public function processRequest() {
+ $request = $this->getRequest();
+ $viewer = $request->getUser();
+
+ if (!$this->id) {
+ $this->id = $request->getInt('revisionID');
+ }
+
+ if ($this->id) {
+ $revision = id(new DifferentialRevisionQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($this->id))
+ ->needRelationships(true)
+ ->needReviewerStatus(true)
+ ->requireCapabilities(
+ array(
+ PhabricatorPolicyCapability::CAN_VIEW,
+ PhabricatorPolicyCapability::CAN_EDIT,
+ ))
+ ->executeOne();
+ if (!$revision) {
+ return new Aphront404Response();
+ }
+ } else {
+ $revision = DifferentialRevision::initializeNewRevision($viewer);
+ }
+
+ $diff_id = $request->getInt('diffID');
+ if ($diff_id) {
+ $diff = id(new DifferentialDiffQuery())
+ ->setViewer($viewer)
+ ->withIDs(array($diff_id))
+ ->executeOne();
+ if (!$diff) {
+ return new Aphront404Response();
+ }
+ if ($diff->getRevisionID()) {
+ // TODO: Redirect?
+ throw new Exception("This diff is already attached to a revision!");
+ }
+ } else {
+ $diff = null;
+ }
+
+ $field_list = PhabricatorCustomField::getObjectFields(
+ $revision,
+ PhabricatorCustomField::ROLE_EDIT);
+ $field_list
+ ->setViewer($viewer)
+ ->readFieldsFromStorage($revision);
+
+ $validation_exception = null;
+ if ($request->isFormPost() && !$request->getStr('viaDiffView')) {
+ $xactions = $field_list->buildFieldTransactionsFromRequest(
+ new DifferentialTransaction(),
+ $request);
+
+ $editor = id(new DifferentialTransactionEditor())
+ ->setActor($viewer)
+ ->setContentSourceFromRequest($request)
+ ->setContinueOnNoEffect(true);
+
+ try {
+ $editor->applyTransactions($revision, $xactions);
+ $revision_uri = '/D'.$revision->getID();
+ return id(new AphrontRedirectResponse())->setURI($revision_uri);
+ } catch (PhabricatorApplicationTransactionValidationException $ex) {
+ $validation_exception = $ex;
+ }
+ }
+
+
+ $form = new AphrontFormView();
+ $form->setUser($request->getUser());
+ if ($diff) {
+ $form->addHiddenInput('diffID', $diff->getID());
+ }
+
+ if ($revision->getID()) {
+ $form->setAction(
+ '/differential/revision/editpro/'.$revision->getID().'/');
+ } else {
+ $form->setAction('/differential/revision/editpro/');
+ }
+
+ if ($diff && $revision->getID()) {
+ $form
+ ->appendChild(
+ id(new AphrontFormTextAreaControl())
+ ->setLabel(pht('Comments'))
+ ->setName('comments')
+ ->setCaption(pht("Explain what's new in this diff."))
+ ->setValue($request->getStr('comments')))
+ ->appendChild(
+ id(new AphrontFormSubmitControl())
+ ->setValue(pht('Save')))
+ ->appendChild(
+ id(new AphrontFormDividerControl()));
+ }
+
+ $field_list->appendFieldsToForm($form);
+
+ $submit = id(new AphrontFormSubmitControl())
+ ->setValue('Save');
+ if ($diff) {
+ $submit->addCancelButton('/differential/diff/'.$diff->getID().'/');
+ } else {
+ $submit->addCancelButton('/D'.$revision->getID());
+ }
+
+ $form->appendChild($submit);
+
+ $crumbs = $this->buildApplicationCrumbs();
+ if ($revision->getID()) {
+ if ($diff) {
+ $title = pht('Update Differential Revision');
+ $crumbs->addTextCrumb(
+ 'D'.$revision->getID(),
+ '/differential/diff/'.$diff->getID().'/');
+ } else {
+ $title = pht('Edit Differential Revision');
+ $crumbs->addTextCrumb(
+ 'D'.$revision->getID(),
+ '/D'.$revision->getID());
+ }
+ } else {
+ $title = pht('Create New Differential Revision');
+ }
+
+ $form_box = id(new PHUIObjectBoxView())
+ ->setHeaderText($title)
+ ->setValidationException($validation_exception)
+ ->setForm($form);
+
+ $crumbs->addTextCrumb($title);
+
+ return $this->buildApplicationPage(
+ array(
+ $crumbs,
+ $form_box,
+ ),
+ array(
+ 'title' => $title,
+ 'device' => true,
+ ));
+ }
+
+}
Index: src/applications/differential/customfield/DifferentialCustomField.php
===================================================================
--- /dev/null
+++ src/applications/differential/customfield/DifferentialCustomField.php
@@ -0,0 +1,6 @@
+<?php
+
+abstract class DifferentialCustomField
+ extends PhabricatorCustomField {
+
+}
Index: src/applications/differential/customfield/DifferentialTitleField.php
===================================================================
--- /dev/null
+++ src/applications/differential/customfield/DifferentialTitleField.php
@@ -0,0 +1,142 @@
+<?php
+
+final class DifferentialTitleField
+ extends DifferentialCustomField {
+
+ private $value;
+ private $fieldError = true;
+
+ public function setFieldError($field_error) {
+ $this->fieldError = $field_error;
+ return $this;
+ }
+
+ public function getFieldError() {
+ return $this->fieldError;
+ }
+
+ public function getFieldKey() {
+ return 'differential:title';
+ }
+
+ public function getFieldName() {
+ return pht('Title');
+ }
+
+ public function getFieldDescription() {
+ return pht('Stores the revision title.');
+ }
+
+ public function canDisableField() {
+ return false;
+ }
+
+ public function shouldAppearInApplicationTransactions() {
+ return true;
+ }
+
+ public function shouldAppearInEditView() {
+ return true;
+ }
+
+ protected function didSetObject(PhabricatorCustomFieldInterface $object) {
+ $this->value = $object->getTitle();
+ }
+
+ public function getOldValueForApplicationTransactions() {
+ return $this->getObject()->getTitle();
+ }
+
+ public function getNewValueForApplicationTransactions() {
+ return $this->value;
+ }
+
+ public function validateApplicationTransactions(
+ PhabricatorApplicationTransactionEditor $editor,
+ $type,
+ array $xactions) {
+
+ $errors = parent::validateApplicationTransactions(
+ $editor,
+ $type,
+ $xactions);
+
+ $transaction = null;
+ foreach ($xactions as $xaction) {
+ $value = $xaction->getNewValue();
+ if (!strlen($value)) {
+ $error = new PhabricatorApplicationTransactionValidationError(
+ $type,
+ pht('Required'),
+ pht('You must choose a title for this revision.'),
+ $xaction);
+ $error->setIsMissingFieldError(true);
+ $errors[] = $error;
+ $this->setFieldError(pht('Required'));
+ }
+ }
+ }
+
+ public function applyApplicationTransactionInternalEffects(
+ PhabricatorApplicationTransaction $xaction) {
+ $this->getObject()->setTitle($xaction->getNewValue());
+ }
+
+ public function readValueFromRequest(AphrontRequest $request) {
+ $this->value = $request->getStr($this->getFieldKey());
+ }
+
+ public function renderEditControl() {
+ return id(new AphrontFormTextAreaControl())
+ ->setHeight(AphrontFormTextAreaControl::HEIGHT_VERY_SHORT)
+ ->setName($this->getFieldKey())
+ ->setValue($this->value)
+ ->setError($this->getFieldError())
+ ->setLabel($this->getFieldName());
+ }
+
+ public function getApplicationTransactionTitle(
+ PhabricatorApplicationTransaction $xaction) {
+ $author_phid = $xaction->getAuthorPHID();
+ $old = $xaction->getOldValue();
+ $new = $xaction->getNewValue();
+
+ if (strlen($old)) {
+ return pht(
+ '%s retitled this revision from "%s" to "%s".',
+ $xaction->renderHandleLink($author_phid),
+ $old,
+ $new);
+ } else {
+ return pht(
+ '%s created this revision.',
+ $xaction->renderHandleLink($author_phid));
+ }
+ }
+
+ public function getApplicationTransactionTitleForFeed(
+ PhabricatorApplicationTransaction $xaction,
+ PhabricatorFeedStory $story) {
+
+ $object_phid = $xaction->getObjectPHID();
+ $author_phid = $xaction->getAuthorPHID();
+ $old = $xaction->getOldValue();
+ $new = $xaction->getNewValue();
+
+ if (strlen($old)) {
+ return pht(
+ '%s retitled %s, from "%s" to "%s".',
+ $xaction->renderHandleLink($author_phid),
+ $xaction->renderHandleLink($object_phid),
+ $old,
+ $new);
+ } else {
+ return pht(
+ '%s created %s.',
+ $xaction->renderHandleLink($author_phid),
+ $xaction->renderHandleLink($object_phid));
+ }
+ }
+
+
+}
Index: src/applications/differential/editor/DifferentialTransactionEditor.php
===================================================================
--- /dev/null
+++ src/applications/differential/editor/DifferentialTransactionEditor.php
@@ -0,0 +1,100 @@
+<?php
+
+final class DifferentialTransactionEditor
+ extends PhabricatorApplicationTransactionEditor {
+
+ public function getTransactionTypes() {
+ $types = parent::getTransactionTypes();
+
+/*
+ $types[] = PhabricatorTransactions::TYPE_EDGE;
+ $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY;
+ $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY;
+
+ $types[] = DifferentialTransaction::TYPE_INLINE;
+ $types[] = DifferentialTransaction::TYPE_UPDATE;
+ $types[] = DifferentialTransaction::TYPE_ACTION;
+*/
+
+ return $types;
+ }
+
+ protected function getCustomTransactionOldValue(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ }
+
+ return parent::getCustomTransactionOldValue($object, $xaction);
+ }
+
+ protected function getCustomTransactionNewValue(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ }
+
+ return parent::getCustomTransactionNewValue($object, $xaction);
+ }
+
+ protected function applyCustomInternalTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ }
+
+ return parent::applyCustomInternalTransaction($object, $xaction);
+ }
+
+ protected function applyCustomExternalTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ }
+
+ return parent::applyCustomExternalTransaction($object, $xaction);
+ }
+
+ protected function validateTransaction(
+ PhabricatorLiskDAO $object,
+ $type,
+ array $xactions) {
+
+ $errors = parent::validateTransaction($object, $type, $xactions);
+
+ switch ($type) {
+ }
+
+ return $errors;
+ }
+
+
+ protected function requireCapabilities(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ }
+
+ return parent::requireCapabilities($object, $xaction);
+ }
+
+ protected function supportsSearch() {
+ return true;
+ }
+
+ protected function extractFilePHIDsFromCustomTransaction(
+ PhabricatorLiskDAO $object,
+ PhabricatorApplicationTransaction $xaction) {
+
+ switch ($xaction->getTransactionType()) {
+ }
+
+ return parent::extractFilePHIDsFromCustomTransaction($object, $xaction);
+ }
+
+}
Index: src/applications/differential/storage/DifferentialRevision.php
===================================================================
--- src/applications/differential/storage/DifferentialRevision.php
+++ src/applications/differential/storage/DifferentialRevision.php
@@ -7,7 +7,8 @@
PhabricatorFlaggableInterface,
PhrequentTrackableInterface,
HarbormasterBuildableInterface,
- PhabricatorSubscribableInterface {
+ PhabricatorSubscribableInterface,
+ PhabricatorCustomFieldInterface {
protected $title = '';
protected $originalTitle;
@@ -39,6 +40,7 @@
private $repository = self::ATTACHABLE;
private $reviewerStatus = self::ATTACHABLE;
+ private $customFields = self::ATTACHABLE;
const TABLE_COMMIT = 'differential_commit';
@@ -436,4 +438,29 @@
return false;
}
+
+/* -( PhabricatorCustomFieldInterface )------------------------------------ */
+
+
+ public function getCustomFieldSpecificationForRole($role) {
+ return array_fill_keys(
+ array(
+
+ ),
+ array('disabled' => false));
+ }
+
+ public function getCustomFieldBaseClass() {
+ return 'DifferentialCustomField';
+ }
+
+ public function getCustomFields() {
+ return $this->assertAttached($this->customFields);
+ }
+
+ public function attachCustomFields(PhabricatorCustomFieldAttachment $fields) {
+ $this->customFields = $fields;
+ return $this;
+ }
+
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mar 21 2025, 5:58 AM (5 w, 2 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7705862
Default Alt Text
D8276.diff (19 KB)
Attached To
Mode
D8276: Implement "Pro" version of revision editor, with one field
Attached
Detach File
Event Timeline
Log In to Comment