[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/diffusion/controller/ -> DiffusionRepositoryEditHostingController.php (source)

   1  <?php
   2  
   3  final class DiffusionRepositoryEditHostingController
   4    extends DiffusionRepositoryEditController {
   5  
   6    private $serve;
   7  
   8    public function willProcessRequest(array $data) {
   9      parent::willProcessRequest($data);
  10      $this->serve = idx($data, 'serve');
  11    }
  12  
  13    public function processRequest() {
  14      $request = $this->getRequest();
  15      $user = $request->getUser();
  16      $drequest = $this->diffusionRequest;
  17      $repository = $drequest->getRepository();
  18  
  19      $repository = id(new PhabricatorRepositoryQuery())
  20        ->setViewer($user)
  21        ->requireCapabilities(
  22          array(
  23            PhabricatorPolicyCapability::CAN_VIEW,
  24            PhabricatorPolicyCapability::CAN_EDIT,
  25          ))
  26        ->withIDs(array($repository->getID()))
  27        ->executeOne();
  28      if (!$repository) {
  29        return new Aphront404Response();
  30      }
  31  
  32      if (!$this->serve) {
  33        return $this->handleHosting($repository);
  34      } else {
  35        return $this->handleProtocols($repository);
  36      }
  37    }
  38  
  39    public function handleHosting(PhabricatorRepository $repository) {
  40      $request = $this->getRequest();
  41      $user = $request->getUser();
  42  
  43      $v_hosting = $repository->isHosted();
  44  
  45      $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/');
  46      $next_uri = $this->getRepositoryControllerURI($repository, 'edit/serve/');
  47  
  48      if ($request->isFormPost()) {
  49        $v_hosting = $request->getBool('hosting');
  50  
  51        $xactions = array();
  52        $template = id(new PhabricatorRepositoryTransaction());
  53  
  54        $type_hosting = PhabricatorRepositoryTransaction::TYPE_HOSTING;
  55  
  56        $xactions[] = id(clone $template)
  57          ->setTransactionType($type_hosting)
  58          ->setNewValue($v_hosting);
  59  
  60        id(new PhabricatorRepositoryEditor())
  61          ->setContinueOnNoEffect(true)
  62          ->setContentSourceFromRequest($request)
  63          ->setActor($user)
  64          ->applyTransactions($repository, $xactions);
  65  
  66        return id(new AphrontRedirectResponse())->setURI($next_uri);
  67      }
  68  
  69      $crumbs = $this->buildApplicationCrumbs();
  70      $crumbs->addTextCrumb(pht('Edit Hosting'));
  71  
  72      $title = pht('Edit Hosting (%s)', $repository->getName());
  73  
  74      $hosted_control = id(new AphrontFormRadioButtonControl())
  75          ->setName('hosting')
  76          ->setLabel(pht('Hosting'))
  77          ->addButton(
  78            true,
  79            pht('Host Repository on Phabricator'),
  80            pht(
  81              'Phabricator will host this repository. Users will be able to '.
  82              'push commits to Phabricator. Phabricator will not pull '.
  83              'changes from elsewhere.'))
  84          ->addButton(
  85            false,
  86            pht('Host Repository Elsewhere'),
  87            pht(
  88              'Phabricator will pull updates to this repository from a master '.
  89              'repository elsewhere (for example, on GitHub or Bitbucket). '.
  90              'Users will not be able to push commits to this repository.'))
  91          ->setValue($v_hosting);
  92  
  93      $doc_href = PhabricatorEnv::getDoclink(
  94        'Diffusion User Guide: Repository Hosting');
  95  
  96      $form = id(new AphrontFormView())
  97        ->setUser($user)
  98        ->appendRemarkupInstructions(
  99          pht(
 100            'Phabricator can host repositories, or it can track repositories '.
 101            'hosted elsewhere (like on GitHub or Bitbucket). For information '.
 102            'on configuring hosting, see [[ %s | Diffusion User Guide: '.
 103            'Repository Hosting]]',
 104            $doc_href))
 105        ->appendChild($hosted_control)
 106        ->appendChild(
 107          id(new AphrontFormSubmitControl())
 108            ->setValue(pht('Save and Continue'))
 109            ->addCancelButton($edit_uri));
 110  
 111      $object_box = id(new PHUIObjectBoxView())
 112        ->setHeaderText($title)
 113        ->setForm($form);
 114  
 115      return $this->buildApplicationPage(
 116        array(
 117          $crumbs,
 118          $object_box,
 119        ),
 120        array(
 121          'title' => $title,
 122        ));
 123    }
 124  
 125    public function handleProtocols(PhabricatorRepository $repository) {
 126      $request = $this->getRequest();
 127      $user = $request->getUser();
 128  
 129      $type = $repository->getVersionControlSystem();
 130      $is_svn = ($type == PhabricatorRepositoryType::REPOSITORY_TYPE_SVN);
 131  
 132      $v_http_mode = $repository->getDetail(
 133        'serve-over-http',
 134        PhabricatorRepository::SERVE_OFF);
 135      $v_ssh_mode = $repository->getDetail(
 136        'serve-over-ssh',
 137        PhabricatorRepository::SERVE_OFF);
 138  
 139      $edit_uri = $this->getRepositoryControllerURI($repository, 'edit/');
 140      $prev_uri = $this->getRepositoryControllerURI($repository, 'edit/hosting/');
 141  
 142      if ($request->isFormPost()) {
 143        $v_http_mode = $request->getStr('http');
 144        $v_ssh_mode = $request->getStr('ssh');
 145  
 146        $xactions = array();
 147        $template = id(new PhabricatorRepositoryTransaction());
 148  
 149        $type_http = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_HTTP;
 150        $type_ssh = PhabricatorRepositoryTransaction::TYPE_PROTOCOL_SSH;
 151  
 152        if (!$is_svn) {
 153          $xactions[] = id(clone $template)
 154            ->setTransactionType($type_http)
 155            ->setNewValue($v_http_mode);
 156        }
 157  
 158        $xactions[] = id(clone $template)
 159          ->setTransactionType($type_ssh)
 160          ->setNewValue($v_ssh_mode);
 161  
 162        id(new PhabricatorRepositoryEditor())
 163          ->setContinueOnNoEffect(true)
 164          ->setContentSourceFromRequest($request)
 165          ->setActor($user)
 166          ->applyTransactions($repository, $xactions);
 167  
 168        return id(new AphrontRedirectResponse())->setURI($edit_uri);
 169      }
 170  
 171      $crumbs = $this->buildApplicationCrumbs();
 172      $crumbs->addTextCrumb(pht('Edit Protocols'));
 173  
 174      $title = pht('Edit Protocols (%s)', $repository->getName());
 175  
 176  
 177      $rw_message = pht(
 178        'Phabricator will serve a read-write copy of this repository.');
 179  
 180      if (!$repository->isHosted()) {
 181        $rw_message = array(
 182          $rw_message,
 183          phutil_tag('br'),
 184          phutil_tag('br'),
 185          pht(
 186            '%s: This repository is hosted elsewhere, so Phabricator can not '.
 187            'perform writes. This mode will act like "Read Only" for '.
 188            'repositories hosted elsewhere.',
 189            phutil_tag('strong', array(), 'WARNING')),
 190        );
 191      }
 192  
 193      $ssh_control =
 194        id(new AphrontFormRadioButtonControl())
 195          ->setName('ssh')
 196          ->setLabel(pht('SSH'))
 197          ->setValue($v_ssh_mode)
 198          ->addButton(
 199            PhabricatorRepository::SERVE_OFF,
 200            PhabricatorRepository::getProtocolAvailabilityName(
 201              PhabricatorRepository::SERVE_OFF),
 202            pht('Phabricator will not serve this repository over SSH.'))
 203          ->addButton(
 204            PhabricatorRepository::SERVE_READONLY,
 205            PhabricatorRepository::getProtocolAvailabilityName(
 206              PhabricatorRepository::SERVE_READONLY),
 207            pht(
 208              'Phabricator will serve a read-only copy of this repository '.
 209              'over SSH.'))
 210          ->addButton(
 211            PhabricatorRepository::SERVE_READWRITE,
 212            PhabricatorRepository::getProtocolAvailabilityName(
 213              PhabricatorRepository::SERVE_READWRITE),
 214            $rw_message);
 215  
 216      $http_control =
 217        id(new AphrontFormRadioButtonControl())
 218          ->setName('http')
 219          ->setLabel(pht('HTTP'))
 220          ->setValue($v_http_mode)
 221          ->addButton(
 222            PhabricatorRepository::SERVE_OFF,
 223            PhabricatorRepository::getProtocolAvailabilityName(
 224              PhabricatorRepository::SERVE_OFF),
 225            pht('Phabricator will not serve this repository over HTTP.'))
 226          ->addButton(
 227            PhabricatorRepository::SERVE_READONLY,
 228            PhabricatorRepository::getProtocolAvailabilityName(
 229              PhabricatorRepository::SERVE_READONLY),
 230            pht(
 231              'Phabricator will serve a read-only copy of this repository '.
 232              'over HTTP.'))
 233          ->addButton(
 234            PhabricatorRepository::SERVE_READWRITE,
 235            PhabricatorRepository::getProtocolAvailabilityName(
 236              PhabricatorRepository::SERVE_READWRITE),
 237            $rw_message);
 238  
 239      if ($is_svn) {
 240        $http_control = id(new AphrontFormMarkupControl())
 241          ->setLabel(pht('HTTP'))
 242          ->setValue(
 243            phutil_tag(
 244              'em',
 245              array(),
 246              pht(
 247                'Phabricator does not currently support HTTP access to '.
 248                'Subversion repositories.')));
 249      }
 250  
 251      $form = id(new AphrontFormView())
 252        ->setUser($user)
 253        ->appendRemarkupInstructions(
 254          pht(
 255            'Phabricator can serve repositories over various protocols. You can '.
 256            'configure server protocols here.'))
 257        ->appendChild($ssh_control);
 258  
 259      if (!PhabricatorEnv::getEnvConfig('diffusion.allow-http-auth')) {
 260        $form->appendRemarkupInstructions(
 261          pht(
 262            'NOTE: The configuration setting [[ %s | %s ]] is currently '.
 263            'disabled. You must enable it to activate authenticated access '.
 264            'to repositories over HTTP.',
 265            '/config/edit/diffusion.allow-http-auth/',
 266            'diffusion.allow-http-auth'));
 267      }
 268  
 269      $form
 270        ->appendChild($http_control)
 271        ->appendChild(
 272          id(new AphrontFormSubmitControl())
 273            ->setValue(pht('Save Changes'))
 274            ->addCancelButton($prev_uri, pht('Back')));
 275  
 276      $object_box = id(new PHUIObjectBoxView())
 277        ->setHeaderText($title)
 278        ->setForm($form);
 279  
 280      return $this->buildApplicationPage(
 281        array(
 282          $crumbs,
 283          $object_box,
 284        ),
 285        array(
 286          'title' => $title,
 287        ));
 288    }
 289  
 290  }


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