mirror of https://github.com/sbt/sbt.git
Get credentials from SBT key `credentials` if available
This commit is contained in:
parent
84d75655fa
commit
3045ebbfd0
|
|
@ -19,6 +19,7 @@ object CoursierPlugin extends AutoPlugin {
|
||||||
val coursierSourceRepositories = Keys.coursierSourceRepositories
|
val coursierSourceRepositories = Keys.coursierSourceRepositories
|
||||||
val coursierResolvers = Keys.coursierResolvers
|
val coursierResolvers = Keys.coursierResolvers
|
||||||
val coursierSbtResolvers = Keys.coursierSbtResolvers
|
val coursierSbtResolvers = Keys.coursierSbtResolvers
|
||||||
|
val coursierUseSbtCredentials = Keys.coursierUseSbtCredentials
|
||||||
val coursierCredentials = Keys.coursierCredentials
|
val coursierCredentials = Keys.coursierCredentials
|
||||||
val coursierFallbackDependencies = Keys.coursierFallbackDependencies
|
val coursierFallbackDependencies = Keys.coursierFallbackDependencies
|
||||||
val coursierCache = Keys.coursierCache
|
val coursierCache = Keys.coursierCache
|
||||||
|
|
@ -62,6 +63,7 @@ object CoursierPlugin extends AutoPlugin {
|
||||||
coursierSourceRepositories := Nil,
|
coursierSourceRepositories := Nil,
|
||||||
coursierResolvers <<= Tasks.coursierResolversTask,
|
coursierResolvers <<= Tasks.coursierResolversTask,
|
||||||
coursierSbtResolvers <<= externalResolvers in updateSbtClassifiers,
|
coursierSbtResolvers <<= externalResolvers in updateSbtClassifiers,
|
||||||
|
coursierUseSbtCredentials := true,
|
||||||
coursierCredentials := Map.empty,
|
coursierCredentials := Map.empty,
|
||||||
coursierFallbackDependencies <<= Tasks.coursierFallbackDependenciesTask,
|
coursierFallbackDependencies <<= Tasks.coursierFallbackDependenciesTask,
|
||||||
coursierCache := Cache.default,
|
coursierCache := Cache.default,
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ object Keys {
|
||||||
val coursierSourceRepositories = SettingKey[Seq[File]]("coursier-source-repositories")
|
val coursierSourceRepositories = SettingKey[Seq[File]]("coursier-source-repositories")
|
||||||
val coursierResolvers = TaskKey[Seq[Resolver]]("coursier-resolvers")
|
val coursierResolvers = TaskKey[Seq[Resolver]]("coursier-resolvers")
|
||||||
val coursierSbtResolvers = TaskKey[Seq[Resolver]]("coursier-sbt-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 coursierCredentials = TaskKey[Map[String, Credentials]]("coursier-credentials")
|
||||||
|
|
||||||
val coursierCache = SettingKey[File]("coursier-cache")
|
val coursierCache = SettingKey[File]("coursier-cache")
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@ import java.net.URL
|
||||||
import java.nio.file.Files
|
import java.nio.file.Files
|
||||||
import java.util.concurrent.Executors
|
import java.util.concurrent.Executors
|
||||||
|
|
||||||
import coursier.core.Publication
|
import coursier.core.{ Authentication, Publication }
|
||||||
import coursier.ivy.IvyRepository
|
import coursier.ivy.IvyRepository
|
||||||
import coursier.Keys._
|
import coursier.Keys._
|
||||||
import coursier.Structure._
|
import coursier.Structure._
|
||||||
|
|
@ -19,6 +19,7 @@ import sbt.Keys._
|
||||||
|
|
||||||
import scala.collection.mutable
|
import scala.collection.mutable
|
||||||
import scala.collection.JavaConverters._
|
import scala.collection.JavaConverters._
|
||||||
|
import scala.util.Try
|
||||||
|
|
||||||
import scalaz.{ \/-, -\/ }
|
import scalaz.{ \/-, -\/ }
|
||||||
import scalaz.concurrent.{ Task, Strategy }
|
import scalaz.concurrent.{ Task, Strategy }
|
||||||
|
|
@ -371,7 +372,18 @@ object Tasks {
|
||||||
"ivy.home" -> (new File(sys.props("user.home")).toURI.getPath + ".ivy2")
|
"ivy.home" -> (new File(sys.props("user.home")).toURI.getPath + ".ivy2")
|
||||||
) ++ sys.props
|
) ++ 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 {
|
val sourceRepositories0 = sourceRepositories.map {
|
||||||
base =>
|
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 =
|
val repositories =
|
||||||
Seq(globalPluginsRepo, interProjectRepo) ++
|
Seq(globalPluginsRepo, interProjectRepo) ++
|
||||||
sourceRepositories0 ++
|
sourceRepositories0 ++
|
||||||
|
|
@ -400,9 +442,9 @@ object Tasks {
|
||||||
resolver,
|
resolver,
|
||||||
ivyProperties,
|
ivyProperties,
|
||||||
log,
|
log,
|
||||||
credentials.get(resolver.name).map(_.authentication)
|
authenticationByRepositoryId.get(resolver.name)
|
||||||
)
|
)
|
||||||
} ++
|
}.map(withAuthenticationByHost(_, authenticationByHost)) ++
|
||||||
fallbackDependenciesRepositories
|
fallbackDependenciesRepositories
|
||||||
|
|
||||||
def resolution = {
|
def resolution = {
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -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)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
object Main extends App
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
> coursierResolution
|
||||||
Loading…
Reference in New Issue