-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlib.jq
87 lines (82 loc) · 1.87 KB
/
lib.jq
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
def toXml:
def optional(f; x): if f then x else . end;
optional
( type == "array"
; .[] )
| if type == "object" then
to_entries[]
| .value |=
( . // []
| optional
( type != "array"
; [ {}, . ] ))
| { tag: .key
, attr:
( .value[0] // {}
| to_entries
| map(" \(.key)=\"\(.value)\"")
| add )
, data:
( .value[1:]
| map(toXml)
| add )}
| "<\(.tag)\(.attr // "")>\(.data // "")</\(.tag)>"
else
. // ""
end
;
def nodes:
def name: capture("^/nix/store/[a-zA-Z0-9]{32}-(?<name>.*)$") | .name;
reduce .[] as $in
( []
; .
+ [ { node:
[ { id: $in.path
, label: $in.path | name }
, { attvalues:
[ {}
, { attvalue:
[ { for: 0
, value: $in.narSize }]}
, { attvalue:
[ { for: 1
, value: $in.closureSize }]}]}]}])
;
def edges:
reduce .[] as $in
( []
; .
+ [ ( $in.references[]
| select(. != $in.path)
| { edge:
[ { source: $in.path
, target: . }]})])
;
{ gexf:
[ { xmlns: "http://gexf.net/1.3"
, "xmlns:xsi": "http://www.w3.org/2001/XMLSchema-instance"
, "xsi:schemaLocation": "http://gexf.net/1.3 http://gexf.net/1.3/gexf.xsd"
, version: "1.3" }
, { meta:
[ {}
, { creator: "nix-closure-gexf"
, keywords: "nix" }]}
, { graph:
[ { defaultedgetype: "directed" }
, { attributes:
[ { class: "node" }
, { attribute:
[ { id: 0
, title: "narSize"
, type: "biginteger" }]}
, { attribute:
[ { id: 1
, title: "closureSize"
, type: "biginteger" }]}]}
, { nodes:
[ {}
, nodes ]}
, { edges:
[ {}
, edges ]}]}]}
| toXml