in multiversion/src/main/scala/multiversion/commands/ExportCommand.scala [426:478]
private def lintEvictedDeclaredDependencies(
originalThirdParty: ThirdpartyConfig,
originalIndex: ResolutionIndex,
index: ResolutionIndex,
failOnEvictedDeclared: Boolean
): Result[Unit] = {
def selectedDependencyOf(config: DependencyConfig): Dependency = {
val originalDependency = config.toCoursierDependency(originalThirdParty.scala)
// The original dependency could have been evicted after the first resolution already,
// and not appear in `index` at all.
val selectedDependency =
if (index.dependencies.contains(config.id)) originalDependency
else originalIndex.reconciledDependency(originalDependency)
index.reconciledDependency(selectedDependency)
}
def targetsDependingOn(dep: Dependency): Set[String] = {
val needleRepr = dep.repr
val ids = index.dependencies.collect {
case (id, dependencies) if dependencies.exists(_.repr == needleRepr) => id
}.toSet
originalThirdParty.dependencies
.collect {
case cfg if ids.contains(cfg.id) =>
cfg.targets
}
.flatten
.toSet
}
val diagnostics =
for {
dependency <- originalThirdParty.dependencies
declaringTargets = dependency.targets
declaredVersion = dependency.version
declaredDependency = dependency.toCoursierDependency(originalThirdParty.scala)
selectedDependency = selectedDependencyOf(dependency)
if declaredDependency.version != selectedDependency.version && dependency.force
breakingTargets = targetsDependingOn(selectedDependency) -- declaringTargets
severity =
if (dependency.url.isDefined || failOnEvictedDeclared) ErrorSeverity else WarningSeverity
} yield new EvictedDeclaredDependencyDiagnostic(
declaredDependency,
declaringTargets,
selectedDependency,
breakingTargets,
hasUrl = dependency.url.isDefined,
severity,
dependency.organization.position
)
app.reportOrElse(diagnostics, ())
}