Path: blob/master/src/applications/harbormaster/controller/HarbormasterBuildableActionController.php
12256 views
<?php12final class HarbormasterBuildableActionController3extends HarbormasterController {45public function handleRequest(AphrontRequest $request) {6$viewer = $this->getViewer();7$id = $request->getURIData('id');8$action = $request->getURIData('action');910$buildable = id(new HarbormasterBuildableQuery())11->setViewer($viewer)12->withIDs(array($id))13->needBuilds(true)14->requireCapabilities(15array(16PhabricatorPolicyCapability::CAN_VIEW,17PhabricatorPolicyCapability::CAN_EDIT,18))19->executeOne();20if (!$buildable) {21return new Aphront404Response();22}2324$message =25HarbormasterBuildMessageTransaction::getTransactionObjectForMessageType(26$action);27if (!$message) {28return new Aphront404Response();29}3031$return_uri = '/'.$buildable->getMonogram();3233// See T13348. Actions may apply to only a subset of builds, so give the34// user a preview of what will happen.3536$can_send = array();3738$rows = array();39$builds = $buildable->getBuilds();40foreach ($builds as $key => $build) {41$exception = null;42try {43$message->assertCanSendMessage($viewer, $build);44$can_send[$key] = $build;45} catch (HarbormasterMessageException $ex) {46$exception = $ex;47}4849if (!$exception) {50$icon_icon = $message->getIcon();51$icon_color = 'green';5253$title = $message->getHarbormasterBuildMessageName();54$body = $message->getHarbormasterBuildableMessageEffect();55} else {56$icon_icon = 'fa-times';57$icon_color = 'red';5859$title = $ex->getTitle();60$body = $ex->getBody();61}6263$icon = id(new PHUIIconView())64->setIcon($icon_icon)65->setColor($icon_color);6667$build_name = phutil_tag(68'a',69array(70'href' => $build->getURI(),71'target' => '_blank',72),73pht('%s %s', $build->getObjectName(), $build->getName()));7475$rows[] = array(76$icon,77$build_name,78$title,79$body,80);81}8283$table = id(new AphrontTableView($rows))84->setHeaders(85array(86null,87pht('Build'),88pht('Action'),89pht('Details'),90))91->setColumnClasses(92array(93null,94null,95'pri',96'wide',97));9899$table = phutil_tag(100'div',101array(102'class' => 'mlt mlb',103),104$table);105106if ($request->isDialogFormPost() && $can_send) {107$editor = id(new HarbormasterBuildableTransactionEditor())108->setActor($viewer)109->setContentSourceFromRequest($request)110->setContinueOnNoEffect(true)111->setContinueOnMissingFields(true);112113$xaction_type = HarbormasterBuildableMessageTransaction::TRANSACTIONTYPE;114115$xaction = id(new HarbormasterBuildableTransaction())116->setTransactionType($xaction_type)117->setNewValue($action);118119$editor->applyTransactions($buildable, array($xaction));120121foreach ($can_send as $build) {122$build->sendMessage(123$viewer,124$message->getHarbormasterBuildMessageType());125}126127return id(new AphrontRedirectResponse())->setURI($return_uri);128}129130if (!$builds) {131$title = pht('No Builds');132$body = pht(133'This buildable has no builds, so you can not issue any commands.');134} else {135if ($can_send) {136$title = $message->newBuildableConfirmPromptTitle(137$builds,138$can_send);139140$body = $message->newBuildableConfirmPromptBody(141$builds,142$can_send);143} else {144$title = pht('Unable to Send Command');145$body = pht(146'You can not send this command to any of the current builds '.147'for this buildable.');148}149150$body = array(151pht('Builds for this buildable:'),152$table,153$body,154);155}156157$warnings = $message->newBuildableConfirmPromptWarnings(158$builds,159$can_send);160161if ($warnings) {162$body[] = id(new PHUIInfoView())163->setSeverity(PHUIInfoView::SEVERITY_WARNING)164->setErrors($warnings);165}166167$submit = $message->getHarbormasterBuildableMessageName();168169$dialog = $this->newDialog()170->setWidth(AphrontDialogView::WIDTH_FULL)171->setTitle($title)172->appendChild($body)173->addCancelButton($return_uri);174175if ($can_send) {176$dialog->addSubmitButton($submit);177}178179return $dialog;180}181182}183184185