@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Begin adding "pro" modular transaction fields to Differential

Summary:
Ref T11114. Currently, all of Differential is extremely custom CustomFields. I want to back away from that somewhat and leverage more EditEngine / ModularTransactions infrastructure.

This allows EditEngine, ModularTransactions, and CustomFields to coexist in an uneasy peace. The "EditPro" controller applies a //different edit// than the CustomFields do, but everything works out in the end. I think.

Hopefully the horrible mess I am creating here will be short-lived.

Test Plan:
- Edited a revision with the normal editor.
- Edited a revision with the pro editor.
- Created a revision with `arc diff`.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T11114

Differential Revision: https://secure.phabricator.com/D17044

+91 -8
+5 -1
src/__phutil_library_map__.php
··· 553 553 'DifferentialRevisionStatus' => 'applications/differential/constants/DifferentialRevisionStatus.php', 554 554 'DifferentialRevisionSummaryHeraldField' => 'applications/differential/herald/DifferentialRevisionSummaryHeraldField.php', 555 555 'DifferentialRevisionTitleHeraldField' => 'applications/differential/herald/DifferentialRevisionTitleHeraldField.php', 556 + 'DifferentialRevisionTitleTransaction' => 'applications/differential/xaction/DifferentialRevisionTitleTransaction.php', 557 + 'DifferentialRevisionTransactionType' => 'applications/differential/xaction/DifferentialRevisionTransactionType.php', 556 558 'DifferentialRevisionUpdateHistoryView' => 'applications/differential/view/DifferentialRevisionUpdateHistoryView.php', 557 559 'DifferentialRevisionViewController' => 'applications/differential/controller/DifferentialRevisionViewController.php', 558 560 'DifferentialSchemaSpec' => 'applications/differential/storage/DifferentialSchemaSpec.php', ··· 5201 5203 'DifferentialRevisionStatus' => 'Phobject', 5202 5204 'DifferentialRevisionSummaryHeraldField' => 'DifferentialRevisionHeraldField', 5203 5205 'DifferentialRevisionTitleHeraldField' => 'DifferentialRevisionHeraldField', 5206 + 'DifferentialRevisionTitleTransaction' => 'DifferentialRevisionTransactionType', 5207 + 'DifferentialRevisionTransactionType' => 'PhabricatorModularTransactionType', 5204 5208 'DifferentialRevisionUpdateHistoryView' => 'AphrontView', 5205 5209 'DifferentialRevisionViewController' => 'DifferentialController', 5206 5210 'DifferentialSchemaSpec' => 'PhabricatorConfigSchemaSpec', ··· 5210 5214 'DifferentialSummaryField' => 'DifferentialCoreCustomField', 5211 5215 'DifferentialTestPlanField' => 'DifferentialCoreCustomField', 5212 5216 'DifferentialTitleField' => 'DifferentialCoreCustomField', 5213 - 'DifferentialTransaction' => 'PhabricatorApplicationTransaction', 5217 + 'DifferentialTransaction' => 'PhabricatorModularTransaction', 5214 5218 'DifferentialTransactionComment' => 'PhabricatorApplicationTransactionComment', 5215 5219 'DifferentialTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 5216 5220 'DifferentialTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
+11 -1
src/applications/differential/editor/DifferentialRevisionEditEngine.php
··· 60 60 } 61 61 62 62 protected function buildCustomEditFields($object) { 63 - return array(); 63 + return array( 64 + id(new PhabricatorTextEditField()) 65 + ->setKey('title') 66 + ->setLabel(pht('Title')) 67 + ->setTransactionType( 68 + DifferentialRevisionTitleTransaction::TRANSACTIONTYPE) 69 + ->setDescription(pht('The title of the revision.')) 70 + ->setConduitDescription(pht('Retitle the revision.')) 71 + ->setConduitTypeDescription(pht('New revision title.')) 72 + ->setValue($object->getTitle()), 73 + ); 64 74 } 65 75 66 76 }
+5 -1
src/applications/differential/storage/DifferentialTransaction.php
··· 1 1 <?php 2 2 3 - final class DifferentialTransaction extends PhabricatorApplicationTransaction { 3 + final class DifferentialTransaction 4 + extends PhabricatorModularTransaction { 4 5 5 6 private $isCommandeerSideEffect; 6 7 ··· 17 18 const MAILTAG_REVIEW_REQUEST = 'differential-review-request'; 18 19 const MAILTAG_OTHER = 'differential-other'; 19 20 21 + public function getBaseTransactionClass() { 22 + return 'DifferentialRevisionTransactionType'; 23 + } 20 24 21 25 public function setIsCommandeerSideEffect($is_side_effect) { 22 26 $this->isCommandeerSideEffect = $is_side_effect;
+57
src/applications/differential/xaction/DifferentialRevisionTitleTransaction.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionTitleTransaction 4 + extends DifferentialRevisionTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'differential.revision.title'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getTitle(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setTitle($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s retitled this revision from %s to %s.', 19 + $this->renderAuthor(), 20 + $this->renderOldValue(), 21 + $this->renderNewValue()); 22 + } 23 + 24 + public function getTitleForFeed() { 25 + return pht( 26 + '%s retitled %s from %s to %s.', 27 + $this->renderAuthor(), 28 + $this->renderObject(), 29 + $this->renderOldValue(), 30 + $this->renderNewValue()); 31 + } 32 + 33 + public function validateTransactions($object, array $xactions) { 34 + $errors = array(); 35 + 36 + if ($this->isEmptyTextTransaction($object->getTitle(), $xactions)) { 37 + $errors[] = $this->newRequiredError( 38 + pht('Revisions must have a title.')); 39 + } 40 + 41 + $max_length = $object->getColumnMaximumByteLength('title'); 42 + foreach ($xactions as $xaction) { 43 + $new_value = $xaction->getNewValue(); 44 + $new_length = strlen($new_value); 45 + if ($new_length > $max_length) { 46 + $errors[] = $this->newInvalidError( 47 + pht( 48 + 'Revision title is too long: the maximum length of a '. 49 + 'revision title is 255 bytes.'), 50 + $xaction); 51 + } 52 + } 53 + 54 + return $errors; 55 + } 56 + 57 + }
+4
src/applications/differential/xaction/DifferentialRevisionTransactionType.php
··· 1 + <?php 2 + 3 + abstract class DifferentialRevisionTransactionType 4 + extends PhabricatorModularTransactionType {}
+9 -5
src/applications/transactions/storage/PhabricatorModularTransaction.php
··· 1 1 <?php 2 2 3 + // TODO: Some "final" modifiers have been VERY TEMPORARILY moved aside to 4 + // allow DifferentialTransaction to extend this class without converting 5 + // fully to ModularTransactions. 6 + 3 7 abstract class PhabricatorModularTransaction 4 8 extends PhabricatorApplicationTransaction { 5 9 ··· 76 80 ->applyExternalEffects($object); 77 81 } 78 82 79 - final public function shouldHide() { 83 + /* final */ public function shouldHide() { 80 84 if ($this->getTransactionImplementation()->shouldHide()) { 81 85 return true; 82 86 } ··· 84 88 return parent::shouldHide(); 85 89 } 86 90 87 - final public function getIcon() { 91 + /* final */ public function getIcon() { 88 92 $icon = $this->getTransactionImplementation()->getIcon(); 89 93 if ($icon !== null) { 90 94 return $icon; ··· 93 97 return parent::getIcon(); 94 98 } 95 99 96 - final public function getTitle() { 100 + /* final */ public function getTitle() { 97 101 $title = $this->getTransactionImplementation()->getTitle(); 98 102 if ($title !== null) { 99 103 return $title; ··· 111 115 return $title; 112 116 } 113 117 114 - final public function getTitleForFeed() { 118 + /* final */ public function getTitleForFeed() { 115 119 $title = $this->getTransactionImplementation()->getTitleForFeed(); 116 120 if ($title !== null) { 117 121 return $title; ··· 120 124 return parent::getTitleForFeed(); 121 125 } 122 126 123 - final public function getColor() { 127 + /* final */ public function getColor() { 124 128 $color = $this->getTransactionImplementation()->getColor(); 125 129 if ($color !== null) { 126 130 return $color;