aboutsummaryrefslogtreecommitdiff
path: root/stage1
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-04-26 18:58:04 -0400
committerChristopher Vogt <oss.nsp@cvogt.org>2016-04-28 13:33:20 -0400
commit56d780d05604cb8bb49c691889c398f1e570cb91 (patch)
treeb4b3ec72c72ed171bbbf34900a0e8ebf6e1e5977 /stage1
parent13c0f445f48fbea1398ca6340ea4cdd8dcb6bfb0 (diff)
downloadcbt-56d780d05604cb8bb49c691889c398f1e570cb91.tar.gz
cbt-56d780d05604cb8bb49c691889c398f1e570cb91.tar.bz2
cbt-56d780d05604cb8bb49c691889c398f1e570cb91.zip
Speedup transitiveDependencies computation by removing duplicate versions and doing less string processing
Diffstat (limited to 'stage1')
-rw-r--r--stage1/resolver.scala29
1 files changed, 19 insertions, 10 deletions
diff --git a/stage1/resolver.scala b/stage1/resolver.scala
index b19255a..ab2a18f 100644
--- a/stage1/resolver.scala
+++ b/stage1/resolver.scala
@@ -157,10 +157,16 @@ abstract class Dependency{
private object transitiveDependenciesCache extends Cache[Seq[Dependency]]
/** return dependencies in order of linearized dependence. this is a bit tricky. */
def transitiveDependencies: Seq[Dependency] = transitiveDependenciesCache{
- val deps = linearize(dependencies)
- val hasInfo = deps.collect{ case d:ArtifactInfo => d }
- val noInfo = deps.filter{
- case _:ArtifactInfo => false
+ // FIXME: this is probably wrong too eager.
+ // We should consider replacing versions during traversals already
+ // not just replace after traversals, because that could mean we
+ // pulled down dependencies current versions don't even rely
+ // on anymore.
+
+ val deps: Seq[Dependency] = linearize(dependencies).reverse.distinct.reverse
+ val hasInfo: Seq[Dependency with ArtifactInfo] = deps.collect{ case d:Dependency with ArtifactInfo => d }
+ val noInfo: Seq[Dependency] = deps.filter{
+ case _:Dependency with ArtifactInfo => false
case _ => true
}
noInfo ++ BoundMavenDependency.updateOutdated( hasInfo ).reverse.distinct
@@ -429,9 +435,9 @@ case class BoundMavenDependency(
}
object BoundMavenDependency{
def ValidIdentifier = "^([A-Za-z0-9_\\-.]+)$".r // according to maven's DefaultModelValidator.java
- def semanticVersionLessThan(left: String, right: String) = {
+ def semanticVersionLessThan(left: Array[Either[Int,String]], right: Array[Either[Int,String]]) = {
// FIXME: this ignores ends when different size
- val zipped = left.split("\\.|\\-").map(toInt) zip right.split("\\.|\\-").map(toInt)
+ val zipped = left zip right
val res = zipped.map {
case (Left(i),Left(j)) => i compare j
case (Right(i),Right(j)) => i compare j
@@ -447,13 +453,16 @@ object BoundMavenDependency{
}
/* this obviously should be overridable somehow */
def updateOutdated(
- deps: Seq[ArtifactInfo],
- versionLessThan: (String, String) => Boolean = semanticVersionLessThan
- )(implicit logger: Logger): Seq[ArtifactInfo] = {
+ deps: Seq[Dependency with ArtifactInfo],
+ versionLessThan: (Array[Either[Int,String]], Array[Either[Int,String]]) => Boolean = semanticVersionLessThan
+ )(implicit logger: Logger): Seq[Dependency with ArtifactInfo] = {
val latest = deps
.groupBy( d => (d.groupId, d.artifactId) )
.mapValues(
- _.sortBy( _.version )( Ordering.fromLessThan(versionLessThan) )
+ _.groupBy(_.version) // remove duplicates
+ .map( _._2.head )
+ .toVector
+ .sortBy( _.version.split("\\.|\\-").map(toInt) )( Ordering.fromLessThan(versionLessThan) )
.last
)
deps.map{