in multiversion/src/main/scala/multiversion/commands/ExportCommand.scala [515:581]
def lintPostResolution(index: ResolutionIndex): Result[Unit] = {
val errors = for {
(module, deps0) <- index.allDependencies.toList
deps = deps0.map(_._1)
allVersions = deps.map { d => index.reconciledVersion(d) }
if allVersions.size > 1
diagnostic <- index.thirdparty.depsByModule.get(module) match {
case Some(declaredDeps) =>
val allDeclaredVersions = declaredDeps.flatMap(_.allVersions)
val unspecified = (allVersions -- allDeclaredVersions).toList
unspecified match {
case Nil =>
Nil
case _ =>
val pos = declaredDeps
.collectFirst {
case d if !d.organization.position.isNone =>
d.organization.position
}
.getOrElse(NoPosition)
val rootsForVersions: Map[String, Set[Dependency]] =
Map(
allVersions.toList.map(v =>
v ->
deps.filter(_.version == v).flatMap(index.roots).toSet
): _*
)
val sortedVersions = allVersions.toVector
.sortBy(v => Version(v))
.sortBy(v => rootsForVersions(v).size)
.reverse
val popularVersion = sortedVersions.head
val okRoots = rootsForVersions(popularVersion)
val okDepsConfig =
okRoots.flatMap(d => index.thirdparty.depsByModule(d.module))
val unpopularRoots =
allVersions
.filter(_ != popularVersion)
.flatMap(rootsForVersions)
.toList
.sortBy(_.toString)
val unpopularDepsConfig =
unpopularRoots.flatMap(d => index.thirdparty.depsByModule(d.module))
List(
new ConflictingTransitiveDependencyDiagnostic(
module,
unspecified.toList,
declaredDeps,
popularVersion,
okRoots.toList,
okDepsConfig.toList,
unpopularRoots,
unpopularDepsConfig,
pos
)
)
}
case None =>
Nil
}
if diagnostic.declaredVersions.nonEmpty
} yield diagnostic
Diagnostic.fromDiagnostics(errors) match {
case Some(diagnostic) => ErrorResult(diagnostic)
case None => ValueResult(())
}
}