@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.

Update Spaces for modular transactions

Summary: Updates the Spaces application for modular transactions, seemed easy to bang out.

Test Plan: Create a space, edit a space, archive a space. Verify default space works as intended.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

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

authored by

Chad Little and committed by
chad
d77a3f87 3d328512

+258 -225
+11 -1
src/__phutil_library_map__.php
··· 3937 3937 'PhabricatorSpacesInterface' => 'applications/spaces/interface/PhabricatorSpacesInterface.php', 3938 3938 'PhabricatorSpacesListController' => 'applications/spaces/controller/PhabricatorSpacesListController.php', 3939 3939 'PhabricatorSpacesNamespace' => 'applications/spaces/storage/PhabricatorSpacesNamespace.php', 3940 + 'PhabricatorSpacesNamespaceArchiveTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceArchiveTransaction.php', 3940 3941 'PhabricatorSpacesNamespaceDatasource' => 'applications/spaces/typeahead/PhabricatorSpacesNamespaceDatasource.php', 3942 + 'PhabricatorSpacesNamespaceDefaultTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceDefaultTransaction.php', 3943 + 'PhabricatorSpacesNamespaceDescriptionTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceDescriptionTransaction.php', 3941 3944 'PhabricatorSpacesNamespaceEditor' => 'applications/spaces/editor/PhabricatorSpacesNamespaceEditor.php', 3945 + 'PhabricatorSpacesNamespaceNameTransaction' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceNameTransaction.php', 3942 3946 'PhabricatorSpacesNamespacePHIDType' => 'applications/spaces/phid/PhabricatorSpacesNamespacePHIDType.php', 3943 3947 'PhabricatorSpacesNamespaceQuery' => 'applications/spaces/query/PhabricatorSpacesNamespaceQuery.php', 3944 3948 'PhabricatorSpacesNamespaceSearchEngine' => 'applications/spaces/query/PhabricatorSpacesNamespaceSearchEngine.php', 3945 3949 'PhabricatorSpacesNamespaceTransaction' => 'applications/spaces/storage/PhabricatorSpacesNamespaceTransaction.php', 3946 3950 'PhabricatorSpacesNamespaceTransactionQuery' => 'applications/spaces/query/PhabricatorSpacesNamespaceTransactionQuery.php', 3951 + 'PhabricatorSpacesNamespaceTransactionType' => 'applications/spaces/xaction/PhabricatorSpacesNamespaceTransactionType.php', 3947 3952 'PhabricatorSpacesNoAccessController' => 'applications/spaces/controller/PhabricatorSpacesNoAccessController.php', 3948 3953 'PhabricatorSpacesRemarkupRule' => 'applications/spaces/remarkup/PhabricatorSpacesRemarkupRule.php', 3949 3954 'PhabricatorSpacesSchemaSpec' => 'applications/spaces/storage/PhabricatorSpacesSchemaSpec.php', ··· 9373 9378 'PhabricatorApplicationTransactionInterface', 9374 9379 'PhabricatorDestructibleInterface', 9375 9380 ), 9381 + 'PhabricatorSpacesNamespaceArchiveTransaction' => 'PhabricatorSpacesNamespaceTransactionType', 9376 9382 'PhabricatorSpacesNamespaceDatasource' => 'PhabricatorTypeaheadDatasource', 9383 + 'PhabricatorSpacesNamespaceDefaultTransaction' => 'PhabricatorSpacesNamespaceTransactionType', 9384 + 'PhabricatorSpacesNamespaceDescriptionTransaction' => 'PhabricatorSpacesNamespaceTransactionType', 9377 9385 'PhabricatorSpacesNamespaceEditor' => 'PhabricatorApplicationTransactionEditor', 9386 + 'PhabricatorSpacesNamespaceNameTransaction' => 'PhabricatorSpacesNamespaceTransactionType', 9378 9387 'PhabricatorSpacesNamespacePHIDType' => 'PhabricatorPHIDType', 9379 9388 'PhabricatorSpacesNamespaceQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 9380 9389 'PhabricatorSpacesNamespaceSearchEngine' => 'PhabricatorApplicationSearchEngine', 9381 - 'PhabricatorSpacesNamespaceTransaction' => 'PhabricatorApplicationTransaction', 9390 + 'PhabricatorSpacesNamespaceTransaction' => 'PhabricatorModularTransaction', 9382 9391 'PhabricatorSpacesNamespaceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 9392 + 'PhabricatorSpacesNamespaceTransactionType' => 'PhabricatorModularTransactionType', 9383 9393 'PhabricatorSpacesNoAccessController' => 'PhabricatorSpacesController', 9384 9394 'PhabricatorSpacesRemarkupRule' => 'PhabricatorObjectRemarkupRule', 9385 9395 'PhabricatorSpacesSchemaSpec' => 'PhabricatorConfigSchemaSpec',
+4 -2
src/applications/spaces/__tests__/PhabricatorSpacesTestCase.php
··· 190 190 191 191 $space = PhabricatorSpacesNamespace::initializeNewNamespace($actor); 192 192 193 - $type_name = PhabricatorSpacesNamespaceTransaction::TYPE_NAME; 194 - $type_default = PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT; 193 + $type_name = 194 + PhabricatorSpacesNamespaceNameTransaction::TRANSACTIONTYPE; 195 + $type_default = 196 + PhabricatorSpacesNamespaceDefaultTransaction::TRANSACTIONTYPE; 195 197 $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 196 198 $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 197 199
+2 -1
src/applications/spaces/controller/PhabricatorSpacesArchiveController.php
··· 23 23 $cancel_uri = '/'.$space->getMonogram(); 24 24 25 25 if ($request->isFormPost()) { 26 - $type_archive = PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE; 26 + $type_archive = 27 + PhabricatorSpacesNamespaceArchiveTransaction::TRANSACTIONTYPE; 27 28 28 29 $xactions = array(); 29 30 $xactions[] = id(new PhabricatorSpacesNamespaceTransaction())
+6 -3
src/applications/spaces/controller/PhabricatorSpacesEditController.php
··· 67 67 $v_view = $request->getStr('viewPolicy'); 68 68 $v_edit = $request->getStr('editPolicy'); 69 69 70 - $type_name = PhabricatorSpacesNamespaceTransaction::TYPE_NAME; 71 - $type_desc = PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION; 72 - $type_default = PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT; 70 + $type_name = 71 + PhabricatorSpacesNamespaceNameTransaction::TRANSACTIONTYPE; 72 + $type_desc = 73 + PhabricatorSpacesNamespaceDescriptionTransaction::TRANSACTIONTYPE; 74 + $type_default = 75 + PhabricatorSpacesNamespaceDefaultTransaction::TRANSACTIONTYPE; 73 76 $type_view = PhabricatorTransactions::TYPE_VIEW_POLICY; 74 77 $type_edit = PhabricatorTransactions::TYPE_EDIT_POLICY; 75 78
+1 -1
src/applications/spaces/controller/PhabricatorSpacesViewController.php
··· 39 39 ->setHeaderIcon('fa-th-large'); 40 40 41 41 if ($space->getIsArchived()) { 42 - $header->setStatus('fa-ban', 'red', pht('Archived')); 42 + $header->setStatus('fa-ban', 'indigo', pht('Archived')); 43 43 } else { 44 44 $header->setStatus('fa-check', 'bluegrey', pht('Active')); 45 45 }
+4 -139
src/applications/spaces/editor/PhabricatorSpacesNamespaceEditor.php
··· 14 14 public function getTransactionTypes() { 15 15 $types = parent::getTransactionTypes(); 16 16 17 - $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_NAME; 18 - $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION; 19 - $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT; 20 - $types[] = PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE; 21 - 22 17 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 23 18 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 24 19 25 20 return $types; 26 21 } 27 22 28 - protected function getCustomTransactionOldValue( 29 - PhabricatorLiskDAO $object, 30 - PhabricatorApplicationTransaction $xaction) { 31 - 32 - switch ($xaction->getTransactionType()) { 33 - case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 34 - $name = $object->getNamespaceName(); 35 - if (!strlen($name)) { 36 - return null; 37 - } 38 - return $name; 39 - case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 40 - if ($this->getIsNewObject()) { 41 - return null; 42 - } 43 - return $object->getDescription(); 44 - case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 45 - return $object->getIsArchived(); 46 - case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 47 - return $object->getIsDefaultNamespace() ? 1 : null; 48 - case PhabricatorTransactions::TYPE_VIEW_POLICY: 49 - return $object->getViewPolicy(); 50 - case PhabricatorTransactions::TYPE_EDIT_POLICY: 51 - return $object->getEditPolicy(); 52 - } 53 - 54 - return parent::getCustomTransactionOldValue($object, $xaction); 55 - } 56 - 57 - protected function getCustomTransactionNewValue( 58 - PhabricatorLiskDAO $object, 59 - PhabricatorApplicationTransaction $xaction) { 60 - 61 - switch ($xaction->getTransactionType()) { 62 - case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 63 - case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 64 - case PhabricatorTransactions::TYPE_VIEW_POLICY: 65 - case PhabricatorTransactions::TYPE_EDIT_POLICY: 66 - return $xaction->getNewValue(); 67 - case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 68 - return $xaction->getNewValue() ? 1 : 0; 69 - case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 70 - return $xaction->getNewValue() ? 1 : null; 71 - } 72 - 73 - return parent::getCustomTransactionNewValue($object, $xaction); 23 + public function getCreateObjectTitle($author, $object) { 24 + return pht('%s created this space.', $author); 74 25 } 75 26 76 - protected function applyCustomInternalTransaction( 77 - PhabricatorLiskDAO $object, 78 - PhabricatorApplicationTransaction $xaction) { 79 - 80 - $new = $xaction->getNewValue(); 81 - 82 - switch ($xaction->getTransactionType()) { 83 - case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 84 - $object->setNamespaceName($new); 85 - return; 86 - case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 87 - $object->setDescription($new); 88 - return; 89 - case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 90 - $object->setIsDefaultNamespace($new ? 1 : null); 91 - return; 92 - case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 93 - $object->setIsArchived($new ? 1 : 0); 94 - return; 95 - case PhabricatorTransactions::TYPE_VIEW_POLICY: 96 - $object->setViewPolicy($new); 97 - return; 98 - case PhabricatorTransactions::TYPE_EDIT_POLICY: 99 - $object->setEditPolicy($new); 100 - return; 101 - } 102 - 103 - return parent::applyCustomInternalTransaction($object, $xaction); 104 - } 105 - 106 - protected function applyCustomExternalTransaction( 107 - PhabricatorLiskDAO $object, 108 - PhabricatorApplicationTransaction $xaction) { 109 - 110 - switch ($xaction->getTransactionType()) { 111 - case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 112 - case PhabricatorSpacesNamespaceTransaction::TYPE_DESCRIPTION: 113 - case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 114 - case PhabricatorSpacesNamespaceTransaction::TYPE_ARCHIVE: 115 - case PhabricatorTransactions::TYPE_VIEW_POLICY: 116 - case PhabricatorTransactions::TYPE_EDIT_POLICY: 117 - return; 118 - } 119 - 120 - return parent::applyCustomExternalTransaction($object, $xaction); 121 - } 122 - 123 - protected function validateTransaction( 124 - PhabricatorLiskDAO $object, 125 - $type, 126 - array $xactions) { 127 - 128 - $errors = parent::validateTransaction($object, $type, $xactions); 129 - 130 - switch ($type) { 131 - case PhabricatorSpacesNamespaceTransaction::TYPE_NAME: 132 - $missing = $this->validateIsEmptyTextField( 133 - $object->getNamespaceName(), 134 - $xactions); 135 - 136 - if ($missing) { 137 - $error = new PhabricatorApplicationTransactionValidationError( 138 - $type, 139 - pht('Required'), 140 - pht('Spaces must have a name.'), 141 - nonempty(last($xactions), null)); 142 - 143 - $error->setIsMissingFieldError(true); 144 - $errors[] = $error; 145 - } 146 - break; 147 - case PhabricatorSpacesNamespaceTransaction::TYPE_DEFAULT: 148 - if (!$this->getIsNewObject()) { 149 - foreach ($xactions as $xaction) { 150 - $errors[] = new PhabricatorApplicationTransactionValidationError( 151 - $type, 152 - pht('Invalid'), 153 - pht( 154 - 'Only the first space created can be the default space, and '. 155 - 'it must remain the default space evermore.'), 156 - $xaction); 157 - } 158 - } 159 - break; 160 - 161 - } 162 - 163 - return $errors; 27 + public function getCreateObjectTitleForFeed($author, $object) { 28 + return pht('%s created space %s.', $author, $object); 164 29 } 165 30 166 31 }
+3 -78
src/applications/spaces/storage/PhabricatorSpacesNamespaceTransaction.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorSpacesNamespaceTransaction 4 - extends PhabricatorApplicationTransaction { 5 - 6 - const TYPE_NAME = 'spaces:name'; 7 - const TYPE_DEFAULT = 'spaces:default'; 8 - const TYPE_DESCRIPTION = 'spaces:description'; 9 - const TYPE_ARCHIVE = 'spaces:archive'; 4 + extends PhabricatorModularTransaction { 10 5 11 6 public function getApplicationName() { 12 7 return 'spaces'; ··· 20 15 return null; 21 16 } 22 17 23 - public function shouldHide() { 24 - $old = $this->getOldValue(); 25 - 26 - switch ($this->getTransactionType()) { 27 - case self::TYPE_DESCRIPTION: 28 - return ($old === null); 29 - } 30 - 31 - return parent::shouldHide(); 32 - } 33 - 34 - public function hasChangeDetails() { 35 - switch ($this->getTransactionType()) { 36 - case self::TYPE_DESCRIPTION: 37 - return true; 38 - } 39 - 40 - return parent::hasChangeDetails(); 41 - } 42 - 43 - public function getRemarkupBlocks() { 44 - $blocks = parent::getRemarkupBlocks(); 45 - 46 - switch ($this->getTransactionType()) { 47 - case self::TYPE_DESCRIPTION: 48 - $blocks[] = $this->getNewValue(); 49 - break; 50 - } 51 - 52 - return $blocks; 53 - } 54 - 55 - public function getTitle() { 56 - $old = $this->getOldValue(); 57 - $new = $this->getNewValue(); 58 - 59 - $author_phid = $this->getAuthorPHID(); 60 - 61 - switch ($this->getTransactionType()) { 62 - case self::TYPE_NAME: 63 - if ($old === null) { 64 - return pht( 65 - '%s created this space.', 66 - $this->renderHandleLink($author_phid)); 67 - } else { 68 - return pht( 69 - '%s renamed this space from "%s" to "%s".', 70 - $this->renderHandleLink($author_phid), 71 - $old, 72 - $new); 73 - } 74 - case self::TYPE_DESCRIPTION: 75 - return pht( 76 - '%s updated the description for this space.', 77 - $this->renderHandleLink($author_phid)); 78 - case self::TYPE_DEFAULT: 79 - return pht( 80 - '%s made this the default space.', 81 - $this->renderHandleLink($author_phid)); 82 - case self::TYPE_ARCHIVE: 83 - if ($new) { 84 - return pht( 85 - '%s archived this space.', 86 - $this->renderHandleLink($author_phid)); 87 - } else { 88 - return pht( 89 - '%s activated this space.', 90 - $this->renderHandleLink($author_phid)); 91 - } 92 - } 93 - 94 - return parent::getTitle(); 18 + public function getBaseTransactionClass() { 19 + return 'PhabricatorSpacesNamespaceTransactionType'; 95 20 } 96 21 97 22 }
+60
src/applications/spaces/xaction/PhabricatorSpacesNamespaceArchiveTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorSpacesNamespaceArchiveTransaction 4 + extends PhabricatorSpacesNamespaceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'spaces:archive'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getIsArchived(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setIsArchived((int)$value); 14 + } 15 + 16 + public function getTitle() { 17 + $new = $this->getNewValue(); 18 + if ($new) { 19 + return pht( 20 + '%s archived this space.', 21 + $this->renderAuthor()); 22 + } else { 23 + return pht( 24 + '%s activated this space.', 25 + $this->renderAuthor()); 26 + } 27 + } 28 + 29 + public function getTitleForFeed() { 30 + $new = $this->getNewValue(); 31 + if ($new) { 32 + return pht( 33 + '%s archived space %s.', 34 + $this->renderAuthor(), 35 + $this->renderObject()); 36 + } else { 37 + return pht( 38 + '%s activated space %s.', 39 + $this->renderAuthor(), 40 + $this->renderObject()); 41 + } 42 + } 43 + 44 + public function getIcon() { 45 + $new = $this->getNewValue(); 46 + if ($new) { 47 + return 'fa-ban'; 48 + } else { 49 + return 'fa-check'; 50 + } 51 + } 52 + 53 + public function getColor() { 54 + $new = $this->getNewValue(); 55 + if ($new) { 56 + return 'indigo'; 57 + } 58 + } 59 + 60 + }
+44
src/applications/spaces/xaction/PhabricatorSpacesNamespaceDefaultTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorSpacesNamespaceDefaultTransaction 4 + extends PhabricatorSpacesNamespaceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'spaces:default'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getIsDefaultNamespace(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setIsDefaultNamespace($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s made this the default space.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function getTitleForFeed() { 23 + return pht( 24 + '%s made space %s the default space.', 25 + $this->renderAuthor(), 26 + $this->renderObject()); 27 + 28 + } 29 + 30 + public function validateTransactions($object, array $xactions) { 31 + $errors = array(); 32 + 33 + if (!$this->isNewObject()) { 34 + foreach ($xactions as $xaction) { 35 + $errors[] = $this->newInvalidError( 36 + pht('Only the first space created can be the default space, and '. 37 + 'it must remain the default space evermore.')); 38 + } 39 + } 40 + 41 + return $errors; 42 + } 43 + 44 + }
+57
src/applications/spaces/xaction/PhabricatorSpacesNamespaceDescriptionTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorSpacesNamespaceDescriptionTransaction 4 + extends PhabricatorSpacesNamespaceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'spaces:description'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDescription(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDescription($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s updated the space description.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function getTitleForFeed() { 23 + return pht( 24 + '%s updated the space description for %s.', 25 + $this->renderAuthor(), 26 + $this->renderObject()); 27 + } 28 + 29 + public function hasChangeDetailView() { 30 + return true; 31 + } 32 + 33 + public function getMailDiffSectionHeader() { 34 + return pht('CHANGES TO SPACE DESCRIPTION'); 35 + } 36 + 37 + public function newChangeDetailView() { 38 + $viewer = $this->getViewer(); 39 + 40 + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 41 + ->setViewer($viewer) 42 + ->setOldText($this->getOldValue()) 43 + ->setNewText($this->getNewValue()); 44 + } 45 + 46 + public function newRemarkupChanges() { 47 + $changes = array(); 48 + 49 + $changes[] = $this->newRemarkupChange() 50 + ->setOldValue($this->getOldValue()) 51 + ->setNewValue($this->getNewValue()); 52 + 53 + return $changes; 54 + } 55 + 56 + 57 + }
+62
src/applications/spaces/xaction/PhabricatorSpacesNamespaceNameTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorSpacesNamespaceNameTransaction 4 + extends PhabricatorSpacesNamespaceTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'spaces:name'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getNamespaceName(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setNamespaceName($value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + if (!strlen($old)) { 19 + return pht( 20 + '%s created this space.', 21 + $this->renderAuthor()); 22 + } else { 23 + return pht( 24 + '%s renamed this space from %s to %s.', 25 + $this->renderAuthor(), 26 + $this->renderOldValue(), 27 + $this->renderNewValue()); 28 + } 29 + } 30 + 31 + public function getTitleForFeed() { 32 + return pht( 33 + '%s renamed space %s from %s to %s.', 34 + $this->renderAuthor(), 35 + $this->renderObject(), 36 + $this->renderOldValue(), 37 + $this->renderNewValue()); 38 + } 39 + 40 + public function validateTransactions($object, array $xactions) { 41 + $errors = array(); 42 + 43 + if ($this->isEmptyTextTransaction($object->getNamespaceName(), $xactions)) { 44 + $errors[] = $this->newRequiredError( 45 + pht('Spaces must have a name.')); 46 + } 47 + 48 + $max_length = $object->getColumnMaximumByteLength('namespaceName'); 49 + foreach ($xactions as $xaction) { 50 + $new_value = $xaction->getNewValue(); 51 + $new_length = strlen($new_value); 52 + if ($new_length > $max_length) { 53 + $errors[] = $this->newInvalidError( 54 + pht('The name can be no longer than %s characters.', 55 + new PhutilNumber($max_length))); 56 + } 57 + } 58 + 59 + return $errors; 60 + } 61 + 62 + }
+4
src/applications/spaces/xaction/PhabricatorSpacesNamespaceTransactionType.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorSpacesNamespaceTransactionType 4 + extends PhabricatorModularTransactionType {}