in maven-resolver-util/src/main/java/org/eclipse/aether/util/graph/transformer/ConflictIdSorter.java [127:171]
private int topsortConflictIds(Collection<ConflictId> conflictIds, DependencyGraphTransformationContext context) {
List<Object> sorted = new ArrayList<>(conflictIds.size());
RootQueue roots = new RootQueue(conflictIds.size() / 2);
for (ConflictId id : conflictIds) {
if (id.inDegree <= 0) {
roots.add(id);
}
}
processRoots(sorted, roots);
boolean cycle = sorted.size() < conflictIds.size();
while (sorted.size() < conflictIds.size()) {
// cycle -> deal gracefully with nodes still having positive in-degree
ConflictId nearest = null;
for (ConflictId id : conflictIds) {
if (id.inDegree <= 0) {
continue;
}
if (nearest == null
|| id.minDepth < nearest.minDepth
|| (id.minDepth == nearest.minDepth && id.inDegree < nearest.inDegree)) {
nearest = id;
}
}
nearest.inDegree = 0;
roots.add(nearest);
processRoots(sorted, roots);
}
Collection<Collection<Object>> cycles = Collections.emptySet();
if (cycle) {
cycles = findCycles(conflictIds);
}
context.put(TransformationContextKeys.SORTED_CONFLICT_IDS, sorted);
context.put(TransformationContextKeys.CYCLIC_CONFLICT_IDS, cycles);
return cycles.size();
}