[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/repository/editor/ -> PhabricatorRepositoryEditor.php (source)

   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  }


Generated: Sun Nov 30 09:20:46 2014 Cross-referenced by PHPXref 0.7.1