xref: /aosp_15_r20/build/bazel/json_module_graph/library.jq (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# Applies "f" to all variation maps in modules and deps
2*7594170eSAndroid Build Coastguard Worker
3*7594170eSAndroid Build Coastguard Workerdef transformModule(f):
4*7594170eSAndroid Build Coastguard Worker  .Variations = (.Variations | f) |
5*7594170eSAndroid Build Coastguard Worker  .DependencyVariations = (.DependencyVariations | f)
6*7594170eSAndroid Build Coastguard Worker;
7*7594170eSAndroid Build Coastguard Worker
8*7594170eSAndroid Build Coastguard Workerdef transformModuleReferences(f):
9*7594170eSAndroid Build Coastguard Worker  transformModule(f) |
10*7594170eSAndroid Build Coastguard Worker  .Deps = [.Deps | .[] | transformModule(f)]
11*7594170eSAndroid Build Coastguard Worker;
12*7594170eSAndroid Build Coastguard Worker
13*7594170eSAndroid Build Coastguard Worker
14*7594170eSAndroid Build Coastguard Worker
15*7594170eSAndroid Build Coastguard Worker# Utility functions for transforming modules
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Workerdef deleteDependencyVariations:
18*7594170eSAndroid Build Coastguard Worker  if .DependencyVariations == .Variations then del(.DependencyVariations) else . end
19*7594170eSAndroid Build Coastguard Worker;
20*7594170eSAndroid Build Coastguard Worker
21*7594170eSAndroid Build Coastguard Worker
22*7594170eSAndroid Build Coastguard Worker# Utility functions for transforming variation maps
23*7594170eSAndroid Build Coastguard Worker
24*7594170eSAndroid Build Coastguard Workerdef emptyIfNull: if . == null then {} else . end
25*7594170eSAndroid Build Coastguard Worker;
26*7594170eSAndroid Build Coastguard Worker
27*7594170eSAndroid Build Coastguard Workerdef flattenVariations:
28*7594170eSAndroid Build Coastguard Worker  [. as $m | . | keys | sort | .[] | . + "=" + ($m[.] | tostring)] | join(", ")
29*7594170eSAndroid Build Coastguard Worker;
30*7594170eSAndroid Build Coastguard Worker
31*7594170eSAndroid Build Coastguard Workerdef removeLinkVariation:
32*7594170eSAndroid Build Coastguard Worker  del(.link)
33*7594170eSAndroid Build Coastguard Worker;
34*7594170eSAndroid Build Coastguard Worker
35*7594170eSAndroid Build Coastguard Workerdef removeEmptyVariations:
36*7594170eSAndroid Build Coastguard Worker  del(.[] | select(. == ""))
37*7594170eSAndroid Build Coastguard Worker;
38*7594170eSAndroid Build Coastguard Worker
39*7594170eSAndroid Build Coastguard Worker# Computes the difference of two maps, returns it as a single string
40*7594170eSAndroid Build Coastguard Workerdef mapDelta($outer; $inner):
41*7594170eSAndroid Build Coastguard Worker  $outer | keys as $outerKeys |
42*7594170eSAndroid Build Coastguard Worker  $inner | keys as $innerKeys |
43*7594170eSAndroid Build Coastguard Worker  ($outerKeys - $innerKeys) as $removed |
44*7594170eSAndroid Build Coastguard Worker  ($innerKeys - $outerKeys) as $added |
45*7594170eSAndroid Build Coastguard Worker  [($removed | .[] | "-" + . + "=" + $outer[.]), ($added | .[] | "+" + . + "=" + $inner[.])] |
46*7594170eSAndroid Build Coastguard Worker  join(", ")
47*7594170eSAndroid Build Coastguard Worker;
48*7594170eSAndroid Build Coastguard Worker
49*7594170eSAndroid Build Coastguard Worker# Transforms the variation map of dependencies (as specified by f) to a delta
50*7594170eSAndroid Build Coastguard Worker# from the variation map of the module that depends on them
51*7594170eSAndroid Build Coastguard Workerdef depDelta(f):
52*7594170eSAndroid Build Coastguard Worker  f as $outer |
53*7594170eSAndroid Build Coastguard Worker  (.Deps | .[] | f) |= (. | mapDelta($outer; .))
54*7594170eSAndroid Build Coastguard Worker;
55*7594170eSAndroid Build Coastguard Worker
56*7594170eSAndroid Build Coastguard Worker# "filterMatchingDeps"  filters deps that have different variations
57*7594170eSAndroid Build Coastguard Worker
58*7594170eSAndroid Build Coastguard Workerdef differentDep($od; $ov):
59*7594170eSAndroid Build Coastguard Worker  (.DependencyVariations != $od or .Variations != $ov) and
60*7594170eSAndroid Build Coastguard Worker  (.DependencyVariations != {} or .Variations != {})
61*7594170eSAndroid Build Coastguard Worker;
62*7594170eSAndroid Build Coastguard Worker
63*7594170eSAndroid Build Coastguard Workerdef filterMatchingDeps: .Variations as $ov |
64*7594170eSAndroid Build Coastguard Worker  .DependencyVariations as $od |
65*7594170eSAndroid Build Coastguard Worker  .Deps = [.Deps[] | select(differentDep($ov; $od))]
66*7594170eSAndroid Build Coastguard Worker;
67*7594170eSAndroid Build Coastguard Worker
68*7594170eSAndroid Build Coastguard Worker
69*7594170eSAndroid Build Coastguard Workerdef groupDeps:
70*7594170eSAndroid Build Coastguard Worker  group_by({Variations, DependencyVariations, Tag}) |
71*7594170eSAndroid Build Coastguard Worker  map({
72*7594170eSAndroid Build Coastguard Worker    DependencyVariations: .[0].DependencyVariations,
73*7594170eSAndroid Build Coastguard Worker    Variations: .[0].Variations,
74*7594170eSAndroid Build Coastguard Worker    Tag: .[0].Tag | sub(" {BaseDependencyTag:{}(?<g>.*)}"; "\(.g)"),
75*7594170eSAndroid Build Coastguard Worker    Modules: map(.Name)
76*7594170eSAndroid Build Coastguard Worker  } | del(if has("DependencyVariations") then .DependencyVariations else empty end))
77*7594170eSAndroid Build Coastguard Worker
78*7594170eSAndroid Build Coastguard Worker;
79*7594170eSAndroid Build Coastguard Worker
80*7594170eSAndroid Build Coastguard Worker# Utilities for filtering out interesting modules (deps remain untouched)
81*7594170eSAndroid Build Coastguard Worker
82*7594170eSAndroid Build Coastguard Workerdef onlyDeps:
83*7594170eSAndroid Build Coastguard Worker  { Name: .Name, Deps: .Deps | map(.Name) }
84*7594170eSAndroid Build Coastguard Worker;
85*7594170eSAndroid Build Coastguard Worker
86*7594170eSAndroid Build Coastguard Workerdef mergeDepsForSameModule:
87*7594170eSAndroid Build Coastguard Worker  group_by(.Name) | map({Name: .[0].Name, Deps: map(.Deps) | flatten | unique | sort})
88*7594170eSAndroid Build Coastguard Worker;
89*7594170eSAndroid Build Coastguard Worker
90*7594170eSAndroid Build Coastguard Workerdef toMergeMap:
91*7594170eSAndroid Build Coastguard Worker  map({key: .Name, value: .Deps}) | from_entries
92*7594170eSAndroid Build Coastguard Worker;
93*7594170eSAndroid Build Coastguard Worker
94*7594170eSAndroid Build Coastguard Workerdef moduleGraphNoVariants:
95*7594170eSAndroid Build Coastguard Worker  map(onlyDeps) | mergeDepsForSameModule | toMergeMap
96*7594170eSAndroid Build Coastguard Worker;
97*7594170eSAndroid Build Coastguard Worker
98*7594170eSAndroid Build Coastguard Workerdef removeSelfEdges:
99*7594170eSAndroid Build Coastguard Worker  to_entries |
100*7594170eSAndroid Build Coastguard Worker  map(.key as $key | {key: .key, value: .value | [.[] | select(. != $key)]}) |
101*7594170eSAndroid Build Coastguard Worker  from_entries
102*7594170eSAndroid Build Coastguard Worker;
103*7594170eSAndroid Build Coastguard Worker
104*7594170eSAndroid Build Coastguard Workerdef directDeps($m):
105*7594170eSAndroid Build Coastguard Worker  map($m[.] // []) + [.] | flatten | unique
106*7594170eSAndroid Build Coastguard Worker;
107*7594170eSAndroid Build Coastguard Worker
108*7594170eSAndroid Build Coastguard Workerdef reverseDeps($m):
109*7594170eSAndroid Build Coastguard Worker .[] | select(.Deps[].Name == $m)
110*7594170eSAndroid Build Coastguard Worker;
111*7594170eSAndroid Build Coastguard Worker
112*7594170eSAndroid Build Coastguard Workerdef transitiveDeps($m):
113*7594170eSAndroid Build Coastguard Worker  {Prev: [], Next: .} |
114*7594170eSAndroid Build Coastguard Worker  until (.Prev == .Next; {Prev: .Next, Next: .Next | directDeps($m)}) |
115*7594170eSAndroid Build Coastguard Worker  .Next
116*7594170eSAndroid Build Coastguard Worker;
117*7594170eSAndroid Build Coastguard Worker
118*7594170eSAndroid Build Coastguard Workerdef findEdge($from;$to):
119*7594170eSAndroid Build Coastguard Worker  .[] | select(.Name == $from) |
120*7594170eSAndroid Build Coastguard Worker  .Deps |= [.[] | select(.Name == $to)] |
121*7594170eSAndroid Build Coastguard Worker  select((.Deps | length) > 0)
122*7594170eSAndroid Build Coastguard Worker;
123*7594170eSAndroid Build Coastguard Worker
124*7594170eSAndroid Build Coastguard Workerdef nonNullAction: .Module.Actions != null
125*7594170eSAndroid Build Coastguard Worker;
126*7594170eSAndroid Build Coastguard Worker
127*7594170eSAndroid Build Coastguard Workerdef getActionInputs: .Module.Actions | .[] |
128*7594170eSAndroid Build Coastguard Worker  .Inputs | if . == null then [] else . end | .[]
129*7594170eSAndroid Build Coastguard Worker;
130*7594170eSAndroid Build Coastguard Worker
131*7594170eSAndroid Build Coastguard Worker# Gets the directory path by the given file path.
132*7594170eSAndroid Build Coastguard Workerdef getDirPath: sub("(?<p>.*)\\/.*"; "\(.p)")
133*7594170eSAndroid Build Coastguard Worker;
134*7594170eSAndroid Build Coastguard Worker
135*7594170eSAndroid Build Coastguard Worker# Returns the names of modules of type $arg
136*7594170eSAndroid Build Coastguard Workerdef modulesOfType($arg):
137*7594170eSAndroid Build Coastguard Worker  [.[] | select(.Type == $arg) | .Name] | unique
138*7594170eSAndroid Build Coastguard Worker;
139*7594170eSAndroid Build Coastguard Worker
140*7594170eSAndroid Build Coastguard Worker# Returns the modules in the transitive closure of $arg.
141*7594170eSAndroid Build Coastguard Worker# $arg must be an array of modules names
142*7594170eSAndroid Build Coastguard Workerdef fullTransitiveDeps($arg):
143*7594170eSAndroid Build Coastguard Worker  [((moduleGraphNoVariants | removeSelfEdges) as $m |
144*7594170eSAndroid Build Coastguard Worker  $arg |
145*7594170eSAndroid Build Coastguard Worker  transitiveDeps($m)) as $names |
146*7594170eSAndroid Build Coastguard Worker  .[] |
147*7594170eSAndroid Build Coastguard Worker  select (IN(.Name; $names | .[]))] |
148*7594170eSAndroid Build Coastguard Worker  sort_by(.Name)
149*7594170eSAndroid Build Coastguard Worker;
150