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