xref: /aosp_15_r20/build/bazel/json_module_graph/distanceFromLeaves.jq (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1# CMD: Prints the longest distance each module has from a leaf in the module graph within the transitive closure of given module
2
3include "library";
4
5def onlyDeps:
6  { Name: .Name, Deps: .Deps | map(.Name) }
7;
8
9def mergeDepsForSameModule:
10  group_by(.Name) | map({Name: .[0].Name, Deps: map(.Deps) | flatten | unique | sort})
11;
12
13def toMergeMap:
14  map({key: .Name, value: .Deps}) | from_entries
15;
16
17def moduleGraphNoVariants:
18  map(onlyDeps) | mergeDepsForSameModule | toMergeMap
19;
20
21def removeSelfEdges:
22  to_entries |
23  map(.key as $key | {key: .key, value: .value | [.[] | select(. != $key)]}) |
24  from_entries
25;
26
27def nextDepths($m):
28  . as $old |
29  to_entries |
30  map({
31      key: .key,
32      value: (
33          .key as $key |
34          $m[.key] // [] |
35          map($old[.]) |
36          if any(. == -1) then -1 else (max // -1) + 1 end
37      )
38  }) |
39  from_entries
40;
41
42def maxDepths($m):
43  map({key: ., value: -1}) | from_entries |
44  {Prev: [], Next: .} |
45  until (.Prev == .Next; {Prev: .Next, Next: .Next | nextDepths($m)}) |
46  .Next
47;
48
49def variantlessDistancesFromLeaves($root):
50  (moduleGraphNoVariants | removeSelfEdges) as $m |
51  [$root] |
52  transitiveDeps($m) |
53  maxDepths($m)
54;
55
56variantlessDistancesFromLeaves($arg)
57