-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdepmap.php
More file actions
184 lines (156 loc) · 3.34 KB
/
Copy pathdepmap.php
File metadata and controls
184 lines (156 loc) · 3.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
<?php
/**
* ULFS Packages Web-Application
*
* depmap controller
*
* depmap controller is used to render packages dependenies map using GraphViz library.
*/
//load application
include "inc/main.php";
//lines stroke styles
$styles = [
"dashed",
"dotted",
"solid",
];
//lines stroke number
$lsn = 0;
//colors list
$colors = [
"red",
"black",
"gray",
"blue",
"green",
"brown",
"pink",
"yellow",
"purple",
"orange",
];
//color number
$cn = 0;
/**
* Get childs for package.
*
* If package is not defined get packages without parents (roots)
*
* @param int $parent A package id
*
* @return array
*/
function getChilds($parent = null)
{
global $db;
$sql = "select id package, code from packages p
left join dependances d on d.package=p.id";
if ($parent) {
$sql .= " where dependance = " . $parent['package'];
} else {
$sql .= " where dependance is null";
}
$db->execute($sql);
return $db->dataset;
}
/**
* Get all packages for release
*
* @param string $release A release code
*
* @return array
*/
function getAll($release)
{
global $db;
$sql = "select p.id package, p.code, r.`release` from packages p left join releases r on r.id=p.`release` where r.release=\"$release\"";
$db->execute($sql);
return $db->dataset;
}
/**
* Add edge for line between parent package node and child package node.
*
* @param object $gv A graph object
* @param object $parent A parent package node object
* @param object $child A child package node object
*/
function addEdge($gv, $parent, $child)
{
global $colors;
global $styles;
global $cn;
global $lsn;
if ($cn >= count($colors)) {
$cn = 0;
$lsn++;
}
if ($lsn >= count($styles)) {
$lsn = 0;
}
$gv->addEdge(
[
$parent['package'] => $child['package'],
],
[
'color' => $colors[$cn],
'style' => $styles[$lsn],
],
);
$cn++;
}
/**
* Add package node to graph
*
* @param object $gv A graph object
* @param array $node A package dataset item
*/
function addNode($gv, $node)
{
//add specific node
$gv->addNode(
$node['package'],
[
'URL' => '/linux/packages/' . $node['release'] . '/' . $node['code'],
'label' => $node['code'],
'shape' => 'box',
],
);
//get chils for node
$childs = getChilds($node);
//each child
foreach ($childs as $cnode) {
//add it to graph
addEdge($gv, $node, $cnode);
}
}
//Main
//get reease value
$release = addslashes($_REQUEST['release']);
//cache file
$file = 'tmp/depmap_' . ($release) . '.svg';
//if cache file not exists
if (!file_exists($file)) {
//render it
require_once 'Image/GraphViz.php';
//get all roots (packages) for release
$roots = getAll($release);
//new graph
$gv = new Image_GraphViz(true, [], "ULFS Packages Dependencies Map");
//add root nodes
foreach ($roots as $node) {
addNode($gv, $node);
}
//start buffer
ob_start();
//render graph to buffer
$gv->image();
//save buffer
$content = ob_get_contents();
//stop buffer
ob_end_clean();
file_put_contents($file, $content);
//show graph
echo $content;
} else {
echo(file_get_contents($file));
}