[ Index ]

PHP Cross Reference of Phabricator

title

Body

[close]

/src/applications/harbormaster/controller/ -> HarbormasterBuildableViewController.php (source)

   1  <?php
   2  
   3  final class HarbormasterBuildableViewController
   4    extends HarbormasterController {
   5  
   6    private $id;
   7  
   8    public function willProcessRequest(array $data) {
   9      $this->id = $data['id'];
  10    }
  11  
  12    public function processRequest() {
  13      $request = $this->getRequest();
  14      $viewer = $request->getUser();
  15  
  16      $id = $this->id;
  17  
  18      $buildable = id(new HarbormasterBuildableQuery())
  19        ->setViewer($viewer)
  20        ->withIDs(array($id))
  21        ->needBuildableHandles(true)
  22        ->needContainerHandles(true)
  23        ->executeOne();
  24      if (!$buildable) {
  25        return new Aphront404Response();
  26      }
  27  
  28      // Pull builds and build targets.
  29      $builds = id(new HarbormasterBuildQuery())
  30        ->setViewer($viewer)
  31        ->withBuildablePHIDs(array($buildable->getPHID()))
  32        ->needBuildTargets(true)
  33        ->execute();
  34  
  35      $buildable->attachBuilds($builds);
  36  
  37      $build_list = $this->buildBuildList($buildable);
  38  
  39      $title = pht('Buildable %d', $id);
  40  
  41      $header = id(new PHUIHeaderView())
  42        ->setHeader($title)
  43        ->setUser($viewer)
  44        ->setPolicyObject($buildable);
  45  
  46      $box = id(new PHUIObjectBoxView())
  47        ->setHeader($header);
  48  
  49      $xactions = id(new HarbormasterBuildableTransactionQuery())
  50        ->setViewer($viewer)
  51        ->withObjectPHIDs(array($buildable->getPHID()))
  52        ->execute();
  53      $timeline = id(new PhabricatorApplicationTransactionView())
  54        ->setUser($viewer)
  55        ->setObjectPHID($buildable->getPHID())
  56        ->setTransactions($xactions);
  57  
  58      $actions = $this->buildActionList($buildable);
  59      $this->buildPropertyLists($box, $buildable, $actions);
  60  
  61      $crumbs = $this->buildApplicationCrumbs();
  62      $crumbs->addTextCrumb("B{$id}");
  63  
  64      return $this->buildApplicationPage(
  65        array(
  66          $crumbs,
  67          $box,
  68          $build_list,
  69          $timeline,
  70        ),
  71        array(
  72          'title' => $title,
  73        ));
  74    }
  75  
  76    private function buildActionList(HarbormasterBuildable $buildable) {
  77      $request = $this->getRequest();
  78      $viewer = $request->getUser();
  79      $id = $buildable->getID();
  80  
  81      $list = id(new PhabricatorActionListView())
  82        ->setUser($viewer)
  83        ->setObject($buildable)
  84        ->setObjectURI($buildable->getMonogram());
  85  
  86      $can_edit = PhabricatorPolicyFilter::hasCapability(
  87        $viewer,
  88        $buildable,
  89        PhabricatorPolicyCapability::CAN_EDIT);
  90  
  91      $can_restart = false;
  92      $can_resume = false;
  93      $can_stop = false;
  94  
  95      foreach ($buildable->getBuilds() as $build) {
  96        if ($build->canRestartBuild()) {
  97          $can_restart = true;
  98        }
  99        if ($build->canResumeBuild()) {
 100          $can_resume = true;
 101        }
 102        if ($build->canStopBuild()) {
 103          $can_stop = true;
 104        }
 105      }
 106  
 107      $restart_uri = "buildable/{$id}/restart/";
 108      $stop_uri = "buildable/{$id}/stop/";
 109      $resume_uri = "buildable/{$id}/resume/";
 110  
 111      $list->addAction(
 112        id(new PhabricatorActionView())
 113          ->setIcon('fa-repeat')
 114          ->setName(pht('Restart All Builds'))
 115          ->setHref($this->getApplicationURI($restart_uri))
 116          ->setWorkflow(true)
 117          ->setDisabled(!$can_restart || !$can_edit));
 118  
 119      $list->addAction(
 120        id(new PhabricatorActionView())
 121          ->setIcon('fa-pause')
 122          ->setName(pht('Pause All Builds'))
 123          ->setHref($this->getApplicationURI($stop_uri))
 124          ->setWorkflow(true)
 125          ->setDisabled(!$can_stop || !$can_edit));
 126  
 127      $list->addAction(
 128        id(new PhabricatorActionView())
 129          ->setIcon('fa-play')
 130          ->setName(pht('Resume All Builds'))
 131          ->setHref($this->getApplicationURI($resume_uri))
 132          ->setWorkflow(true)
 133          ->setDisabled(!$can_resume || !$can_edit));
 134  
 135      return $list;
 136    }
 137  
 138    private function buildPropertyLists(
 139      PHUIObjectBoxView $box,
 140      HarbormasterBuildable $buildable,
 141      PhabricatorActionListView $actions) {
 142      $request = $this->getRequest();
 143      $viewer = $request->getUser();
 144  
 145      $properties = id(new PHUIPropertyListView())
 146        ->setUser($viewer)
 147        ->setObject($buildable)
 148        ->setActionList($actions);
 149      $box->addPropertyList($properties);
 150  
 151      $properties->addProperty(
 152        pht('Buildable'),
 153        $buildable->getBuildableHandle()->renderLink());
 154  
 155      if ($buildable->getContainerHandle() !== null) {
 156        $properties->addProperty(
 157          pht('Container'),
 158          $buildable->getContainerHandle()->renderLink());
 159      }
 160  
 161      $properties->addProperty(
 162        pht('Origin'),
 163        $buildable->getIsManualBuildable()
 164          ? pht('Manual Buildable')
 165          : pht('Automatic Buildable'));
 166  
 167    }
 168  
 169    private function buildBuildList(HarbormasterBuildable $buildable) {
 170      $viewer = $this->getRequest()->getUser();
 171  
 172      $build_list = id(new PHUIObjectItemListView())
 173        ->setUser($viewer);
 174      foreach ($buildable->getBuilds() as $build) {
 175        $view_uri = $this->getApplicationURI('/build/'.$build->getID().'/');
 176        $item = id(new PHUIObjectItemView())
 177          ->setObjectName(pht('Build %d', $build->getID()))
 178          ->setHeader($build->getName())
 179          ->setHref($view_uri);
 180  
 181        $status = $build->getBuildStatus();
 182        $item->setBarColor(HarbormasterBuild::getBuildStatusColor($status));
 183  
 184        $item->addAttribute(HarbormasterBuild::getBuildStatusName($status));
 185  
 186        if ($build->isRestarting()) {
 187          $item->addIcon('fa-repeat', pht('Restarting'));
 188        } else if ($build->isStopping()) {
 189          $item->addIcon('fa-pause', pht('Pausing'));
 190        } else if ($build->isResuming()) {
 191          $item->addIcon('fa-play', pht('Resuming'));
 192        }
 193  
 194        $build_id = $build->getID();
 195  
 196        $restart_uri = "build/restart/{$build_id}/buildable/";
 197        $resume_uri = "build/resume/{$build_id}/buildable/";
 198        $stop_uri = "build/stop/{$build_id}/buildable/";
 199  
 200        $item->addAction(
 201          id(new PHUIListItemView())
 202            ->setIcon('fa-repeat')
 203            ->setName(pht('Restart'))
 204            ->setHref($this->getApplicationURI($restart_uri))
 205            ->setWorkflow(true)
 206            ->setDisabled(!$build->canRestartBuild()));
 207  
 208        if ($build->canResumeBuild()) {
 209          $item->addAction(
 210            id(new PHUIListItemView())
 211              ->setIcon('fa-play')
 212              ->setName(pht('Resume'))
 213              ->setHref($this->getApplicationURI($resume_uri))
 214              ->setWorkflow(true));
 215        } else {
 216          $item->addAction(
 217            id(new PHUIListItemView())
 218              ->setIcon('fa-pause')
 219              ->setName(pht('Pause'))
 220              ->setHref($this->getApplicationURI($stop_uri))
 221              ->setWorkflow(true)
 222              ->setDisabled(!$build->canStopBuild()));
 223        }
 224  
 225        $targets = $build->getBuildTargets();
 226  
 227        if ($targets) {
 228          $target_list = id(new PHUIStatusListView());
 229          foreach ($targets as $target) {
 230            $status = $target->getTargetStatus();
 231            $icon = HarbormasterBuildTarget::getBuildTargetStatusIcon($status);
 232            $color = HarbormasterBuildTarget::getBuildTargetStatusColor($status);
 233            $status_name =
 234              HarbormasterBuildTarget::getBuildTargetStatusName($status);
 235  
 236            $name = $target->getName();
 237  
 238            $target_list->addItem(
 239              id(new PHUIStatusItemView())
 240                ->setIcon($icon, $color, $status_name)
 241                ->setTarget(pht('Target %d', $target->getID()))
 242                ->setNote($name));
 243          }
 244  
 245          $target_box = id(new PHUIBoxView())
 246            ->addPadding(PHUI::PADDING_SMALL)
 247            ->appendChild($target_list);
 248  
 249          $item->appendChild($target_box);
 250        }
 251  
 252        $build_list->addItem($item);
 253      }
 254  
 255      return $build_list;
 256    }
 257  
 258  }


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