From 1f1067b4830533615a724bb2634c982067a6392f Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 23 Feb 2016 20:15:24 +0100 Subject: [PATCH 1/2] Add support for sbt.override.build.repos flag Fixes https://github.com/alexarchambault/coursier/issues/134 --- .../src/main/scala-2.10/coursier/Tasks.scala | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/plugin/src/main/scala-2.10/coursier/Tasks.scala b/plugin/src/main/scala-2.10/coursier/Tasks.scala index 3804105c0..96582b6fd 100644 --- a/plugin/src/main/scala-2.10/coursier/Tasks.scala +++ b/plugin/src/main/scala-2.10/coursier/Tasks.scala @@ -23,15 +23,24 @@ import scalaz.concurrent.{ Task, Strategy } object Tasks { - def coursierResolversTask: Def.Initialize[sbt.Task[Seq[Resolver]]] = Def.task { - var resolvers = externalResolvers.value - if (sbtPlugin.value) - resolvers = Seq( - sbtResolver.value, - Classpaths.sbtPluginReleases - ) ++ resolvers - resolvers - } + def coursierResolversTask: Def.Initialize[sbt.Task[Seq[Resolver]]] = + ( + externalResolvers, + sbtPlugin, + sbtResolver, + bootResolvers, + overrideBuildResolvers + ).map { (extRes, isSbtPlugin, sbtRes, bootResOpt, overrideFlag) => + bootResOpt.filter(_ => overrideFlag).getOrElse { + var resolvers = extRes + if (isSbtPlugin) + resolvers = Seq( + sbtRes, + Classpaths.sbtPluginReleases + ) ++ resolvers + resolvers + } + } def coursierProjectTask: Def.Initialize[sbt.Task[Project]] = ( From 79b4be89bcbbc753b53fea3b3c40c5a06e04953e Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Tue, 23 Feb 2016 20:15:25 +0100 Subject: [PATCH 2/2] Escape characters in cache path Fixes https://github.com/alexarchambault/coursier/issues/133 --- cache/src/main/scala/coursier/Cache.scala | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/cache/src/main/scala/coursier/Cache.scala b/cache/src/main/scala/coursier/Cache.scala index 846828393..a060e37e6 100644 --- a/cache/src/main/scala/coursier/Cache.scala +++ b/cache/src/main/scala/coursier/Cache.scala @@ -19,6 +19,26 @@ object Cache { // Check SHA-1 if available, else be fine with no checksum val defaultChecksums = Seq(Some("SHA-1"), None) + private val unsafeChars: Set[Char] = " %$&+,:;=?@<>#".toSet + + // Scala version of http://stackoverflow.com/questions/4571346/how-to-encode-url-to-avoid-special-characters-in-java/4605848#4605848 + // '/' was removed from the unsafe character list + private def escape(input: String): String = { + + def toHex(ch: Int) = + (if (ch < 10) '0' + ch else 'A' + ch - 10).toChar + + def isUnsafe(ch: Char) = + ch > 128 || ch < 0 || unsafeChars(ch) + + input.flatMap { + case ch if isUnsafe(ch) => + "%" + toHex(ch / 16) + toHex(ch % 16) + case other => + other.toString + } + } + private def withLocal(artifact: Artifact, cache: Seq[(String, File)]): Artifact = { def local(url: String) = if (url.startsWith("file:///")) @@ -28,7 +48,7 @@ object Cache { else { val localPathOpt = cache.collectFirst { case (base, cacheDir) if url.startsWith(base) => - cacheDir + "/" + url.stripPrefix(base) + cacheDir.toString + "/" + escape(url.stripPrefix(base)) } localPathOpt.getOrElse {