From a91b955a9ff7765740b35eae2c286ad55d2b58d4 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 24 Jun 2017 15:43:37 +0200 Subject: [PATCH] Give slow resolvers a lower priority --- .../main/scala/coursier/CoursierPlugin.scala | 4 +- .../src/main/scala/coursier/Keys.scala | 4 ++ .../src/main/scala/coursier/Tasks.scala | 37 ++++++++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) diff --git a/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala b/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala index 9946875a6..d66bffea5 100644 --- a/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala +++ b/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala @@ -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)) ++ diff --git a/sbt-coursier/src/main/scala/coursier/Keys.scala b/sbt-coursier/src/main/scala/coursier/Keys.scala index c421d89d3..ef3d909ab 100644 --- a/sbt-coursier/src/main/scala/coursier/Keys.scala +++ b/sbt-coursier/src/main/scala/coursier/Keys.scala @@ -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") diff --git a/sbt-coursier/src/main/scala/coursier/Tasks.scala b/sbt-coursier/src/main/scala/coursier/Tasks.scala index 3699a8121..a51947a85 100644 --- a/sbt-coursier/src/main/scala/coursier/Tasks.scala +++ b/sbt-coursier/src/main/scala/coursier/Tasks.scala @@ -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]]] =