@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
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}