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

Rough sketch of new repository URI editing

Summary:
Ref T10748. Ref T10366. This adds a new EditEngine, EditController, Editor, Query, and Transaction for RepositoryURIs.

None of these really do anything helpful yet, and these URIs are still unused in the actual application.

Test Plan: {F1249794}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10366, T10748

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

+524 -6
+19
resources/sql/autopatches/20160428.repo.1.urixaction.sql
··· 1 + CREATE TABLE {$NAMESPACE}_repository.repository_uritransaction ( 2 + id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 3 + phid VARBINARY(64) NOT NULL, 4 + authorPHID VARBINARY(64) NOT NULL, 5 + objectPHID VARBINARY(64) NOT NULL, 6 + viewPolicy VARBINARY(64) NOT NULL, 7 + editPolicy VARBINARY(64) NOT NULL, 8 + commentPHID VARBINARY(64) DEFAULT NULL, 9 + commentVersion INT UNSIGNED NOT NULL, 10 + transactionType VARCHAR(32) COLLATE {$COLLATE_TEXT} NOT NULL, 11 + oldValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 12 + newValue LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 13 + contentSource LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 14 + metadata LONGTEXT COLLATE {$COLLATE_TEXT} NOT NULL, 15 + dateCreated INT UNSIGNED NOT NULL, 16 + dateModified INT UNSIGNED NOT NULL, 17 + UNIQUE KEY `key_phid` (`phid`), 18 + KEY `key_object` (`objectPHID`) 19 + ) ENGINE=InnoDB, COLLATE {$COLLATE_TEXT};
+18 -1
src/__phutil_library_map__.php
··· 789 789 'DiffusionRepositorySymbolsManagementPanel' => 'applications/diffusion/management/DiffusionRepositorySymbolsManagementPanel.php', 790 790 'DiffusionRepositoryTag' => 'applications/diffusion/data/DiffusionRepositoryTag.php', 791 791 'DiffusionRepositoryTestAutomationController' => 'applications/diffusion/controller/DiffusionRepositoryTestAutomationController.php', 792 + 'DiffusionRepositoryURIEditController' => 'applications/diffusion/controller/DiffusionRepositoryURIEditController.php', 792 793 'DiffusionRepositoryURIsIndexEngineExtension' => 'applications/diffusion/engineextension/DiffusionRepositoryURIsIndexEngineExtension.php', 793 794 'DiffusionRepositoryURIsManagementPanel' => 'applications/diffusion/management/DiffusionRepositoryURIsManagementPanel.php', 794 795 'DiffusionRequest' => 'applications/diffusion/request/DiffusionRequest.php', ··· 814 815 'DiffusionTagListController' => 'applications/diffusion/controller/DiffusionTagListController.php', 815 816 'DiffusionTagListView' => 'applications/diffusion/view/DiffusionTagListView.php', 816 817 'DiffusionTagsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionTagsQueryConduitAPIMethod.php', 818 + 'DiffusionURIEditEngine' => 'applications/diffusion/editor/DiffusionURIEditEngine.php', 819 + 'DiffusionURIEditor' => 'applications/diffusion/editor/DiffusionURIEditor.php', 817 820 'DiffusionURITestCase' => 'applications/diffusion/request/__tests__/DiffusionURITestCase.php', 818 821 'DiffusionUpdateCoverageConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionUpdateCoverageConduitAPIMethod.php', 819 822 'DiffusionView' => 'applications/diffusion/view/DiffusionView.php', ··· 3237 3240 'PhabricatorRepositoryURIIndex' => 'applications/repository/storage/PhabricatorRepositoryURIIndex.php', 3238 3241 'PhabricatorRepositoryURINormalizer' => 'applications/repository/data/PhabricatorRepositoryURINormalizer.php', 3239 3242 'PhabricatorRepositoryURINormalizerTestCase' => 'applications/repository/data/__tests__/PhabricatorRepositoryURINormalizerTestCase.php', 3243 + 'PhabricatorRepositoryURIPHIDType' => 'applications/repository/phid/PhabricatorRepositoryURIPHIDType.php', 3244 + 'PhabricatorRepositoryURIQuery' => 'applications/repository/query/PhabricatorRepositoryURIQuery.php', 3240 3245 'PhabricatorRepositoryURITestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php', 3246 + 'PhabricatorRepositoryURITransaction' => 'applications/repository/storage/PhabricatorRepositoryURITransaction.php', 3241 3247 'PhabricatorRepositoryVCSPassword' => 'applications/repository/storage/PhabricatorRepositoryVCSPassword.php', 3242 3248 'PhabricatorRepositoryVersion' => 'applications/repository/constants/PhabricatorRepositoryVersion.php', 3243 3249 'PhabricatorRepositoryWorkingCopyVersion' => 'applications/repository/storage/PhabricatorRepositoryWorkingCopyVersion.php', ··· 5009 5015 'DiffusionRepositorySymbolsManagementPanel' => 'DiffusionRepositoryManagementPanel', 5010 5016 'DiffusionRepositoryTag' => 'Phobject', 5011 5017 'DiffusionRepositoryTestAutomationController' => 'DiffusionRepositoryEditController', 5018 + 'DiffusionRepositoryURIEditController' => 'DiffusionRepositoryEditController', 5012 5019 'DiffusionRepositoryURIsIndexEngineExtension' => 'PhabricatorIndexEngineExtension', 5013 5020 'DiffusionRepositoryURIsManagementPanel' => 'DiffusionRepositoryManagementPanel', 5014 5021 'DiffusionRequest' => 'Phobject', ··· 5034 5041 'DiffusionTagListController' => 'DiffusionController', 5035 5042 'DiffusionTagListView' => 'DiffusionView', 5036 5043 'DiffusionTagsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 5044 + 'DiffusionURIEditEngine' => 'PhabricatorEditEngine', 5045 + 'DiffusionURIEditor' => 'PhabricatorApplicationTransactionEditor', 5037 5046 'DiffusionURITestCase' => 'PhutilTestCase', 5038 5047 'DiffusionUpdateCoverageConduitAPIMethod' => 'DiffusionConduitAPIMethod', 5039 5048 'DiffusionView' => 'AphrontView', ··· 7913 7922 'PhabricatorRepositoryTransaction' => 'PhabricatorApplicationTransaction', 7914 7923 'PhabricatorRepositoryTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 7915 7924 'PhabricatorRepositoryType' => 'Phobject', 7916 - 'PhabricatorRepositoryURI' => 'PhabricatorRepositoryDAO', 7925 + 'PhabricatorRepositoryURI' => array( 7926 + 'PhabricatorRepositoryDAO', 7927 + 'PhabricatorApplicationTransactionInterface', 7928 + 'PhabricatorPolicyInterface', 7929 + 'PhabricatorExtendedPolicyInterface', 7930 + ), 7917 7931 'PhabricatorRepositoryURIIndex' => 'PhabricatorRepositoryDAO', 7918 7932 'PhabricatorRepositoryURINormalizer' => 'Phobject', 7919 7933 'PhabricatorRepositoryURINormalizerTestCase' => 'PhabricatorTestCase', 7934 + 'PhabricatorRepositoryURIPHIDType' => 'PhabricatorPHIDType', 7935 + 'PhabricatorRepositoryURIQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 7920 7936 'PhabricatorRepositoryURITestCase' => 'PhabricatorTestCase', 7937 + 'PhabricatorRepositoryURITransaction' => 'PhabricatorApplicationTransaction', 7921 7938 'PhabricatorRepositoryVCSPassword' => 'PhabricatorRepositoryDAO', 7922 7939 'PhabricatorRepositoryVersion' => 'Phobject', 7923 7940 'PhabricatorRepositoryWorkingCopyVersion' => 'PhabricatorRepositoryDAO',
+2
src/applications/diffusion/application/PhabricatorDiffusionApplication.php
··· 91 91 => 'DiffusionCommitEditController', 92 92 'manage/(?:(?P<panel>[^/]+)/)?' 93 93 => 'DiffusionRepositoryManageController', 94 + $this->getEditRoutePattern('uri/edit/') 95 + => 'DiffusionRepositoryURIEditController', 94 96 'edit/' => array( 95 97 '' => 'DiffusionRepositoryEditMainController', 96 98 'basic/' => 'DiffusionRepositoryEditBasicController',
+21
src/applications/diffusion/controller/DiffusionRepositoryURIEditController.php
··· 1 + <?php 2 + 3 + final class DiffusionRepositoryURIEditController 4 + extends DiffusionRepositoryEditController { 5 + 6 + public function handleRequest(AphrontRequest $request) { 7 + $response = $this->loadDiffusionContextForEdit(); 8 + if ($response) { 9 + return $response; 10 + } 11 + 12 + $drequest = $this->getDiffusionRequest(); 13 + $repository = $drequest->getRepository(); 14 + 15 + return id(new DiffusionURIEditEngine()) 16 + ->setController($this) 17 + ->setRepository($repository) 18 + ->buildResponse(); 19 + } 20 + 21 + }
+93
src/applications/diffusion/editor/DiffusionURIEditEngine.php
··· 1 + <?php 2 + 3 + final class DiffusionURIEditEngine 4 + extends PhabricatorEditEngine { 5 + 6 + const ENGINECONST = 'diffusion.uri'; 7 + 8 + private $repository; 9 + 10 + public function setRepository(PhabricatorRepository $repository) { 11 + $this->repository = $repository; 12 + return $this; 13 + } 14 + 15 + public function getRepository() { 16 + return $this->repository; 17 + } 18 + 19 + public function isEngineConfigurable() { 20 + return false; 21 + } 22 + 23 + public function getEngineName() { 24 + return pht('Repository URIs'); 25 + } 26 + 27 + public function getSummaryHeader() { 28 + return pht('Edit Repository URI'); 29 + } 30 + 31 + public function getSummaryText() { 32 + return pht('Creates and edits repository URIs.'); 33 + } 34 + 35 + public function getEngineApplicationClass() { 36 + return 'PhabricatorDiffusionApplication'; 37 + } 38 + 39 + protected function newEditableObject() { 40 + $repository = $this->getRepository(); 41 + return PhabricatorRepositoryURI::initializeNewURI($repository); 42 + } 43 + 44 + protected function newObjectQuery() { 45 + return new PhabricatorRepositoryURIQuery(); 46 + } 47 + 48 + protected function getObjectCreateTitleText($object) { 49 + return pht('Create Repository URI'); 50 + } 51 + 52 + protected function getObjectCreateButtonText($object) { 53 + return pht('Create Repository URI'); 54 + } 55 + 56 + protected function getObjectEditTitleText($object) { 57 + return pht('Edit Repository URI: %s', $object->getDisplayURI()); 58 + } 59 + 60 + protected function getObjectEditShortText($object) { 61 + return $object->getDisplayURI(); 62 + } 63 + 64 + protected function getObjectCreateShortText() { 65 + return pht('Create Repository URI'); 66 + } 67 + 68 + protected function getObjectName() { 69 + return pht('Repository URI'); 70 + } 71 + 72 + protected function getObjectViewURI($object) { 73 + $repository = $this->getRepository(); 74 + return $repository->getPathURI('manage/uris/'); 75 + } 76 + 77 + protected function buildCustomEditFields($object) { 78 + $viewer = $this->getViewer(); 79 + 80 + return array( 81 + id(new PhabricatorTextEditField()) 82 + ->setKey('uri') 83 + ->setLabel(pht('URI')) 84 + ->setIsRequired(true) 85 + ->setTransactionType(PhabricatorRepositoryURITransaction::TYPE_URI) 86 + ->setDescription(pht('The repository URI.')) 87 + ->setConduitDescription(pht('Change the repository URI.')) 88 + ->setConduitTypeDescription(pht('New repository URI.')) 89 + ->setValue($object->getURI()), 90 + ); 91 + } 92 + 93 + }
+99
src/applications/diffusion/editor/DiffusionURIEditor.php
··· 1 + <?php 2 + 3 + final class DiffusionURIEditor 4 + extends PhabricatorApplicationTransactionEditor { 5 + 6 + public function getEditorApplicationClass() { 7 + return 'PhabricatorDiffusionApplication'; 8 + } 9 + 10 + public function getEditorObjectsDescription() { 11 + return pht('Diffusion URIs'); 12 + } 13 + 14 + public function getTransactionTypes() { 15 + $types = parent::getTransactionTypes(); 16 + 17 + $types[] = PhabricatorRepositoryURITransaction::TYPE_URI; 18 + 19 + return $types; 20 + } 21 + 22 + protected function getCustomTransactionOldValue( 23 + PhabricatorLiskDAO $object, 24 + PhabricatorApplicationTransaction $xaction) { 25 + 26 + switch ($xaction->getTransactionType()) { 27 + case PhabricatorRepositoryURITransaction::TYPE_URI: 28 + return $object->getURI(); 29 + } 30 + 31 + return parent::getCustomTransactionOldValue($object, $xaction); 32 + } 33 + 34 + protected function getCustomTransactionNewValue( 35 + PhabricatorLiskDAO $object, 36 + PhabricatorApplicationTransaction $xaction) { 37 + 38 + switch ($xaction->getTransactionType()) { 39 + case PhabricatorRepositoryURITransaction::TYPE_URI: 40 + return $xaction->getNewValue(); 41 + } 42 + 43 + return parent::getCustomTransactionNewValue($object, $xaction); 44 + } 45 + 46 + protected function applyCustomInternalTransaction( 47 + PhabricatorLiskDAO $object, 48 + PhabricatorApplicationTransaction $xaction) { 49 + 50 + switch ($xaction->getTransactionType()) { 51 + case PhabricatorRepositoryURITransaction::TYPE_URI: 52 + $object->setURI($xaction->getNewValue()); 53 + break; 54 + } 55 + } 56 + 57 + protected function applyCustomExternalTransaction( 58 + PhabricatorLiskDAO $object, 59 + PhabricatorApplicationTransaction $xaction) { 60 + 61 + switch ($xaction->getTransactionType()) { 62 + case PhabricatorRepositoryURITransaction::TYPE_URI: 63 + return; 64 + } 65 + 66 + return parent::applyCustomExternalTransaction($object, $xaction); 67 + } 68 + 69 + protected function validateTransaction( 70 + PhabricatorLiskDAO $object, 71 + $type, 72 + array $xactions) { 73 + 74 + $errors = parent::validateTransaction($object, $type, $xactions); 75 + 76 + switch ($type) { 77 + case PhabricatorRepositoryURITransaction::TYPE_URI: 78 + $missing = $this->validateIsEmptyTextField( 79 + $object->getURI(), 80 + $xactions); 81 + 82 + if ($missing) { 83 + $error = new PhabricatorApplicationTransactionValidationError( 84 + $type, 85 + pht('Required'), 86 + pht('Repository URI is required.'), 87 + nonempty(last($xactions), null)); 88 + 89 + $error->setIsMissingFieldError(true); 90 + $errors[] = $error; 91 + break; 92 + } 93 + break; 94 + } 95 + 96 + return $errors; 97 + } 98 + 99 + }
+6 -2
src/applications/diffusion/management/DiffusionRepositoryURIsManagementPanel.php
··· 16 16 public function buildManagementPanelContent() { 17 17 $repository = $this->getRepository(); 18 18 $viewer = $this->getViewer(); 19 - 20 - $repository->attachURIs(array()); 21 19 $uris = $repository->getURIs(); 22 20 23 21 Javelin::initBehavior('phabricator-tooltips'); ··· 25 23 foreach ($uris as $uri) { 26 24 27 25 $uri_name = $uri->getDisplayURI(); 26 + $uri_name = phutil_tag( 27 + 'a', 28 + array( 29 + 'href' => $repository->getPathURI('uri/edit/'.$uri->getID().'/'), 30 + ), 31 + $uri_name); 28 32 29 33 if ($uri->getIsDisabled()) { 30 34 $status_icon = 'fa-times grey';
+2 -1
src/applications/diffusion/request/DiffusionRequest.php
··· 142 142 143 143 $query = id(new PhabricatorRepositoryQuery()) 144 144 ->setViewer($viewer) 145 - ->withIdentifiers(array($identifier)); 145 + ->withIdentifiers(array($identifier)) 146 + ->needURIs(true); 146 147 147 148 if ($need_edit) { 148 149 $query->requireCapabilities(
+40
src/applications/repository/phid/PhabricatorRepositoryURIPHIDType.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryURIPHIDType extends PhabricatorPHIDType { 4 + 5 + const TYPECONST = 'RURI'; 6 + 7 + public function getTypeName() { 8 + return pht('Repository URI'); 9 + } 10 + 11 + public function newObject() { 12 + return new PhabricatorRepositoryURI(); 13 + } 14 + 15 + public function getPHIDTypeApplicationClass() { 16 + return 'PhabricatorDiffusionApplication'; 17 + } 18 + 19 + protected function buildQueryForObjects( 20 + PhabricatorObjectQuery $query, 21 + array $phids) { 22 + 23 + return id(new PhabricatorRepositoryURIQuery()) 24 + ->withPHIDs($phids); 25 + } 26 + 27 + public function loadHandles( 28 + PhabricatorHandleQuery $query, 29 + array $handles, 30 + array $objects) { 31 + 32 + foreach ($handles as $phid => $handle) { 33 + $uri = $objects[$phid]; 34 + 35 + $handle->setName( 36 + pht('URI %d %s', $uri->getID(), $uri->getDisplayURI())); 37 + } 38 + } 39 + 40 + }
+20
src/applications/repository/query/PhabricatorRepositoryQuery.php
··· 34 34 private $needMostRecentCommits; 35 35 private $needCommitCounts; 36 36 private $needProjectPHIDs; 37 + private $needURIs; 37 38 38 39 public function withIDs(array $ids) { 39 40 $this->ids = $ids; ··· 145 146 146 147 public function needProjectPHIDs($need_phids) { 147 148 $this->needProjectPHIDs = $need_phids; 149 + return $this; 150 + } 151 + 152 + public function needURIs($need_uris) { 153 + $this->needURIs = $need_uris; 148 154 return $this; 149 155 } 150 156 ··· 345 351 $repository->getPHID(), 346 352 )); 347 353 $repository->attachProjectPHIDs($project_phids); 354 + } 355 + } 356 + 357 + $viewer = $this->getViewer(); 358 + 359 + if ($this->needURIs) { 360 + $uris = id(new PhabricatorRepositoryURIQuery()) 361 + ->setViewer($viewer) 362 + ->withRepositories($repositories) 363 + ->execute(); 364 + $uri_groups = mgroup($uris, 'getRepositoryPHID'); 365 + foreach ($repositories as $repository) { 366 + $repository_uris = idx($uri_groups, $repository->getPHID(), array()); 367 + $repository->attachURIs($repository_uris); 348 368 } 349 369 } 350 370
+106
src/applications/repository/query/PhabricatorRepositoryURIQuery.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryURIQuery 4 + extends PhabricatorCursorPagedPolicyAwareQuery { 5 + 6 + private $ids; 7 + private $phids; 8 + private $repositoryPHIDs; 9 + private $repositories = array(); 10 + 11 + public function withIDs(array $ids) { 12 + $this->ids = $ids; 13 + return $this; 14 + } 15 + 16 + public function withPHIDs(array $phids) { 17 + $this->phids = $phids; 18 + return $this; 19 + } 20 + 21 + public function withRepositoryPHIDs(array $phids) { 22 + $this->repositoryPHIDs = $phids; 23 + return $this; 24 + } 25 + 26 + public function withRepositories(array $repositories) { 27 + $repositories = mpull($repositories, null, 'getPHID'); 28 + $this->withRepositoryPHIDs(array_keys($repositories)); 29 + $this->repositories = $repositories; 30 + return $this; 31 + } 32 + 33 + public function withObjectHashes(array $hashes) { 34 + $this->objectHashes = $hashes; 35 + return $this; 36 + } 37 + 38 + public function newResultObject() { 39 + return new PhabricatorRepositoryURI(); 40 + } 41 + 42 + protected function loadPage() { 43 + return $this->loadStandardPage($this->newResultObject()); 44 + } 45 + 46 + protected function buildWhereClauseParts(AphrontDatabaseConnection $conn) { 47 + $where = parent::buildWhereClauseParts($conn); 48 + 49 + if ($this->ids !== null) { 50 + $where[] = qsprintf( 51 + $conn, 52 + 'id IN (%Ld)', 53 + $this->ids); 54 + } 55 + 56 + if ($this->phids !== null) { 57 + $where[] = qsprintf( 58 + $conn, 59 + 'phid IN (%Ls)', 60 + $this->phids); 61 + } 62 + 63 + if ($this->repositoryPHIDs !== null) { 64 + $where[] = qsprintf( 65 + $conn, 66 + 'repositoryPHID IN (%Ls)', 67 + $this->repositoryPHIDs); 68 + } 69 + 70 + return $where; 71 + } 72 + 73 + protected function willFilterPage(array $uris) { 74 + $repositories = $this->repositories; 75 + 76 + $repository_phids = mpull($uris, 'getRepositoryPHID'); 77 + $repository_phids = array_fuse($repository_phids); 78 + $repository_phids = array_diff_key($repository_phids, $repositories); 79 + 80 + if ($repository_phids) { 81 + $more_repositories = id(new PhabricatorRepositoryQuery()) 82 + ->setViewer($this->getViewer()) 83 + ->withPHIDs($repository_phids) 84 + ->execute(); 85 + $repositories += mpull($more_repositories, null, 'getPHID'); 86 + } 87 + 88 + foreach ($uris as $key => $uri) { 89 + $repository_phid = $uri->getRepositoryPHID(); 90 + $repository = idx($repositories, $repository_phid); 91 + if (!$repository) { 92 + $this->didRejectResult($uri); 93 + unset($uris[$key]); 94 + continue; 95 + } 96 + $uri->attachRepository($repository); 97 + } 98 + 99 + return $uris; 100 + } 101 + 102 + public function getQueryApplicationClass() { 103 + return 'PhabricatorDiffusionApplication'; 104 + } 105 + 106 + }
+78 -2
src/applications/repository/storage/PhabricatorRepositoryURI.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorRepositoryURI 4 - extends PhabricatorRepositoryDAO { 4 + extends PhabricatorRepositoryDAO 5 + implements 6 + PhabricatorApplicationTransactionInterface, 7 + PhabricatorPolicyInterface, 8 + PhabricatorExtendedPolicyInterface { 5 9 6 10 protected $repositoryPHID; 7 11 protected $uri; ··· 67 71 ->setIsDisabled(0); 68 72 } 69 73 74 + public function generatePHID() { 75 + return PhabricatorPHID::generateNewPHID( 76 + PhabricatorRepositoryURIPHIDType::TYPECONST); 77 + } 78 + 70 79 public function attachRepository(PhabricatorRepository $repository) { 71 80 $this->repository = $repository; 72 81 return $this; ··· 176 185 } 177 186 } 178 187 179 - return self::IO_IGNORE; 188 + return self::IO_NONE; 180 189 } 181 190 182 191 ··· 296 305 default: 297 306 return null; 298 307 } 308 + } 309 + 310 + 311 + /* -( PhabricatorApplicationTransactionInterface )------------------------- */ 312 + 313 + 314 + public function getApplicationTransactionEditor() { 315 + return new DiffusionURIEditor(); 316 + } 317 + 318 + public function getApplicationTransactionObject() { 319 + return $this; 320 + } 321 + 322 + public function getApplicationTransactionTemplate() { 323 + return new PhabricatorRepositoryURITransaction(); 324 + } 325 + 326 + public function willRenderTimeline( 327 + PhabricatorApplicationTransactionView $timeline, 328 + AphrontRequest $request) { 329 + return $timeline; 330 + } 331 + 332 + 333 + /* -( PhabricatorPolicyInterface )----------------------------------------- */ 334 + 335 + 336 + public function getCapabilities() { 337 + return array( 338 + PhabricatorPolicyCapability::CAN_VIEW, 339 + PhabricatorPolicyCapability::CAN_EDIT, 340 + ); 341 + } 342 + 343 + public function getPolicy($capability) { 344 + switch ($capability) { 345 + case PhabricatorPolicyCapability::CAN_VIEW: 346 + case PhabricatorPolicyCapability::CAN_EDIT: 347 + return PhabricatorPolicies::getMostOpenPolicy(); 348 + } 349 + } 350 + 351 + public function hasAutomaticCapability($capability, PhabricatorUser $viewer) { 352 + return false; 353 + } 354 + 355 + public function describeAutomaticCapability($capability) { 356 + return null; 357 + } 358 + 359 + 360 + /* -( PhabricatorExtendedPolicyInterface )--------------------------------- */ 361 + 362 + 363 + public function getExtendedPolicy($capability, PhabricatorUser $viewer) { 364 + $extended = array(); 365 + 366 + switch ($capability) { 367 + case PhabricatorPolicyCapability::CAN_EDIT: 368 + // To edit a repository URI, you must be able to edit the 369 + // corresponding repository. 370 + $extended[] = array($this->getRepository(), $capability); 371 + break; 372 + } 373 + 374 + return $extended; 299 375 } 300 376 301 377 }
+20
src/applications/repository/storage/PhabricatorRepositoryURITransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryURITransaction 4 + extends PhabricatorApplicationTransaction { 5 + 6 + const TYPE_URI = 'diffusion.uri.uri'; 7 + 8 + public function getApplicationName() { 9 + return 'repository'; 10 + } 11 + 12 + public function getApplicationTransactionType() { 13 + return PhabricatorRepositoryURIPHIDType::TYPECONST; 14 + } 15 + 16 + public function getApplicationTransactionCommentObject() { 17 + return null; 18 + } 19 + 20 + }