[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/owners/controller/ -> PhabricatorOwnersEditController.php (source)

   1  <?php
   2  
   3  final class PhabricatorOwnersEditController
   4    extends PhabricatorOwnersController {
   5  
   6    private $id;
   7  
   8    public function willProcessRequest(array $data) {
   9      $this->id = idx($data, 'id');
  10    }
  11  
  12    public function processRequest() {
  13      $request = $this->getRequest();
  14      $user = $request->getUser();
  15  
  16      if ($this->id) {
  17        $package = id(new PhabricatorOwnersPackage())->load($this->id);
  18        if (!$package) {
  19          return new Aphront404Response();
  20        }
  21      } else {
  22        $package = new PhabricatorOwnersPackage();
  23        $package->setPrimaryOwnerPHID($user->getPHID());
  24      }
  25  
  26      $e_name = true;
  27      $e_primary = true;
  28  
  29      $errors = array();
  30  
  31      if ($request->isFormPost()) {
  32        $package->setName($request->getStr('name'));
  33        $package->setDescription($request->getStr('description'));
  34        $old_auditing_enabled = $package->getAuditingEnabled();
  35        $package->setAuditingEnabled(
  36          ($request->getStr('auditing') === 'enabled')
  37            ? 1
  38            : 0);
  39  
  40        $primary = $request->getArr('primary');
  41        $primary = reset($primary);
  42        $old_primary = $package->getPrimaryOwnerPHID();
  43        $package->setPrimaryOwnerPHID($primary);
  44  
  45        $owners = $request->getArr('owners');
  46        if ($primary) {
  47          array_unshift($owners, $primary);
  48        }
  49        $owners = array_unique($owners);
  50  
  51        $paths = $request->getArr('path');
  52        $repos = $request->getArr('repo');
  53        $excludes = $request->getArr('exclude');
  54  
  55        $path_refs = array();
  56        for ($ii = 0; $ii < count($paths); $ii++) {
  57          if (empty($paths[$ii]) || empty($repos[$ii])) {
  58            continue;
  59          }
  60          $path_refs[] = array(
  61            'repositoryPHID'  => $repos[$ii],
  62            'path'            => $paths[$ii],
  63            'excluded'        => $excludes[$ii],
  64          );
  65        }
  66  
  67        if (!strlen($package->getName())) {
  68          $e_name = pht('Required');
  69          $errors[] = pht('Package name is required.');
  70        } else {
  71          $e_name = null;
  72        }
  73  
  74        if (!$package->getPrimaryOwnerPHID()) {
  75          $e_primary = pht('Required');
  76          $errors[] = pht('Package must have a primary owner.');
  77        } else {
  78          $e_primary = null;
  79        }
  80  
  81        if (!$path_refs) {
  82          $errors[] = pht('Package must include at least one path.');
  83        }
  84  
  85        if (!$errors) {
  86          $package->attachUnsavedOwners($owners);
  87          $package->attachUnsavedPaths($path_refs);
  88          $package->attachOldAuditingEnabled($old_auditing_enabled);
  89          $package->attachOldPrimaryOwnerPHID($old_primary);
  90          $package->attachActorPHID($user->getPHID());
  91          try {
  92            $package->save();
  93            return id(new AphrontRedirectResponse())
  94              ->setURI('/owners/package/'.$package->getID().'/');
  95          } catch (AphrontDuplicateKeyQueryException $ex) {
  96            $e_name = pht('Duplicate');
  97            $errors[] = pht('Package name must be unique.');
  98          }
  99        }
 100      } else {
 101        $owners = $package->loadOwners();
 102        $owners = mpull($owners, 'getUserPHID');
 103  
 104        $paths = $package->loadPaths();
 105        $path_refs = array();
 106        foreach ($paths as $path) {
 107          $path_refs[] = array(
 108            'repositoryPHID' => $path->getRepositoryPHID(),
 109            'path' => $path->getPath(),
 110            'excluded' => $path->getExcluded(),
 111          );
 112        }
 113      }
 114  
 115      $handles = $this->loadViewerHandles($owners);
 116  
 117      $primary = $package->getPrimaryOwnerPHID();
 118      if ($primary && isset($handles[$primary])) {
 119        $handle_primary_owner = array($handles[$primary]);
 120      } else {
 121        $handle_primary_owner = array();
 122      }
 123  
 124      $handles_all_owners = array_select_keys($handles, $owners);
 125  
 126      if ($package->getID()) {
 127        $title = pht('Edit Package');
 128        $side_nav_filter = 'edit/'.$this->id;
 129      } else {
 130        $title = pht('New Package');
 131        $side_nav_filter = 'new';
 132      }
 133      $this->setSideNavFilter($side_nav_filter);
 134  
 135      $repos = id(new PhabricatorRepositoryQuery())
 136        ->setViewer($user)
 137        ->execute();
 138  
 139      $default_paths = array();
 140      foreach ($repos as $repo) {
 141        $default_path = $repo->getDetail('default-owners-path');
 142        if ($default_path) {
 143          $default_paths[$repo->getPHID()] = $default_path;
 144        }
 145      }
 146  
 147      $repos = mpull($repos, 'getCallsign', 'getPHID');
 148  
 149      $template = new AphrontTypeaheadTemplateView();
 150      $template = $template->render();
 151  
 152      Javelin::initBehavior(
 153        'owners-path-editor',
 154        array(
 155          'root'                => 'path-editor',
 156          'table'               => 'paths',
 157          'add_button'          => 'addpath',
 158          'repositories'        => $repos,
 159          'input_template'      => $template,
 160          'pathRefs'            => $path_refs,
 161  
 162          'completeURI'         => '/diffusion/services/path/complete/',
 163          'validateURI'         => '/diffusion/services/path/validate/',
 164  
 165          'repositoryDefaultPaths' => $default_paths,
 166        ));
 167  
 168      require_celerity_resource('owners-path-editor-css');
 169  
 170      $cancel_uri = $package->getID()
 171        ? '/owners/package/'.$package->getID().'/'
 172        : '/owners/';
 173  
 174      $form = id(new AphrontFormView())
 175        ->setUser($user)
 176        ->appendChild(
 177          id(new AphrontFormTextControl())
 178            ->setLabel(pht('Name'))
 179            ->setName('name')
 180            ->setValue($package->getName())
 181            ->setError($e_name))
 182        ->appendChild(
 183          id(new AphrontFormTokenizerControl())
 184            ->setDatasource(new PhabricatorProjectOrUserDatasource())
 185            ->setLabel(pht('Primary Owner'))
 186            ->setName('primary')
 187            ->setLimit(1)
 188            ->setValue($handle_primary_owner)
 189            ->setError($e_primary))
 190        ->appendChild(
 191          id(new AphrontFormTokenizerControl())
 192            ->setDatasource(new PhabricatorProjectOrUserDatasource())
 193            ->setLabel(pht('Owners'))
 194            ->setName('owners')
 195            ->setValue($handles_all_owners))
 196        ->appendChild(
 197          id(new AphrontFormSelectControl())
 198            ->setName('auditing')
 199            ->setLabel(pht('Auditing'))
 200            ->setCaption(
 201              pht('With auditing enabled, all future commits that touch '.
 202                  'this package will be reviewed to make sure an owner '.
 203                  'of the package is involved and the commit message has '.
 204                  'a valid revision, reviewed by, and author.'))
 205            ->setOptions(array(
 206              'disabled'  => pht('Disabled'),
 207              'enabled'   => pht('Enabled'),
 208            ))
 209            ->setValue(
 210              $package->getAuditingEnabled()
 211                ? 'enabled'
 212                : 'disabled'))
 213        ->appendChild(
 214          id(new PHUIFormInsetView())
 215            ->setTitle(pht('Paths'))
 216            ->addDivAttributes(array('id' => 'path-editor'))
 217            ->setRightButton(javelin_tag(
 218                'a',
 219                array(
 220                  'href' => '#',
 221                  'class' => 'button green',
 222                  'sigil' => 'addpath',
 223                  'mustcapture' => true,
 224                ),
 225                pht('Add New Path')))
 226            ->setDescription(
 227              pht('Specify the files and directories which comprise '.
 228                  'this package.'))
 229            ->setContent(javelin_tag(
 230                'table',
 231                array(
 232                  'class' => 'owners-path-editor-table',
 233                  'sigil' => 'paths',
 234                ),
 235                '')))
 236        ->appendChild(
 237          id(new AphrontFormTextAreaControl())
 238            ->setLabel(pht('Description'))
 239            ->setName('description')
 240            ->setValue($package->getDescription()))
 241        ->appendChild(
 242          id(new AphrontFormSubmitControl())
 243            ->addCancelButton($cancel_uri)
 244            ->setValue(pht('Save Package')));
 245  
 246      $form_box = id(new PHUIObjectBoxView())
 247        ->setHeaderText($title)
 248        ->setFormErrors($errors)
 249        ->setForm($form);
 250  
 251      $nav = $this->buildSideNavView();
 252      $nav->appendChild($form_box);
 253  
 254      return $this->buildApplicationPage(
 255        array(
 256          $nav,
 257        ),
 258        array(
 259          'title' => $title,
 260        ));
 261    }
 262  
 263    protected function getExtraPackageViews(AphrontSideNavFilterView $view) {
 264      if ($this->id) {
 265        $view->addFilter('edit/'.$this->id, pht('Edit'));
 266      } else {
 267        $view->addFilter('new', pht('New'));
 268      }
 269    }
 270  }


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