diff --git a/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala b/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala index d967a06f6..f48b6bc11 100644 --- a/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala +++ b/sbt-coursier/src/main/scala/coursier/CoursierPlugin.scala @@ -18,6 +18,7 @@ object CoursierPlugin extends AutoPlugin { val coursierArtifactsChecksums = Keys.coursierArtifactsChecksums val coursierCachePolicies = Keys.coursierCachePolicies val coursierTtl = Keys.coursierTtl + val coursierKeepPreloaded = Keys.coursierKeepPreloaded val coursierVerbosity = Keys.coursierVerbosity val mavenProfiles = Keys.mavenProfiles val coursierResolvers = Keys.coursierResolvers @@ -138,6 +139,11 @@ object CoursierPlugin extends AutoPlugin { } ) + private val preloadedBase = { + val rawPattern = "file:///${sbt.preloaded-${sbt.global.base-${user.home}/.sbt}/preloaded/}" + Tasks.exceptionPatternParser().apply(rawPattern).string + } + def coursierSettings( shadedConfigOpt: Option[(String, String)], packageConfigs: Seq[(Configuration, String)] @@ -162,10 +168,18 @@ object CoursierPlugin extends AutoPlugin { case _ => false } - if (pluginIvySnapshotsFound && !resolvers.contains(Classpaths.sbtPluginReleases)) - resolvers :+ Classpaths.sbtPluginReleases + val resolvers0 = + if (pluginIvySnapshotsFound && !resolvers.contains(Classpaths.sbtPluginReleases)) + resolvers :+ Classpaths.sbtPluginReleases + else + resolvers + + if (coursierKeepPreloaded.value) + resolvers0 else - resolvers + resolvers0.filter { r => + !r.name.startsWith("local-preloaded") + } }, coursierFallbackDependencies := Tasks.coursierFallbackDependenciesTask.value, coursierArtifacts := Tasks.artifactFilesOrErrors(withClassifiers = false).value, @@ -275,7 +289,8 @@ object CoursierPlugin extends AutoPlugin { coursierUseSbtCredentials := true, coursierCredentials := Map.empty, coursierCache := Cache.default, - coursierReorderResolvers := true + coursierReorderResolvers := true, + coursierKeepPreloaded := false ) 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 ef3d909ab..d195e36e3 100644 --- a/sbt-coursier/src/main/scala/coursier/Keys.scala +++ b/sbt-coursier/src/main/scala/coursier/Keys.scala @@ -18,6 +18,7 @@ object Keys { val coursierArtifactsChecksums = SettingKey[Seq[Option[String]]]("coursier-artifacts-checksums") val coursierCachePolicies = SettingKey[Seq[CachePolicy]]("coursier-cache-policies") val coursierTtl = SettingKey[Option[Duration]]("coursier-ttl") + val coursierKeepPreloaded = SettingKey[Boolean]("coursier-keep-preloaded", "Whether to take into account sbt preloaded repositories or not") val coursierVerbosity = SettingKey[Int]("coursier-verbosity") diff --git a/sbt-coursier/src/main/scala/coursier/Tasks.scala b/sbt-coursier/src/main/scala/coursier/Tasks.scala index d29bba4b6..ba213d7c5 100644 --- a/sbt-coursier/src/main/scala/coursier/Tasks.scala +++ b/sbt-coursier/src/main/scala/coursier/Tasks.scala @@ -99,12 +99,21 @@ object Tasks { Def.task { val result = resultTask.value val reorderResolvers = coursierReorderResolvers.value + val keepPreloaded = coursierKeepPreloaded.value - if (reorderResolvers && result.exists(fastRepo) && result.exists(slowRepo)) { - val (slow, other) = result.partition(slowRepo) - other ++ slow - } else - result + val result0 = + if (reorderResolvers && result.exists(fastRepo) && result.exists(slowRepo)) { + val (slow, other) = result.partition(slowRepo) + other ++ slow + } else + result + + if (keepPreloaded) + result0 + else + result0.filter { r => + !r.name.startsWith("local-preloaded") + } } } @@ -423,7 +432,7 @@ object Tasks { private def createLogger() = new TermDisplay(new OutputStreamWriter(System.err)) - private def globalPluginPatterns(sbtVersion: String): Seq[coursier.ivy.Pattern] = { + private[coursier] def exceptionPatternParser(): String => coursier.ivy.Pattern = { val props = sys.props.toMap @@ -438,21 +447,25 @@ object Tasks { addUriProp("sbt.global.base") addUriProp("user.home") - def pattern(s: String): coursier.ivy.Pattern = { - val p = PropertiesPattern.parse(s) match { - case -\/(err) => - throw new Exception(s"Cannot parse pattern $s: $err") - case \/-(p) => - p - } + { + s => + val p = PropertiesPattern.parse(s) match { + case -\/(err) => + throw new Exception(s"Cannot parse pattern $s: $err") + case \/-(p) => + p + } - p.substituteProperties(props ++ extraProps) match { - case -\/(err) => - throw new Exception(err) - case \/-(p) => - p - } + p.substituteProperties(props ++ extraProps) match { + case -\/(err) => + throw new Exception(err) + case \/-(p) => + p + } } + } + + private def globalPluginPatterns(sbtVersion: String): Seq[coursier.ivy.Pattern] = { // FIXME get the 0.13 automatically? val defaultRawPattern = s"$${sbt.global.base.uri-$${user.home.uri}/.sbt/$sbtVersion}/plugins/target" + @@ -468,7 +481,7 @@ object Tasks { Seq( defaultRawPattern, extraRawPattern - ).map(pattern) + ).map(exceptionPatternParser()) } def parentProjectCacheTask: Def.Initialize[sbt.Task[Map[Seq[sbt.Resolver],Seq[coursier.ProjectCache]]]] =