try breaking circular dependency and continue sorting

This commit is contained in:
Eugene Yokota 2015-07-26 23:19:16 -04:00
parent ddf941f371
commit 4e69d04be8
1 changed files with 12 additions and 6 deletions

View File

@ -407,7 +407,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
}: _*) }: _*)
// sort the all modules such that less called modules comes earlier // sort the all modules such that less called modules comes earlier
@tailrec def sortModules(cs: Vector[(String, String)], @tailrec def sortModules(cs: Vector[(String, String)],
acc: Vector[(String, String)], acc: Vector[(String, String)], extra: Vector[(String, String)],
n: Int, guard: Int): Vector[(String, String)] = n: Int, guard: Int): Vector[(String, String)] =
{ {
// println(s"sortModules: $n / $guard") // println(s"sortModules: $n / $guard")
@ -423,12 +423,18 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
} }
} }
} }
lazy val result0 = acc ++ notCalled ++ called lazy val result0 = acc ++ notCalled ++ called ++ extra
def warnCircular(): Unit = {
log.warn(s"""avoid circular dependency while using cached resolution: ${cs.mkString(",")}""")
}
(if (n > guard) { (if (n > guard) {
log.warn(s"""cached resolution detected circular dependencies: ${cs.mkString(",")}""") warnCircular
result0 result0
} else if (called.isEmpty || notCalled.isEmpty) result0 } else if (called.isEmpty) result0
else sortModules(called, acc ++ notCalled, 0, called.size * called.size + 1)) else if (notCalled.isEmpty) {
warnCircular
sortModules(cs.tail, acc, extra :+ cs.head, n + 1, guard)
} else sortModules(called, acc ++ notCalled, extra, 0, called.size * called.size + 1))
} }
def resolveConflicts(cs: List[(String, String)], def resolveConflicts(cs: List[(String, String)],
allModules: Map[(String, String), Vector[OrganizationArtifactReport]]): List[OrganizationArtifactReport] = allModules: Map[(String, String), Vector[OrganizationArtifactReport]]): List[OrganizationArtifactReport] =
@ -456,7 +462,7 @@ private[sbt] trait CachedResolutionResolveEngine extends ResolveEngine {
} }
} }
val guard0 = (orgNamePairs.size * orgNamePairs.size) + 1 val guard0 = (orgNamePairs.size * orgNamePairs.size) + 1
val sorted: Vector[(String, String)] = sortModules(orgNamePairs, Vector(), 0, guard0) val sorted: Vector[(String, String)] = sortModules(orgNamePairs, Vector(), Vector(), 0, guard0)
val result = resolveConflicts(sorted.toList, allModules0) val result = resolveConflicts(sorted.toList, allModules0)
result.toVector result.toVector
} }