Give slow resolvers a lower priority

This commit is contained in:
Alexandre Archambault 2017-06-24 15:43:37 +02:00
parent 8d1ff10914
commit a91b955a9f
3 changed files with 43 additions and 2 deletions

View File

@ -21,6 +21,7 @@ object CoursierPlugin extends AutoPlugin {
val coursierVerbosity = Keys.coursierVerbosity
val mavenProfiles = Keys.mavenProfiles
val coursierResolvers = Keys.coursierResolvers
val coursierReorderResolvers = Keys.coursierReorderResolvers
val coursierRecursiveResolvers = Keys.coursierRecursiveResolvers
val coursierSbtResolvers = Keys.coursierSbtResolvers
val coursierUseSbtCredentials = Keys.coursierUseSbtCredentials
@ -171,7 +172,8 @@ object CoursierPlugin extends AutoPlugin {
mavenProfiles := Set.empty,
coursierUseSbtCredentials := true,
coursierCredentials := Map.empty,
coursierCache := Cache.default
coursierCache := Cache.default,
coursierReorderResolvers := true
)
override lazy val projectSettings = coursierSettings(None, Seq(Compile, Test).map(c => c -> c.name)) ++

View File

@ -23,6 +23,10 @@ object Keys {
val mavenProfiles = SettingKey[Set[String]]("maven-profiles")
val coursierReorderResolvers = SettingKey[Boolean](
"coursier-reorder-resolvers",
"Whether resolvers should be re-ordered so that typically slow ones are given a lower priority"
)
val coursierResolvers = TaskKey[Seq[Resolver]]("coursier-resolvers")
val coursierRecursiveResolvers = TaskKey[Seq[Resolver]]("coursier-recursive-resolvers", "Resolvers of the current project, plus those of all from its inter-dependency projects")
val coursierSbtResolvers = TaskKey[Seq[Resolver]]("coursier-sbt-resolvers")

View File

@ -44,15 +44,44 @@ object Tasks {
structure(state).allProjectRefs.filter(p => deps(p.project))
}
private val slowReposBase = Seq(
"https://repo.typesafe.com/",
"https://repo.scala-sbt.org/",
"http://repo.typesafe.com/",
"http://repo.scala-sbt.org/"
)
private val fastReposBase = Seq(
"http://repo1.maven.org/",
"https://repo1.maven.org/"
)
def coursierResolversTask: Def.Initialize[sbt.Task[Seq[Resolver]]] = Def.task {
def url(res: Resolver): Option[String] =
res match {
case m: SbtCompatibility.MavenRepository =>
Some(m.root)
case u: sbt.URLRepository =>
u.patterns.artifactPatterns.headOption
.orElse(u.patterns.ivyPatterns.headOption)
case _ =>
None
}
def fastRepo(res: Resolver): Boolean =
url(res).exists(u => fastReposBase.exists(u.startsWith))
def slowRepo(res: Resolver): Boolean =
url(res).exists(u => slowReposBase.exists(u.startsWith))
val extRes = externalResolvers.value
val isSbtPlugin = sbtPlugin.value
val sbtRes = sbtResolver.value
val bootResOpt = bootResolvers.value
val overrideFlag = overrideBuildResolvers.value
val reorderResolvers = coursierReorderResolvers.value
bootResOpt.filter(_ => overrideFlag).getOrElse {
val result = bootResOpt.filter(_ => overrideFlag).getOrElse {
var resolvers = extRes
if (isSbtPlugin)
resolvers = Seq(
@ -61,6 +90,12 @@ object Tasks {
) ++ resolvers
resolvers
}
if (reorderResolvers && result.exists(fastRepo) && result.exists(slowRepo)) {
val (slow, other) = result.partition(slowRepo)
other ++ slow
} else
result
}
def coursierRecursiveResolversTask: Def.Initialize[sbt.Task[Seq[Resolver]]] =