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