diff --git a/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala b/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala index 04c5979e5..e9ef4f01f 100644 --- a/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala +++ b/plugin/src/main/scala-2.10/coursier/CoursierPlugin.scala @@ -19,6 +19,7 @@ object CoursierPlugin extends AutoPlugin { val coursierSourceRepositories = Keys.coursierSourceRepositories val coursierResolvers = Keys.coursierResolvers val coursierSbtResolvers = Keys.coursierSbtResolvers + val coursierUseSbtCredentials = Keys.coursierUseSbtCredentials val coursierCredentials = Keys.coursierCredentials val coursierFallbackDependencies = Keys.coursierFallbackDependencies val coursierCache = Keys.coursierCache @@ -62,6 +63,7 @@ object CoursierPlugin extends AutoPlugin { coursierSourceRepositories := Nil, coursierResolvers <<= Tasks.coursierResolversTask, coursierSbtResolvers <<= externalResolvers in updateSbtClassifiers, + coursierUseSbtCredentials := true, coursierCredentials := Map.empty, coursierFallbackDependencies <<= Tasks.coursierFallbackDependenciesTask, coursierCache := Cache.default, diff --git a/plugin/src/main/scala-2.10/coursier/Keys.scala b/plugin/src/main/scala-2.10/coursier/Keys.scala index 995f74084..4c5e20a52 100644 --- a/plugin/src/main/scala-2.10/coursier/Keys.scala +++ b/plugin/src/main/scala-2.10/coursier/Keys.scala @@ -18,6 +18,7 @@ object Keys { val coursierSourceRepositories = SettingKey[Seq[File]]("coursier-source-repositories") val coursierResolvers = TaskKey[Seq[Resolver]]("coursier-resolvers") val coursierSbtResolvers = TaskKey[Seq[Resolver]]("coursier-sbt-resolvers") + val coursierUseSbtCredentials = SettingKey[Boolean]("coursier-use-sbt-credentials") val coursierCredentials = TaskKey[Map[String, Credentials]]("coursier-credentials") val coursierCache = SettingKey[File]("coursier-cache") diff --git a/plugin/src/main/scala-2.10/coursier/Tasks.scala b/plugin/src/main/scala-2.10/coursier/Tasks.scala index e8fe7551f..10cf1758d 100644 --- a/plugin/src/main/scala-2.10/coursier/Tasks.scala +++ b/plugin/src/main/scala-2.10/coursier/Tasks.scala @@ -5,7 +5,7 @@ import java.net.URL import java.nio.file.Files import java.util.concurrent.Executors -import coursier.core.Publication +import coursier.core.{ Authentication, Publication } import coursier.ivy.IvyRepository import coursier.Keys._ import coursier.Structure._ @@ -19,6 +19,7 @@ import sbt.Keys._ import scala.collection.mutable import scala.collection.JavaConverters._ +import scala.util.Try import scalaz.{ \/-, -\/ } import scalaz.concurrent.{ Task, Strategy } @@ -371,7 +372,18 @@ object Tasks { "ivy.home" -> (new File(sys.props("user.home")).toURI.getPath + ".ivy2") ) ++ sys.props - val credentials = coursierCredentials.value + val useSbtCredentials = coursierUseSbtCredentials.value + + val authenticationByHost = + if (useSbtCredentials) { + val cred = sbt.Keys.credentials.value.map(sbt.Credentials.toDirect) + cred.map { c => + c.host -> Authentication(c.userName, c.passwd) + }.toMap + } else + Map.empty[String, Authentication] + + val authenticationByRepositoryId = coursierCredentials.value.mapValues(_.authentication) val sourceRepositories0 = sourceRepositories.map { base => @@ -392,6 +404,36 @@ object Tasks { ) } + def withAuthenticationByHost(repo: Repository, credentials: Map[String, Authentication]): Repository = { + + def httpHost(s: String) = + if (s.startsWith("http://") || s.startsWith("https://")) + Try(Cache.url(s).getHost).toOption + else + None + + repo match { + case m: MavenRepository => + if (m.authentication.isEmpty) + httpHost(m.root).flatMap(credentials.get).fold(m) { auth => + m.copy(authentication = Some(auth)) + } + else + m + case i: IvyRepository => + if (i.authentication.isEmpty) { + val base = i.pattern.takeWhile(c => c != '[' && c != '(' && c != '$') + + httpHost(base).flatMap(credentials.get).fold(i) { auth => + i.copy(authentication = Some(auth)) + } + } else + i + case _ => + repo + } + } + val repositories = Seq(globalPluginsRepo, interProjectRepo) ++ sourceRepositories0 ++ @@ -400,9 +442,9 @@ object Tasks { resolver, ivyProperties, log, - credentials.get(resolver.name).map(_.authentication) + authenticationByRepositoryId.get(resolver.name) ) - } ++ + }.map(withAuthenticationByHost(_, authenticationByHost)) ++ fallbackDependenciesRepositories def resolution = { diff --git a/plugin/src/sbt-test/sbt-coursier/credentials-sbt/build.sbt b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/build.sbt new file mode 100644 index 000000000..132e5248f --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/build.sbt @@ -0,0 +1,14 @@ +scalaVersion := "2.11.8" + +resolvers += "authenticated" at "http://localhost:8080" + +credentials += Credentials("", "localhost", "user", "pass") + +coursierCachePolicies := { + if (sys.props("os.name").startsWith("Windows")) + coursierCachePolicies.value + else + Seq(coursier.CachePolicy.ForceDownload) +} + +libraryDependencies += "com.abc" % "test" % "0.1" diff --git a/plugin/src/sbt-test/sbt-coursier/credentials-sbt/project/plugins.sbt b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/project/plugins.sbt new file mode 100644 index 000000000..152225a9e --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/project/plugins.sbt @@ -0,0 +1,11 @@ +{ + val pluginVersion = sys.props.getOrElse( + "plugin.version", + throw new RuntimeException( + """|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin + ) + ) + + addSbtPlugin("io.get-coursier" % "sbt-coursier" % pluginVersion) +} diff --git a/plugin/src/sbt-test/sbt-coursier/credentials-sbt/src/main/scala/Main.scala b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/src/main/scala/Main.scala new file mode 100644 index 000000000..86ae9e9e3 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/src/main/scala/Main.scala @@ -0,0 +1 @@ +object Main extends App \ No newline at end of file diff --git a/plugin/src/sbt-test/sbt-coursier/credentials-sbt/test b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/test new file mode 100644 index 000000000..4d96ce4c9 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/credentials-sbt/test @@ -0,0 +1 @@ +> coursierResolution