@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
at recaptime-dev/main 66 lines 1.5 kB view raw
1<?php 2 3/** 4 * Directed graph representing a build plan 5 */ 6final class HarbormasterBuildGraph extends AbstractDirectedGraph { 7 8 private $stepMap; 9 10 public static function determineDependencyExecution( 11 HarbormasterBuildPlan $plan) { 12 13 $steps = id(new HarbormasterBuildStepQuery()) 14 ->setViewer(PhabricatorUser::getOmnipotentUser()) 15 ->withBuildPlanPHIDs(array($plan->getPHID())) 16 ->execute(); 17 18 $steps_by_phid = mpull($steps, null, 'getPHID'); 19 $step_phids = mpull($steps, 'getPHID'); 20 21 if (count($steps) === 0) { 22 return array(); 23 } 24 25 $graph = id(new HarbormasterBuildGraph($steps_by_phid)) 26 ->addNodes($step_phids); 27 28 $raw_results = $graph->getNodesInRoughTopologicalOrder(); 29 30 $results = array(); 31 foreach ($raw_results as $node) { 32 $results[] = array( 33 'node' => $steps_by_phid[$node['node']], 34 'depth' => $node['depth'], 35 'cycle' => $node['cycle'], 36 ); 37 } 38 39 return $results; 40 } 41 42 public function __construct($step_map) { 43 $this->stepMap = $step_map; 44 } 45 46 protected function loadEdges(array $nodes) { 47 $map = array(); 48 foreach ($nodes as $node) { 49 $step = $this->stepMap[$node]; 50 51 try { 52 $deps = $step->getStepImplementation()->getDependencies($step); 53 } catch (Exception $ex) { 54 $deps = array(); 55 } 56 57 $map[$node] = array(); 58 foreach ($deps as $dep) { 59 $map[$node][] = $dep; 60 } 61 } 62 63 return $map; 64 } 65 66}