3 final class HarbormasterBuildableViewController
4 extends HarbormasterController
{
6 public function shouldAllowPublic() {
10 public function handleRequest(AphrontRequest
$request) {
11 $viewer = $this->getViewer();
13 $buildable = id(new HarbormasterBuildableQuery())
15 ->withIDs(array($request->getURIData('id')))
18 return new Aphront404Response();
21 $id = $buildable->getID();
23 // Pull builds and build targets.
24 $builds = id(new HarbormasterBuildQuery())
26 ->withBuildablePHIDs(array($buildable->getPHID()))
27 ->needBuildTargets(true)
30 list($lint, $unit) = $this->renderLintAndUnit($buildable, $builds);
32 $buildable->attachBuilds($builds);
33 $object = $buildable->getBuildableObject();
35 $build_list = $this->buildBuildList($buildable);
37 $title = pht('Buildable %d', $id);
39 $header = id(new PHUIHeaderView())
42 ->setPolicyObject($buildable)
44 $buildable->getStatusIcon(),
45 $buildable->getStatusColor(),
46 $buildable->getStatusDisplayName())
47 ->setHeaderIcon('fa-recycle');
49 $timeline = $this->buildTransactionTimeline(
51 new HarbormasterBuildableTransactionQuery());
52 $timeline->setShouldTerminate(true);
54 $curtain = $this->buildCurtainView($buildable);
55 $properties = $this->buildPropertyList($buildable);
57 $crumbs = $this->buildApplicationCrumbs();
58 $crumbs->addTextCrumb($buildable->getMonogram());
59 $crumbs->setBorder(true);
61 $view = id(new PHUITwoColumnView())
63 ->setCurtain($curtain)
64 ->setMainColumn(array(
72 return $this->newPage()
79 private function buildCurtainView(HarbormasterBuildable
$buildable) {
80 $viewer = $this->getViewer();
81 $id = $buildable->getID();
83 $curtain = $this->newCurtainView($buildable);
85 $can_edit = PhabricatorPolicyFilter
::hasCapability(
88 PhabricatorPolicyCapability
::CAN_EDIT
);
91 new HarbormasterBuildMessageRestartTransaction(),
92 new HarbormasterBuildMessagePauseTransaction(),
93 new HarbormasterBuildMessageResumeTransaction(),
94 new HarbormasterBuildMessageAbortTransaction(),
97 foreach ($messages as $message) {
99 // Messages are enabled if they can be sent to at least one build.
101 foreach ($buildable->getBuilds() as $build) {
102 $can_send = $message->canSendMessage($viewer, $build);
108 $message_uri = urisprintf(
111 $message->getHarbormasterBuildMessageType());
112 $message_uri = $this->getApplicationURI($message_uri);
114 $action = id(new PhabricatorActionView())
115 ->setName($message->getHarbormasterBuildableMessageName())
116 ->setIcon($message->getIcon())
117 ->setHref($message_uri)
118 ->setDisabled(!$can_send ||
!$can_edit)
121 $curtain->addAction($action);
127 private function buildPropertyList(HarbormasterBuildable
$buildable) {
128 $viewer = $this->getViewer();
130 $properties = id(new PHUIPropertyListView())
133 $container_phid = $buildable->getContainerPHID();
134 $buildable_phid = $buildable->getBuildablePHID();
136 if ($container_phid) {
137 $properties->addProperty(
139 $viewer->renderHandle($container_phid));
142 $properties->addProperty(
144 $viewer->renderHandle($buildable_phid));
146 $properties->addProperty(
148 $buildable->getIsManualBuildable()
149 ?
pht('Manual Buildable')
150 : pht('Automatic Buildable'));
152 return id(new PHUIObjectBoxView())
153 ->setHeaderText(pht('Properties'))
154 ->setBackground(PHUIObjectBoxView
::BLUE_PROPERTY
)
155 ->appendChild($properties);
158 private function buildBuildList(HarbormasterBuildable
$buildable) {
159 $viewer = $this->getRequest()->getUser();
161 $build_list = id(new PHUIObjectItemListView())
163 foreach ($buildable->getBuilds() as $build) {
164 $view_uri = $this->getApplicationURI('/build/'.$build->getID().'/');
166 $item = id(new PHUIObjectItemView())
167 ->setObjectName(pht('Build %d', $build->getID()))
168 ->setHeader($build->getName())
169 ->setHref($view_uri);
171 $status = $build->getBuildPendingStatusObject();
173 $item->setStatusIcon(
174 $status->getIconIcon().' '.$status->getIconColor(),
177 $targets = $build->getBuildTargets();
180 $target_list = id(new PHUIStatusListView());
181 foreach ($targets as $target) {
182 $status = $target->getTargetStatus();
183 $icon = HarbormasterBuildTarget
::getBuildTargetStatusIcon($status);
184 $color = HarbormasterBuildTarget
::getBuildTargetStatusColor($status);
186 HarbormasterBuildTarget
::getBuildTargetStatusName($status);
188 $name = $target->getName();
190 $target_list->addItem(
191 id(new PHUIStatusItemView())
192 ->setIcon($icon, $color, $status_name)
193 ->setTarget(pht('Target %d', $target->getID()))
197 $target_box = id(new PHUIBoxView())
198 ->addPadding(PHUI
::PADDING_SMALL
)
199 ->appendChild($target_list);
201 $item->appendChild($target_box);
204 $build_list->addItem($item);
207 $build_list->setFlush(true);
209 $box = id(new PHUIObjectBoxView())
210 ->setHeaderText(pht('Builds'))
211 ->setBackground(PHUIObjectBoxView
::BLUE_PROPERTY
)
212 ->appendChild($build_list);
217 private function renderLintAndUnit(
218 HarbormasterBuildable
$buildable,
221 $viewer = $this->getViewer();
224 foreach ($builds as $build) {
225 foreach ($build->getBuildTargets() as $target) {
226 $targets[] = $target;
234 $target_phids = mpull($targets, 'getPHID');
236 $lint_data = id(new HarbormasterBuildLintMessage())->loadAllWhere(
237 'buildTargetPHID IN (%Ls)',
240 $unit_data = id(new HarbormasterBuildUnitMessageQuery())
242 ->withBuildTargetPHIDs($target_phids)
246 $lint_table = id(new HarbormasterLintPropertyView())
249 ->setLintMessages($lint_data);
251 $lint_href = $this->getApplicationURI('lint/'.$buildable->getID().'/');
253 $lint_header = id(new PHUIHeaderView())
254 ->setHeader(pht('Lint Messages'))
256 id(new PHUIButtonView())
258 ->setHref($lint_href)
259 ->setIcon('fa-list-ul')
260 ->setText('View All'));
262 $lint = id(new PHUIObjectBoxView())
263 ->setHeader($lint_header)
264 ->setBackground(PHUIObjectBoxView
::BLUE_PROPERTY
)
265 ->setTable($lint_table);
271 $unit = id(new HarbormasterUnitSummaryView())
273 ->setBuildable($buildable)
274 ->setUnitMessages($unit_data)
275 ->setShowViewAll(true)
281 return array($lint, $unit);