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

Modularize Repository transactions

Summary: Depends on D19828. Ref T13216. Before adding new transactions to repositories (filesize limit, copy time limit, etc) modularize the existing transactions.

Test Plan:

- Created repository.
- Edited callsign (invalid, valid, duplicate, add, remove).
- Edited short name (invaild, valid, duplicate, add, remove).
- Edited description (add, remove).
- Edited encoding (invalid, valid, remove).
- Allowed/denied dangerous changes.
- Allowed/denied enormous chagnes.
- Activated, deactivated, reactivated.
- Changed tags.
- Changed push policy.
- Changed default branch (add, remove).
- Changed track only: add, remove, invalid function, invalid regex.
- Changed autoclose only: add, remove, invalid function, invalid regex.
- Changed publish/notify.
- Changed autoclose.
- Changed staging area (add, remove, invalid).
- Changed blueprints (add, remove).
- Changed symbols (add, remove).
- Grepped for `PhabricatorRepositoryTransaction::TYPE_`.
- Reviewed transaction history:

{F6021036}

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T13216

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

+1266 -949
+45 -1
src/__phutil_library_map__.php
··· 4084 4084 'PhabricatorRemarkupUIExample' => 'applications/uiexample/examples/PhabricatorRemarkupUIExample.php', 4085 4085 'PhabricatorRepositoriesSetupCheck' => 'applications/config/check/PhabricatorRepositoriesSetupCheck.php', 4086 4086 'PhabricatorRepository' => 'applications/repository/storage/PhabricatorRepository.php', 4087 + 'PhabricatorRepositoryActivateTransaction' => 'applications/repository/xaction/PhabricatorRepositoryActivateTransaction.php', 4087 4088 'PhabricatorRepositoryAuditRequest' => 'applications/repository/storage/PhabricatorRepositoryAuditRequest.php', 4089 + 'PhabricatorRepositoryAutocloseOnlyTransaction' => 'applications/repository/xaction/PhabricatorRepositoryAutocloseOnlyTransaction.php', 4090 + 'PhabricatorRepositoryAutocloseTransaction' => 'applications/repository/xaction/PhabricatorRepositoryAutocloseTransaction.php', 4091 + 'PhabricatorRepositoryBlueprintsTransaction' => 'applications/repository/xaction/PhabricatorRepositoryBlueprintsTransaction.php', 4088 4092 'PhabricatorRepositoryBranch' => 'applications/repository/storage/PhabricatorRepositoryBranch.php', 4093 + 'PhabricatorRepositoryCallsignTransaction' => 'applications/repository/xaction/PhabricatorRepositoryCallsignTransaction.php', 4089 4094 'PhabricatorRepositoryCommit' => 'applications/repository/storage/PhabricatorRepositoryCommit.php', 4090 4095 'PhabricatorRepositoryCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryCommitChangeParserWorker.php', 4091 4096 'PhabricatorRepositoryCommitData' => 'applications/repository/storage/PhabricatorRepositoryCommitData.php', ··· 4099 4104 'PhabricatorRepositoryCommitTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryCommitTestCase.php', 4100 4105 'PhabricatorRepositoryConfigOptions' => 'applications/repository/config/PhabricatorRepositoryConfigOptions.php', 4101 4106 'PhabricatorRepositoryDAO' => 'applications/repository/storage/PhabricatorRepositoryDAO.php', 4107 + 'PhabricatorRepositoryDangerousTransaction' => 'applications/repository/xaction/PhabricatorRepositoryDangerousTransaction.php', 4108 + 'PhabricatorRepositoryDefaultBranchTransaction' => 'applications/repository/xaction/PhabricatorRepositoryDefaultBranchTransaction.php', 4109 + 'PhabricatorRepositoryDescriptionTransaction' => 'applications/repository/xaction/PhabricatorRepositoryDescriptionTransaction.php', 4102 4110 'PhabricatorRepositoryDestructibleCodex' => 'applications/repository/codex/PhabricatorRepositoryDestructibleCodex.php', 4103 4111 'PhabricatorRepositoryDiscoveryEngine' => 'applications/repository/engine/PhabricatorRepositoryDiscoveryEngine.php', 4104 4112 'PhabricatorRepositoryEditor' => 'applications/repository/editor/PhabricatorRepositoryEditor.php', 4113 + 'PhabricatorRepositoryEncodingTransaction' => 'applications/repository/xaction/PhabricatorRepositoryEncodingTransaction.php', 4105 4114 'PhabricatorRepositoryEngine' => 'applications/repository/engine/PhabricatorRepositoryEngine.php', 4115 + 'PhabricatorRepositoryEnormousTransaction' => 'applications/repository/xaction/PhabricatorRepositoryEnormousTransaction.php', 4106 4116 'PhabricatorRepositoryFerretEngine' => 'applications/repository/search/PhabricatorRepositoryFerretEngine.php', 4107 4117 'PhabricatorRepositoryFulltextEngine' => 'applications/repository/search/PhabricatorRepositoryFulltextEngine.php', 4108 4118 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositoryGitCommitChangeParserWorker.php', ··· 4146 4156 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositoryMercurialCommitMessageParserWorker.php', 4147 4157 'PhabricatorRepositoryMirror' => 'applications/repository/storage/PhabricatorRepositoryMirror.php', 4148 4158 'PhabricatorRepositoryMirrorEngine' => 'applications/repository/engine/PhabricatorRepositoryMirrorEngine.php', 4159 + 'PhabricatorRepositoryNameTransaction' => 'applications/repository/xaction/PhabricatorRepositoryNameTransaction.php', 4160 + 'PhabricatorRepositoryNotifyTransaction' => 'applications/repository/xaction/PhabricatorRepositoryNotifyTransaction.php', 4149 4161 'PhabricatorRepositoryOldRef' => 'applications/repository/storage/PhabricatorRepositoryOldRef.php', 4150 4162 'PhabricatorRepositoryParsedChange' => 'applications/repository/data/PhabricatorRepositoryParsedChange.php', 4151 4163 'PhabricatorRepositoryPullEngine' => 'applications/repository/engine/PhabricatorRepositoryPullEngine.php', ··· 4162 4174 'PhabricatorRepositoryPushLogQuery' => 'applications/repository/query/PhabricatorRepositoryPushLogQuery.php', 4163 4175 'PhabricatorRepositoryPushLogSearchEngine' => 'applications/repository/query/PhabricatorRepositoryPushLogSearchEngine.php', 4164 4176 'PhabricatorRepositoryPushMailWorker' => 'applications/repository/worker/PhabricatorRepositoryPushMailWorker.php', 4177 + 'PhabricatorRepositoryPushPolicyTransaction' => 'applications/repository/xaction/PhabricatorRepositoryPushPolicyTransaction.php', 4165 4178 'PhabricatorRepositoryPushReplyHandler' => 'applications/repository/mail/PhabricatorRepositoryPushReplyHandler.php', 4166 4179 'PhabricatorRepositoryQuery' => 'applications/repository/query/PhabricatorRepositoryQuery.php', 4167 4180 'PhabricatorRepositoryRefCursor' => 'applications/repository/storage/PhabricatorRepositoryRefCursor.php', ··· 4170 4183 'PhabricatorRepositoryRefEngine' => 'applications/repository/engine/PhabricatorRepositoryRefEngine.php', 4171 4184 'PhabricatorRepositoryRefPosition' => 'applications/repository/storage/PhabricatorRepositoryRefPosition.php', 4172 4185 'PhabricatorRepositoryRepositoryPHIDType' => 'applications/repository/phid/PhabricatorRepositoryRepositoryPHIDType.php', 4186 + 'PhabricatorRepositorySVNSubpathTransaction' => 'applications/repository/xaction/PhabricatorRepositorySVNSubpathTransaction.php', 4173 4187 'PhabricatorRepositorySchemaSpec' => 'applications/repository/storage/PhabricatorRepositorySchemaSpec.php', 4174 4188 'PhabricatorRepositorySearchEngine' => 'applications/repository/query/PhabricatorRepositorySearchEngine.php', 4189 + 'PhabricatorRepositoryServiceTransaction' => 'applications/repository/xaction/PhabricatorRepositoryServiceTransaction.php', 4190 + 'PhabricatorRepositorySlugTransaction' => 'applications/repository/xaction/PhabricatorRepositorySlugTransaction.php', 4191 + 'PhabricatorRepositoryStagingURITransaction' => 'applications/repository/xaction/PhabricatorRepositoryStagingURITransaction.php', 4175 4192 'PhabricatorRepositoryStatusMessage' => 'applications/repository/storage/PhabricatorRepositoryStatusMessage.php', 4176 4193 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'applications/repository/worker/commitchangeparser/PhabricatorRepositorySvnCommitChangeParserWorker.php', 4177 4194 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'applications/repository/worker/commitmessageparser/PhabricatorRepositorySvnCommitMessageParserWorker.php', 4178 4195 'PhabricatorRepositorySymbol' => 'applications/repository/storage/PhabricatorRepositorySymbol.php', 4196 + 'PhabricatorRepositorySymbolLanguagesTransaction' => 'applications/repository/xaction/PhabricatorRepositorySymbolLanguagesTransaction.php', 4197 + 'PhabricatorRepositorySymbolSourcesTransaction' => 'applications/repository/xaction/PhabricatorRepositorySymbolSourcesTransaction.php', 4179 4198 'PhabricatorRepositorySyncEvent' => 'applications/repository/storage/PhabricatorRepositorySyncEvent.php', 4180 4199 'PhabricatorRepositorySyncEventPHIDType' => 'applications/repository/phid/PhabricatorRepositorySyncEventPHIDType.php', 4181 4200 'PhabricatorRepositorySyncEventQuery' => 'applications/repository/query/PhabricatorRepositorySyncEventQuery.php', 4182 4201 'PhabricatorRepositoryTestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryTestCase.php', 4202 + 'PhabricatorRepositoryTrackOnlyTransaction' => 'applications/repository/xaction/PhabricatorRepositoryTrackOnlyTransaction.php', 4183 4203 'PhabricatorRepositoryTransaction' => 'applications/repository/storage/PhabricatorRepositoryTransaction.php', 4184 4204 'PhabricatorRepositoryTransactionQuery' => 'applications/repository/query/PhabricatorRepositoryTransactionQuery.php', 4205 + 'PhabricatorRepositoryTransactionType' => 'applications/repository/xaction/PhabricatorRepositoryTransactionType.php', 4185 4206 'PhabricatorRepositoryType' => 'applications/repository/constants/PhabricatorRepositoryType.php', 4186 4207 'PhabricatorRepositoryURI' => 'applications/repository/storage/PhabricatorRepositoryURI.php', 4187 4208 'PhabricatorRepositoryURIIndex' => 'applications/repository/storage/PhabricatorRepositoryURIIndex.php', ··· 4192 4213 'PhabricatorRepositoryURITestCase' => 'applications/repository/storage/__tests__/PhabricatorRepositoryURITestCase.php', 4193 4214 'PhabricatorRepositoryURITransaction' => 'applications/repository/storage/PhabricatorRepositoryURITransaction.php', 4194 4215 'PhabricatorRepositoryURITransactionQuery' => 'applications/repository/query/PhabricatorRepositoryURITransactionQuery.php', 4216 + 'PhabricatorRepositoryVCSTransaction' => 'applications/repository/xaction/PhabricatorRepositoryVCSTransaction.php', 4195 4217 'PhabricatorRepositoryWorkingCopyVersion' => 'applications/repository/storage/PhabricatorRepositoryWorkingCopyVersion.php', 4196 4218 'PhabricatorRequestExceptionHandler' => 'aphront/handler/PhabricatorRequestExceptionHandler.php', 4197 4219 'PhabricatorResourceSite' => 'aphront/site/PhabricatorResourceSite.php', ··· 10004 10026 'PhabricatorFulltextInterface', 10005 10027 'PhabricatorFerretInterface', 10006 10028 ), 10029 + 'PhabricatorRepositoryActivateTransaction' => 'PhabricatorRepositoryTransactionType', 10007 10030 'PhabricatorRepositoryAuditRequest' => array( 10008 10031 'PhabricatorRepositoryDAO', 10009 10032 'PhabricatorPolicyInterface', 10010 10033 ), 10034 + 'PhabricatorRepositoryAutocloseOnlyTransaction' => 'PhabricatorRepositoryTransactionType', 10035 + 'PhabricatorRepositoryAutocloseTransaction' => 'PhabricatorRepositoryTransactionType', 10036 + 'PhabricatorRepositoryBlueprintsTransaction' => 'PhabricatorRepositoryTransactionType', 10011 10037 'PhabricatorRepositoryBranch' => 'PhabricatorRepositoryDAO', 10038 + 'PhabricatorRepositoryCallsignTransaction' => 'PhabricatorRepositoryTransactionType', 10012 10039 'PhabricatorRepositoryCommit' => array( 10013 10040 'PhabricatorRepositoryDAO', 10014 10041 'PhabricatorPolicyInterface', ··· 10042 10069 'PhabricatorRepositoryCommitTestCase' => 'PhabricatorTestCase', 10043 10070 'PhabricatorRepositoryConfigOptions' => 'PhabricatorApplicationConfigOptions', 10044 10071 'PhabricatorRepositoryDAO' => 'PhabricatorLiskDAO', 10072 + 'PhabricatorRepositoryDangerousTransaction' => 'PhabricatorRepositoryTransactionType', 10073 + 'PhabricatorRepositoryDefaultBranchTransaction' => 'PhabricatorRepositoryTransactionType', 10074 + 'PhabricatorRepositoryDescriptionTransaction' => 'PhabricatorRepositoryTransactionType', 10045 10075 'PhabricatorRepositoryDestructibleCodex' => 'PhabricatorDestructibleCodex', 10046 10076 'PhabricatorRepositoryDiscoveryEngine' => 'PhabricatorRepositoryEngine', 10047 10077 'PhabricatorRepositoryEditor' => 'PhabricatorApplicationTransactionEditor', 10078 + 'PhabricatorRepositoryEncodingTransaction' => 'PhabricatorRepositoryTransactionType', 10048 10079 'PhabricatorRepositoryEngine' => 'Phobject', 10080 + 'PhabricatorRepositoryEnormousTransaction' => 'PhabricatorRepositoryTransactionType', 10049 10081 'PhabricatorRepositoryFerretEngine' => 'PhabricatorFerretEngine', 10050 10082 'PhabricatorRepositoryFulltextEngine' => 'PhabricatorFulltextEngine', 10051 10083 'PhabricatorRepositoryGitCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', ··· 10097 10129 'PhabricatorRepositoryMercurialCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 10098 10130 'PhabricatorRepositoryMirror' => 'PhabricatorRepositoryDAO', 10099 10131 'PhabricatorRepositoryMirrorEngine' => 'PhabricatorRepositoryEngine', 10132 + 'PhabricatorRepositoryNameTransaction' => 'PhabricatorRepositoryTransactionType', 10133 + 'PhabricatorRepositoryNotifyTransaction' => 'PhabricatorRepositoryTransactionType', 10100 10134 'PhabricatorRepositoryOldRef' => array( 10101 10135 'PhabricatorRepositoryDAO', 10102 10136 'PhabricatorPolicyInterface', ··· 10125 10159 'PhabricatorRepositoryPushLogQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 10126 10160 'PhabricatorRepositoryPushLogSearchEngine' => 'PhabricatorApplicationSearchEngine', 10127 10161 'PhabricatorRepositoryPushMailWorker' => 'PhabricatorWorker', 10162 + 'PhabricatorRepositoryPushPolicyTransaction' => 'PhabricatorRepositoryTransactionType', 10128 10163 'PhabricatorRepositoryPushReplyHandler' => 'PhabricatorMailReplyHandler', 10129 10164 'PhabricatorRepositoryQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 10130 10165 'PhabricatorRepositoryRefCursor' => array( ··· 10136 10171 'PhabricatorRepositoryRefEngine' => 'PhabricatorRepositoryEngine', 10137 10172 'PhabricatorRepositoryRefPosition' => 'PhabricatorRepositoryDAO', 10138 10173 'PhabricatorRepositoryRepositoryPHIDType' => 'PhabricatorPHIDType', 10174 + 'PhabricatorRepositorySVNSubpathTransaction' => 'PhabricatorRepositoryTransactionType', 10139 10175 'PhabricatorRepositorySchemaSpec' => 'PhabricatorConfigSchemaSpec', 10140 10176 'PhabricatorRepositorySearchEngine' => 'PhabricatorApplicationSearchEngine', 10177 + 'PhabricatorRepositoryServiceTransaction' => 'PhabricatorRepositoryTransactionType', 10178 + 'PhabricatorRepositorySlugTransaction' => 'PhabricatorRepositoryTransactionType', 10179 + 'PhabricatorRepositoryStagingURITransaction' => 'PhabricatorRepositoryTransactionType', 10141 10180 'PhabricatorRepositoryStatusMessage' => 'PhabricatorRepositoryDAO', 10142 10181 'PhabricatorRepositorySvnCommitChangeParserWorker' => 'PhabricatorRepositoryCommitChangeParserWorker', 10143 10182 'PhabricatorRepositorySvnCommitMessageParserWorker' => 'PhabricatorRepositoryCommitMessageParserWorker', 10144 10183 'PhabricatorRepositorySymbol' => 'PhabricatorRepositoryDAO', 10184 + 'PhabricatorRepositorySymbolLanguagesTransaction' => 'PhabricatorRepositoryTransactionType', 10185 + 'PhabricatorRepositorySymbolSourcesTransaction' => 'PhabricatorRepositoryTransactionType', 10145 10186 'PhabricatorRepositorySyncEvent' => array( 10146 10187 'PhabricatorRepositoryDAO', 10147 10188 'PhabricatorPolicyInterface', ··· 10149 10190 'PhabricatorRepositorySyncEventPHIDType' => 'PhabricatorPHIDType', 10150 10191 'PhabricatorRepositorySyncEventQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 10151 10192 'PhabricatorRepositoryTestCase' => 'PhabricatorTestCase', 10152 - 'PhabricatorRepositoryTransaction' => 'PhabricatorApplicationTransaction', 10193 + 'PhabricatorRepositoryTrackOnlyTransaction' => 'PhabricatorRepositoryTransactionType', 10194 + 'PhabricatorRepositoryTransaction' => 'PhabricatorModularTransaction', 10153 10195 'PhabricatorRepositoryTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 10196 + 'PhabricatorRepositoryTransactionType' => 'PhabricatorModularTransactionType', 10154 10197 'PhabricatorRepositoryType' => 'Phobject', 10155 10198 'PhabricatorRepositoryURI' => array( 10156 10199 'PhabricatorRepositoryDAO', ··· 10167 10210 'PhabricatorRepositoryURITestCase' => 'PhabricatorTestCase', 10168 10211 'PhabricatorRepositoryURITransaction' => 'PhabricatorApplicationTransaction', 10169 10212 'PhabricatorRepositoryURITransactionQuery' => 'PhabricatorApplicationTransactionQuery', 10213 + 'PhabricatorRepositoryVCSTransaction' => 'PhabricatorRepositoryTransactionType', 10170 10214 'PhabricatorRepositoryWorkingCopyVersion' => 'PhabricatorRepositoryDAO', 10171 10215 'PhabricatorRequestExceptionHandler' => 'AphrontRequestExceptionHandler', 10172 10216 'PhabricatorResourceSite' => 'PhabricatorSite',
+2 -1
src/applications/diffusion/controller/DiffusionRepositoryEditActivateController.php
··· 25 25 } 26 26 27 27 $xaction = id(new PhabricatorRepositoryTransaction()) 28 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_ACTIVATE) 28 + ->setTransactionType( 29 + PhabricatorRepositoryActivateTransaction::TRANSACTIONTYPE) 29 30 ->setNewValue($new_status); 30 31 31 32 $editor = id(new PhabricatorRepositoryEditor())
+2 -1
src/applications/diffusion/controller/DiffusionRepositoryEditDangerousController.php
··· 30 30 31 31 if ($request->isFormPost()) { 32 32 $xaction = id(new PhabricatorRepositoryTransaction()) 33 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_DANGEROUS) 33 + ->setTransactionType( 34 + PhabricatorRepositoryDangerousTransaction::TRANSACTIONTYPE) 34 35 ->setNewValue(!$repository->shouldAllowDangerousChanges()); 35 36 36 37 $editor = id(new PhabricatorRepositoryEditor())
+2 -1
src/applications/diffusion/controller/DiffusionRepositoryEditEnormousController.php
··· 30 30 31 31 if ($request->isFormPost()) { 32 32 $xaction = id(new PhabricatorRepositoryTransaction()) 33 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_ENORMOUS) 33 + ->setTransactionType( 34 + PhabricatorRepositoryEnormousTransaction::TRANSACTIONTYPE) 34 35 ->setNewValue(!$repository->shouldAllowEnormousChanges()); 35 36 36 37 $editor = id(new PhabricatorRepositoryEditor())
+30 -20
src/applications/diffusion/editor/DiffusionRepositoryEditEngine.php
··· 243 243 id(new PhabricatorSelectEditField()) 244 244 ->setKey('vcs') 245 245 ->setLabel(pht('Version Control System')) 246 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_VCS) 246 + ->setTransactionType( 247 + PhabricatorRepositoryVCSTransaction::TRANSACTIONTYPE) 247 248 ->setIsFormField(false) 248 249 ->setIsCopyable(true) 249 250 ->setOptions(PhabricatorRepositoryType::getAllRepositoryTypes()) ··· 258 259 ->setKey('name') 259 260 ->setLabel(pht('Name')) 260 261 ->setIsRequired(true) 261 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_NAME) 262 + ->setTransactionType( 263 + PhabricatorRepositoryNameTransaction::TRANSACTIONTYPE) 262 264 ->setDescription(pht('The repository name.')) 263 265 ->setConduitDescription(pht('Rename the repository.')) 264 266 ->setConduitTypeDescription(pht('New repository name.')) ··· 266 268 id(new PhabricatorTextEditField()) 267 269 ->setKey('callsign') 268 270 ->setLabel(pht('Callsign')) 269 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_CALLSIGN) 271 + ->setTransactionType( 272 + PhabricatorRepositoryCallsignTransaction::TRANSACTIONTYPE) 270 273 ->setDescription(pht('The repository callsign.')) 271 274 ->setConduitDescription(pht('Change the repository callsign.')) 272 275 ->setConduitTypeDescription(pht('New repository callsign.')) ··· 274 277 id(new PhabricatorTextEditField()) 275 278 ->setKey('shortName') 276 279 ->setLabel(pht('Short Name')) 277 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_SLUG) 280 + ->setTransactionType( 281 + PhabricatorRepositorySlugTransaction::TRANSACTIONTYPE) 278 282 ->setDescription(pht('Short, unique repository name.')) 279 283 ->setConduitDescription(pht('Change the repository short name.')) 280 284 ->setConduitTypeDescription(pht('New short name for the repository.')) ··· 282 286 id(new PhabricatorRemarkupEditField()) 283 287 ->setKey('description') 284 288 ->setLabel(pht('Description')) 285 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_DESCRIPTION) 289 + ->setTransactionType( 290 + PhabricatorRepositoryDescriptionTransaction::TRANSACTIONTYPE) 286 291 ->setDescription(pht('Repository description.')) 287 292 ->setConduitDescription(pht('Change the repository description.')) 288 293 ->setConduitTypeDescription(pht('New repository description.')) ··· 291 296 ->setKey('encoding') 292 297 ->setLabel(pht('Text Encoding')) 293 298 ->setIsCopyable(true) 294 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_ENCODING) 299 + ->setTransactionType( 300 + PhabricatorRepositoryEncodingTransaction::TRANSACTIONTYPE) 295 301 ->setDescription(pht('Default text encoding.')) 296 302 ->setConduitDescription(pht('Change the default text encoding.')) 297 303 ->setConduitTypeDescription(pht('New text encoding.')) ··· 304 310 ->setOptions( 305 311 pht('Prevent Dangerous Changes'), 306 312 pht('Allow Dangerous Changes')) 307 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_DANGEROUS) 313 + ->setTransactionType( 314 + PhabricatorRepositoryDangerousTransaction::TRANSACTIONTYPE) 308 315 ->setDescription(pht('Permit dangerous changes to be made.')) 309 316 ->setConduitDescription(pht('Allow or prevent dangerous changes.')) 310 317 ->setConduitTypeDescription(pht('New protection setting.')) ··· 317 324 ->setOptions( 318 325 pht('Prevent Enormous Changes'), 319 326 pht('Allow Enormous Changes')) 320 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_ENORMOUS) 327 + ->setTransactionType( 328 + PhabricatorRepositoryEnormousTransaction::TRANSACTIONTYPE) 321 329 ->setDescription(pht('Permit enormous changes to be made.')) 322 330 ->setConduitDescription(pht('Allow or prevent enormous changes.')) 323 331 ->setConduitTypeDescription(pht('New protection setting.')) ··· 325 333 id(new PhabricatorSelectEditField()) 326 334 ->setKey('status') 327 335 ->setLabel(pht('Status')) 328 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_ACTIVATE) 336 + ->setTransactionType( 337 + PhabricatorRepositoryActivateTransaction::TRANSACTIONTYPE) 329 338 ->setIsFormField(false) 330 339 ->setOptions(PhabricatorRepository::getStatusNameMap()) 331 340 ->setDescription(pht('Active or inactive status.')) ··· 336 345 ->setKey('defaultBranch') 337 346 ->setLabel(pht('Default Branch')) 338 347 ->setTransactionType( 339 - PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH) 348 + PhabricatorRepositoryDefaultBranchTransaction::TRANSACTIONTYPE) 340 349 ->setIsCopyable(true) 341 350 ->setDescription(pht('Default branch name.')) 342 351 ->setConduitDescription(pht('Set the default branch name.')) ··· 347 356 ->setKey('trackOnly') 348 357 ->setLabel(pht('Track Only')) 349 358 ->setTransactionType( 350 - PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY) 359 + PhabricatorRepositoryTrackOnlyTransaction::TRANSACTIONTYPE) 351 360 ->setIsCopyable(true) 352 361 ->setDescription(pht('Track only these branches.')) 353 362 ->setConduitDescription(pht('Set the tracked branches.')) ··· 358 367 ->setKey('autocloseOnly') 359 368 ->setLabel(pht('Autoclose Only')) 360 369 ->setTransactionType( 361 - PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY) 370 + PhabricatorRepositoryAutocloseOnlyTransaction::TRANSACTIONTYPE) 362 371 ->setIsCopyable(true) 363 372 ->setDescription(pht('Autoclose commits on only these branches.')) 364 373 ->setConduitDescription(pht('Set the autoclose branches.')) ··· 368 377 ->setKey('importOnly') 369 378 ->setLabel(pht('Import Only')) 370 379 ->setTransactionType( 371 - PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH) 380 + PhabricatorRepositorySVNSubpathTransaction::TRANSACTIONTYPE) 372 381 ->setIsCopyable(true) 373 382 ->setDescription(pht('Subpath to selectively import.')) 374 383 ->setConduitDescription(pht('Set the subpath to import.')) ··· 379 388 ->setKey('stagingAreaURI') 380 389 ->setLabel(pht('Staging Area URI')) 381 390 ->setTransactionType( 382 - PhabricatorRepositoryTransaction::TYPE_STAGING_URI) 391 + PhabricatorRepositoryStagingURITransaction::TRANSACTIONTYPE) 383 392 ->setIsCopyable(true) 384 393 ->setDescription(pht('Staging area URI.')) 385 394 ->setConduitDescription(pht('Set the staging area URI.')) ··· 390 399 ->setKey('automationBlueprintPHIDs') 391 400 ->setLabel(pht('Use Blueprints')) 392 401 ->setTransactionType( 393 - PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS) 402 + PhabricatorRepositoryBlueprintsTransaction::TRANSACTIONTYPE) 394 403 ->setIsCopyable(true) 395 404 ->setDatasource(new DrydockBlueprintDatasource()) 396 405 ->setDescription(pht('Automation blueprints.')) ··· 402 411 ->setKey('symbolLanguages') 403 412 ->setLabel(pht('Languages')) 404 413 ->setTransactionType( 405 - PhabricatorRepositoryTransaction::TYPE_SYMBOLS_LANGUAGE) 414 + PhabricatorRepositorySymbolLanguagesTransaction::TRANSACTIONTYPE) 406 415 ->setIsCopyable(true) 407 416 ->setDescription( 408 417 pht('Languages which define symbols in this repository.')) ··· 415 424 ->setKey('symbolRepositoryPHIDs') 416 425 ->setLabel(pht('Uses Symbols From')) 417 426 ->setTransactionType( 418 - PhabricatorRepositoryTransaction::TYPE_SYMBOLS_SOURCES) 427 + PhabricatorRepositorySymbolSourcesTransaction::TRANSACTIONTYPE) 419 428 ->setIsCopyable(true) 420 429 ->setDatasource(new DiffusionRepositoryDatasource()) 421 430 ->setDescription(pht('Repositories to link symbols from.')) ··· 426 435 ->setKey('publish') 427 436 ->setLabel(pht('Publish/Notify')) 428 437 ->setTransactionType( 429 - PhabricatorRepositoryTransaction::TYPE_NOTIFY) 438 + PhabricatorRepositoryNotifyTransaction::TRANSACTIONTYPE) 430 439 ->setIsCopyable(true) 431 440 ->setOptions( 432 441 pht('Disable Notifications, Feed, and Herald'), ··· 439 448 ->setKey('autoclose') 440 449 ->setLabel(pht('Autoclose')) 441 450 ->setTransactionType( 442 - PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE) 451 + PhabricatorRepositoryAutocloseTransaction::TRANSACTIONTYPE) 443 452 ->setIsCopyable(true) 444 453 ->setOptions( 445 454 pht('Disable Autoclose'), ··· 455 464 ->setIsCopyable(true) 456 465 ->setCapability(DiffusionPushCapability::CAPABILITY) 457 466 ->setPolicies($policies) 458 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY) 467 + ->setTransactionType( 468 + PhabricatorRepositoryPushPolicyTransaction::TRANSACTIONTYPE) 459 469 ->setDescription( 460 470 pht('Controls who can push changes to the repository.')) 461 471 ->setConduitDescription(
+5 -5
src/applications/meta/xactions/PhabricatorApplicationPolicyChangeTransaction.php
··· 52 52 } 53 53 54 54 public function getTitle() { 55 - $old = $this->renderPolicy($this->getOldValue()); 56 - $new = $this->renderPolicy($this->getNewValue()); 55 + $old = $this->renderApplicationPolicy($this->getOldValue()); 56 + $new = $this->renderApplicationPolicy($this->getNewValue()); 57 57 58 58 return pht( 59 59 '%s changed the "%s" policy from "%s" to "%s".', ··· 64 64 } 65 65 66 66 public function getTitleForFeed() { 67 - $old = $this->renderPolicy($this->getOldValue()); 68 - $new = $this->renderPolicy($this->getNewValue()); 67 + $old = $this->renderApplicationPolicy($this->getOldValue()); 68 + $new = $this->renderApplicationPolicy($this->getNewValue()); 69 69 70 70 return pht( 71 71 '%s changed the "%s" policy for application %s from "%s" to "%s".', ··· 165 165 return $errors; 166 166 } 167 167 168 - private function renderPolicy($name) { 168 + private function renderApplicationPolicy($name) { 169 169 $policies = $this->getAllPolicies(); 170 170 if (empty($policies[$name])) { 171 171 // Not a standard policy, check for a custom policy.
-520
src/applications/repository/editor/PhabricatorRepositoryEditor.php
··· 14 14 public function getTransactionTypes() { 15 15 $types = parent::getTransactionTypes(); 16 16 17 - $types[] = PhabricatorRepositoryTransaction::TYPE_VCS; 18 - $types[] = PhabricatorRepositoryTransaction::TYPE_ACTIVATE; 19 - $types[] = PhabricatorRepositoryTransaction::TYPE_NAME; 20 - $types[] = PhabricatorRepositoryTransaction::TYPE_DESCRIPTION; 21 - $types[] = PhabricatorRepositoryTransaction::TYPE_ENCODING; 22 - $types[] = PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH; 23 - $types[] = PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY; 24 - $types[] = PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY; 25 - $types[] = PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH; 26 - $types[] = PhabricatorRepositoryTransaction::TYPE_NOTIFY; 27 - $types[] = PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE; 28 - $types[] = PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY; 29 - $types[] = PhabricatorRepositoryTransaction::TYPE_DANGEROUS; 30 - $types[] = PhabricatorRepositoryTransaction::TYPE_ENORMOUS; 31 - $types[] = PhabricatorRepositoryTransaction::TYPE_SLUG; 32 - $types[] = PhabricatorRepositoryTransaction::TYPE_SERVICE; 33 - $types[] = PhabricatorRepositoryTransaction::TYPE_SYMBOLS_LANGUAGE; 34 - $types[] = PhabricatorRepositoryTransaction::TYPE_SYMBOLS_SOURCES; 35 - $types[] = PhabricatorRepositoryTransaction::TYPE_STAGING_URI; 36 - $types[] = PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS; 37 - $types[] = PhabricatorRepositoryTransaction::TYPE_CALLSIGN; 38 - 39 17 $types[] = PhabricatorTransactions::TYPE_EDGE; 40 18 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 41 19 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 42 20 43 21 return $types; 44 - } 45 - 46 - protected function getCustomTransactionOldValue( 47 - PhabricatorLiskDAO $object, 48 - PhabricatorApplicationTransaction $xaction) { 49 - 50 - switch ($xaction->getTransactionType()) { 51 - case PhabricatorRepositoryTransaction::TYPE_VCS: 52 - return $object->getVersionControlSystem(); 53 - case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 54 - return $object->isTracked(); 55 - case PhabricatorRepositoryTransaction::TYPE_NAME: 56 - return $object->getName(); 57 - case PhabricatorRepositoryTransaction::TYPE_DESCRIPTION: 58 - return $object->getDetail('description'); 59 - case PhabricatorRepositoryTransaction::TYPE_ENCODING: 60 - return $object->getDetail('encoding'); 61 - case PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH: 62 - return $object->getDetail('default-branch'); 63 - case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 64 - return array_keys($object->getDetail('branch-filter', array())); 65 - case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 66 - return array_keys($object->getDetail('close-commits-filter', array())); 67 - case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: 68 - return $object->getDetail('svn-subpath'); 69 - case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 70 - return (int)!$object->getDetail('herald-disabled'); 71 - case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 72 - return (int)!$object->getDetail('disable-autoclose'); 73 - case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 74 - return $object->getPushPolicy(); 75 - case PhabricatorRepositoryTransaction::TYPE_DANGEROUS: 76 - return $object->shouldAllowDangerousChanges(); 77 - case PhabricatorRepositoryTransaction::TYPE_ENORMOUS: 78 - return $object->shouldAllowEnormousChanges(); 79 - case PhabricatorRepositoryTransaction::TYPE_SLUG: 80 - return $object->getRepositorySlug(); 81 - case PhabricatorRepositoryTransaction::TYPE_SERVICE: 82 - return $object->getAlmanacServicePHID(); 83 - case PhabricatorRepositoryTransaction::TYPE_SYMBOLS_LANGUAGE: 84 - return $object->getSymbolLanguages(); 85 - case PhabricatorRepositoryTransaction::TYPE_SYMBOLS_SOURCES: 86 - return $object->getSymbolSources(); 87 - case PhabricatorRepositoryTransaction::TYPE_STAGING_URI: 88 - return $object->getDetail('staging-uri'); 89 - case PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS: 90 - return $object->getDetail('automation.blueprintPHIDs', array()); 91 - case PhabricatorRepositoryTransaction::TYPE_CALLSIGN: 92 - return $object->getCallsign(); 93 - } 94 - } 95 - 96 - protected function getCustomTransactionNewValue( 97 - PhabricatorLiskDAO $object, 98 - PhabricatorApplicationTransaction $xaction) { 99 - 100 - switch ($xaction->getTransactionType()) { 101 - case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 102 - case PhabricatorRepositoryTransaction::TYPE_NAME: 103 - case PhabricatorRepositoryTransaction::TYPE_DESCRIPTION: 104 - case PhabricatorRepositoryTransaction::TYPE_ENCODING: 105 - case PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH: 106 - case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 107 - case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 108 - case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: 109 - case PhabricatorRepositoryTransaction::TYPE_VCS: 110 - case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 111 - case PhabricatorRepositoryTransaction::TYPE_DANGEROUS: 112 - case PhabricatorRepositoryTransaction::TYPE_ENORMOUS: 113 - case PhabricatorRepositoryTransaction::TYPE_SERVICE: 114 - case PhabricatorRepositoryTransaction::TYPE_SYMBOLS_LANGUAGE: 115 - case PhabricatorRepositoryTransaction::TYPE_SYMBOLS_SOURCES: 116 - case PhabricatorRepositoryTransaction::TYPE_STAGING_URI: 117 - case PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS: 118 - return $xaction->getNewValue(); 119 - case PhabricatorRepositoryTransaction::TYPE_SLUG: 120 - case PhabricatorRepositoryTransaction::TYPE_CALLSIGN: 121 - $name = $xaction->getNewValue(); 122 - if (strlen($name)) { 123 - return $name; 124 - } 125 - return null; 126 - case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 127 - case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 128 - return (int)$xaction->getNewValue(); 129 - } 130 - } 131 - 132 - protected function applyCustomInternalTransaction( 133 - PhabricatorLiskDAO $object, 134 - PhabricatorApplicationTransaction $xaction) { 135 - 136 - switch ($xaction->getTransactionType()) { 137 - case PhabricatorRepositoryTransaction::TYPE_VCS: 138 - $object->setVersionControlSystem($xaction->getNewValue()); 139 - break; 140 - case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 141 - $active = $xaction->getNewValue(); 142 - 143 - // The first time a repository is activated, clear the "new repository" 144 - // flag so we stop showing setup hints. 145 - if ($active) { 146 - $object->setDetail('newly-initialized', false); 147 - } 148 - 149 - $object->setDetail('tracking-enabled', $active); 150 - break; 151 - case PhabricatorRepositoryTransaction::TYPE_NAME: 152 - $object->setName($xaction->getNewValue()); 153 - break; 154 - case PhabricatorRepositoryTransaction::TYPE_DESCRIPTION: 155 - $object->setDetail('description', $xaction->getNewValue()); 156 - break; 157 - case PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH: 158 - $object->setDetail('default-branch', $xaction->getNewValue()); 159 - break; 160 - case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 161 - $object->setDetail( 162 - 'branch-filter', 163 - array_fill_keys($xaction->getNewValue(), true)); 164 - break; 165 - case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 166 - $object->setDetail( 167 - 'close-commits-filter', 168 - array_fill_keys($xaction->getNewValue(), true)); 169 - break; 170 - case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: 171 - $object->setDetail('svn-subpath', $xaction->getNewValue()); 172 - break; 173 - case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 174 - $object->setDetail('herald-disabled', (int)!$xaction->getNewValue()); 175 - break; 176 - case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 177 - $object->setDetail('disable-autoclose', (int)!$xaction->getNewValue()); 178 - break; 179 - case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 180 - return $object->setPushPolicy($xaction->getNewValue()); 181 - case PhabricatorRepositoryTransaction::TYPE_DANGEROUS: 182 - $object->setDetail('allow-dangerous-changes', $xaction->getNewValue()); 183 - return; 184 - case PhabricatorRepositoryTransaction::TYPE_ENORMOUS: 185 - $object->setDetail('allow-enormous-changes', $xaction->getNewValue()); 186 - return; 187 - case PhabricatorRepositoryTransaction::TYPE_SLUG: 188 - $object->setRepositorySlug($xaction->getNewValue()); 189 - return; 190 - case PhabricatorRepositoryTransaction::TYPE_SERVICE: 191 - $object->setAlmanacServicePHID($xaction->getNewValue()); 192 - return; 193 - case PhabricatorRepositoryTransaction::TYPE_SYMBOLS_LANGUAGE: 194 - $object->setDetail('symbol-languages', $xaction->getNewValue()); 195 - return; 196 - case PhabricatorRepositoryTransaction::TYPE_SYMBOLS_SOURCES: 197 - $object->setDetail('symbol-sources', $xaction->getNewValue()); 198 - return; 199 - case PhabricatorRepositoryTransaction::TYPE_STAGING_URI: 200 - $object->setDetail('staging-uri', $xaction->getNewValue()); 201 - return; 202 - case PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS: 203 - $object->setDetail( 204 - 'automation.blueprintPHIDs', 205 - $xaction->getNewValue()); 206 - return; 207 - case PhabricatorRepositoryTransaction::TYPE_CALLSIGN: 208 - $object->setCallsign($xaction->getNewValue()); 209 - return; 210 - case PhabricatorRepositoryTransaction::TYPE_ENCODING: 211 - $object->setDetail('encoding', $xaction->getNewValue()); 212 - break; 213 - } 214 - } 215 - 216 - protected function applyCustomExternalTransaction( 217 - PhabricatorLiskDAO $object, 218 - PhabricatorApplicationTransaction $xaction) { 219 - 220 - switch ($xaction->getTransactionType()) { 221 - case PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS: 222 - DrydockAuthorization::applyAuthorizationChanges( 223 - $this->getActor(), 224 - $object->getPHID(), 225 - $xaction->getOldValue(), 226 - $xaction->getNewValue()); 227 - break; 228 - } 229 - 230 - } 231 - 232 - protected function validateTransaction( 233 - PhabricatorLiskDAO $object, 234 - $type, 235 - array $xactions) { 236 - 237 - $errors = parent::validateTransaction($object, $type, $xactions); 238 - 239 - switch ($type) { 240 - case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 241 - case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 242 - foreach ($xactions as $xaction) { 243 - foreach ($xaction->getNewValue() as $pattern) { 244 - // Check for invalid regular expressions. 245 - $regexp = PhabricatorRepository::extractBranchRegexp($pattern); 246 - if ($regexp !== null) { 247 - $ok = @preg_match($regexp, ''); 248 - if ($ok === false) { 249 - $error = new PhabricatorApplicationTransactionValidationError( 250 - $type, 251 - pht('Invalid'), 252 - pht( 253 - 'Expression "%s" is not a valid regular expression. Note '. 254 - 'that you must include delimiters.', 255 - $regexp), 256 - $xaction); 257 - $errors[] = $error; 258 - continue; 259 - } 260 - } 261 - 262 - // Check for formatting mistakes like `regex(...)` instead of 263 - // `regexp(...)`. 264 - $matches = null; 265 - if (preg_match('/^([^(]+)\\(.*\\)\z/', $pattern, $matches)) { 266 - switch ($matches[1]) { 267 - case 'regexp': 268 - break; 269 - default: 270 - $error = new PhabricatorApplicationTransactionValidationError( 271 - $type, 272 - pht('Invalid'), 273 - pht( 274 - 'Matching function "%s(...)" is not recognized. Valid '. 275 - 'functions are: regexp(...).', 276 - $matches[1]), 277 - $xaction); 278 - $errors[] = $error; 279 - break; 280 - } 281 - } 282 - } 283 - } 284 - break; 285 - 286 - case PhabricatorRepositoryTransaction::TYPE_AUTOMATION_BLUEPRINTS: 287 - foreach ($xactions as $xaction) { 288 - $old = nonempty($xaction->getOldValue(), array()); 289 - $new = nonempty($xaction->getNewValue(), array()); 290 - 291 - $add = array_diff($new, $old); 292 - 293 - $invalid = PhabricatorObjectQuery::loadInvalidPHIDsForViewer( 294 - $this->getActor(), 295 - $add); 296 - if ($invalid) { 297 - $errors[] = new PhabricatorApplicationTransactionValidationError( 298 - $type, 299 - pht('Invalid'), 300 - pht( 301 - 'Some of the selected automation blueprints are invalid '. 302 - 'or restricted: %s.', 303 - implode(', ', $invalid)), 304 - $xaction); 305 - } 306 - } 307 - break; 308 - 309 - case PhabricatorRepositoryTransaction::TYPE_VCS: 310 - $vcs_map = PhabricatorRepositoryType::getAllRepositoryTypes(); 311 - $current_vcs = $object->getVersionControlSystem(); 312 - 313 - if (!$this->getIsNewObject()) { 314 - foreach ($xactions as $xaction) { 315 - if ($xaction->getNewValue() == $current_vcs) { 316 - continue; 317 - } 318 - 319 - $errors[] = new PhabricatorApplicationTransactionValidationError( 320 - $type, 321 - pht('Immutable'), 322 - pht( 323 - 'You can not change the version control system an existing '. 324 - 'repository uses. It can only be set when a repository is '. 325 - 'first created.'), 326 - $xaction); 327 - } 328 - } else { 329 - $value = $object->getVersionControlSystem(); 330 - foreach ($xactions as $xaction) { 331 - $value = $xaction->getNewValue(); 332 - 333 - if (empty($vcs_map[$value])) { 334 - $errors[] = new PhabricatorApplicationTransactionValidationError( 335 - $type, 336 - pht('Invalid'), 337 - pht( 338 - 'Specified version control system must be a VCS '. 339 - 'recognized by Phabricator: %s.', 340 - implode(', ', array_keys($vcs_map))), 341 - $xaction); 342 - } 343 - } 344 - 345 - if (!strlen($value)) { 346 - $error = new PhabricatorApplicationTransactionValidationError( 347 - $type, 348 - pht('Required'), 349 - pht( 350 - 'When creating a repository, you must specify a valid '. 351 - 'underlying version control system: %s.', 352 - implode(', ', array_keys($vcs_map))), 353 - nonempty(last($xactions), null)); 354 - $error->setIsMissingFieldError(true); 355 - $errors[] = $error; 356 - } 357 - } 358 - break; 359 - 360 - case PhabricatorRepositoryTransaction::TYPE_NAME: 361 - $missing = $this->validateIsEmptyTextField( 362 - $object->getName(), 363 - $xactions); 364 - 365 - if ($missing) { 366 - $error = new PhabricatorApplicationTransactionValidationError( 367 - $type, 368 - pht('Required'), 369 - pht('Repository name is required.'), 370 - nonempty(last($xactions), null)); 371 - 372 - $error->setIsMissingFieldError(true); 373 - $errors[] = $error; 374 - } 375 - break; 376 - 377 - case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 378 - $status_map = PhabricatorRepository::getStatusMap(); 379 - foreach ($xactions as $xaction) { 380 - $status = $xaction->getNewValue(); 381 - if (empty($status_map[$status])) { 382 - $errors[] = new PhabricatorApplicationTransactionValidationError( 383 - $type, 384 - pht('Invalid'), 385 - pht( 386 - 'Repository status "%s" is not valid.', 387 - $status), 388 - $xaction); 389 - } 390 - } 391 - break; 392 - 393 - case PhabricatorRepositoryTransaction::TYPE_ENCODING: 394 - foreach ($xactions as $xaction) { 395 - // Make sure the encoding is valid by converting to UTF-8. This tests 396 - // that the user has mbstring installed, and also that they didn't 397 - // type a garbage encoding name. Note that we're converting from 398 - // UTF-8 to the target encoding, because mbstring is fine with 399 - // converting from a nonsense encoding. 400 - $encoding = $xaction->getNewValue(); 401 - if (!strlen($encoding)) { 402 - continue; 403 - } 404 - 405 - try { 406 - phutil_utf8_convert('.', $encoding, 'UTF-8'); 407 - } catch (Exception $ex) { 408 - $errors[] = new PhabricatorApplicationTransactionValidationError( 409 - $type, 410 - pht('Invalid'), 411 - pht( 412 - 'Repository encoding "%s" is not valid: %s', 413 - $encoding, 414 - $ex->getMessage()), 415 - $xaction); 416 - } 417 - } 418 - break; 419 - 420 - case PhabricatorRepositoryTransaction::TYPE_SLUG: 421 - foreach ($xactions as $xaction) { 422 - $old = $xaction->getOldValue(); 423 - $new = $xaction->getNewValue(); 424 - 425 - if (!strlen($new)) { 426 - continue; 427 - } 428 - 429 - if ($new === $old) { 430 - continue; 431 - } 432 - 433 - try { 434 - PhabricatorRepository::assertValidRepositorySlug($new); 435 - } catch (Exception $ex) { 436 - $errors[] = new PhabricatorApplicationTransactionValidationError( 437 - $type, 438 - pht('Invalid'), 439 - $ex->getMessage(), 440 - $xaction); 441 - continue; 442 - } 443 - 444 - $other = id(new PhabricatorRepositoryQuery()) 445 - ->setViewer(PhabricatorUser::getOmnipotentUser()) 446 - ->withSlugs(array($new)) 447 - ->executeOne(); 448 - if ($other && ($other->getID() !== $object->getID())) { 449 - $errors[] = new PhabricatorApplicationTransactionValidationError( 450 - $type, 451 - pht('Duplicate'), 452 - pht( 453 - 'The selected repository short name is already in use by '. 454 - 'another repository. Choose a unique short name.'), 455 - $xaction); 456 - continue; 457 - } 458 - } 459 - break; 460 - 461 - case PhabricatorRepositoryTransaction::TYPE_CALLSIGN: 462 - foreach ($xactions as $xaction) { 463 - $old = $xaction->getOldValue(); 464 - $new = $xaction->getNewValue(); 465 - 466 - if (!strlen($new)) { 467 - continue; 468 - } 469 - 470 - if ($new === $old) { 471 - continue; 472 - } 473 - 474 - try { 475 - PhabricatorRepository::assertValidCallsign($new); 476 - } catch (Exception $ex) { 477 - $errors[] = new PhabricatorApplicationTransactionValidationError( 478 - $type, 479 - pht('Invalid'), 480 - $ex->getMessage(), 481 - $xaction); 482 - continue; 483 - } 484 - 485 - $other = id(new PhabricatorRepositoryQuery()) 486 - ->setViewer(PhabricatorUser::getOmnipotentUser()) 487 - ->withCallsigns(array($new)) 488 - ->executeOne(); 489 - if ($other && ($other->getID() !== $object->getID())) { 490 - $errors[] = new PhabricatorApplicationTransactionValidationError( 491 - $type, 492 - pht('Duplicate'), 493 - pht( 494 - 'The selected callsign ("%s") is already in use by another '. 495 - 'repository. Choose a unique callsign.', 496 - $new), 497 - $xaction); 498 - continue; 499 - } 500 - } 501 - break; 502 - 503 - case PhabricatorRepositoryTransaction::TYPE_SYMBOLS_SOURCES: 504 - foreach ($xactions as $xaction) { 505 - $old = $object->getSymbolSources(); 506 - $new = $xaction->getNewValue(); 507 - 508 - // If the viewer is adding new repositories, make sure they are 509 - // valid and visible. 510 - $add = array_diff($new, $old); 511 - if (!$add) { 512 - continue; 513 - } 514 - 515 - $repositories = id(new PhabricatorRepositoryQuery()) 516 - ->setViewer($this->getActor()) 517 - ->withPHIDs($add) 518 - ->execute(); 519 - $repositories = mpull($repositories, null, 'getPHID'); 520 - 521 - foreach ($add as $phid) { 522 - if (isset($repositories[$phid])) { 523 - continue; 524 - } 525 - 526 - $errors[] = new PhabricatorApplicationTransactionValidationError( 527 - $type, 528 - pht('Invalid'), 529 - pht( 530 - 'Repository ("%s") does not exist, or you do not have '. 531 - 'permission to see it.', 532 - $phid), 533 - $xaction); 534 - break; 535 - } 536 - } 537 - break; 538 - 539 - } 540 - 541 - return $errors; 542 22 } 543 23 544 24 protected function didCatchDuplicateKeyException(
+2 -1
src/applications/repository/management/PhabricatorRepositoryManagementClusterizeWorkflow.php
··· 117 117 $xactions = array(); 118 118 119 119 $xactions[] = id(new PhabricatorRepositoryTransaction()) 120 - ->setTransactionType(PhabricatorRepositoryTransaction::TYPE_SERVICE) 120 + ->setTransactionType( 121 + PhabricatorRepositoryServiceTransaction::TRANSACTIONTYPE) 121 122 ->setNewValue($service_phid); 122 123 123 124 id(new PhabricatorRepositoryEditor())
+3 -398
src/applications/repository/storage/PhabricatorRepositoryTransaction.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorRepositoryTransaction 4 - extends PhabricatorApplicationTransaction { 5 - 6 - const TYPE_VCS = 'repo:vcs'; 7 - const TYPE_ACTIVATE = 'repo:activate'; 8 - const TYPE_NAME = 'repo:name'; 9 - const TYPE_DESCRIPTION = 'repo:description'; 10 - const TYPE_ENCODING = 'repo:encoding'; 11 - const TYPE_DEFAULT_BRANCH = 'repo:default-branch'; 12 - const TYPE_TRACK_ONLY = 'repo:track-only'; 13 - const TYPE_AUTOCLOSE_ONLY = 'repo:autoclose-only'; 14 - const TYPE_SVN_SUBPATH = 'repo:svn-subpath'; 15 - const TYPE_NOTIFY = 'repo:notify'; 16 - const TYPE_AUTOCLOSE = 'repo:autoclose'; 17 - const TYPE_PUSH_POLICY = 'repo:push-policy'; 18 - const TYPE_DANGEROUS = 'repo:dangerous'; 19 - const TYPE_ENORMOUS = 'repo:enormous'; 20 - const TYPE_SLUG = 'repo:slug'; 21 - const TYPE_SERVICE = 'repo:service'; 22 - const TYPE_SYMBOLS_SOURCES = 'repo:symbol-source'; 23 - const TYPE_SYMBOLS_LANGUAGE = 'repo:symbol-language'; 24 - const TYPE_STAGING_URI = 'repo:staging-uri'; 25 - const TYPE_AUTOMATION_BLUEPRINTS = 'repo:automation-blueprints'; 26 - const TYPE_CALLSIGN = 'repo:callsign'; 4 + extends PhabricatorModularTransaction { 27 5 28 6 public function getApplicationName() { 29 7 return 'repository'; ··· 37 15 return null; 38 16 } 39 17 40 - public function getRequiredHandlePHIDs() { 41 - $phids = parent::getRequiredHandlePHIDs(); 42 - 43 - $old = $this->getOldValue(); 44 - $new = $this->getNewValue(); 45 - 46 - switch ($this->getTransactionType()) { 47 - case self::TYPE_PUSH_POLICY: 48 - case self::TYPE_SERVICE: 49 - if ($old) { 50 - $phids[] = $old; 51 - } 52 - if ($new) { 53 - $phids[] = $new; 54 - } 55 - break; 56 - case self::TYPE_SYMBOLS_SOURCES: 57 - case self::TYPE_AUTOMATION_BLUEPRINTS: 58 - if ($old) { 59 - $phids = array_merge($phids, $old); 60 - } 61 - if ($new) { 62 - $phids = array_merge($phids, $new); 63 - } 64 - break; 65 - } 66 - 67 - return $phids; 68 - } 69 - 70 - public function shouldHide() { 71 - $old = $this->getOldValue(); 72 - $new = $this->getNewValue(); 73 - 74 - switch ($this->getTransactionType()) { 75 - case self::TYPE_NAME: 76 - // Hide these on create, they aren't interesting and we have an 77 - // explicit "create" transaction. 78 - if (!strlen($old)) { 79 - return true; 80 - } 81 - break; 82 - } 83 - 84 - return parent::shouldHide(); 85 - } 86 - 87 - public function getIcon() { 88 - switch ($this->getTransactionType()) { 89 - case self::TYPE_VCS: 90 - return 'fa-plus'; 91 - } 92 - return parent::getIcon(); 93 - } 94 - 95 - public function getColor() { 96 - switch ($this->getTransactionType()) { 97 - case self::TYPE_VCS: 98 - return 'green'; 99 - } 100 - return parent::getIcon(); 101 - } 102 - 103 - public function getTitle() { 104 - $author_phid = $this->getAuthorPHID(); 105 - 106 - $old = $this->getOldValue(); 107 - $new = $this->getNewValue(); 108 - 109 - switch ($this->getTransactionType()) { 110 - case self::TYPE_VCS: 111 - return pht( 112 - '%s created this repository.', 113 - $this->renderHandleLink($author_phid)); 114 - case self::TYPE_ACTIVATE: 115 - // TODO: Old versions of this transaction use a boolean value, but 116 - // should be migrated. 117 - $is_deactivate = 118 - (!$new) || 119 - ($new == PhabricatorRepository::STATUS_INACTIVE); 120 - 121 - if (!$is_deactivate) { 122 - return pht( 123 - '%s activated this repository.', 124 - $this->renderHandleLink($author_phid)); 125 - } else { 126 - return pht( 127 - '%s deactivated this repository.', 128 - $this->renderHandleLink($author_phid)); 129 - } 130 - case self::TYPE_NAME: 131 - return pht( 132 - '%s renamed this repository from "%s" to "%s".', 133 - $this->renderHandleLink($author_phid), 134 - $old, 135 - $new); 136 - case self::TYPE_DESCRIPTION: 137 - return pht( 138 - '%s updated the description of this repository.', 139 - $this->renderHandleLink($author_phid)); 140 - case self::TYPE_ENCODING: 141 - if (strlen($old) && !strlen($new)) { 142 - return pht( 143 - '%s removed the "%s" encoding configured for this repository.', 144 - $this->renderHandleLink($author_phid), 145 - $old); 146 - } else if (strlen($new) && !strlen($old)) { 147 - return pht( 148 - '%s set the encoding for this repository to "%s".', 149 - $this->renderHandleLink($author_phid), 150 - $new); 151 - } else { 152 - return pht( 153 - '%s changed the repository encoding from "%s" to "%s".', 154 - $this->renderHandleLink($author_phid), 155 - $old, 156 - $new); 157 - } 158 - case self::TYPE_DEFAULT_BRANCH: 159 - if (!strlen($new)) { 160 - return pht( 161 - '%s removed "%s" as the default branch.', 162 - $this->renderHandleLink($author_phid), 163 - $old); 164 - } else if (!strlen($old)) { 165 - return pht( 166 - '%s set the default branch to "%s".', 167 - $this->renderHandleLink($author_phid), 168 - $new); 169 - } else { 170 - return pht( 171 - '%s changed the default branch from "%s" to "%s".', 172 - $this->renderHandleLink($author_phid), 173 - $old, 174 - $new); 175 - } 176 - break; 177 - case self::TYPE_TRACK_ONLY: 178 - if (!$new) { 179 - return pht( 180 - '%s set this repository to track all branches.', 181 - $this->renderHandleLink($author_phid)); 182 - } else if (!$old) { 183 - return pht( 184 - '%s set this repository to track branches: %s.', 185 - $this->renderHandleLink($author_phid), 186 - implode(', ', $new)); 187 - } else { 188 - return pht( 189 - '%s changed track branches from "%s" to "%s".', 190 - $this->renderHandleLink($author_phid), 191 - implode(', ', $old), 192 - implode(', ', $new)); 193 - } 194 - break; 195 - case self::TYPE_AUTOCLOSE_ONLY: 196 - if (!$new) { 197 - return pht( 198 - '%s set this repository to autoclose on all branches.', 199 - $this->renderHandleLink($author_phid)); 200 - } else if (!$old) { 201 - return pht( 202 - '%s set this repository to autoclose on branches: %s.', 203 - $this->renderHandleLink($author_phid), 204 - implode(', ', $new)); 205 - } else { 206 - return pht( 207 - '%s changed autoclose branches from "%s" to "%s".', 208 - $this->renderHandleLink($author_phid), 209 - implode(', ', $old), 210 - implode(', ', $new)); 211 - } 212 - break; 213 - case self::TYPE_SVN_SUBPATH: 214 - if (!strlen($new)) { 215 - return pht( 216 - '%s removed "%s" as the Import Only path.', 217 - $this->renderHandleLink($author_phid), 218 - $old); 219 - } else if (!strlen($old)) { 220 - return pht( 221 - '%s set the repository to import only "%s".', 222 - $this->renderHandleLink($author_phid), 223 - $new); 224 - } else { 225 - return pht( 226 - '%s changed the import path from "%s" to "%s".', 227 - $this->renderHandleLink($author_phid), 228 - $old, 229 - $new); 230 - } 231 - break; 232 - case self::TYPE_NOTIFY: 233 - if ($new) { 234 - return pht( 235 - '%s enabled notifications and publishing for this repository.', 236 - $this->renderHandleLink($author_phid)); 237 - } else { 238 - return pht( 239 - '%s disabled notifications and publishing for this repository.', 240 - $this->renderHandleLink($author_phid)); 241 - } 242 - break; 243 - case self::TYPE_AUTOCLOSE: 244 - if ($new) { 245 - return pht( 246 - '%s enabled autoclose for this repository.', 247 - $this->renderHandleLink($author_phid)); 248 - } else { 249 - return pht( 250 - '%s disabled autoclose for this repository.', 251 - $this->renderHandleLink($author_phid)); 252 - } 253 - break; 254 - case self::TYPE_PUSH_POLICY: 255 - return pht( 256 - '%s changed the push policy of this repository from "%s" to "%s".', 257 - $this->renderHandleLink($author_phid), 258 - $this->renderPolicyName($old, 'old'), 259 - $this->renderPolicyName($new, 'new')); 260 - case self::TYPE_DANGEROUS: 261 - if ($new) { 262 - return pht( 263 - '%s disabled protection against dangerous changes.', 264 - $this->renderHandleLink($author_phid)); 265 - } else { 266 - return pht( 267 - '%s enabled protection against dangerous changes.', 268 - $this->renderHandleLink($author_phid)); 269 - } 270 - case self::TYPE_ENORMOUS: 271 - if ($new) { 272 - return pht( 273 - '%s disabled protection against enormous changes.', 274 - $this->renderHandleLink($author_phid)); 275 - } else { 276 - return pht( 277 - '%s enabled protection against enormous changes.', 278 - $this->renderHandleLink($author_phid)); 279 - } 280 - case self::TYPE_SLUG: 281 - if (strlen($old) && !strlen($new)) { 282 - return pht( 283 - '%s removed the short name of this repository.', 284 - $this->renderHandleLink($author_phid)); 285 - } else if (strlen($new) && !strlen($old)) { 286 - return pht( 287 - '%s set the short name of this repository to "%s".', 288 - $this->renderHandleLink($author_phid), 289 - $new); 290 - } else { 291 - return pht( 292 - '%s changed the short name of this repository from "%s" to "%s".', 293 - $this->renderHandleLink($author_phid), 294 - $old, 295 - $new); 296 - } 297 - case self::TYPE_SERVICE: 298 - if (strlen($old) && !strlen($new)) { 299 - return pht( 300 - '%s moved storage for this repository from %s to local.', 301 - $this->renderHandleLink($author_phid), 302 - $this->renderHandleLink($old)); 303 - } else if (!strlen($old) && strlen($new)) { 304 - // TODO: Possibly, we should distinguish between automatic assignment 305 - // on creation vs explicit adjustment. 306 - return pht( 307 - '%s set storage for this repository to %s.', 308 - $this->renderHandleLink($author_phid), 309 - $this->renderHandleLink($new)); 310 - } else { 311 - return pht( 312 - '%s moved storage for this repository from %s to %s.', 313 - $this->renderHandleLink($author_phid), 314 - $this->renderHandleLink($old), 315 - $this->renderHandleLink($new)); 316 - } 317 - case self::TYPE_SYMBOLS_SOURCES: 318 - return pht( 319 - '%s changed symbol sources from %s to %s.', 320 - $this->renderHandleLink($author_phid), 321 - empty($old) ? pht('None') : $this->renderHandleList($old), 322 - empty($new) ? pht('None') : $this->renderHandleList($new)); 323 - 324 - case self::TYPE_SYMBOLS_LANGUAGE: 325 - return pht('%s changed indexed languages from %s to %s.', 326 - $this->renderHandleLink($author_phid), 327 - $old ? implode(', ', $old) : pht('Any'), 328 - $new ? implode(', ', $new) : pht('Any')); 329 - 330 - case self::TYPE_STAGING_URI: 331 - if (!$old) { 332 - return pht( 333 - '%s set "%s" as the staging area for this repository.', 334 - $this->renderHandleLink($author_phid), 335 - $new); 336 - } else if (!$new) { 337 - return pht( 338 - '%s removed "%s" as the staging area for this repository.', 339 - $this->renderHandleLink($author_phid), 340 - $old); 341 - } else { 342 - return pht( 343 - '%s changed the staging area for this repository from '. 344 - '"%s" to "%s".', 345 - $this->renderHandleLink($author_phid), 346 - $old, 347 - $new); 348 - } 349 - 350 - case self::TYPE_AUTOMATION_BLUEPRINTS: 351 - $add = array_diff($new, $old); 352 - $rem = array_diff($old, $new); 353 - 354 - if ($add && $rem) { 355 - return pht( 356 - '%s changed %s automation blueprint(s), '. 357 - 'added %s: %s; removed %s: %s.', 358 - $this->renderHandleLink($author_phid), 359 - new PhutilNumber(count($add) + count($rem)), 360 - new PhutilNumber(count($add)), 361 - $this->renderHandleList($add), 362 - new PhutilNumber(count($rem)), 363 - $this->renderHandleList($rem)); 364 - } else if ($add) { 365 - return pht( 366 - '%s added %s automation blueprint(s): %s.', 367 - $this->renderHandleLink($author_phid), 368 - new PhutilNumber(count($add)), 369 - $this->renderHandleList($add)); 370 - } else { 371 - return pht( 372 - '%s removed %s automation blueprint(s): %s.', 373 - $this->renderHandleLink($author_phid), 374 - new PhutilNumber(count($rem)), 375 - $this->renderHandleList($rem)); 376 - } 377 - 378 - case self::TYPE_CALLSIGN: 379 - if ($old === null) { 380 - return pht( 381 - '%s set the callsign for this repository to "%s".', 382 - $this->renderHandleLink($author_phid), 383 - $new); 384 - } else if ($new === null) { 385 - return pht( 386 - '%s removed the callsign ("%s") for this repository.', 387 - $this->renderHandleLink($author_phid), 388 - $old); 389 - } else { 390 - return pht( 391 - '%s changed the callsign for this repository from "%s" to "%s".', 392 - $this->renderHandleLink($author_phid), 393 - $old, 394 - $new); 395 - } 396 - 397 - } 398 - 399 - return parent::getTitle(); 400 - } 401 - 402 - public function hasChangeDetails() { 403 - switch ($this->getTransactionType()) { 404 - case self::TYPE_DESCRIPTION: 405 - return true; 406 - } 407 - return parent::hasChangeDetails(); 408 - } 409 - 410 - public function renderChangeDetails(PhabricatorUser $viewer) { 411 - return $this->renderTextCorpusChangeDetails( 412 - $viewer, 413 - $this->getOldValue(), 414 - $this->getNewValue()); 18 + public function getBaseTransactionClass() { 19 + return 'PhabricatorRepositoryTransactionType'; 415 20 } 416 21 417 22 }
+61
src/applications/repository/xaction/PhabricatorRepositoryActivateTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryActivateTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:activate'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->isTracked(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + // The first time a repository is activated, clear the "new repository" 14 + // flag so we stop showing setup hints. 15 + if ($value) { 16 + $object->setDetail('newly-initialized', false); 17 + } 18 + 19 + $object->setDetail('tracking-enabled', $value); 20 + } 21 + 22 + public function getTitle() { 23 + $new = $this->getNewValue(); 24 + 25 + // TODO: Old versions of this transaction use a boolean value, but 26 + // should be migrated. 27 + $is_deactivate = 28 + (!$new) || 29 + ($new == PhabricatorRepository::STATUS_INACTIVE); 30 + 31 + if (!$is_deactivate) { 32 + return pht( 33 + '%s activated this repository.', 34 + $this->renderAuthor()); 35 + } else { 36 + return pht( 37 + '%s deactivated this repository.', 38 + $this->renderAuthor()); 39 + } 40 + } 41 + 42 + public function validateTransactions($object, array $xactions) { 43 + $errors = array(); 44 + 45 + $status_map = PhabricatorRepository::getStatusMap(); 46 + foreach ($xactions as $xaction) { 47 + $status = $xaction->getNewValue(); 48 + if (empty($status_map[$status])) { 49 + $errors[] = $this->newInvalidError( 50 + pht( 51 + 'Repository status "%s" is not valid. Valid statuses are: %s.', 52 + $status, 53 + implode(', ', array_keys($status_map))), 54 + $xaction); 55 + } 56 + } 57 + 58 + return $errors; 59 + } 60 + 61 + }
+42
src/applications/repository/xaction/PhabricatorRepositoryAutocloseOnlyTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryAutocloseOnlyTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:autoclose-only'; 7 + 8 + public function generateOldValue($object) { 9 + return array_keys($object->getDetail('close-commits-filter', array())); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('close-commits-filter', array_fill_keys($value, true)); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if (!$new) { 21 + return pht( 22 + '%s set this repository to autoclose on all branches.', 23 + $this->renderAuthor()); 24 + } else if (!$old) { 25 + return pht( 26 + '%s set this repository to autoclose on branches: %s.', 27 + $this->renderAuthor(), 28 + $this->renderValue(implode(', ', $new))); 29 + } else { 30 + return pht( 31 + '%s changed autoclose branches from %s to %s.', 32 + $this->renderAuthor(), 33 + $this->renderValue(implode(', ', $old)), 34 + $this->renderValue(implode(', ', $new))); 35 + } 36 + } 37 + 38 + public function validateTransactions($object, array $xactions) { 39 + return $this->validateRefList($object, $xactions); 40 + } 41 + 42 + }
+34
src/applications/repository/xaction/PhabricatorRepositoryAutocloseTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryAutocloseTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:autoclose'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)!$object->getDetail('disable-autoclose'); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setDetail('disable-autoclose', (int)!$value); 18 + } 19 + 20 + public function getTitle() { 21 + $new = $this->getNewValue(); 22 + 23 + if ($new) { 24 + return pht( 25 + '%s enabled autoclose for this repository.', 26 + $this->renderAuthor()); 27 + } else { 28 + return pht( 29 + '%s disabled autoclose for this repository.', 30 + $this->renderAuthor()); 31 + } 32 + } 33 + 34 + }
+81
src/applications/repository/xaction/PhabricatorRepositoryBlueprintsTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryBlueprintsTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:automation-blueprints'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDetail('automation.blueprintPHIDs', array()); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('automation.blueprintPHIDs', $value); 14 + } 15 + 16 + public function applyExternalEffects($object, $value) { 17 + DrydockAuthorization::applyAuthorizationChanges( 18 + $this->getActor(), 19 + $object->getPHID(), 20 + $this->getOldValue(), 21 + $this->getNewValue()); 22 + } 23 + 24 + public function getTitle() { 25 + $old = $this->getOldValue(); 26 + $new = $this->getNewValue(); 27 + 28 + $add = array_diff($new, $old); 29 + $rem = array_diff($old, $new); 30 + 31 + if ($add && $rem) { 32 + return pht( 33 + '%s changed %s automation blueprint(s), '. 34 + 'added %s: %s; removed %s: %s.', 35 + $this->renderAuthor(), 36 + new PhutilNumber(count($add) + count($rem)), 37 + new PhutilNumber(count($add)), 38 + $this->renderHandleList($add), 39 + new PhutilNumber(count($rem)), 40 + $this->renderHandleList($rem)); 41 + } else if ($add) { 42 + return pht( 43 + '%s added %s automation blueprint(s): %s.', 44 + $this->renderAuthor(), 45 + new PhutilNumber(count($add)), 46 + $this->renderHandleList($add)); 47 + } else { 48 + return pht( 49 + '%s removed %s automation blueprint(s): %s.', 50 + $this->renderAuthor(), 51 + new PhutilNumber(count($rem)), 52 + $this->renderHandleList($rem)); 53 + } 54 + } 55 + 56 + public function validateTransactions($object, array $xactions) { 57 + $errors = array(); 58 + 59 + foreach ($xactions as $xaction) { 60 + $old = nonempty($xaction->getOldValue(), array()); 61 + $new = nonempty($xaction->getNewValue(), array()); 62 + 63 + $add = array_diff($new, $old); 64 + 65 + $invalid = PhabricatorObjectQuery::loadInvalidPHIDsForViewer( 66 + $this->getActor(), 67 + $add); 68 + if ($invalid) { 69 + $errors[] = $this->newInvalidError( 70 + pht( 71 + 'Some of the selected automation blueprints are invalid '. 72 + 'or restricted: %s.', 73 + implode(', ', $invalid)), 74 + $xaction); 75 + } 76 + } 77 + 78 + return $errors; 79 + } 80 + 81 + }
+90
src/applications/repository/xaction/PhabricatorRepositoryCallsignTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryCallsignTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:callsign'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getCallsign(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + if (strlen($value)) { 14 + return $value; 15 + } 16 + 17 + return null; 18 + } 19 + 20 + public function applyInternalEffects($object, $value) { 21 + $object->setCallsign($value); 22 + } 23 + 24 + public function getTitle() { 25 + $old = $this->getOldValue(); 26 + $new = $this->getNewValue(); 27 + 28 + if (!strlen($old)) { 29 + return pht( 30 + '%s set the callsign for this repository to %s.', 31 + $this->renderAuthor(), 32 + $this->renderNewValue()); 33 + } else if (!strlen($new)) { 34 + return pht( 35 + '%s removed the callsign (%s) for this repository.', 36 + $this->renderAuthor(), 37 + $this->renderOldValue()); 38 + } else { 39 + return pht( 40 + '%s changed the callsign for this repository from %s to %s.', 41 + $this->renderAuthor(), 42 + $this->renderOldValue(), 43 + $this->renderNewValue()); 44 + } 45 + } 46 + 47 + public function validateTransactions($object, array $xactions) { 48 + $errors = array(); 49 + 50 + foreach ($xactions as $xaction) { 51 + $old = $xaction->getOldValue(); 52 + $new = $xaction->getNewValue(); 53 + 54 + if (!strlen($new)) { 55 + continue; 56 + } 57 + 58 + if ($new === $old) { 59 + continue; 60 + } 61 + 62 + try { 63 + PhabricatorRepository::assertValidCallsign($new); 64 + } catch (Exception $ex) { 65 + $errors[] = $this->newInvalidError( 66 + $ex->getMessage(), 67 + $xaction); 68 + continue; 69 + } 70 + 71 + $other = id(new PhabricatorRepositoryQuery()) 72 + ->setViewer(PhabricatorUser::getOmnipotentUser()) 73 + ->withCallsigns(array($new)) 74 + ->executeOne(); 75 + if ($other && ($other->getID() !== $object->getID())) { 76 + $errors[] = $this->newError( 77 + pht('Duplicate'), 78 + pht( 79 + 'The selected callsign ("%s") is already in use by another '. 80 + 'repository. Choose a unique callsign.', 81 + $new), 82 + $xaction); 83 + continue; 84 + } 85 + } 86 + 87 + return $errors; 88 + } 89 + 90 + }
+30
src/applications/repository/xaction/PhabricatorRepositoryDangerousTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryDangerousTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:dangerous'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->shouldAllowDangerousChanges(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('allow-dangerous-changes', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $new = $this->getNewValue(); 18 + 19 + if ($new) { 20 + return pht( 21 + '%s disabled protection against dangerous changes.', 22 + $this->renderAuthor()); 23 + } else { 24 + return pht( 25 + '%s enabled protection against dangerous changes.', 26 + $this->renderAuthor()); 27 + } 28 + } 29 + 30 + }
+39
src/applications/repository/xaction/PhabricatorRepositoryDefaultBranchTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryDefaultBranchTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:default-branch'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDetail('default-branch'); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('default-branch', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if (!strlen($new)) { 21 + return pht( 22 + '%s removed %s as the default branch.', 23 + $this->renderAuthor(), 24 + $this->renderOldValue()); 25 + } else if (!strlen($old)) { 26 + return pht( 27 + '%s set the default branch to %s.', 28 + $this->renderAuthor(), 29 + $this->renderNewValue()); 30 + } else { 31 + return pht( 32 + '%s changed the default branch from %s to %s.', 33 + $this->renderAuthor(), 34 + $this->renderOldValue(), 35 + $this->renderNewValue()); 36 + } 37 + } 38 + 39 + }
+49
src/applications/repository/xaction/PhabricatorRepositoryDescriptionTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryDescriptionTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:description'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDetail('description'); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('description', $value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s updated the description for this repository.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function hasChangeDetailView() { 23 + return true; 24 + } 25 + 26 + public function getMailDiffSectionHeader() { 27 + return pht('CHANGES TO REPOSITORY DESCRIPTION'); 28 + } 29 + 30 + public function newChangeDetailView() { 31 + $viewer = $this->getViewer(); 32 + 33 + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 34 + ->setViewer($viewer) 35 + ->setOldText($this->getOldValue()) 36 + ->setNewText($this->getNewValue()); 37 + } 38 + 39 + public function newRemarkupChanges() { 40 + $changes = array(); 41 + 42 + $changes[] = $this->newRemarkupChange() 43 + ->setOldValue($this->getOldValue()) 44 + ->setNewValue($this->getNewValue()); 45 + 46 + return $changes; 47 + } 48 + 49 + }
+68
src/applications/repository/xaction/PhabricatorRepositoryEncodingTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryEncodingTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:encoding'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDetail('encoding'); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('encoding', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if (strlen($old) && !strlen($new)) { 21 + return pht( 22 + '%s removed the %s encoding configured for this repository.', 23 + $this->renderAuthor(), 24 + $this->renderOldValue()); 25 + } else if (strlen($new) && !strlen($old)) { 26 + return pht( 27 + '%s set the encoding for this repository to %s.', 28 + $this->renderAuthor(), 29 + $this->renderNewValue()); 30 + } else { 31 + return pht( 32 + '%s changed the repository encoding from %s to %s.', 33 + $this->renderAuthor(), 34 + $this->renderOldValue(), 35 + $this->renderNewValue()); 36 + } 37 + } 38 + 39 + public function validateTransactions($object, array $xactions) { 40 + $errors = array(); 41 + 42 + foreach ($xactions as $xaction) { 43 + // Make sure the encoding is valid by converting to UTF-8. This tests 44 + // that the user has mbstring installed, and also that they didn't 45 + // type a garbage encoding name. Note that we're converting from 46 + // UTF-8 to the target encoding, because mbstring is fine with 47 + // converting from a nonsense encoding. 48 + $encoding = $xaction->getNewValue(); 49 + if (!strlen($encoding)) { 50 + continue; 51 + } 52 + 53 + try { 54 + phutil_utf8_convert('.', $encoding, 'UTF-8'); 55 + } catch (Exception $ex) { 56 + $errors[] = $this->newInvalidError( 57 + pht( 58 + 'Repository encoding "%s" is not valid: %s', 59 + $encoding, 60 + $ex->getMessage()), 61 + $xaction); 62 + } 63 + } 64 + 65 + return $errors; 66 + } 67 + 68 + }
+30
src/applications/repository/xaction/PhabricatorRepositoryEnormousTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryEnormousTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:enormous'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->shouldAllowEnormousChanges(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('allow-enormous-changes', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $new = $this->getNewValue(); 18 + 19 + if ($new) { 20 + return pht( 21 + '%s disabled protection against enormous changes.', 22 + $this->renderAuthor()); 23 + } else { 24 + return pht( 25 + '%s enabled protection against enormous changes.', 26 + $this->renderAuthor()); 27 + } 28 + } 29 + 30 + }
+35
src/applications/repository/xaction/PhabricatorRepositoryNameTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryNameTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:name'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getName(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setName($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s renamed this repository from %s to %s.', 19 + $this->renderAuthor(), 20 + $this->renderOldValue(), 21 + $this->renderNewValue()); 22 + } 23 + 24 + public function validateTransactions($object, array $xactions) { 25 + $errors = array(); 26 + 27 + if ($this->isEmptyTextTransaction($object->getName(), $xactions)) { 28 + $errors[] = $this->newRequiredError( 29 + pht('Repositories must have a name.')); 30 + } 31 + 32 + return $errors; 33 + } 34 + 35 + }
+34
src/applications/repository/xaction/PhabricatorRepositoryNotifyTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryNotifyTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:notify'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)!$object->getDetail('herald-disabled'); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setDetail('herald-disabled', (int)!$value); 18 + } 19 + 20 + public function getTitle() { 21 + $new = $this->getNewValue(); 22 + 23 + if ($new) { 24 + return pht( 25 + '%s enabled notifications and publishing for this repository.', 26 + $this->renderAuthor()); 27 + } else { 28 + return pht( 29 + '%s disabled notifications and publishing for this repository.', 30 + $this->renderAuthor()); 31 + } 32 + } 33 + 34 + }
+24
src/applications/repository/xaction/PhabricatorRepositoryPushPolicyTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryPushPolicyTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:push-policy'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getPushPolicy(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setPushPolicy($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s changed the push policy of this repository from %s to %s.', 19 + $this->renderAuthor(), 20 + $this->renderOldPolicy(), 21 + $this->renderNewPolicy()); 22 + } 23 + 24 + }
+39
src/applications/repository/xaction/PhabricatorRepositorySVNSubpathTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositorySVNSubpathTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:svn-subpath'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDetail('svn-subpath'); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('svn-subpath', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if (!strlen($new)) { 21 + return pht( 22 + '%s removed %s as the "Import Only" path.', 23 + $this->renderAuthor(), 24 + $this->renderOldValue()); 25 + } else if (!strlen($old)) { 26 + return pht( 27 + '%s set the repository "Import Only" path to %s.', 28 + $this->renderAuthor(), 29 + $this->renderNewValue()); 30 + } else { 31 + return pht( 32 + '%s changed the "Import Only" path from %s to %s.', 33 + $this->renderAuthor(), 34 + $this->renderOldValue(), 35 + $this->renderNewValue()); 36 + } 37 + } 38 + 39 + }
+59
src/applications/repository/xaction/PhabricatorRepositoryServiceTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryServiceTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:service'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getAlmanacServicePHID(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + if (strlen($value)) { 14 + return $value; 15 + } 16 + 17 + return null; 18 + } 19 + 20 + public function applyInternalEffects($object, $value) { 21 + $object->setAlmanacServicePHID($value); 22 + } 23 + 24 + public function getTitle() { 25 + $old = $this->getOldValue(); 26 + $new = $this->getOldValue(); 27 + 28 + if (strlen($old) && !strlen($new)) { 29 + return pht( 30 + '%s moved storage for this repository from %s to local.', 31 + $this->renderAuthor(), 32 + $this->renderOldHandle()); 33 + } else if (!strlen($old) && strlen($new)) { 34 + // TODO: Possibly, we should distinguish between automatic assignment 35 + // on creation vs explicit adjustment. 36 + return pht( 37 + '%s set storage for this repository to %s.', 38 + $this->renderAuthor(), 39 + $this->renderNewHandle()); 40 + } else { 41 + return pht( 42 + '%s moved storage for this repository from %s to %s.', 43 + $this->renderAuthor(), 44 + $this->renderOldHandle(), 45 + $this->renderNewHandle()); 46 + } 47 + } 48 + 49 + public function validateTransactions($object, array $xactions) { 50 + $errors = array(); 51 + 52 + // TODO: This could use some validation, values should be valid Almanac 53 + // services of appropriate types. It's only reachable via the CLI so it's 54 + // difficult to get wrong in practice. 55 + 56 + return $errors; 57 + } 58 + 59 + }
+88
src/applications/repository/xaction/PhabricatorRepositorySlugTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositorySlugTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:slug'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getRepositorySlug(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + if (strlen($value)) { 14 + return $value; 15 + } 16 + 17 + return null; 18 + } 19 + 20 + public function applyInternalEffects($object, $value) { 21 + $object->setRepositorySlug($value); 22 + } 23 + 24 + public function getTitle() { 25 + $old = $this->getOldValue(); 26 + $new = $this->getNewValue(); 27 + 28 + if (strlen($old) && !strlen($new)) { 29 + return pht( 30 + '%s removed the short name of this repository.', 31 + $this->renderAuthor()); 32 + } else if (strlen($new) && !strlen($old)) { 33 + return pht( 34 + '%s set the short name of this repository to %s.', 35 + $this->renderAuthor(), 36 + $this->renderNewValue()); 37 + } else { 38 + return pht( 39 + '%s changed the short name of this repository from %s to %s.', 40 + $this->renderAuthor(), 41 + $this->renderOldValue(), 42 + $this->renderNewValue()); 43 + } 44 + } 45 + 46 + public function validateTransactions($object, array $xactions) { 47 + $errors = array(); 48 + 49 + foreach ($xactions as $xaction) { 50 + $old = $xaction->getOldValue(); 51 + $new = $xaction->getNewValue(); 52 + 53 + if (!strlen($new)) { 54 + continue; 55 + } 56 + 57 + if ($new === $old) { 58 + continue; 59 + } 60 + 61 + try { 62 + PhabricatorRepository::assertValidRepositorySlug($new); 63 + } catch (Exception $ex) { 64 + $errors[] = $this->newInvalidError( 65 + $ex->getMessage(), 66 + $xaction); 67 + continue; 68 + } 69 + 70 + $other = id(new PhabricatorRepositoryQuery()) 71 + ->setViewer(PhabricatorUser::getOmnipotentUser()) 72 + ->withSlugs(array($new)) 73 + ->executeOne(); 74 + if ($other && ($other->getID() !== $object->getID())) { 75 + $errors[] = $this->newError( 76 + pht('Duplicate'), 77 + pht( 78 + 'The selected repository short name is already in use by '. 79 + 'another repository. Choose a unique short name.'), 80 + $xaction); 81 + continue; 82 + } 83 + } 84 + 85 + return $errors; 86 + } 87 + 88 + }
+68
src/applications/repository/xaction/PhabricatorRepositoryStagingURITransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryStagingURITransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:staging-uri'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDetail('staging-uri'); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('staging-uri', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if (!strlen($old)) { 21 + return pht( 22 + '%s set %s as the staging area for this repository.', 23 + $this->renderAuthor(), 24 + $this->renderNewValue()); 25 + } else if (!strlen($new)) { 26 + return pht( 27 + '%s removed %s as the staging area for this repository.', 28 + $this->renderAuthor(), 29 + $this->renderOldValue()); 30 + } else { 31 + return pht( 32 + '%s changed the staging area for this repository from '. 33 + '%s to %s.', 34 + $this->renderAuthor(), 35 + $this->renderOldValue(), 36 + $this->renderNewValue()); 37 + } 38 + } 39 + 40 + public function validateTransactions($object, array $xactions) { 41 + $errors = array(); 42 + 43 + $old = $this->generateOldValue($object); 44 + foreach ($xactions as $xaction) { 45 + $new = $xaction->getNewValue(); 46 + 47 + if (!strlen($new)) { 48 + continue; 49 + } 50 + 51 + if ($new === $old) { 52 + continue; 53 + } 54 + 55 + try { 56 + PhabricatorRepository::assertValidRemoteURI($new); 57 + } catch (Exception $ex) { 58 + $errors[] = $this->newInvalidError( 59 + $ex->getMessage(), 60 + $xaction); 61 + continue; 62 + } 63 + } 64 + 65 + return $errors; 66 + } 67 + 68 + }
+39
src/applications/repository/xaction/PhabricatorRepositorySymbolLanguagesTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositorySymbolLanguagesTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:symbol-language'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getSymbolLanguages(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('symbol-languages', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if ($old) { 21 + $display_old = implode(', ', $old); 22 + } else { 23 + $display_old = pht('Any'); 24 + } 25 + 26 + if ($new) { 27 + $display_new = implode(', ', $new); 28 + } else { 29 + $display_new = pht('Any'); 30 + } 31 + 32 + return pht( 33 + '%s changed indexed languages from %s to %s.', 34 + $this->renderAuthor(), 35 + $this->renderValue($display_old), 36 + $this->renderValue($display_new)); 37 + } 38 + 39 + }
+78
src/applications/repository/xaction/PhabricatorRepositorySymbolSourcesTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositorySymbolSourcesTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:symbol-source'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getSymbolSources(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('symbol-sources', $value); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if ($old) { 21 + $display_old = $this->renderHandleList($old); 22 + } else { 23 + $display_old = $this->renderValue(pht('None')); 24 + } 25 + 26 + if ($new) { 27 + $display_new = $this->renderHandleList($new); 28 + } else { 29 + $display_new = $this->renderValue(pht('None')); 30 + } 31 + 32 + return pht( 33 + '%s changed symbol sources from %s to %s.', 34 + $this->renderAuthor(), 35 + $display_old, 36 + $display_new); 37 + } 38 + 39 + public function validateTransactions($object, array $xactions) { 40 + $errors = array(); 41 + 42 + foreach ($xactions as $xaction) { 43 + $old = $object->getSymbolSources(); 44 + $new = $xaction->getNewValue(); 45 + 46 + // If the viewer is adding new repositories, make sure they are 47 + // valid and visible. 48 + $add = array_diff($new, $old); 49 + if (!$add) { 50 + continue; 51 + } 52 + 53 + $repositories = id(new PhabricatorRepositoryQuery()) 54 + ->setViewer($this->getActor()) 55 + ->withPHIDs($add) 56 + ->execute(); 57 + $repositories = mpull($repositories, null, 'getPHID'); 58 + 59 + foreach ($add as $phid) { 60 + if (isset($repositories[$phid])) { 61 + continue; 62 + } 63 + 64 + $errors[] = $this->newInvalidError( 65 + pht( 66 + 'Repository ("%s") does not exist, or you do not have '. 67 + 'permission to see it.', 68 + $phid), 69 + $xaction); 70 + break; 71 + } 72 + } 73 + 74 + return $errors; 75 + } 76 + 77 + 78 + }
+42
src/applications/repository/xaction/PhabricatorRepositoryTrackOnlyTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryTrackOnlyTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:track-only'; 7 + 8 + public function generateOldValue($object) { 9 + return array_keys($object->getDetail('branch-filter', array())); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDetail('branch-filter', array_fill_keys($value, true)); 14 + } 15 + 16 + public function getTitle() { 17 + $old = $this->getOldValue(); 18 + $new = $this->getNewValue(); 19 + 20 + if (!$new) { 21 + return pht( 22 + '%s set this repository to track all branches.', 23 + $this->renderAuthor()); 24 + } else if (!$old) { 25 + return pht( 26 + '%s set this repository to track branches: %s.', 27 + $this->renderAuthor(), 28 + $this->renderValue(implode(', ', $new))); 29 + } else { 30 + return pht( 31 + '%s changed tracked branches from %s to %s.', 32 + $this->renderAuthor(), 33 + $this->renderValue(implode(', ', $old)), 34 + $this->renderValue(implode(', ', $new))); 35 + } 36 + } 37 + 38 + public function validateTransactions($object, array $xactions) { 39 + return $this->validateRefList($object, $xactions); 40 + } 41 + 42 + }
+49
src/applications/repository/xaction/PhabricatorRepositoryTransactionType.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorRepositoryTransactionType 4 + extends PhabricatorModularTransactionType { 5 + 6 + protected function validateRefList($object, array $xactions) { 7 + $errors = array(); 8 + 9 + foreach ($xactions as $xaction) { 10 + foreach ($xaction->getNewValue() as $pattern) { 11 + // Check for invalid regular expressions. 12 + $regexp = PhabricatorRepository::extractBranchRegexp($pattern); 13 + if ($regexp !== null) { 14 + $ok = @preg_match($regexp, ''); 15 + if ($ok === false) { 16 + $errors[] = $this->newInvalidError( 17 + pht( 18 + 'Expression "%s" is not a valid regular expression. Note '. 19 + 'that you must include delimiters.', 20 + $regexp), 21 + $xaction); 22 + continue; 23 + } 24 + } 25 + 26 + // Check for formatting mistakes like `regex(...)` instead of 27 + // `regexp(...)`. 28 + $matches = null; 29 + if (preg_match('/^([^(]+)\\(.*\\)\z/', $pattern, $matches)) { 30 + switch ($matches[1]) { 31 + case 'regexp': 32 + break; 33 + default: 34 + $errors[] = $this->newInvalidError( 35 + pht( 36 + 'Matching function "%s(...)" is not recognized. Valid '. 37 + 'functions are: regexp(...).', 38 + $matches[1]), 39 + $xaction); 40 + break; 41 + } 42 + } 43 + } 44 + } 45 + 46 + return $errors; 47 + } 48 + 49 + }
+66
src/applications/repository/xaction/PhabricatorRepositoryVCSTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorRepositoryVCSTransaction 4 + extends PhabricatorRepositoryTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'repo:vcs'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getVersionControlSystem(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setVersionControlSystem($value); 14 + } 15 + 16 + public function validateTransactions($object, array $xactions) { 17 + $errors = array(); 18 + 19 + $vcs_map = PhabricatorRepositoryType::getAllRepositoryTypes(); 20 + $current_vcs = $object->getVersionControlSystem(); 21 + 22 + if (!$this->isNewObject()) { 23 + foreach ($xactions as $xaction) { 24 + if ($xaction->getNewValue() == $current_vcs) { 25 + continue; 26 + } 27 + 28 + $errors[] = $this->newInvalidError( 29 + pht( 30 + 'You can not change the version control system an existing '. 31 + 'repository uses. It can only be set when a repository is '. 32 + 'first created.'), 33 + $xaction); 34 + } 35 + 36 + return $errors; 37 + } 38 + 39 + $value = $object->getVersionControlSystem(); 40 + 41 + foreach ($xactions as $xaction) { 42 + $value = $xaction->getNewValue(); 43 + 44 + if (isset($vcs_map[$value])) { 45 + continue; 46 + } 47 + 48 + $errors[] = $this->newInvalidError( 49 + pht( 50 + 'Specified version control system must be a VCS '. 51 + 'recognized by Phabricator. Valid systems are: %s.', 52 + implode(', ', array_keys($vcs_map))), 53 + $xaction); 54 + } 55 + 56 + if ($value === null) { 57 + $errors[] = $this->newRequiredError( 58 + pht( 59 + 'When creating a repository, you must specify a valid '. 60 + 'underlying version control system. Valid systems are: %s.', 61 + implode(', ', array_keys($vcs_map)))); 62 + } 63 + 64 + return $errors; 65 + } 66 + }
+1 -1
src/applications/transactions/controller/PhabricatorApplicationTransactionValueController.php
··· 32 32 case PhabricatorTransactions::TYPE_VIEW_POLICY: 33 33 case PhabricatorTransactions::TYPE_EDIT_POLICY: 34 34 case PhabricatorTransactions::TYPE_JOIN_POLICY: 35 - case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 35 + case PhabricatorRepositoryPushPolicyTransaction::TRANSACTIONTYPE: 36 36 break; 37 37 default: 38 38 return new Aphront404Response();
+29
src/applications/transactions/storage/PhabricatorModularTransactionType.php
··· 199 199 return $this->renderHandle($this->getNewValue()); 200 200 } 201 201 202 + final protected function renderOldPolicy() { 203 + return $this->renderPolicy($this->getOldValue(), 'old'); 204 + } 205 + 206 + final protected function renderNewPolicy() { 207 + return $this->renderPolicy($this->getNewValue(), 'new'); 208 + } 209 + 210 + final protected function renderPolicy($phid, $mode) { 211 + $viewer = $this->getViewer(); 212 + $handles = $viewer->loadHandles(array($phid)); 213 + 214 + $policy = PhabricatorPolicy::newFromPolicyAndHandle( 215 + $phid, 216 + $handles[$phid]); 217 + 218 + if ($this->isTextMode()) { 219 + return $this->renderValue($policy->getFullName()); 220 + } 221 + 222 + $storage = $this->getStorage(); 223 + if ($policy->getType() == PhabricatorPolicyType::TYPE_CUSTOM) { 224 + $policy->setHref('/transactions/'.$mode.'/'.$storage->getPHID().'/'); 225 + $policy->setWorkflow(true); 226 + } 227 + 228 + return $this->renderValue($policy->renderDescription()); 229 + } 230 + 202 231 final protected function renderHandleList(array $phids) { 203 232 $viewer = $this->getViewer(); 204 233 $display = $viewer->renderHandleList($phids)