Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F15408058
D20219.id48268.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
11 KB
Referenced Files
None
Subscribers
None
D20219.id48268.diff
View Options
diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php
--- a/src/__phutil_library_map__.php
+++ b/src/__phutil_library_map__.php
@@ -1370,6 +1370,7 @@
'HarbormasterBuildTransactionQuery' => 'applications/harbormaster/query/HarbormasterBuildTransactionQuery.php',
'HarbormasterBuildUnitMessage' => 'applications/harbormaster/storage/build/HarbormasterBuildUnitMessage.php',
'HarbormasterBuildUnitMessageQuery' => 'applications/harbormaster/query/HarbormasterBuildUnitMessageQuery.php',
+ 'HarbormasterBuildView' => 'applications/harbormaster/view/HarbormasterBuildView.php',
'HarbormasterBuildViewController' => 'applications/harbormaster/controller/HarbormasterBuildViewController.php',
'HarbormasterBuildWorker' => 'applications/harbormaster/worker/HarbormasterBuildWorker.php',
'HarbormasterBuildable' => 'applications/harbormaster/storage/HarbormasterBuildable.php',
@@ -6999,6 +7000,7 @@
'PhabricatorPolicyInterface',
),
'HarbormasterBuildUnitMessageQuery' => 'PhabricatorCursorPagedPolicyAwareQuery',
+ 'HarbormasterBuildView' => 'AphrontView',
'HarbormasterBuildViewController' => 'HarbormasterController',
'HarbormasterBuildWorker' => 'HarbormasterWorker',
'HarbormasterBuildable' => array(
diff --git a/src/applications/harbormaster/controller/HarbormasterPlanViewController.php b/src/applications/harbormaster/controller/HarbormasterPlanViewController.php
--- a/src/applications/harbormaster/controller/HarbormasterPlanViewController.php
+++ b/src/applications/harbormaster/controller/HarbormasterPlanViewController.php
@@ -18,11 +18,6 @@
return new Aphront404Response();
}
- $timeline = $this->buildTransactionTimeline(
- $plan,
- new HarbormasterBuildPlanTransactionQuery());
- $timeline->setShouldTerminate(true);
-
$title = $plan->getName();
$header = id(new PHUIHeaderView())
@@ -33,24 +28,30 @@
$curtain = $this->buildCurtainView($plan);
- $crumbs = $this->buildApplicationCrumbs();
- $crumbs->addTextCrumb(pht('Plan %d', $id));
- $crumbs->setBorder(true);
+ $crumbs = $this->buildApplicationCrumbs()
+ ->addTextCrumb($plan->getObjectName())
+ ->setBorder(true);
- list($step_list, $has_any_conflicts, $would_deadlock) =
+ list($step_list, $has_any_conflicts, $would_deadlock, $steps) =
$this->buildStepList($plan);
$error = null;
- if ($would_deadlock) {
- $error = pht('This build plan will deadlock when executed, due to '.
- 'circular dependencies present in the build plan. '.
- 'Examine the step list and resolve the deadlock.');
+ if (!$steps) {
+ $error = pht(
+ 'This build plan does not have any build steps yet, so it will '.
+ 'not do anything when run.');
+ } else if ($would_deadlock) {
+ $error = pht(
+ 'This build plan will deadlock when executed, due to circular '.
+ 'dependencies present in the build plan. Examine the step list '.
+ 'and resolve the deadlock.');
} else if ($has_any_conflicts) {
// A deadlocking build will also cause all the artifacts to be
// invalid, so we just skip showing this message if that's the
// case.
- $error = pht('This build plan has conflicts in one or more build steps. '.
- 'Examine the step list and resolve the listed errors.');
+ $error = pht(
+ 'This build plan has conflicts in one or more build steps. '.
+ 'Examine the step list and resolve the listed errors.');
}
if ($error) {
@@ -59,18 +60,28 @@
->appendChild($error);
}
+ $builds_view = $this->newBuildsView($plan);
+
+ $timeline = $this->buildTransactionTimeline(
+ $plan,
+ new HarbormasterBuildPlanTransactionQuery());
+ $timeline->setShouldTerminate(true);
+
$view = id(new PHUITwoColumnView())
->setHeader($header)
->setCurtain($curtain)
- ->setMainColumn(array(
- $error,
- $step_list,
- $timeline,
- ));
+ ->setMainColumn(
+ array(
+ $error,
+ $step_list,
+ $builds_view,
+ $timeline,
+ ));
return $this->newPage()
->setTitle($title)
->setCrumbs($crumbs)
+ ->setPageObjectPHIDs(array($plan->getPHID()))
->appendChild($view);
}
@@ -213,7 +224,7 @@
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
->appendChild($step_list);
- return array($step_box, $has_any_conflicts, $is_deadlocking);
+ return array($step_box, $has_any_conflicts, $is_deadlocking, $steps);
}
private function buildCurtainView(HarbormasterBuildPlan $plan) {
@@ -376,7 +387,7 @@
array $steps) {
$has_conflicts = false;
- if (count($step_phids) === 0) {
+ if (!$step_phids) {
return null;
}
@@ -436,4 +447,41 @@
return array($ui, $has_conflicts);
}
+
+ private function newBuildsView(HarbormasterBuildPlan $plan) {
+ $viewer = $this->getViewer();
+
+ $builds = id(new HarbormasterBuildQuery())
+ ->setViewer($viewer)
+ ->withBuildPlanPHIDs(array($plan->getPHID()))
+ ->setLimit(10)
+ ->execute();
+
+ $list = id(new HarbormasterBuildView())
+ ->setViewer($viewer)
+ ->setBuilds($builds)
+ ->newObjectList();
+
+ $list->setNoDataString(pht('No recent builds.'));
+
+ $more_href = new PhutilURI(
+ $this->getApplicationURI('/build/'),
+ array('plan' => $plan->getPHID()));
+
+ $more_link = id(new PHUIButtonView())
+ ->setTag('a')
+ ->setIcon('fa-list-ul')
+ ->setText(pht('View All Builds'))
+ ->setHref($more_href);
+
+ $header = id(new PHUIHeaderView())
+ ->setHeader(pht('Recent Builds'))
+ ->addActionLink($more_link);
+
+ return id(new PHUIObjectBoxView())
+ ->setHeader($header)
+ ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
+ ->appendChild($list);
+ }
+
}
diff --git a/src/applications/harbormaster/query/HarbormasterBuildSearchEngine.php b/src/applications/harbormaster/query/HarbormasterBuildSearchEngine.php
--- a/src/applications/harbormaster/query/HarbormasterBuildSearchEngine.php
+++ b/src/applications/harbormaster/query/HarbormasterBuildSearchEngine.php
@@ -128,49 +128,14 @@
$viewer = $this->requireViewer();
- $buildables = mpull($builds, 'getBuildable');
- $object_phids = mpull($buildables, 'getBuildablePHID');
- $initiator_phids = mpull($builds, 'getInitiatorPHID');
- $phids = array_mergev(array($initiator_phids, $object_phids));
- $phids = array_unique(array_filter($phids));
-
- $handles = $viewer->loadHandles($phids);
-
- $list = new PHUIObjectItemListView();
- foreach ($builds as $build) {
- $id = $build->getID();
- $initiator = $handles[$build->getInitiatorPHID()];
- $buildable_object = $handles[$build->getBuildable()->getBuildablePHID()];
-
- $item = id(new PHUIObjectItemView())
- ->setViewer($viewer)
- ->setObject($build)
- ->setObjectName(pht('Build %d', $build->getID()))
- ->setHeader($build->getName())
- ->setHref($build->getURI())
- ->setEpoch($build->getDateCreated())
- ->addAttribute($buildable_object->getName());
-
- if ($initiator) {
- $item->addHandleIcon($initiator, $initiator->getName());
- }
-
- $status = $build->getBuildStatus();
-
- $status_icon = HarbormasterBuildStatus::getBuildStatusIcon($status);
- $status_color = HarbormasterBuildStatus::getBuildStatusColor($status);
- $status_label = HarbormasterBuildStatus::getBuildStatusName($status);
-
- $item->setStatusIcon("{$status_icon} {$status_color}", $status_label);
-
- $list->addItem($item);
- }
-
- $result = new PhabricatorApplicationSearchResultView();
- $result->setObjectList($list);
- $result->setNoDataString(pht('No builds found.'));
-
- return $result;
+ $list = id(new HarbormasterBuildView())
+ ->setViewer($viewer)
+ ->setBuilds($builds)
+ ->newObjectList();
+
+ return id(new PhabricatorApplicationSearchResultView())
+ ->setObjectList($list)
+ ->setNoDataString(pht('No builds found.'));
}
}
diff --git a/src/applications/harbormaster/storage/build/HarbormasterBuild.php b/src/applications/harbormaster/storage/build/HarbormasterBuild.php
--- a/src/applications/harbormaster/storage/build/HarbormasterBuild.php
+++ b/src/applications/harbormaster/storage/build/HarbormasterBuild.php
@@ -193,6 +193,10 @@
return HarbormasterBuildStatus::newBuildStatusObject($status_key);
}
+ public function getObjectName() {
+ return pht('Build %d', $this->getID());
+ }
+
/* -( Build Commands )----------------------------------------------------- */
diff --git a/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php b/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php
--- a/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php
+++ b/src/applications/harbormaster/storage/configuration/HarbormasterBuildPlan.php
@@ -91,7 +91,7 @@
}
public function getObjectName() {
- return pht('Build Plan %d', $this->getID());
+ return pht('Plan %d', $this->getID());
}
diff --git a/src/applications/harbormaster/view/HarbormasterBuildView.php b/src/applications/harbormaster/view/HarbormasterBuildView.php
new file mode 100644
--- /dev/null
+++ b/src/applications/harbormaster/view/HarbormasterBuildView.php
@@ -0,0 +1,67 @@
+<?php
+
+final class HarbormasterBuildView
+ extends AphrontView {
+
+ private $builds = array();
+
+ public function setBuilds(array $builds) {
+ assert_instances_of($builds, 'HarbormasterBuild');
+ $this->builds = $builds;
+ return $this;
+ }
+
+ public function getBuilds() {
+ return $this->builds;
+ }
+
+ public function render() {
+ return $this->newObjectList();
+ }
+
+ public function newObjectList() {
+ $viewer = $this->getViewer();
+ $builds = $this->getBuilds();
+
+ $buildables = mpull($builds, 'getBuildable');
+ $object_phids = mpull($buildables, 'getBuildablePHID');
+ $initiator_phids = mpull($builds, 'getInitiatorPHID');
+ $phids = array_mergev(array($initiator_phids, $object_phids));
+ $phids = array_unique(array_filter($phids));
+
+ $handles = $viewer->loadHandles($phids);
+
+ $list = new PHUIObjectItemListView();
+ foreach ($builds as $build) {
+ $id = $build->getID();
+ $initiator = $handles[$build->getInitiatorPHID()];
+ $buildable_object = $handles[$build->getBuildable()->getBuildablePHID()];
+
+ $item = id(new PHUIObjectItemView())
+ ->setViewer($viewer)
+ ->setObject($build)
+ ->setObjectName($build->getObjectName())
+ ->setHeader($build->getName())
+ ->setHref($build->getURI())
+ ->setEpoch($build->getDateCreated())
+ ->addAttribute($buildable_object->getName());
+
+ if ($initiator) {
+ $item->addByline($initiator->renderLink());
+ }
+
+ $status = $build->getBuildStatus();
+
+ $status_icon = HarbormasterBuildStatus::getBuildStatusIcon($status);
+ $status_color = HarbormasterBuildStatus::getBuildStatusColor($status);
+ $status_label = HarbormasterBuildStatus::getBuildStatusName($status);
+
+ $item->setStatusIcon("{$status_icon} {$status_color}", $status_label);
+
+ $list->addItem($item);
+ }
+
+ return $list;
+ }
+
+}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Mar 19, 9:11 PM (1 d, 4 h ago)
Storage Engine
blob
Storage Format
Encrypted (AES-256-CBC)
Storage Handle
7674461
Default Alt Text
D20219.id48268.diff (11 KB)
Attached To
Mode
D20219: Add a "Recent Builds" element to the Build Plan UI and tighten up a few odds and ends
Attached
Detach File
Event Timeline
Log In to Comment