[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorRepositoryEditor 4 extends PhabricatorApplicationTransactionEditor { 5 6 public function getEditorApplicationClass() { 7 return 'PhabricatorDiffusionApplication'; 8 } 9 10 public function getEditorObjectsDescription() { 11 return pht('Repositories'); 12 } 13 14 public function getTransactionTypes() { 15 $types = parent::getTransactionTypes(); 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_UUID; 26 $types[] = PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH; 27 $types[] = PhabricatorRepositoryTransaction::TYPE_NOTIFY; 28 $types[] = PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE; 29 $types[] = PhabricatorRepositoryTransaction::TYPE_REMOTE_URI; 30 $types[] = PhabricatorRepositoryTransaction::TYPE_SSH_LOGIN; 31 $types[] = PhabricatorRepositoryTransaction::TYPE_SSH_KEY; 32 $types[] = PhabricatorRepositoryTransaction::TYPE_SSH_KEYFILE; 33 $types[] = PhabricatorRepositoryTransaction::TYPE_HTTP_LOGIN; 34 $types[] = PhabricatorRepositoryTransaction::TYPE_HTTP_PASS; 35 $types[] = PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH; 36 $types[] = PhabricatorRepositoryTransaction::TYPE_HOSTING; 37 $types[] = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP; 38 $types[] = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH; 39 $types[] = PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY; 40 $types[] = PhabricatorRepositoryTransaction::TYPE_CREDENTIAL; 41 $types[] = PhabricatorRepositoryTransaction::TYPE_DANGEROUS; 42 $types[] = PhabricatorRepositoryTransaction::TYPE_CLONE_NAME; 43 44 $types[] = PhabricatorTransactions::TYPE_EDGE; 45 $types[] = PhabricatorTransactions::TYPE_VIEW_POLICY; 46 $types[] = PhabricatorTransactions::TYPE_EDIT_POLICY; 47 48 return $types; 49 } 50 51 protected function getCustomTransactionOldValue( 52 PhabricatorLiskDAO $object, 53 PhabricatorApplicationTransaction $xaction) { 54 55 switch ($xaction->getTransactionType()) { 56 case PhabricatorRepositoryTransaction::TYPE_VCS: 57 return $object->getVersionControlSystem(); 58 case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 59 return $object->isTracked(); 60 case PhabricatorRepositoryTransaction::TYPE_NAME: 61 return $object->getName(); 62 case PhabricatorRepositoryTransaction::TYPE_DESCRIPTION: 63 return $object->getDetail('description'); 64 case PhabricatorRepositoryTransaction::TYPE_ENCODING: 65 return $object->getDetail('encoding'); 66 case PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH: 67 return $object->getDetail('default-branch'); 68 case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 69 return array_keys($object->getDetail('branch-filter', array())); 70 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 71 return array_keys($object->getDetail('close-commits-filter', array())); 72 case PhabricatorRepositoryTransaction::TYPE_UUID: 73 return $object->getUUID(); 74 case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: 75 return $object->getDetail('svn-subpath'); 76 case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 77 return (int)!$object->getDetail('herald-disabled'); 78 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 79 return (int)!$object->getDetail('disable-autoclose'); 80 case PhabricatorRepositoryTransaction::TYPE_REMOTE_URI: 81 return $object->getDetail('remote-uri'); 82 case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH: 83 return $object->getDetail('local-path'); 84 case PhabricatorRepositoryTransaction::TYPE_HOSTING: 85 return $object->isHosted(); 86 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 87 return $object->getServeOverHTTP(); 88 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 89 return $object->getServeOverSSH(); 90 case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 91 return $object->getPushPolicy(); 92 case PhabricatorRepositoryTransaction::TYPE_CREDENTIAL: 93 return $object->getCredentialPHID(); 94 case PhabricatorRepositoryTransaction::TYPE_DANGEROUS: 95 return $object->shouldAllowDangerousChanges(); 96 case PhabricatorRepositoryTransaction::TYPE_CLONE_NAME: 97 return $object->getDetail('clone-name'); 98 } 99 } 100 101 protected function getCustomTransactionNewValue( 102 PhabricatorLiskDAO $object, 103 PhabricatorApplicationTransaction $xaction) { 104 105 switch ($xaction->getTransactionType()) { 106 case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 107 case PhabricatorRepositoryTransaction::TYPE_NAME: 108 case PhabricatorRepositoryTransaction::TYPE_DESCRIPTION: 109 case PhabricatorRepositoryTransaction::TYPE_ENCODING: 110 case PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH: 111 case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 112 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 113 case PhabricatorRepositoryTransaction::TYPE_UUID: 114 case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: 115 case PhabricatorRepositoryTransaction::TYPE_REMOTE_URI: 116 case PhabricatorRepositoryTransaction::TYPE_SSH_LOGIN: 117 case PhabricatorRepositoryTransaction::TYPE_SSH_KEY: 118 case PhabricatorRepositoryTransaction::TYPE_SSH_KEYFILE: 119 case PhabricatorRepositoryTransaction::TYPE_HTTP_LOGIN: 120 case PhabricatorRepositoryTransaction::TYPE_HTTP_PASS: 121 case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH: 122 case PhabricatorRepositoryTransaction::TYPE_VCS: 123 case PhabricatorRepositoryTransaction::TYPE_HOSTING: 124 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 125 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 126 case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 127 case PhabricatorRepositoryTransaction::TYPE_CREDENTIAL: 128 case PhabricatorRepositoryTransaction::TYPE_DANGEROUS: 129 case PhabricatorRepositoryTransaction::TYPE_CLONE_NAME: 130 return $xaction->getNewValue(); 131 case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 132 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 133 return (int)$xaction->getNewValue(); 134 } 135 } 136 137 protected function applyCustomInternalTransaction( 138 PhabricatorLiskDAO $object, 139 PhabricatorApplicationTransaction $xaction) { 140 141 switch ($xaction->getTransactionType()) { 142 case PhabricatorRepositoryTransaction::TYPE_VCS: 143 $object->setVersionControlSystem($xaction->getNewValue()); 144 break; 145 case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 146 $object->setDetail('tracking-enabled', $xaction->getNewValue()); 147 break; 148 case PhabricatorRepositoryTransaction::TYPE_NAME: 149 $object->setName($xaction->getNewValue()); 150 break; 151 case PhabricatorRepositoryTransaction::TYPE_DESCRIPTION: 152 $object->setDetail('description', $xaction->getNewValue()); 153 break; 154 case PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH: 155 $object->setDetail('default-branch', $xaction->getNewValue()); 156 break; 157 case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 158 $object->setDetail( 159 'branch-filter', 160 array_fill_keys($xaction->getNewValue(), true)); 161 break; 162 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 163 $object->setDetail( 164 'close-commits-filter', 165 array_fill_keys($xaction->getNewValue(), true)); 166 break; 167 case PhabricatorRepositoryTransaction::TYPE_UUID: 168 $object->setUUID($xaction->getNewValue()); 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_REMOTE_URI: 180 $object->setDetail('remote-uri', $xaction->getNewValue()); 181 break; 182 case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH: 183 $object->setDetail('local-path', $xaction->getNewValue()); 184 break; 185 case PhabricatorRepositoryTransaction::TYPE_HOSTING: 186 return $object->setHosted($xaction->getNewValue()); 187 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 188 return $object->setServeOverHTTP($xaction->getNewValue()); 189 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 190 return $object->setServeOverSSH($xaction->getNewValue()); 191 case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 192 return $object->setPushPolicy($xaction->getNewValue()); 193 case PhabricatorRepositoryTransaction::TYPE_CREDENTIAL: 194 return $object->setCredentialPHID($xaction->getNewValue()); 195 case PhabricatorRepositoryTransaction::TYPE_DANGEROUS: 196 $object->setDetail('allow-dangerous-changes', $xaction->getNewValue()); 197 return; 198 case PhabricatorRepositoryTransaction::TYPE_CLONE_NAME: 199 $object->setDetail('clone-name', $xaction->getNewValue()); 200 return; 201 case PhabricatorRepositoryTransaction::TYPE_ENCODING: 202 // Make sure the encoding is valid by converting to UTF-8. This tests 203 // that the user has mbstring installed, and also that they didn't type 204 // a garbage encoding name. Note that we're converting from UTF-8 to 205 // the target encoding, because mbstring is fine with converting from 206 // a nonsense encoding. 207 $encoding = $xaction->getNewValue(); 208 if (strlen($encoding)) { 209 try { 210 phutil_utf8_convert('.', $encoding, 'UTF-8'); 211 } catch (Exception $ex) { 212 throw new PhutilProxyException( 213 pht( 214 "Error setting repository encoding '%s': %s'", 215 $encoding, 216 $ex->getMessage()), 217 $ex); 218 } 219 } 220 $object->setDetail('encoding', $encoding); 221 break; 222 } 223 } 224 225 protected function applyCustomExternalTransaction( 226 PhabricatorLiskDAO $object, 227 PhabricatorApplicationTransaction $xaction) { 228 229 switch ($xaction->getTransactionType()) { 230 case PhabricatorRepositoryTransaction::TYPE_CREDENTIAL: 231 // Adjust the object <-> credential edge for this repository. 232 233 $old_phid = $xaction->getOldValue(); 234 $new_phid = $xaction->getNewValue(); 235 236 $editor = new PhabricatorEdgeEditor(); 237 238 $edge_type = PhabricatorEdgeConfig::TYPE_OBJECT_USES_CREDENTIAL; 239 $src_phid = $object->getPHID(); 240 241 if ($old_phid) { 242 $editor->removeEdge($src_phid, $edge_type, $old_phid); 243 } 244 245 if ($new_phid) { 246 $editor->addEdge($src_phid, $edge_type, $new_phid); 247 } 248 249 $editor->save(); 250 break; 251 } 252 253 } 254 255 protected function mergeTransactions( 256 PhabricatorApplicationTransaction $u, 257 PhabricatorApplicationTransaction $v) { 258 259 $type = $u->getTransactionType(); 260 switch ($type) {} 261 262 return parent::mergeTransactions($u, $v); 263 } 264 265 protected function transactionHasEffect( 266 PhabricatorLiskDAO $object, 267 PhabricatorApplicationTransaction $xaction) { 268 269 $old = $xaction->getOldValue(); 270 $new = $xaction->getNewValue(); 271 272 $type = $xaction->getTransactionType(); 273 switch ($type) {} 274 275 return parent::transactionHasEffect($object, $xaction); 276 } 277 278 protected function requireCapabilities( 279 PhabricatorLiskDAO $object, 280 PhabricatorApplicationTransaction $xaction) { 281 282 switch ($xaction->getTransactionType()) { 283 case PhabricatorRepositoryTransaction::TYPE_ACTIVATE: 284 case PhabricatorRepositoryTransaction::TYPE_NAME: 285 case PhabricatorRepositoryTransaction::TYPE_DESCRIPTION: 286 case PhabricatorRepositoryTransaction::TYPE_ENCODING: 287 case PhabricatorRepositoryTransaction::TYPE_DEFAULT_BRANCH: 288 case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 289 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE_ONLY: 290 case PhabricatorRepositoryTransaction::TYPE_UUID: 291 case PhabricatorRepositoryTransaction::TYPE_SVN_SUBPATH: 292 case PhabricatorRepositoryTransaction::TYPE_REMOTE_URI: 293 case PhabricatorRepositoryTransaction::TYPE_SSH_LOGIN: 294 case PhabricatorRepositoryTransaction::TYPE_SSH_KEY: 295 case PhabricatorRepositoryTransaction::TYPE_SSH_KEYFILE: 296 case PhabricatorRepositoryTransaction::TYPE_HTTP_LOGIN: 297 case PhabricatorRepositoryTransaction::TYPE_HTTP_PASS: 298 case PhabricatorRepositoryTransaction::TYPE_LOCAL_PATH: 299 case PhabricatorRepositoryTransaction::TYPE_VCS: 300 case PhabricatorRepositoryTransaction::TYPE_NOTIFY: 301 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 302 case PhabricatorRepositoryTransaction::TYPE_HOSTING: 303 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP: 304 case PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH: 305 case PhabricatorRepositoryTransaction::TYPE_PUSH_POLICY: 306 case PhabricatorRepositoryTransaction::TYPE_CREDENTIAL: 307 case PhabricatorRepositoryTransaction::TYPE_DANGEROUS: 308 case PhabricatorRepositoryTransaction::TYPE_CLONE_NAME: 309 PhabricatorPolicyFilter::requireCapability( 310 $this->requireActor(), 311 $object, 312 PhabricatorPolicyCapability::CAN_EDIT); 313 break; 314 } 315 } 316 317 protected function validateTransaction( 318 PhabricatorLiskDAO $object, 319 $type, 320 array $xactions) { 321 322 $errors = parent::validateTransaction($object, $type, $xactions); 323 324 switch ($type) { 325 case PhabricatorRepositoryTransaction::TYPE_AUTOCLOSE: 326 case PhabricatorRepositoryTransaction::TYPE_TRACK_ONLY: 327 foreach ($xactions as $xaction) { 328 foreach ($xaction->getNewValue() as $pattern) { 329 // Check for invalid regular expressions. 330 $regexp = PhabricatorRepository::extractBranchRegexp($pattern); 331 if ($regexp !== null) { 332 $ok = @preg_match($regexp, ''); 333 if ($ok === false) { 334 $error = new PhabricatorApplicationTransactionValidationError( 335 $type, 336 pht('Invalid'), 337 pht( 338 'Expression "%s" is not a valid regular expression. Note '. 339 'that you must include delimiters.', 340 $regexp), 341 $xaction); 342 $errors[] = $error; 343 continue; 344 } 345 } 346 347 // Check for formatting mistakes like `regex(...)` instead of 348 // `regexp(...)`. 349 $matches = null; 350 if (preg_match('/^([^(]+)\\(.*\\)\z/', $pattern, $matches)) { 351 switch ($matches[1]) { 352 case 'regexp': 353 break; 354 default: 355 $error = new PhabricatorApplicationTransactionValidationError( 356 $type, 357 pht('Invalid'), 358 pht( 359 'Matching function "%s(...)" is not recognized. Valid '. 360 'functions are: regexp(...).', 361 $matches[1]), 362 $xaction); 363 $errors[] = $error; 364 break; 365 } 366 } 367 } 368 } 369 break; 370 371 case PhabricatorRepositoryTransaction::TYPE_REMOTE_URI: 372 foreach ($xactions as $xaction) { 373 $new_uri = $xaction->getNewValue(); 374 try { 375 PhabricatorRepository::assertValidRemoteURI($new_uri); 376 } catch (Exception $ex) { 377 $errors[] = new PhabricatorApplicationTransactionValidationError( 378 $type, 379 pht('Invalid'), 380 $ex->getMessage(), 381 $xaction); 382 } 383 } 384 break; 385 386 case PhabricatorRepositoryTransaction::TYPE_CREDENTIAL: 387 $ok = PassphraseCredentialControl::validateTransactions( 388 $this->getActor(), 389 $xactions); 390 if (!$ok) { 391 foreach ($xactions as $xaction) { 392 $errors[] = new PhabricatorApplicationTransactionValidationError( 393 $type, 394 pht('Invalid'), 395 pht( 396 'The selected credential does not exist, or you do not have '. 397 'permission to use it.'), 398 $xaction); 399 } 400 } 401 break; 402 } 403 404 return $errors; 405 } 406 407 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |