@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 Owners package transactions

Summary: Converts Owners package transactions to modular transactions.

Test Plan:
- created a new package
- edited all simple properties from the web ui
- checked that project and user owners were added as reviewers appropriately to new diffs
- inspected the change details for various types of path add / remove / update / reorder changes

Reviewers: epriestley, #blessed_reviewers

Reviewed By: epriestley, #blessed_reviewers

Subscribers: Korvin, epriestley

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

authored by

Mike Riley and committed by
yelirekim
8247edff 8759f7e6

+578 -604
+21 -1
src/__phutil_library_map__.php
··· 3017 3017 'PhabricatorOwnersListController' => 'applications/owners/controller/PhabricatorOwnersListController.php', 3018 3018 'PhabricatorOwnersOwner' => 'applications/owners/storage/PhabricatorOwnersOwner.php', 3019 3019 'PhabricatorOwnersPackage' => 'applications/owners/storage/PhabricatorOwnersPackage.php', 3020 + 'PhabricatorOwnersPackageAuditingTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageAuditingTransaction.php', 3021 + 'PhabricatorOwnersPackageAutoreviewTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageAutoreviewTransaction.php', 3020 3022 'PhabricatorOwnersPackageDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageDatasource.php', 3023 + 'PhabricatorOwnersPackageDescriptionTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageDescriptionTransaction.php', 3024 + 'PhabricatorOwnersPackageDominionTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageDominionTransaction.php', 3021 3025 'PhabricatorOwnersPackageEditEngine' => 'applications/owners/editor/PhabricatorOwnersPackageEditEngine.php', 3022 3026 'PhabricatorOwnersPackageFulltextEngine' => 'applications/owners/query/PhabricatorOwnersPackageFulltextEngine.php', 3023 3027 'PhabricatorOwnersPackageFunctionDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageFunctionDatasource.php', 3024 3028 'PhabricatorOwnersPackageNameNgrams' => 'applications/owners/storage/PhabricatorOwnersPackageNameNgrams.php', 3029 + 'PhabricatorOwnersPackageNameTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageNameTransaction.php', 3025 3030 'PhabricatorOwnersPackageOwnerDatasource' => 'applications/owners/typeahead/PhabricatorOwnersPackageOwnerDatasource.php', 3031 + 'PhabricatorOwnersPackageOwnersTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageOwnersTransaction.php', 3026 3032 'PhabricatorOwnersPackagePHIDType' => 'applications/owners/phid/PhabricatorOwnersPackagePHIDType.php', 3033 + 'PhabricatorOwnersPackagePathsTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackagePathsTransaction.php', 3034 + 'PhabricatorOwnersPackagePrimaryTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackagePrimaryTransaction.php', 3027 3035 'PhabricatorOwnersPackageQuery' => 'applications/owners/query/PhabricatorOwnersPackageQuery.php', 3028 3036 'PhabricatorOwnersPackageRemarkupRule' => 'applications/owners/remarkup/PhabricatorOwnersPackageRemarkupRule.php', 3029 3037 'PhabricatorOwnersPackageSearchEngine' => 'applications/owners/query/PhabricatorOwnersPackageSearchEngine.php', 3038 + 'PhabricatorOwnersPackageStatusTransaction' => 'applications/owners/xaction/PhabricatorOwnersPackageStatusTransaction.php', 3030 3039 'PhabricatorOwnersPackageTestCase' => 'applications/owners/storage/__tests__/PhabricatorOwnersPackageTestCase.php', 3031 3040 'PhabricatorOwnersPackageTransaction' => 'applications/owners/storage/PhabricatorOwnersPackageTransaction.php', 3032 3041 'PhabricatorOwnersPackageTransactionEditor' => 'applications/owners/editor/PhabricatorOwnersPackageTransactionEditor.php', 3033 3042 'PhabricatorOwnersPackageTransactionQuery' => 'applications/owners/query/PhabricatorOwnersPackageTransactionQuery.php', 3043 + 'PhabricatorOwnersPackageTransactionType' => 'applications/owners/xaction/PhabricatorOwnersPackageTransactionType.php', 3034 3044 'PhabricatorOwnersPath' => 'applications/owners/storage/PhabricatorOwnersPath.php', 3035 3045 'PhabricatorOwnersPathsController' => 'applications/owners/controller/PhabricatorOwnersPathsController.php', 3036 3046 'PhabricatorOwnersPathsSearchEngineAttachment' => 'applications/owners/engineextension/PhabricatorOwnersPathsSearchEngineAttachment.php', ··· 7949 7959 'PhabricatorFulltextInterface', 7950 7960 'PhabricatorNgramsInterface', 7951 7961 ), 7962 + 'PhabricatorOwnersPackageAuditingTransaction' => 'PhabricatorOwnersPackageTransactionType', 7963 + 'PhabricatorOwnersPackageAutoreviewTransaction' => 'PhabricatorOwnersPackageTransactionType', 7952 7964 'PhabricatorOwnersPackageDatasource' => 'PhabricatorTypeaheadDatasource', 7965 + 'PhabricatorOwnersPackageDescriptionTransaction' => 'PhabricatorOwnersPackageTransactionType', 7966 + 'PhabricatorOwnersPackageDominionTransaction' => 'PhabricatorOwnersPackageTransactionType', 7953 7967 'PhabricatorOwnersPackageEditEngine' => 'PhabricatorEditEngine', 7954 7968 'PhabricatorOwnersPackageFulltextEngine' => 'PhabricatorFulltextEngine', 7955 7969 'PhabricatorOwnersPackageFunctionDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 7956 7970 'PhabricatorOwnersPackageNameNgrams' => 'PhabricatorSearchNgrams', 7971 + 'PhabricatorOwnersPackageNameTransaction' => 'PhabricatorOwnersPackageTransactionType', 7957 7972 'PhabricatorOwnersPackageOwnerDatasource' => 'PhabricatorTypeaheadCompositeDatasource', 7973 + 'PhabricatorOwnersPackageOwnersTransaction' => 'PhabricatorOwnersPackageTransactionType', 7958 7974 'PhabricatorOwnersPackagePHIDType' => 'PhabricatorPHIDType', 7975 + 'PhabricatorOwnersPackagePathsTransaction' => 'PhabricatorOwnersPackageTransactionType', 7976 + 'PhabricatorOwnersPackagePrimaryTransaction' => 'PhabricatorOwnersPackageTransactionType', 7959 7977 'PhabricatorOwnersPackageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 7960 7978 'PhabricatorOwnersPackageRemarkupRule' => 'PhabricatorObjectRemarkupRule', 7961 7979 'PhabricatorOwnersPackageSearchEngine' => 'PhabricatorApplicationSearchEngine', 7980 + 'PhabricatorOwnersPackageStatusTransaction' => 'PhabricatorOwnersPackageTransactionType', 7962 7981 'PhabricatorOwnersPackageTestCase' => 'PhabricatorTestCase', 7963 - 'PhabricatorOwnersPackageTransaction' => 'PhabricatorApplicationTransaction', 7982 + 'PhabricatorOwnersPackageTransaction' => 'PhabricatorModularTransaction', 7964 7983 'PhabricatorOwnersPackageTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 7965 7984 'PhabricatorOwnersPackageTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 7985 + 'PhabricatorOwnersPackageTransactionType' => 'PhabricatorModularTransactionType', 7966 7986 'PhabricatorOwnersPath' => 'PhabricatorOwnersDAO', 7967 7987 'PhabricatorOwnersPathsController' => 'PhabricatorOwnersController', 7968 7988 'PhabricatorOwnersPathsSearchEngineAttachment' => 'PhabricatorSearchEngineAttachment',
+2 -1
src/applications/owners/controller/PhabricatorOwnersArchiveController.php
··· 31 31 32 32 $xactions = array(); 33 33 34 + $type = PhabricatorOwnersPackageStatusTransaction::TRANSACTIONTYPE; 34 35 $xactions[] = id(new PhabricatorOwnersPackageTransaction()) 35 - ->setTransactionType(PhabricatorOwnersPackageTransaction::TYPE_STATUS) 36 + ->setTransactionType($type) 36 37 ->setNewValue($new_status); 37 38 38 39 id(new PhabricatorOwnersPackageTransactionEditor())
+1 -1
src/applications/owners/controller/PhabricatorOwnersPathsController.php
··· 48 48 ); 49 49 } 50 50 51 - $type_paths = PhabricatorOwnersPackageTransaction::TYPE_PATHS; 51 + $type_paths = PhabricatorOwnersPackagePathsTransaction::TRANSACTIONTYPE; 52 52 53 53 $xactions = array(); 54 54 $xactions[] = id(new PhabricatorOwnersPackageTransaction())
+13 -8
src/applications/owners/editor/PhabricatorOwnersPackageEditEngine.php
··· 95 95 ->setKey('name') 96 96 ->setLabel(pht('Name')) 97 97 ->setDescription(pht('Name of the package.')) 98 - ->setTransactionType(PhabricatorOwnersPackageTransaction::TYPE_NAME) 98 + ->setTransactionType( 99 + PhabricatorOwnersPackageNameTransaction::TRANSACTIONTYPE) 99 100 ->setIsRequired(true) 100 101 ->setValue($object->getName()), 101 102 id(new PhabricatorDatasourceEditField()) 102 103 ->setKey('owners') 103 104 ->setLabel(pht('Owners')) 104 105 ->setDescription(pht('Users and projects which own the package.')) 105 - ->setTransactionType(PhabricatorOwnersPackageTransaction::TYPE_OWNERS) 106 + ->setTransactionType( 107 + PhabricatorOwnersPackageOwnersTransaction::TRANSACTIONTYPE) 106 108 ->setDatasource(new PhabricatorProjectOrUserDatasource()) 107 109 ->setIsCopyable(true) 108 110 ->setValue($object->getOwnerPHIDs()), ··· 112 114 ->setDescription( 113 115 pht('Change package dominion rules.')) 114 116 ->setTransactionType( 115 - PhabricatorOwnersPackageTransaction::TYPE_DOMINION) 117 + PhabricatorOwnersPackageDominionTransaction::TRANSACTIONTYPE) 116 118 ->setIsCopyable(true) 117 119 ->setValue($object->getDominion()) 118 120 ->setOptions($dominion_map), ··· 124 126 'Automatically trigger reviews for commits affecting files in '. 125 127 'this package.')) 126 128 ->setTransactionType( 127 - PhabricatorOwnersPackageTransaction::TYPE_AUTOREVIEW) 129 + PhabricatorOwnersPackageAutoreviewTransaction::TRANSACTIONTYPE) 128 130 ->setIsCopyable(true) 129 131 ->setValue($object->getAutoReview()) 130 132 ->setOptions($autoreview_map), ··· 135 137 pht( 136 138 'Automatically trigger audits for commits affecting files in '. 137 139 'this package.')) 138 - ->setTransactionType(PhabricatorOwnersPackageTransaction::TYPE_AUDITING) 140 + ->setTransactionType( 141 + PhabricatorOwnersPackageAuditingTransaction::TRANSACTIONTYPE) 139 142 ->setIsCopyable(true) 140 143 ->setValue($object->getAuditingEnabled()) 141 144 ->setOptions( ··· 148 151 ->setLabel(pht('Description')) 149 152 ->setDescription(pht('Human-readable description of the package.')) 150 153 ->setTransactionType( 151 - PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION) 154 + PhabricatorOwnersPackageDescriptionTransaction::TRANSACTIONTYPE) 152 155 ->setValue($object->getDescription()), 153 156 id(new PhabricatorSelectEditField()) 154 157 ->setKey('status') 155 158 ->setLabel(pht('Status')) 156 159 ->setDescription(pht('Archive or enable the package.')) 157 - ->setTransactionType(PhabricatorOwnersPackageTransaction::TYPE_STATUS) 160 + ->setTransactionType( 161 + PhabricatorOwnersPackageStatusTransaction::TRANSACTIONTYPE) 158 162 ->setIsConduitOnly(true) 159 163 ->setValue($object->getStatus()) 160 164 ->setOptions($object->getStatusNameMap()), ··· 162 166 ->setKey('paths.set') 163 167 ->setLabel(pht('Paths')) 164 168 ->setIsConduitOnly(true) 165 - ->setTransactionType(PhabricatorOwnersPackageTransaction::TYPE_PATHS) 169 + ->setTransactionType( 170 + PhabricatorOwnersPackagePathsTransaction::TRANSACTIONTYPE) 166 171 ->setConduitDescription( 167 172 pht('Overwrite existing package paths with new paths.')) 168 173 ->setConduitTypeDescription(
-342
src/applications/owners/editor/PhabricatorOwnersPackageTransactionEditor.php
··· 14 14 public function getTransactionTypes() { 15 15 $types = parent::getTransactionTypes(); 16 16 17 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_NAME; 18 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_OWNERS; 19 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_AUDITING; 20 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION; 21 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_PATHS; 22 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_STATUS; 23 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_AUTOREVIEW; 24 - $types[] = PhabricatorOwnersPackageTransaction::TYPE_DOMINION; 25 - 26 17 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 27 18 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 28 19 29 20 return $types; 30 - } 31 - 32 - protected function getCustomTransactionOldValue( 33 - PhabricatorLiskDAO $object, 34 - PhabricatorApplicationTransaction $xaction) { 35 - 36 - switch ($xaction->getTransactionType()) { 37 - case PhabricatorOwnersPackageTransaction::TYPE_NAME: 38 - return $object->getName(); 39 - case PhabricatorOwnersPackageTransaction::TYPE_OWNERS: 40 - $phids = mpull($object->getOwners(), 'getUserPHID'); 41 - $phids = array_values($phids); 42 - return $phids; 43 - case PhabricatorOwnersPackageTransaction::TYPE_AUDITING: 44 - return (int)$object->getAuditingEnabled(); 45 - case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION: 46 - return $object->getDescription(); 47 - case PhabricatorOwnersPackageTransaction::TYPE_PATHS: 48 - $paths = $object->getPaths(); 49 - return mpull($paths, 'getRef'); 50 - case PhabricatorOwnersPackageTransaction::TYPE_STATUS: 51 - return $object->getStatus(); 52 - case PhabricatorOwnersPackageTransaction::TYPE_AUTOREVIEW: 53 - return $object->getAutoReview(); 54 - case PhabricatorOwnersPackageTransaction::TYPE_DOMINION: 55 - return $object->getDominion(); 56 - } 57 - } 58 - 59 - protected function getCustomTransactionNewValue( 60 - PhabricatorLiskDAO $object, 61 - PhabricatorApplicationTransaction $xaction) { 62 - 63 - switch ($xaction->getTransactionType()) { 64 - case PhabricatorOwnersPackageTransaction::TYPE_NAME: 65 - case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION: 66 - case PhabricatorOwnersPackageTransaction::TYPE_STATUS: 67 - case PhabricatorOwnersPackageTransaction::TYPE_AUTOREVIEW: 68 - case PhabricatorOwnersPackageTransaction::TYPE_DOMINION: 69 - return $xaction->getNewValue(); 70 - case PhabricatorOwnersPackageTransaction::TYPE_PATHS: 71 - $new = $xaction->getNewValue(); 72 - foreach ($new as $key => $info) { 73 - $new[$key]['excluded'] = (int)idx($info, 'excluded'); 74 - } 75 - return $new; 76 - case PhabricatorOwnersPackageTransaction::TYPE_AUDITING: 77 - return (int)$xaction->getNewValue(); 78 - case PhabricatorOwnersPackageTransaction::TYPE_OWNERS: 79 - $phids = $xaction->getNewValue(); 80 - $phids = array_unique($phids); 81 - $phids = array_values($phids); 82 - return $phids; 83 - } 84 - } 85 - 86 - protected function transactionHasEffect( 87 - PhabricatorLiskDAO $object, 88 - PhabricatorApplicationTransaction $xaction) { 89 - 90 - switch ($xaction->getTransactionType()) { 91 - case PhabricatorOwnersPackageTransaction::TYPE_PATHS: 92 - $old = $xaction->getOldValue(); 93 - $new = $xaction->getNewValue(); 94 - 95 - $diffs = PhabricatorOwnersPath::getTransactionValueChanges($old, $new); 96 - list($rem, $add) = $diffs; 97 - 98 - return ($rem || $add); 99 - } 100 - 101 - return parent::transactionHasEffect($object, $xaction); 102 - } 103 - 104 - protected function applyCustomInternalTransaction( 105 - PhabricatorLiskDAO $object, 106 - PhabricatorApplicationTransaction $xaction) { 107 - 108 - switch ($xaction->getTransactionType()) { 109 - case PhabricatorOwnersPackageTransaction::TYPE_NAME: 110 - $object->setName($xaction->getNewValue()); 111 - return; 112 - case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION: 113 - $object->setDescription($xaction->getNewValue()); 114 - return; 115 - case PhabricatorOwnersPackageTransaction::TYPE_AUDITING: 116 - $object->setAuditingEnabled($xaction->getNewValue()); 117 - return; 118 - case PhabricatorOwnersPackageTransaction::TYPE_OWNERS: 119 - case PhabricatorOwnersPackageTransaction::TYPE_PATHS: 120 - return; 121 - case PhabricatorOwnersPackageTransaction::TYPE_STATUS: 122 - $object->setStatus($xaction->getNewValue()); 123 - return; 124 - case PhabricatorOwnersPackageTransaction::TYPE_AUTOREVIEW: 125 - $object->setAutoReview($xaction->getNewValue()); 126 - return; 127 - case PhabricatorOwnersPackageTransaction::TYPE_DOMINION: 128 - $object->setDominion($xaction->getNewValue()); 129 - return; 130 - } 131 - 132 - return parent::applyCustomInternalTransaction($object, $xaction); 133 - } 134 - 135 - protected function applyCustomExternalTransaction( 136 - PhabricatorLiskDAO $object, 137 - PhabricatorApplicationTransaction $xaction) { 138 - 139 - switch ($xaction->getTransactionType()) { 140 - case PhabricatorOwnersPackageTransaction::TYPE_NAME: 141 - case PhabricatorOwnersPackageTransaction::TYPE_DESCRIPTION: 142 - case PhabricatorOwnersPackageTransaction::TYPE_AUDITING: 143 - case PhabricatorOwnersPackageTransaction::TYPE_STATUS: 144 - case PhabricatorOwnersPackageTransaction::TYPE_AUTOREVIEW: 145 - case PhabricatorOwnersPackageTransaction::TYPE_DOMINION: 146 - return; 147 - case PhabricatorOwnersPackageTransaction::TYPE_OWNERS: 148 - $old = $xaction->getOldValue(); 149 - $new = $xaction->getNewValue(); 150 - 151 - $owners = $object->getOwners(); 152 - $owners = mpull($owners, null, 'getUserPHID'); 153 - 154 - $rem = array_diff($old, $new); 155 - foreach ($rem as $phid) { 156 - if (isset($owners[$phid])) { 157 - $owners[$phid]->delete(); 158 - unset($owners[$phid]); 159 - } 160 - } 161 - 162 - $add = array_diff($new, $old); 163 - foreach ($add as $phid) { 164 - $owners[$phid] = id(new PhabricatorOwnersOwner()) 165 - ->setPackageID($object->getID()) 166 - ->setUserPHID($phid) 167 - ->save(); 168 - } 169 - 170 - // TODO: Attach owners here 171 - return; 172 - case PhabricatorOwnersPackageTransaction::TYPE_PATHS: 173 - $old = $xaction->getOldValue(); 174 - $new = $xaction->getNewValue(); 175 - 176 - $paths = $object->getPaths(); 177 - 178 - $diffs = PhabricatorOwnersPath::getTransactionValueChanges($old, $new); 179 - list($rem, $add) = $diffs; 180 - 181 - $set = PhabricatorOwnersPath::getSetFromTransactionValue($rem); 182 - foreach ($paths as $path) { 183 - $ref = $path->getRef(); 184 - if (PhabricatorOwnersPath::isRefInSet($ref, $set)) { 185 - $path->delete(); 186 - } 187 - } 188 - 189 - foreach ($add as $ref) { 190 - $path = PhabricatorOwnersPath::newFromRef($ref) 191 - ->setPackageID($object->getID()) 192 - ->save(); 193 - } 194 - 195 - return; 196 - } 197 - 198 - return parent::applyCustomExternalTransaction($object, $xaction); 199 - } 200 - 201 - protected function validateTransaction( 202 - PhabricatorLiskDAO $object, 203 - $type, 204 - array $xactions) { 205 - 206 - $errors = parent::validateTransaction($object, $type, $xactions); 207 - 208 - switch ($type) { 209 - case PhabricatorOwnersPackageTransaction::TYPE_NAME: 210 - $missing = $this->validateIsEmptyTextField( 211 - $object->getName(), 212 - $xactions); 213 - 214 - if ($missing) { 215 - $error = new PhabricatorApplicationTransactionValidationError( 216 - $type, 217 - pht('Required'), 218 - pht('Package name is required.'), 219 - nonempty(last($xactions), null)); 220 - 221 - $error->setIsMissingFieldError(true); 222 - $errors[] = $error; 223 - } 224 - 225 - foreach ($xactions as $xaction) { 226 - $new = $xaction->getNewValue(); 227 - if (preg_match('([,!])', $new)) { 228 - $errors[] = new PhabricatorApplicationTransactionValidationError( 229 - $type, 230 - pht('Invalid'), 231 - pht( 232 - 'Package names may not contain commas (",") or exclamation '. 233 - 'marks ("!"). These characters are ambiguous when package '. 234 - 'names are parsed from the command line.'), 235 - $xaction); 236 - } 237 - } 238 - 239 - break; 240 - case PhabricatorOwnersPackageTransaction::TYPE_AUTOREVIEW: 241 - $map = PhabricatorOwnersPackage::getAutoreviewOptionsMap(); 242 - foreach ($xactions as $xaction) { 243 - $new = $xaction->getNewValue(); 244 - 245 - if (empty($map[$new])) { 246 - $valid = array_keys($map); 247 - 248 - $errors[] = new PhabricatorApplicationTransactionValidationError( 249 - $type, 250 - pht('Invalid'), 251 - pht( 252 - 'Autoreview setting "%s" is not valid. '. 253 - 'Valid settings are: %s.', 254 - $new, 255 - implode(', ', $valid)), 256 - $xaction); 257 - } 258 - } 259 - break; 260 - case PhabricatorOwnersPackageTransaction::TYPE_DOMINION: 261 - $map = PhabricatorOwnersPackage::getDominionOptionsMap(); 262 - foreach ($xactions as $xaction) { 263 - $new = $xaction->getNewValue(); 264 - 265 - if (empty($map[$new])) { 266 - $valid = array_keys($map); 267 - 268 - $errors[] = new PhabricatorApplicationTransactionValidationError( 269 - $type, 270 - pht('Invalid'), 271 - pht( 272 - 'Dominion setting "%s" is not valid. '. 273 - 'Valid settings are: %s.', 274 - $new, 275 - implode(', ', $valid)), 276 - $xaction); 277 - } 278 - } 279 - break; 280 - case PhabricatorOwnersPackageTransaction::TYPE_PATHS: 281 - if (!$xactions) { 282 - continue; 283 - } 284 - 285 - $old = mpull($object->getPaths(), 'getRef'); 286 - foreach ($xactions as $xaction) { 287 - $new = $xaction->getNewValue(); 288 - 289 - // Check that we have a list of paths. 290 - if (!is_array($new)) { 291 - $errors[] = new PhabricatorApplicationTransactionValidationError( 292 - $type, 293 - pht('Invalid'), 294 - pht('Path specification must be a list of paths.'), 295 - $xaction); 296 - continue; 297 - } 298 - 299 - // Check that each item in the list is formatted properly. 300 - $type_exception = null; 301 - foreach ($new as $key => $value) { 302 - try { 303 - PhutilTypeSpec::checkMap( 304 - $value, 305 - array( 306 - 'repositoryPHID' => 'string', 307 - 'path' => 'string', 308 - 'excluded' => 'optional wild', 309 - )); 310 - } catch (PhutilTypeCheckException $ex) { 311 - $errors[] = new PhabricatorApplicationTransactionValidationError( 312 - $type, 313 - pht('Invalid'), 314 - pht( 315 - 'Path specification list contains invalid value '. 316 - 'in key "%s": %s.', 317 - $key, 318 - $ex->getMessage()), 319 - $xaction); 320 - $type_exception = $ex; 321 - } 322 - } 323 - 324 - if ($type_exception) { 325 - continue; 326 - } 327 - 328 - // Check that any new paths reference legitimate repositories which 329 - // the viewer has permission to see. 330 - list($rem, $add) = PhabricatorOwnersPath::getTransactionValueChanges( 331 - $old, 332 - $new); 333 - 334 - if ($add) { 335 - $repository_phids = ipull($add, 'repositoryPHID'); 336 - 337 - $repositories = id(new PhabricatorRepositoryQuery()) 338 - ->setViewer($this->getActor()) 339 - ->withPHIDs($repository_phids) 340 - ->execute(); 341 - $repositories = mpull($repositories, null, 'getPHID'); 342 - 343 - foreach ($add as $ref) { 344 - $repository_phid = $ref['repositoryPHID']; 345 - if (isset($repositories[$repository_phid])) { 346 - continue; 347 - } 348 - 349 - $errors[] = new PhabricatorApplicationTransactionValidationError( 350 - $type, 351 - pht('Invalid'), 352 - pht( 353 - 'Path specification list references repository PHID "%s", '. 354 - 'but that is not a valid, visible repository.', 355 - $repository_phid)); 356 - } 357 - } 358 - } 359 - break; 360 - } 361 - 362 - return $errors; 363 21 } 364 22 365 23 protected function shouldSendMail(
+3 -251
src/applications/owners/storage/PhabricatorOwnersPackageTransaction.php
··· 1 1 <?php 2 2 3 3 final class PhabricatorOwnersPackageTransaction 4 - extends PhabricatorApplicationTransaction { 5 - 6 - const TYPE_NAME = 'owners.name'; 7 - const TYPE_PRIMARY = 'owners.primary'; 8 - const TYPE_OWNERS = 'owners.owners'; 9 - const TYPE_AUDITING = 'owners.auditing'; 10 - const TYPE_DESCRIPTION = 'owners.description'; 11 - const TYPE_PATHS = 'owners.paths'; 12 - const TYPE_STATUS = 'owners.status'; 13 - const TYPE_AUTOREVIEW = 'owners.autoreview'; 14 - const TYPE_DOMINION = 'owners.dominion'; 4 + extends PhabricatorModularTransaction { 15 5 16 6 public function getApplicationName() { 17 7 return 'owners'; ··· 21 11 return PhabricatorOwnersPackagePHIDType::TYPECONST; 22 12 } 23 13 24 - public function getRequiredHandlePHIDs() { 25 - $phids = parent::getRequiredHandlePHIDs(); 26 - 27 - $old = $this->getOldValue(); 28 - $new = $this->getNewValue(); 29 - 30 - switch ($this->getTransactionType()) { 31 - case self::TYPE_OWNERS: 32 - if (!is_array($old)) { 33 - $old = array(); 34 - } 35 - 36 - if (!is_array($new)) { 37 - $new = array(); 38 - } 39 - 40 - $add = array_diff($new, $old); 41 - foreach ($add as $phid) { 42 - $phids[] = $phid; 43 - } 44 - $rem = array_diff($old, $new); 45 - foreach ($rem as $phid) { 46 - $phids[] = $phid; 47 - } 48 - break; 49 - } 50 - 51 - return $phids; 52 - } 53 - 54 - public function shouldHide() { 55 - $old = $this->getOldValue(); 56 - $new = $this->getNewValue(); 57 - 58 - switch ($this->getTransactionType()) { 59 - case self::TYPE_DESCRIPTION: 60 - if ($old === null) { 61 - return true; 62 - } 63 - break; 64 - case self::TYPE_PRIMARY: 65 - // TODO: Eventually, remove these transactions entirely. 66 - return true; 67 - } 68 - 69 - return parent::shouldHide(); 70 - } 71 - 72 - public function getTitle() { 73 - $old = $this->getOldValue(); 74 - $new = $this->getNewValue(); 75 - $author_phid = $this->getAuthorPHID(); 76 - 77 - switch ($this->getTransactionType()) { 78 - case PhabricatorTransactions::TYPE_CREATE: 79 - return pht( 80 - '%s created this package.', 81 - $this->renderHandleLink($author_phid)); 82 - case self::TYPE_NAME: 83 - if ($old === null) { 84 - return pht( 85 - '%s created this package.', 86 - $this->renderHandleLink($author_phid)); 87 - } else { 88 - return pht( 89 - '%s renamed this package from "%s" to "%s".', 90 - $this->renderHandleLink($author_phid), 91 - $old, 92 - $new); 93 - } 94 - case self::TYPE_OWNERS: 95 - $add = array_diff($new, $old); 96 - $rem = array_diff($old, $new); 97 - if ($add && !$rem) { 98 - return pht( 99 - '%s added %s owner(s): %s.', 100 - $this->renderHandleLink($author_phid), 101 - count($add), 102 - $this->renderHandleList($add)); 103 - } else if ($rem && !$add) { 104 - return pht( 105 - '%s removed %s owner(s): %s.', 106 - $this->renderHandleLink($author_phid), 107 - count($rem), 108 - $this->renderHandleList($rem)); 109 - } else { 110 - return pht( 111 - '%s changed %s package owner(s), added %s: %s; removed %s: %s.', 112 - $this->renderHandleLink($author_phid), 113 - count($add) + count($rem), 114 - count($add), 115 - $this->renderHandleList($add), 116 - count($rem), 117 - $this->renderHandleList($rem)); 118 - } 119 - case self::TYPE_AUDITING: 120 - if ($new) { 121 - return pht( 122 - '%s enabled auditing for this package.', 123 - $this->renderHandleLink($author_phid)); 124 - } else { 125 - return pht( 126 - '%s disabled auditing for this package.', 127 - $this->renderHandleLink($author_phid)); 128 - } 129 - case self::TYPE_DESCRIPTION: 130 - return pht( 131 - '%s updated the description for this package.', 132 - $this->renderHandleLink($author_phid)); 133 - case self::TYPE_PATHS: 134 - // TODO: Flesh this out. 135 - return pht( 136 - '%s updated paths for this package.', 137 - $this->renderHandleLink($author_phid)); 138 - case self::TYPE_STATUS: 139 - if ($new == PhabricatorOwnersPackage::STATUS_ACTIVE) { 140 - return pht( 141 - '%s activated this package.', 142 - $this->renderHandleLink($author_phid)); 143 - } else if ($new == PhabricatorOwnersPackage::STATUS_ARCHIVED) { 144 - return pht( 145 - '%s archived this package.', 146 - $this->renderHandleLink($author_phid)); 147 - } 148 - case self::TYPE_AUTOREVIEW: 149 - $map = PhabricatorOwnersPackage::getAutoreviewOptionsMap(); 150 - $map = ipull($map, 'name'); 151 - 152 - $old = idx($map, $old, $old); 153 - $new = idx($map, $new, $new); 154 - 155 - return pht( 156 - '%s adjusted autoreview from "%s" to "%s".', 157 - $this->renderHandleLink($author_phid), 158 - $old, 159 - $new); 160 - case self::TYPE_DOMINION: 161 - $map = PhabricatorOwnersPackage::getDominionOptionsMap(); 162 - $map = ipull($map, 'short'); 163 - 164 - $old = idx($map, $old, $old); 165 - $new = idx($map, $new, $new); 166 - 167 - return pht( 168 - '%s adjusted package dominion rules from "%s" to "%s".', 169 - $this->renderHandleLink($author_phid), 170 - $old, 171 - $new); 172 - } 173 - 174 - return parent::getTitle(); 175 - } 176 - 177 - public function hasChangeDetails() { 178 - switch ($this->getTransactionType()) { 179 - case self::TYPE_DESCRIPTION: 180 - return ($this->getOldValue() !== null); 181 - case self::TYPE_PATHS: 182 - return true; 183 - } 184 - 185 - return parent::hasChangeDetails(); 186 - } 187 - 188 - public function renderChangeDetails(PhabricatorUser $viewer) { 189 - switch ($this->getTransactionType()) { 190 - case self::TYPE_DESCRIPTION: 191 - $old = $this->getOldValue(); 192 - $new = $this->getNewValue(); 193 - 194 - return $this->renderTextCorpusChangeDetails( 195 - $viewer, 196 - $old, 197 - $new); 198 - case self::TYPE_PATHS: 199 - $old = $this->getOldValue(); 200 - $new = $this->getNewValue(); 201 - 202 - $diffs = PhabricatorOwnersPath::getTransactionValueChanges($old, $new); 203 - list($rem, $add) = $diffs; 204 - 205 - $rows = array(); 206 - foreach ($rem as $ref) { 207 - $rows[] = array( 208 - 'class' => 'diff-removed', 209 - 'change' => '-', 210 - ) + $ref; 211 - } 212 - 213 - foreach ($add as $ref) { 214 - $rows[] = array( 215 - 'class' => 'diff-added', 216 - 'change' => '+', 217 - ) + $ref; 218 - } 219 - 220 - $rowc = array(); 221 - foreach ($rows as $key => $row) { 222 - $rowc[] = $row['class']; 223 - $rows[$key] = array( 224 - $row['change'], 225 - $row['excluded'] ? pht('Exclude') : pht('Include'), 226 - $viewer->renderHandle($row['repositoryPHID']), 227 - $row['path'], 228 - ); 229 - } 230 - 231 - $table = id(new AphrontTableView($rows)) 232 - ->setRowClasses($rowc) 233 - ->setHeaders( 234 - array( 235 - null, 236 - pht('Type'), 237 - pht('Repository'), 238 - pht('Path'), 239 - )) 240 - ->setColumnClasses( 241 - array( 242 - null, 243 - null, 244 - null, 245 - 'wide', 246 - )); 247 - 248 - return $table; 249 - } 250 - 251 - return parent::renderChangeDetails($viewer); 252 - } 253 - 254 - public function getRemarkupBlocks() { 255 - $blocks = parent::getRemarkupBlocks(); 256 - 257 - switch ($this->getTransactionType()) { 258 - case self::TYPE_DESCRIPTION: 259 - $blocks[] = $this->getNewValue(); 260 - break; 261 - } 262 - 263 - return $blocks; 14 + public function getBaseTransactionClass() { 15 + return 'PhabricatorOwnersPackageTransactionType'; 264 16 } 265 17 266 18 }
+32
src/applications/owners/xaction/PhabricatorOwnersPackageAuditingTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackageAuditingTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.auditing'; 7 + 8 + public function generateOldValue($object) { 9 + return (int)$object->getAuditingEnabled(); 10 + } 11 + 12 + public function generateNewValue($object, $value) { 13 + return (int)$value; 14 + } 15 + 16 + public function applyInternalEffects($object, $value) { 17 + $object->setAuditingEnabled($value); 18 + } 19 + 20 + public function getTitle() { 21 + if ($this->getNewValue()) { 22 + return pht( 23 + '%s enabled auditing for this package.', 24 + $this->renderAuthor()); 25 + } else { 26 + return pht( 27 + '%s disabled auditing for this package.', 28 + $this->renderAuthor()); 29 + } 30 + } 31 + 32 + }
+56
src/applications/owners/xaction/PhabricatorOwnersPackageAutoreviewTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackageAutoreviewTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.autoreview'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getAutoReview(); 10 + } 11 + 12 + public function validateTransactions($object, array $xactions) { 13 + $errors = array(); 14 + 15 + $map = PhabricatorOwnersPackage::getAutoreviewOptionsMap(); 16 + foreach ($xactions as $xaction) { 17 + $new = $xaction->getNewValue(); 18 + 19 + if (empty($map[$new])) { 20 + $valid = array_keys($map); 21 + 22 + $errors[] = $this->newInvalidError( 23 + pht( 24 + 'Autoreview setting "%s" is not valid. '. 25 + 'Valid settings are: %s.', 26 + $new, 27 + implode(', ', $valid)), 28 + $xaction); 29 + } 30 + } 31 + 32 + return $errors; 33 + } 34 + 35 + public function applyInternalEffects($object, $value) { 36 + $object->setAutoReview($value); 37 + } 38 + 39 + public function getTitle() { 40 + $map = PhabricatorOwnersPackage::getAutoreviewOptionsMap(); 41 + $map = ipull($map, 'name'); 42 + 43 + $old = $this->getOldValue(); 44 + $new = $this->getNewValue(); 45 + 46 + $old = idx($map, $old, $old); 47 + $new = idx($map, $new, $new); 48 + 49 + return pht( 50 + '%s adjusted autoreview from %s to %s.', 51 + $this->renderAuthor(), 52 + $this->renderValue($old), 53 + $this->renderValue($new)); 54 + } 55 + 56 + }
+29
src/applications/owners/xaction/PhabricatorOwnersPackageDescriptionTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackageDescriptionTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.description'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDescription(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setDescription($value); 14 + } 15 + 16 + public function getTitle() { 17 + return pht( 18 + '%s updated the description for this package.', 19 + $this->renderAuthor()); 20 + } 21 + 22 + public function newChangeDetailView() { 23 + return id(new PhabricatorApplicationTransactionTextDiffDetailView()) 24 + ->setViewer($this->getViewer()) 25 + ->setOldText($this->getOldValue()) 26 + ->setNewText($this->getNewValue()); 27 + } 28 + 29 + }
+56
src/applications/owners/xaction/PhabricatorOwnersPackageDominionTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackageDominionTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.dominion'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getDominion(); 10 + } 11 + 12 + public function validateTransactions($object, array $xactions) { 13 + $errors = array(); 14 + 15 + $map = PhabricatorOwnersPackage::getDominionOptionsMap(); 16 + foreach ($xactions as $xaction) { 17 + $new = $xaction->getNewValue(); 18 + 19 + if (empty($map[$new])) { 20 + $valid = array_keys($map); 21 + 22 + $errors[] = $this->newInvalidError( 23 + pht( 24 + 'Dominion setting "%s" is not valid. '. 25 + 'Valid settings are: %s.', 26 + $new, 27 + implode(', ', $valid)), 28 + $xaction); 29 + } 30 + } 31 + 32 + return $errors; 33 + } 34 + 35 + public function applyInternalEffects($object, $value) { 36 + $object->setDominion($value); 37 + } 38 + 39 + public function getTitle() { 40 + $map = PhabricatorOwnersPackage::getDominionOptionsMap(); 41 + $map = ipull($map, 'short'); 42 + 43 + $old = $this->getOldValue(); 44 + $new = $this->getNewValue(); 45 + 46 + $old = idx($map, $old, $old); 47 + $new = idx($map, $new, $new); 48 + 49 + return pht( 50 + '%s adjusted package dominion rules from %s to %s.', 51 + $this->renderAuthor(), 52 + $this->renderValue($old), 53 + $this->renderValue($new)); 54 + } 55 + 56 + }
+52
src/applications/owners/xaction/PhabricatorOwnersPackageNameTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackageNameTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.name'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getName(); 10 + } 11 + 12 + public function validateTransactions($object, array $xactions) { 13 + $errors = array(); 14 + 15 + $missing = $this->isEmptyTextTransaction( 16 + $object->getName(), 17 + $xactions); 18 + 19 + if ($missing) { 20 + $errors[] = $this->newRequiredError( 21 + pht('Package name is required.'), 22 + nonempty(last($xactions), null)); 23 + } 24 + 25 + foreach ($xactions as $xaction) { 26 + $new = $xaction->getNewValue(); 27 + if (preg_match('([,!])', $new)) { 28 + $errors[] = $this->newInvalidError( 29 + pht( 30 + 'Package names may not contain commas (",") or exclamation '. 31 + 'marks ("!"). These characters are ambiguous when package '. 32 + 'names are parsed from the command line.'), 33 + $xaction); 34 + } 35 + } 36 + 37 + return $errors; 38 + } 39 + 40 + public function applyInternalEffects($object, $value) { 41 + $object->setName($value); 42 + } 43 + 44 + public function getTitle() { 45 + return pht( 46 + '%s renamed this package from %s to %s.', 47 + $this->renderAuthor(), 48 + $this->renderOldValue(), 49 + $this->renderNewValue()); 50 + } 51 + 52 + }
+76
src/applications/owners/xaction/PhabricatorOwnersPackageOwnersTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackageOwnersTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.owners'; 7 + 8 + public function generateOldValue($object) { 9 + $phids = mpull($object->getOwners(), 'getUserPHID'); 10 + $phids = array_values($phids); 11 + return $phids; 12 + } 13 + 14 + public function generateNewValue($object, $value) { 15 + $phids = array_unique($value); 16 + $phids = array_values($phids); 17 + return $phids; 18 + } 19 + 20 + public function applyExternalEffects($object, $value) { 21 + $old = $this->generateOldValue($object); 22 + $new = $value; 23 + 24 + $owners = $object->getOwners(); 25 + $owners = mpull($owners, null, 'getUserPHID'); 26 + 27 + $rem = array_diff($old, $new); 28 + foreach ($rem as $phid) { 29 + if (isset($owners[$phid])) { 30 + $owners[$phid]->delete(); 31 + unset($owners[$phid]); 32 + } 33 + } 34 + 35 + $add = array_diff($new, $old); 36 + foreach ($add as $phid) { 37 + $owners[$phid] = id(new PhabricatorOwnersOwner()) 38 + ->setPackageID($object->getID()) 39 + ->setUserPHID($phid) 40 + ->save(); 41 + } 42 + 43 + // TODO: Attach owners here 44 + } 45 + 46 + public function getTitle() { 47 + $old = $this->getOldValue(); 48 + $new = $this->getNewValue(); 49 + 50 + $add = array_diff($new, $old); 51 + $rem = array_diff($old, $new); 52 + if ($add && !$rem) { 53 + return pht( 54 + '%s added %s owner(s): %s.', 55 + $this->renderAuthor(), 56 + count($add), 57 + $this->renderHandleList($add)); 58 + } else if ($rem && !$add) { 59 + return pht( 60 + '%s removed %s owner(s): %s.', 61 + $this->renderAuthor(), 62 + count($rem), 63 + $this->renderHandleList($rem)); 64 + } else { 65 + return pht( 66 + '%s changed %s package owner(s), added %s: %s; removed %s: %s.', 67 + $this->renderAuthor(), 68 + count($add) + count($rem), 69 + count($add), 70 + $this->renderHandleList($add), 71 + count($rem), 72 + $this->renderHandleList($rem)); 73 + } 74 + } 75 + 76 + }
+189
src/applications/owners/xaction/PhabricatorOwnersPackagePathsTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackagePathsTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.paths'; 7 + 8 + public function generateOldValue($object) { 9 + $paths = $object->getPaths(); 10 + return mpull($paths, 'getRef'); 11 + } 12 + 13 + public function generateNewValue($object, $value) { 14 + $new = $value; 15 + foreach ($new as $key => $info) { 16 + $new[$key]['excluded'] = (int)idx($info, 'excluded'); 17 + } 18 + return $new; 19 + } 20 + 21 + public function validateTransactions($object, array $xactions) { 22 + $errors = array(); 23 + 24 + if (!$xactions) { 25 + return $errors; 26 + } 27 + 28 + $old = mpull($object->getPaths(), 'getRef'); 29 + foreach ($xactions as $xaction) { 30 + $new = $xaction->getNewValue(); 31 + 32 + // Check that we have a list of paths. 33 + if (!is_array($new)) { 34 + $errors[] = $this->newInvalidError( 35 + pht('Path specification must be a list of paths.'), 36 + $xaction); 37 + continue; 38 + } 39 + 40 + // Check that each item in the list is formatted properly. 41 + $type_exception = null; 42 + foreach ($new as $key => $value) { 43 + try { 44 + PhutilTypeSpec::checkMap( 45 + $value, 46 + array( 47 + 'repositoryPHID' => 'string', 48 + 'path' => 'string', 49 + 'excluded' => 'optional wild', 50 + )); 51 + } catch (PhutilTypeCheckException $ex) { 52 + $errors[] = $this->newInvalidError( 53 + pht( 54 + 'Path specification list contains invalid value '. 55 + 'in key "%s": %s.', 56 + $key, 57 + $ex->getMessage()), 58 + $xaction); 59 + $type_exception = $ex; 60 + } 61 + } 62 + 63 + if ($type_exception) { 64 + continue; 65 + } 66 + 67 + // Check that any new paths reference legitimate repositories which 68 + // the viewer has permission to see. 69 + list($rem, $add) = PhabricatorOwnersPath::getTransactionValueChanges( 70 + $old, 71 + $new); 72 + 73 + if ($add) { 74 + $repository_phids = ipull($add, 'repositoryPHID'); 75 + 76 + $repositories = id(new PhabricatorRepositoryQuery()) 77 + ->setViewer($this->getActor()) 78 + ->withPHIDs($repository_phids) 79 + ->execute(); 80 + $repositories = mpull($repositories, null, 'getPHID'); 81 + 82 + foreach ($add as $ref) { 83 + $repository_phid = $ref['repositoryPHID']; 84 + if (isset($repositories[$repository_phid])) { 85 + continue; 86 + } 87 + 88 + $errors[] = $this->newInvalidError( 89 + pht( 90 + 'Path specification list references repository PHID "%s", '. 91 + 'but that is not a valid, visible repository.', 92 + $repository_phid)); 93 + } 94 + } 95 + } 96 + 97 + return $errors; 98 + } 99 + 100 + public function applyExternalEffects($object, $value) { 101 + $old = $this->generateOldValue($object); 102 + $new = $value; 103 + 104 + $paths = $object->getPaths(); 105 + 106 + $diffs = PhabricatorOwnersPath::getTransactionValueChanges($old, $new); 107 + list($rem, $add) = $diffs; 108 + 109 + $set = PhabricatorOwnersPath::getSetFromTransactionValue($rem); 110 + foreach ($paths as $path) { 111 + $ref = $path->getRef(); 112 + if (PhabricatorOwnersPath::isRefInSet($ref, $set)) { 113 + $path->delete(); 114 + } 115 + } 116 + 117 + foreach ($add as $ref) { 118 + $path = PhabricatorOwnersPath::newFromRef($ref) 119 + ->setPackageID($object->getID()) 120 + ->save(); 121 + } 122 + } 123 + 124 + public function getTitle() { 125 + // TODO: Flesh this out. 126 + return pht( 127 + '%s updated paths for this package.', 128 + $this->renderAuthor()); 129 + } 130 + 131 + public function hasChangeDetailView() { 132 + return true; 133 + } 134 + 135 + public function newChangeDetailView() { 136 + $old = $this->getOldValue(); 137 + $new = $this->getNewValue(); 138 + 139 + $diffs = PhabricatorOwnersPath::getTransactionValueChanges($old, $new); 140 + list($rem, $add) = $diffs; 141 + 142 + $rows = array(); 143 + foreach ($rem as $ref) { 144 + $rows[] = array( 145 + 'class' => 'diff-removed', 146 + 'change' => '-', 147 + ) + $ref; 148 + } 149 + 150 + foreach ($add as $ref) { 151 + $rows[] = array( 152 + 'class' => 'diff-added', 153 + 'change' => '+', 154 + ) + $ref; 155 + } 156 + 157 + $rowc = array(); 158 + foreach ($rows as $key => $row) { 159 + $rowc[] = $row['class']; 160 + $rows[$key] = array( 161 + $row['change'], 162 + $row['excluded'] ? pht('Exclude') : pht('Include'), 163 + $this->renderHandle($row['repositoryPHID']), 164 + $row['path'], 165 + ); 166 + } 167 + 168 + $table = id(new AphrontTableView($rows)) 169 + ->setViewer($this->getViewer()) 170 + ->setRowClasses($rowc) 171 + ->setHeaders( 172 + array( 173 + null, 174 + pht('Type'), 175 + pht('Repository'), 176 + pht('Path'), 177 + )) 178 + ->setColumnClasses( 179 + array( 180 + null, 181 + null, 182 + null, 183 + 'wide', 184 + )); 185 + 186 + return $table; 187 + } 188 + 189 + }
+15
src/applications/owners/xaction/PhabricatorOwnersPackagePrimaryTransaction.php
··· 1 + <?php 2 + 3 + /** 4 + * @deprecated 5 + */ 6 + final class PhabricatorOwnersPackagePrimaryTransaction 7 + extends PhabricatorOwnersPackageTransactionType { 8 + 9 + const TRANSACTIONTYPE = 'owners.primary'; 10 + 11 + public function shouldHide() { 12 + return true; 13 + } 14 + 15 + }
+29
src/applications/owners/xaction/PhabricatorOwnersPackageStatusTransaction.php
··· 1 + <?php 2 + 3 + final class PhabricatorOwnersPackageStatusTransaction 4 + extends PhabricatorOwnersPackageTransactionType { 5 + 6 + const TRANSACTIONTYPE = 'owners.status'; 7 + 8 + public function generateOldValue($object) { 9 + return $object->getStatus(); 10 + } 11 + 12 + public function applyInternalEffects($object, $value) { 13 + $object->setStatus($value); 14 + } 15 + 16 + public function getTitle() { 17 + $new = $this->getNewValue(); 18 + if ($new == PhabricatorOwnersPackage::STATUS_ACTIVE) { 19 + return pht( 20 + '%s activated this package.', 21 + $this->renderAuthor()); 22 + } else if ($new == PhabricatorOwnersPackage::STATUS_ARCHIVED) { 23 + return pht( 24 + '%s archived this package.', 25 + $this->renderAuthor()); 26 + } 27 + } 28 + 29 + }
+4
src/applications/owners/xaction/PhabricatorOwnersPackageTransactionType.php
··· 1 + <?php 2 + 3 + abstract class PhabricatorOwnersPackageTransactionType 4 + extends PhabricatorModularTransactionType {}