diff --git a/src/applications/harbormaster/constants/HarbormasterBuildStatus.php b/src/applications/harbormaster/constants/HarbormasterBuildStatus.php --- a/src/applications/harbormaster/constants/HarbormasterBuildStatus.php +++ b/src/applications/harbormaster/constants/HarbormasterBuildStatus.php @@ -2,51 +2,56 @@ final class HarbormasterBuildStatus extends Phobject { - /** - * 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'; + private $key; + private $properties; + + public function __construct($key, array $properties) { + $this->key = $key; + $this->properties = $properties; + } + + public static function newBuildStatusObject($status) { + $spec = self::getBuildStatusSpec($status); + return new self($status, $spec); + } + + private function getProperty($key) { + if (!array_key_exists($key, $this->properties)) { + throw new Exception( + pht( + 'Attempting to access unknown build status property ("%s").', + $key)); + } + + return $this->properties[$key]; + } + + public function isBuilding() { + return $this->getProperty('isBuilding'); + } + + public function isPaused() { + return ($this->key === self::STATUS_PAUSED); + } + + public function isComplete() { + return $this->getProperty('isComplete'); + } + + public function isPassed() { + return ($this->key === self::STATUS_PASSED); + } + /** * Get a human readable name for a build status constant. @@ -56,7 +61,7 @@ */ public static function getBuildStatusName($status) { $spec = self::getBuildStatusSpec($status); - return idx($spec, 'name', pht('Unknown ("%s")', $status)); + return $spec['name']; } public static function getBuildStatusMap() { @@ -66,17 +71,17 @@ public static function getBuildStatusIcon($status) { $spec = self::getBuildStatusSpec($status); - return idx($spec, 'icon', 'fa-question-circle'); + return $spec['icon']; } public static function getBuildStatusColor($status) { $spec = self::getBuildStatusSpec($status); - return idx($spec, 'color', 'bluegrey'); + return $spec['color']; } public static function getBuildStatusANSIColor($status) { $spec = self::getBuildStatusSpec($status); - return idx($spec, 'color.ansi', 'magenta'); + return $spec['color.ansi']; } public static function getWaitingStatusConstants() { @@ -110,60 +115,90 @@ 'icon' => 'fa-circle-o', 'color' => 'dark', 'color.ansi' => 'yellow', + 'isBuilding' => false, + 'isComplete' => false, ), self::STATUS_PENDING => array( 'name' => pht('Pending'), 'icon' => 'fa-circle-o', 'color' => 'blue', 'color.ansi' => 'yellow', + 'isBuilding' => true, + 'isComplete' => false, ), self::STATUS_BUILDING => array( 'name' => pht('Building'), 'icon' => 'fa-chevron-circle-right', 'color' => 'blue', 'color.ansi' => 'yellow', + 'isBuilding' => true, + 'isComplete' => false, ), self::STATUS_PASSED => array( 'name' => pht('Passed'), 'icon' => 'fa-check-circle', 'color' => 'green', 'color.ansi' => 'green', + 'isBuilding' => false, + 'isComplete' => true, ), self::STATUS_FAILED => array( 'name' => pht('Failed'), 'icon' => 'fa-times-circle', 'color' => 'red', 'color.ansi' => 'red', + 'isBuilding' => false, + 'isComplete' => true, ), self::STATUS_ABORTED => array( 'name' => pht('Aborted'), 'icon' => 'fa-minus-circle', 'color' => 'red', 'color.ansi' => 'red', + 'isBuilding' => false, + 'isComplete' => true, ), self::STATUS_ERROR => array( 'name' => pht('Unexpected Error'), 'icon' => 'fa-minus-circle', 'color' => 'red', 'color.ansi' => 'red', + 'isBuilding' => false, + 'isComplete' => true, ), self::STATUS_PAUSED => array( 'name' => pht('Paused'), 'icon' => 'fa-minus-circle', 'color' => 'dark', 'color.ansi' => 'yellow', + 'isBuilding' => false, + 'isComplete' => false, ), self::STATUS_DEADLOCKED => array( 'name' => pht('Deadlocked'), 'icon' => 'fa-exclamation-circle', 'color' => 'red', 'color.ansi' => 'red', + 'isBuilding' => false, + 'isComplete' => true, ), ); } private static function getBuildStatusSpec($status) { - return idx(self::getBuildStatusSpecMap(), $status, array()); + $map = self::getBuildStatusSpecMap(); + if (isset($map[$status])) { + return $map[$status]; + } + + return array( + 'name' => pht('Unknown ("%s")', $status), + 'icon' => 'fa-question-circle', + 'color' => 'bluegrey', + 'color.ansi' => 'magenta', + 'isBuilding' => false, + 'isComplete' => false, + ); } } 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 @@ -36,6 +36,10 @@ ->setHeader($title) ->setUser($viewer) ->setPolicyObject($buildable) + ->setStatus( + $buildable->getStatusIcon(), + $buildable->getStatusColor(), + $buildable->getStatusDisplayName()) ->setHeaderIcon('fa-recycle'); $timeline = $this->buildTransactionTimeline( 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 @@ -443,15 +443,11 @@ $all_pass = true; $any_fail = false; foreach ($buildable->getBuilds() as $build) { - if ($build->getBuildStatus() != HarbormasterBuildStatus::STATUS_PASSED) { + if (!$build->isPassed()) { $all_pass = false; } - if (in_array($build->getBuildStatus(), array( - HarbormasterBuildStatus::STATUS_FAILED, - HarbormasterBuildStatus::STATUS_ERROR, - HarbormasterBuildStatus::STATUS_DEADLOCKED, - ))) { + if ($build->isComplete() && !$build->isPassed()) { $any_fail = true; } } 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 @@ -58,6 +58,18 @@ } } + public function getStatusIcon() { + return self::getBuildableStatusIcon($this->getBuildableStatus()); + } + + public function getStatusDisplayName() { + return self::getBuildableStatusName($this->getBuildableStatus()); + } + + public function getStatusColor() { + return self::getBuildableStatusColor($this->getBuildableStatus()); + } + public static function initializeNewBuildable(PhabricatorUser $actor) { return id(new HarbormasterBuildable()) ->setIsManualBuildable(0) 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 @@ -108,9 +108,7 @@ } public function isBuilding() { - return - $this->getBuildStatus() === HarbormasterBuildStatus::STATUS_PENDING || - $this->getBuildStatus() === HarbormasterBuildStatus::STATUS_BUILDING; + return $this->getBuildStatusObject()->isBuilding(); } public function isAutobuild() { @@ -173,13 +171,15 @@ } public function isComplete() { - return in_array( - $this->getBuildStatus(), - HarbormasterBuildStatus::getCompletedStatusConstants()); + return $this->getBuildStatusObject()->isComplete(); } public function isPaused() { - return ($this->getBuildStatus() == HarbormasterBuildStatus::STATUS_PAUSED); + return $this->getBuildStatusObject()->isPaused(); + } + + public function isPassed() { + return $this->getBuildStatusObject()->isPassed(); } public function getURI() { @@ -187,6 +187,11 @@ return "/harbormaster/build/{$id}/"; } + protected function getBuildStatusObject() { + $status_key = $this->getBuildStatus(); + return HarbormasterBuildStatus::newBuildStatusObject($status_key); + } + /* -( Build Commands )----------------------------------------------------- */