Path: blob/master/src/applications/harbormaster/controller/HarbormasterBuildableViewController.php
12256 views
<?php12final class HarbormasterBuildableViewController3extends HarbormasterController {45public function shouldAllowPublic() {6return true;7}89public function handleRequest(AphrontRequest $request) {10$viewer = $this->getViewer();1112$buildable = id(new HarbormasterBuildableQuery())13->setViewer($viewer)14->withIDs(array($request->getURIData('id')))15->executeOne();16if (!$buildable) {17return new Aphront404Response();18}1920$id = $buildable->getID();2122// Pull builds and build targets.23$builds = id(new HarbormasterBuildQuery())24->setViewer($viewer)25->withBuildablePHIDs(array($buildable->getPHID()))26->needBuildTargets(true)27->execute();2829list($lint, $unit) = $this->renderLintAndUnit($buildable, $builds);3031$buildable->attachBuilds($builds);32$object = $buildable->getBuildableObject();3334$build_list = $this->buildBuildList($buildable);3536$title = pht('Buildable %d', $id);3738$header = id(new PHUIHeaderView())39->setHeader($title)40->setUser($viewer)41->setPolicyObject($buildable)42->setStatus(43$buildable->getStatusIcon(),44$buildable->getStatusColor(),45$buildable->getStatusDisplayName())46->setHeaderIcon('fa-recycle');4748$timeline = $this->buildTransactionTimeline(49$buildable,50new HarbormasterBuildableTransactionQuery());51$timeline->setShouldTerminate(true);5253$curtain = $this->buildCurtainView($buildable);54$properties = $this->buildPropertyList($buildable);5556$crumbs = $this->buildApplicationCrumbs();57$crumbs->addTextCrumb($buildable->getMonogram());58$crumbs->setBorder(true);5960$view = id(new PHUITwoColumnView())61->setHeader($header)62->setCurtain($curtain)63->setMainColumn(array(64$properties,65$lint,66$unit,67$build_list,68$timeline,69));7071return $this->newPage()72->setTitle($title)73->setCrumbs($crumbs)74->appendChild($view);7576}7778private function buildCurtainView(HarbormasterBuildable $buildable) {79$viewer = $this->getViewer();80$id = $buildable->getID();8182$curtain = $this->newCurtainView($buildable);8384$can_edit = PhabricatorPolicyFilter::hasCapability(85$viewer,86$buildable,87PhabricatorPolicyCapability::CAN_EDIT);8889$messages = array(90new HarbormasterBuildMessageRestartTransaction(),91new HarbormasterBuildMessagePauseTransaction(),92new HarbormasterBuildMessageResumeTransaction(),93new HarbormasterBuildMessageAbortTransaction(),94);9596foreach ($messages as $message) {9798// Messages are enabled if they can be sent to at least one build.99$can_send = false;100foreach ($buildable->getBuilds() as $build) {101$can_send = $message->canSendMessage($viewer, $build);102if ($can_send) {103break;104}105}106107$message_uri = urisprintf(108'/buildable/%d/%s/',109$id,110$message->getHarbormasterBuildMessageType());111$message_uri = $this->getApplicationURI($message_uri);112113$action = id(new PhabricatorActionView())114->setName($message->getHarbormasterBuildableMessageName())115->setIcon($message->getIcon())116->setHref($message_uri)117->setDisabled(!$can_send || !$can_edit)118->setWorkflow(true);119120$curtain->addAction($action);121}122123return $curtain;124}125126private function buildPropertyList(HarbormasterBuildable $buildable) {127$viewer = $this->getViewer();128129$properties = id(new PHUIPropertyListView())130->setUser($viewer);131132$container_phid = $buildable->getContainerPHID();133$buildable_phid = $buildable->getBuildablePHID();134135if ($container_phid) {136$properties->addProperty(137pht('Container'),138$viewer->renderHandle($container_phid));139}140141$properties->addProperty(142pht('Buildable'),143$viewer->renderHandle($buildable_phid));144145$properties->addProperty(146pht('Origin'),147$buildable->getIsManualBuildable()148? pht('Manual Buildable')149: pht('Automatic Buildable'));150151return id(new PHUIObjectBoxView())152->setHeaderText(pht('Properties'))153->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)154->appendChild($properties);155}156157private function buildBuildList(HarbormasterBuildable $buildable) {158$viewer = $this->getRequest()->getUser();159160$build_list = id(new PHUIObjectItemListView())161->setUser($viewer);162foreach ($buildable->getBuilds() as $build) {163$view_uri = $this->getApplicationURI('/build/'.$build->getID().'/');164165$item = id(new PHUIObjectItemView())166->setObjectName(pht('Build %d', $build->getID()))167->setHeader($build->getName())168->setHref($view_uri);169170$status = $build->getBuildPendingStatusObject();171172$item->setStatusIcon(173$status->getIconIcon().' '.$status->getIconColor(),174$status->getName());175176$targets = $build->getBuildTargets();177178if ($targets) {179$target_list = id(new PHUIStatusListView());180foreach ($targets as $target) {181$status = $target->getTargetStatus();182$icon = HarbormasterBuildTarget::getBuildTargetStatusIcon($status);183$color = HarbormasterBuildTarget::getBuildTargetStatusColor($status);184$status_name =185HarbormasterBuildTarget::getBuildTargetStatusName($status);186187$name = $target->getName();188189$target_list->addItem(190id(new PHUIStatusItemView())191->setIcon($icon, $color, $status_name)192->setTarget(pht('Target %d', $target->getID()))193->setNote($name));194}195196$target_box = id(new PHUIBoxView())197->addPadding(PHUI::PADDING_SMALL)198->appendChild($target_list);199200$item->appendChild($target_box);201}202203$build_list->addItem($item);204}205206$build_list->setFlush(true);207208$box = id(new PHUIObjectBoxView())209->setHeaderText(pht('Builds'))210->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)211->appendChild($build_list);212213return $box;214}215216private function renderLintAndUnit(217HarbormasterBuildable $buildable,218array $builds) {219220$viewer = $this->getViewer();221222$targets = array();223foreach ($builds as $build) {224foreach ($build->getBuildTargets() as $target) {225$targets[] = $target;226}227}228229if (!$targets) {230return;231}232233$target_phids = mpull($targets, 'getPHID');234235$lint_data = id(new HarbormasterBuildLintMessage())->loadAllWhere(236'buildTargetPHID IN (%Ls)',237$target_phids);238239$unit_data = id(new HarbormasterBuildUnitMessageQuery())240->setViewer($viewer)241->withBuildTargetPHIDs($target_phids)242->execute();243244if ($lint_data) {245$lint_table = id(new HarbormasterLintPropertyView())246->setViewer($viewer)247->setLimit(10)248->setLintMessages($lint_data);249250$lint_href = $this->getApplicationURI('lint/'.$buildable->getID().'/');251252$lint_header = id(new PHUIHeaderView())253->setHeader(pht('Lint Messages'))254->addActionLink(255id(new PHUIButtonView())256->setTag('a')257->setHref($lint_href)258->setIcon('fa-list-ul')259->setText('View All'));260261$lint = id(new PHUIObjectBoxView())262->setHeader($lint_header)263->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)264->setTable($lint_table);265} else {266$lint = null;267}268269if ($unit_data) {270$unit = id(new HarbormasterUnitSummaryView())271->setViewer($viewer)272->setBuildable($buildable)273->setUnitMessages($unit_data)274->setShowViewAll(true)275->setLimit(5);276} else {277$unit = null;278}279280return array($lint, $unit);281}282283}284285286