@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class HarbormasterUnitMessageViewController
4 extends HarbormasterController {
5
6 public function shouldAllowPublic() {
7 return true;
8 }
9
10 public function handleRequest(AphrontRequest $request) {
11 $viewer = $this->getViewer();
12
13 $message_id = $request->getURIData('id');
14
15 $message = id(new HarbormasterBuildUnitMessageQuery())
16 ->setViewer($viewer)
17 ->withIDs(array($message_id))
18 ->executeOne();
19 if (!$message) {
20 return new Aphront404Response();
21 }
22
23 $build_target = id(new HarbormasterBuildTargetQuery())
24 ->setViewer($viewer)
25 ->withPHIDs(array($message->getBuildTargetPHID()))
26 ->executeOne();
27 if (!$build_target) {
28 return new Aphront404Response();
29 }
30
31 $build = $build_target->getBuild();
32 $buildable = $build->getBuildable();
33 $buildable_id = $buildable->getID();
34
35 $id = $message->getID();
36 $display_name = $message->getUnitMessageDisplayName();
37
38 $status = $message->getResult();
39 $status_icon = HarbormasterUnitStatus::getUnitStatusIcon($status);
40 $status_color = HarbormasterUnitStatus::getUnitStatusColor($status);
41 $status_label = HarbormasterUnitStatus::getUnitStatusLabel($status);
42
43 $header = id(new PHUIHeaderView())
44 ->setHeader($display_name)
45 ->setStatus($status_icon, $status_color, $status_label);
46
47 $properties = $this->buildPropertyListView($message);
48 $curtain = $this->buildCurtainView($message, $build);
49
50 $unit = id(new PHUIObjectBoxView())
51 ->setHeaderText(pht('TEST RESULT'))
52 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
53 ->addPropertyList($properties);
54
55 $crumbs = $this->buildApplicationCrumbs();
56 $this->addBuildableCrumb($crumbs, $buildable);
57
58 $crumbs->addTextCrumb(
59 pht('Unit Tests'),
60 "/harbormaster/unit/{$buildable_id}/");
61
62 $crumbs->addTextCrumb(pht('Unit %d', $id));
63 $crumbs->setBorder(true);
64
65 $title = array(
66 $display_name,
67 $buildable->getMonogram(),
68 );
69
70 $view = id(new PHUITwoColumnView())
71 ->setHeader($header)
72 ->setCurtain($curtain)
73 ->setMainColumn(array(
74 $unit,
75 ));
76
77 return $this->newPage()
78 ->setTitle($title)
79 ->setCrumbs($crumbs)
80 ->appendChild($view);
81 }
82
83 private function buildPropertyListView(
84 HarbormasterBuildUnitMessage $message) {
85 $viewer = $this->getViewer();
86
87 $view = id(new PHUIPropertyListView())
88 ->setUser($viewer);
89
90 $view->addProperty(
91 pht('Run At'),
92 phabricator_datetime($message->getDateCreated(), $viewer));
93
94 $details = $message->newUnitMessageDetailsView($viewer);
95
96 $view->addSectionHeader(
97 pht('Details'),
98 PHUIPropertyListView::ICON_TESTPLAN);
99 $view->addTextContent($details);
100
101 return $view;
102 }
103
104 private function buildCurtainView(
105 HarbormasterBuildUnitMessage $message,
106 HarbormasterBuild $build) {
107 $viewer = $this->getViewer();
108
109 $curtain = $this->newCurtainView($build);
110
111 $curtain->addAction(
112 id(new PhabricatorActionView())
113 ->setName(pht('View Build'))
114 ->setHref($build->getURI())
115 ->setIcon('fa-wrench'));
116
117 return $curtain;
118 }
119}