in multiversion/src/main/scala/multiversion/configs/ThirdpartyConfig.scala [91:130]
def relaxedForAllModules: Seq[(ModuleMatchers, Reconciliation)] =
Vector((ModuleMatchers.all, Reconciliation.Relaxed))
/** Collect all the root dependencies to resolve together. */
def rootDependencies(
root: DependencyConfig,
previousIndex: Option[ResolutionIndex]
): Seq[Dependency] = {
val seen = mutable.Set.empty[String]
val roots = mutable.Buffer.empty[Dependency]
val queue = mutable.Queue(root)
while (queue.nonEmpty) {
val current = queue.dequeue()
roots += current.toCoursierDependency(scala)
current.dependencies.foreach { dep =>
if (seen.add(dep)) {
depsByTargets
.getOrElse(dep, Nil)
.foreach(d => queue.enqueue(d))
}
}
}
// Use a previous index to explicitly resolve selected versions of transitive
// dependencies. This is necessary to pick up the transitive dependencies of the selected
// versions of our dependencies.
// For instance, if A depends on D v1, but D v1 is evicted in favor of D v2 and D v2 has a
// dependency on E, which D v1 didn't have, then resolving A along with D v2 will ensure
// that E will end up on the classpath of A.
previousIndex.foreach { index =>
index.dependencies
.getOrElse(root.id, Nil)
.foreach { d =>
val reconciledVersion = index.reconciledVersion(d)
if (reconciledVersion != d.version) {
roots += d.withVersion(reconciledVersion)
}
}
}
roots
}