Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/phabricator
Path: blob/master/src/applications/harbormaster/engine/HarbormasterBuildGraph.php
12256 views
1
<?php
2
3
/**
4
* Directed graph representing a build plan
5
*/
6
final 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
}
67
68