Path: blob/master/src/applications/harbormaster/engine/HarbormasterBuildGraph.php
12256 views
<?php12/**3* Directed graph representing a build plan4*/5final class HarbormasterBuildGraph extends AbstractDirectedGraph {67private $stepMap;89public static function determineDependencyExecution(10HarbormasterBuildPlan $plan) {1112$steps = id(new HarbormasterBuildStepQuery())13->setViewer(PhabricatorUser::getOmnipotentUser())14->withBuildPlanPHIDs(array($plan->getPHID()))15->execute();1617$steps_by_phid = mpull($steps, null, 'getPHID');18$step_phids = mpull($steps, 'getPHID');1920if (count($steps) === 0) {21return array();22}2324$graph = id(new HarbormasterBuildGraph($steps_by_phid))25->addNodes($step_phids);2627$raw_results = $graph->getNodesInRoughTopologicalOrder();2829$results = array();30foreach ($raw_results as $node) {31$results[] = array(32'node' => $steps_by_phid[$node['node']],33'depth' => $node['depth'],34'cycle' => $node['cycle'],35);36}3738return $results;39}4041public function __construct($step_map) {42$this->stepMap = $step_map;43}4445protected function loadEdges(array $nodes) {46$map = array();47foreach ($nodes as $node) {48$step = $this->stepMap[$node];4950try {51$deps = $step->getStepImplementation()->getDependencies($step);52} catch (Exception $ex) {53$deps = array();54}5556$map[$node] = array();57foreach ($deps as $dep) {58$map[$node][] = $dep;59}60}6162return $map;63}6465}666768