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 @@ -1131,6 +1131,7 @@ 'HarbormasterBuildQuery' => 'applications/harbormaster/query/HarbormasterBuildQuery.php', 'HarbormasterBuildRequest' => 'applications/harbormaster/engine/HarbormasterBuildRequest.php', 'HarbormasterBuildSearchEngine' => 'applications/harbormaster/query/HarbormasterBuildSearchEngine.php', + 'HarbormasterBuildStatus' => 'applications/harbormaster/constants/HarbormasterBuildStatus.php', 'HarbormasterBuildStatusDatasource' => 'applications/harbormaster/typeahead/HarbormasterBuildStatusDatasource.php', 'HarbormasterBuildStep' => 'applications/harbormaster/storage/configuration/HarbormasterBuildStep.php', 'HarbormasterBuildStepCoreCustomField' => 'applications/harbormaster/customfield/HarbormasterBuildStepCoreCustomField.php', @@ -5687,6 +5688,7 @@ 'HarbormasterBuildQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 'HarbormasterBuildRequest' => 'Phobject', 'HarbormasterBuildSearchEngine' => 'PhabricatorApplicationSearchEngine', + 'HarbormasterBuildStatus' => 'Phobject', 'HarbormasterBuildStatusDatasource' => 'PhabricatorTypeaheadDatasource', 'HarbormasterBuildStep' => array( 'HarbormasterDAO', diff --git a/src/applications/harbormaster/conduit/HarbormasterQueryBuildsConduitAPIMethod.php b/src/applications/harbormaster/conduit/HarbormasterQueryBuildsConduitAPIMethod.php --- a/src/applications/harbormaster/conduit/HarbormasterQueryBuildsConduitAPIMethod.php +++ b/src/applications/harbormaster/conduit/HarbormasterQueryBuildsConduitAPIMethod.php @@ -66,6 +66,7 @@ $id = $build->getID(); $uri = '/harbormaster/build/'.$id.'/'; $status = $build->getBuildStatus(); + $status_name = HarbormasterBuildStatus::getBuildStatusName($status); $data[] = array( 'id' => $id, @@ -75,7 +76,7 @@ 'buildablePHID' => $build->getBuildablePHID(), 'buildPlanPHID' => $build->getBuildPlanPHID(), 'buildStatus' => $status, - 'buildStatusName' => HarbormasterBuild::getBuildStatusName($status), + 'buildStatusName' => $status_name, ); } diff --git a/src/applications/harbormaster/constants/HarbormasterBuildStatus.php b/src/applications/harbormaster/constants/HarbormasterBuildStatus.php new file mode 100644 --- /dev/null +++ b/src/applications/harbormaster/constants/HarbormasterBuildStatus.php @@ -0,0 +1,121 @@ + pht('Inactive'), + self::STATUS_PENDING => pht('Pending'), + self::STATUS_BUILDING => pht('Building'), + self::STATUS_PASSED => pht('Passed'), + self::STATUS_FAILED => pht('Failed'), + self::STATUS_ABORTED => pht('Aborted'), + self::STATUS_ERROR => pht('Unexpected Error'), + self::STATUS_PAUSED => pht('Paused'), + self::STATUS_DEADLOCKED => pht('Deadlocked'), + ); + } + + public static function getBuildStatusIcon($status) { + switch ($status) { + case self::STATUS_INACTIVE: + case self::STATUS_PENDING: + return PHUIStatusItemView::ICON_OPEN; + case self::STATUS_BUILDING: + return PHUIStatusItemView::ICON_RIGHT; + case self::STATUS_PASSED: + return PHUIStatusItemView::ICON_ACCEPT; + case self::STATUS_FAILED: + return PHUIStatusItemView::ICON_REJECT; + case self::STATUS_ABORTED: + return PHUIStatusItemView::ICON_MINUS; + case self::STATUS_ERROR: + return PHUIStatusItemView::ICON_MINUS; + case self::STATUS_PAUSED: + return PHUIStatusItemView::ICON_MINUS; + case self::STATUS_DEADLOCKED: + return PHUIStatusItemView::ICON_WARNING; + default: + return PHUIStatusItemView::ICON_QUESTION; + } + } + + public static function getBuildStatusColor($status) { + switch ($status) { + case self::STATUS_INACTIVE: + return 'dark'; + case self::STATUS_PENDING: + case self::STATUS_BUILDING: + return 'blue'; + case self::STATUS_PASSED: + return 'green'; + case self::STATUS_FAILED: + case self::STATUS_ABORTED: + case self::STATUS_ERROR: + case self::STATUS_DEADLOCKED: + return 'red'; + case self::STATUS_PAUSED: + return 'dark'; + default: + return 'bluegrey'; + } + } + +} diff --git a/src/applications/harbormaster/controller/HarbormasterBuildViewController.php b/src/applications/harbormaster/controller/HarbormasterBuildViewController.php --- a/src/applications/harbormaster/controller/HarbormasterBuildViewController.php +++ b/src/applications/harbormaster/controller/HarbormasterBuildViewController.php @@ -581,9 +581,9 @@ } else { $status = $build->getBuildStatus(); $status_name = - HarbormasterBuild::getBuildStatusName($status); - $icon = HarbormasterBuild::getBuildStatusIcon($status); - $color = HarbormasterBuild::getBuildStatusColor($status); + HarbormasterBuildStatus::getBuildStatusName($status); + $icon = HarbormasterBuildStatus::getBuildStatusIcon($status); + $color = HarbormasterBuildStatus::getBuildStatusColor($status); } $item->setTarget($status_name); diff --git a/src/applications/harbormaster/controller/HarbormasterBuildableViewController.php b/src/applications/harbormaster/controller/HarbormasterBuildableViewController.php --- a/src/applications/harbormaster/controller/HarbormasterBuildableViewController.php +++ b/src/applications/harbormaster/controller/HarbormasterBuildableViewController.php @@ -196,11 +196,10 @@ ->setHref($view_uri); $status = $build->getBuildStatus(); - $item->setStatusIcon( - 'fa-dot-circle-o '.HarbormasterBuild::getBuildStatusColor($status), - HarbormasterBuild::getBuildStatusName($status)); - - $item->addAttribute(HarbormasterBuild::getBuildStatusName($status)); + $status_color = HarbormasterBuildStatus::getBuildStatusColor($status); + $status_name = HarbormasterBuildStatus::getBuildStatusName($status); + $item->setStatusIcon('fa-dot-circle-o '.$status_color, $status_name); + $item->addAttribute($status_name); if ($build->isRestarting()) { $item->addIcon('fa-repeat', pht('Restarting')); diff --git a/src/applications/harbormaster/engine/HarbormasterBuildEngine.php b/src/applications/harbormaster/engine/HarbormasterBuildEngine.php --- a/src/applications/harbormaster/engine/HarbormasterBuildEngine.php +++ b/src/applications/harbormaster/engine/HarbormasterBuildEngine.php @@ -63,7 +63,7 @@ // If any exception is raised, the build is marked as a failure and the // exception is re-thrown (this ensures we don't leave builds in an // inconsistent state). - $build->setBuildStatus(HarbormasterBuild::STATUS_ERROR); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_ERROR); $build->save(); $lock->unlock(); @@ -106,30 +106,30 @@ private function updateBuild(HarbormasterBuild $build) { if ($build->isAborting()) { $this->releaseAllArtifacts($build); - $build->setBuildStatus(HarbormasterBuild::STATUS_ABORTED); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_ABORTED); $build->save(); } - if (($build->getBuildStatus() == HarbormasterBuild::STATUS_PENDING) || + if (($build->getBuildStatus() == HarbormasterBuildStatus::STATUS_PENDING) || ($build->isRestarting())) { $this->restartBuild($build); - $build->setBuildStatus(HarbormasterBuild::STATUS_BUILDING); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_BUILDING); $build->save(); } if ($build->isResuming()) { - $build->setBuildStatus(HarbormasterBuild::STATUS_BUILDING); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_BUILDING); $build->save(); } if ($build->isPausing() && !$build->isComplete()) { - $build->setBuildStatus(HarbormasterBuild::STATUS_PAUSED); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_PAUSED); $build->save(); } $build->deleteUnprocessedCommands(); - if ($build->getBuildStatus() == HarbormasterBuild::STATUS_BUILDING) { + if ($build->getBuildStatus() == HarbormasterBuildStatus::STATUS_BUILDING) { $this->updateBuildSteps($build); } } @@ -243,7 +243,7 @@ // If any step failed, fail the whole build, then bail. if (count($failed)) { - $build->setBuildStatus(HarbormasterBuild::STATUS_FAILED); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_FAILED); $build->save(); return; } @@ -251,7 +251,7 @@ // If every step is complete, we're done with this build. Mark it passed // and bail. if (count($complete) == count($steps)) { - $build->setBuildStatus(HarbormasterBuild::STATUS_PASSED); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_PASSED); $build->save(); return; } @@ -287,7 +287,7 @@ if (!$runnable && !$waiting && !$underway) { // This means the build is deadlocked, and the user has configured // circular dependencies. - $build->setBuildStatus(HarbormasterBuild::STATUS_DEADLOCKED); + $build->setBuildStatus(HarbormasterBuildStatus::STATUS_DEADLOCKED); $build->save(); return; } @@ -443,14 +443,14 @@ $all_pass = true; $any_fail = false; foreach ($buildable->getBuilds() as $build) { - if ($build->getBuildStatus() != HarbormasterBuild::STATUS_PASSED) { + if ($build->getBuildStatus() != HarbormasterBuildStatus::STATUS_PASSED) { $all_pass = false; } - if ($build->getBuildStatus() == HarbormasterBuild::STATUS_FAILED || - $build->getBuildStatus() == HarbormasterBuild::STATUS_ERROR || - $build->getBuildStatus() == HarbormasterBuild::STATUS_DEADLOCKED) { - $any_fail = true; - } + $any_fail = in_array($build->getBuildStatus(), array( + HarbormasterBuildStatus::STATUS_FAILED, + HarbormasterBuildStatus::STATUS_ERROR, + HarbormasterBuildStatus::STATUS_DEADLOCKED, + )); } if ($any_fail) { diff --git a/src/applications/harbormaster/event/HarbormasterUIEventListener.php b/src/applications/harbormaster/event/HarbormasterUIEventListener.php --- a/src/applications/harbormaster/event/HarbormasterUIEventListener.php +++ b/src/applications/harbormaster/event/HarbormasterUIEventListener.php @@ -132,9 +132,9 @@ } $status = $build->getBuildStatus(); - $status_name = HarbormasterBuild::getBuildStatusName($status); - $icon = HarbormasterBuild::getBuildStatusIcon($status); - $color = HarbormasterBuild::getBuildStatusColor($status); + $status_name = HarbormasterBuildStatus::getBuildStatusName($status); + $icon = HarbormasterBuildStatus::getBuildStatusIcon($status); + $color = HarbormasterBuildStatus::getBuildStatusColor($status); $item->setIcon($icon, $color, $status_name); 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 @@ -107,9 +107,9 @@ $status = $build->getBuildStatus(); - $status_icon = HarbormasterBuild::getBuildStatusIcon($status); - $status_color = HarbormasterBuild::getBuildStatusColor($status); - $status_label = HarbormasterBuild::getBuildStatusName($status); + $status_icon = HarbormasterBuildStatus::getBuildStatusIcon($status); + $status_color = HarbormasterBuildStatus::getBuildStatusColor($status); + $status_label = HarbormasterBuildStatus::getBuildStatusName($status); $item->setStatusIcon("{$status_icon} {$status_color}", $status_label); diff --git a/src/applications/harbormaster/storage/HarbormasterBuildable.php b/src/applications/harbormaster/storage/HarbormasterBuildable.php --- a/src/applications/harbormaster/storage/HarbormasterBuildable.php +++ b/src/applications/harbormaster/storage/HarbormasterBuildable.php @@ -170,7 +170,7 @@ ->setBuildablePHID($this->getPHID()) ->setBuildPlanPHID($plan->getPHID()) ->setBuildParameters($parameters) - ->setBuildStatus(HarbormasterBuild::STATUS_PENDING); + ->setBuildStatus(HarbormasterBuildStatus::STATUS_PENDING); if ($initiator_phid) { $build->setInitiatorPHID($initiator_phid); } 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 @@ -18,125 +18,9 @@ private $buildTargets = self::ATTACHABLE; private $unprocessedCommands = self::ATTACHABLE; - /** - * Not currently being built. - */ - const STATUS_INACTIVE = 'inactive'; - - /** - * Pending pick up by the Harbormaster daemon. - */ - const STATUS_PENDING = 'pending'; - - /** - * Current building the buildable. - */ - const STATUS_BUILDING = 'building'; - - /** - * The build has passed. - */ - const STATUS_PASSED = 'passed'; - - /** - * The build has failed. - */ - const STATUS_FAILED = 'failed'; - - /** - * The build has aborted. - */ - const STATUS_ABORTED = 'aborted'; - - /** - * The build encountered an unexpected error. - */ - const STATUS_ERROR = 'error'; - - /** - * The build has been paused. - */ - const STATUS_PAUSED = 'paused'; - - /** - * The build has been deadlocked. - */ - const STATUS_DEADLOCKED = 'deadlocked'; - - - /** - * Get a human readable name for a build status constant. - * - * @param const Build status constant. - * @return string Human-readable name. - */ - public static function getBuildStatusName($status) { - $map = self::getBuildStatusMap(); - return idx($map, $status, pht('Unknown ("%s")', $status)); - } - - public static function getBuildStatusMap() { - return array( - self::STATUS_INACTIVE => pht('Inactive'), - self::STATUS_PENDING => pht('Pending'), - self::STATUS_BUILDING => pht('Building'), - self::STATUS_PASSED => pht('Passed'), - self::STATUS_FAILED => pht('Failed'), - self::STATUS_ABORTED => pht('Aborted'), - self::STATUS_ERROR => pht('Unexpected Error'), - self::STATUS_PAUSED => pht('Paused'), - self::STATUS_DEADLOCKED => pht('Deadlocked'), - ); - } - - public static function getBuildStatusIcon($status) { - switch ($status) { - case self::STATUS_INACTIVE: - case self::STATUS_PENDING: - return PHUIStatusItemView::ICON_OPEN; - case self::STATUS_BUILDING: - return PHUIStatusItemView::ICON_RIGHT; - case self::STATUS_PASSED: - return PHUIStatusItemView::ICON_ACCEPT; - case self::STATUS_FAILED: - return PHUIStatusItemView::ICON_REJECT; - case self::STATUS_ABORTED: - return PHUIStatusItemView::ICON_MINUS; - case self::STATUS_ERROR: - return PHUIStatusItemView::ICON_MINUS; - case self::STATUS_PAUSED: - return PHUIStatusItemView::ICON_MINUS; - case self::STATUS_DEADLOCKED: - return PHUIStatusItemView::ICON_WARNING; - default: - return PHUIStatusItemView::ICON_QUESTION; - } - } - - public static function getBuildStatusColor($status) { - switch ($status) { - case self::STATUS_INACTIVE: - return 'dark'; - case self::STATUS_PENDING: - case self::STATUS_BUILDING: - return 'blue'; - case self::STATUS_PASSED: - return 'green'; - case self::STATUS_FAILED: - case self::STATUS_ABORTED: - case self::STATUS_ERROR: - case self::STATUS_DEADLOCKED: - return 'red'; - case self::STATUS_PAUSED: - return 'dark'; - default: - return 'bluegrey'; - } - } - public static function initializeNewBuild(PhabricatorUser $actor) { return id(new HarbormasterBuild()) - ->setBuildStatus(self::STATUS_INACTIVE) + ->setBuildStatus(HarbormasterBuildStatus::STATUS_INACTIVE) ->setBuildGeneration(0); } @@ -220,8 +104,9 @@ } public function isBuilding() { - return $this->getBuildStatus() === self::STATUS_PENDING || - $this->getBuildStatus() === self::STATUS_BUILDING; + return + $this->getBuildStatus() === HarbormasterBuildStatus::STATUS_PENDING || + $this->getBuildStatus() === HarbormasterBuildStatus::STATUS_BUILDING; } public function isAutobuild() { @@ -285,11 +170,11 @@ public function isComplete() { switch ($this->getBuildStatus()) { - case self::STATUS_PASSED: - case self::STATUS_FAILED: - case self::STATUS_ABORTED: - case self::STATUS_ERROR: - case self::STATUS_PAUSED: + case HarbormasterBuildStatus::STATUS_PASSED: + case HarbormasterBuildStatus::STATUS_FAILED: + case HarbormasterBuildStatus::STATUS_ABORTED: + case HarbormasterBuildStatus::STATUS_ERROR: + case HarbormasterBuildStatus::STATUS_PAUSED: return true; } @@ -297,7 +182,7 @@ } public function isPaused() { - return ($this->getBuildStatus() == self::STATUS_PAUSED); + return ($this->getBuildStatus() == HarbormasterBuildStatus::STATUS_PAUSED); } public function getURI() { diff --git a/src/applications/harbormaster/typeahead/HarbormasterBuildStatusDatasource.php b/src/applications/harbormaster/typeahead/HarbormasterBuildStatusDatasource.php --- a/src/applications/harbormaster/typeahead/HarbormasterBuildStatusDatasource.php +++ b/src/applications/harbormaster/typeahead/HarbormasterBuildStatusDatasource.php @@ -27,11 +27,11 @@ private function buildResults() { $results = array(); - $status_map = HarbormasterBuild::getBuildStatusMap(); + $status_map = HarbormasterBuildStatus::getBuildStatusMap(); foreach ($status_map as $value => $name) { $result = id(new PhabricatorTypeaheadResult()) - ->setIcon(HarbormasterBuild::getBuildStatusIcon($value)) - ->setColor(HarbormasterBuild::getBuildStatusColor($value)) + ->setIcon(HarbormasterBuildStatus::getBuildStatusIcon($value)) + ->setColor(HarbormasterBuildStatus::getBuildStatusColor($value)) ->setPHID($value) ->setName($name) ->addAttribute(pht('Status'));