mirror of https://github.com/sbt/sbt.git
commit
8ca951d2c2
|
|
@ -8,8 +8,10 @@ jdk:
|
||||||
install:
|
install:
|
||||||
- npm install xmldom
|
- npm install xmldom
|
||||||
- npm install xhr2
|
- npm install xhr2
|
||||||
script: project/travis.sh "$TRAVIS_SCALA_VERSION" "$TRAVIS_PULL_REQUEST" "$TRAVIS_BRANCH" "$(jdk_switcher home oraclejdk7)"
|
script: project/travis.sh "$TRAVIS_SCALA_VERSION" "$TRAVIS_PULL_REQUEST" "$TRAVIS_BRANCH"
|
||||||
|
"$(jdk_switcher home oraclejdk7)"
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- secure: miHFMwVRD/yjOLy794nOwc2lJTMyL5O0MXABT9ksg5ejQy1FrFVc2YH86Agp80W02/lGLGl0qWCiK1TBcs9q4Apt01nkD1a/0/iuTRm//bdhnu8BbRxFITf+2cyYJVytKPsF585aHldMv1rwZs3TDaTzEEecAEki5r50yyTVo7ycG0lVj9aVWXerKRMIT54Wb8M6nqbyRB1jGWT0ETNU13vOvQznPTUXQG5hsiKnGYRf8T3umOMdOHpV0rvdwYqAIMsikaAFcYCS5P/pLXMtmRHICH9KUG8TV/ST07p1BXtbBg9y1Q+lpnXotXh4ZNoWOp8B6v7fxJ/WlLYTDROWCiHJ4s2V4Di00db/nW4OWrEEBlrh7vJ/npZqyt9V9YeNv6alxi+DCESwusgvD4Cx5c3zh+2X6RB6BYwWHlFnd80rmsLe4R4fFUcc8E/ZR9vUFjP1CsQKqfJ5yfKR6V+n8jK8FjLpoaU9PHPo2H4V3FZM/fCLcxhE37vfaYI7/O7MqE/cdGpZIuz7g3c4toWCgNZJDn8iJCPmrgcbW5zbfDxvWU2K816ycgnUwSQ5dufrJpAbLNrjR1O8EPRkMDDp9bB7/4RVQvfDfP9GGoiHPHHgxGzY0Lf5bm+Bj1mRfB5/SXHd3IjhUCD9q7eD1/ANifEYALC5BJ4TB8RhQUPU8uM=
|
- secure: miHFMwVRD/yjOLy794nOwc2lJTMyL5O0MXABT9ksg5ejQy1FrFVc2YH86Agp80W02/lGLGl0qWCiK1TBcs9q4Apt01nkD1a/0/iuTRm//bdhnu8BbRxFITf+2cyYJVytKPsF585aHldMv1rwZs3TDaTzEEecAEki5r50yyTVo7ycG0lVj9aVWXerKRMIT54Wb8M6nqbyRB1jGWT0ETNU13vOvQznPTUXQG5hsiKnGYRf8T3umOMdOHpV0rvdwYqAIMsikaAFcYCS5P/pLXMtmRHICH9KUG8TV/ST07p1BXtbBg9y1Q+lpnXotXh4ZNoWOp8B6v7fxJ/WlLYTDROWCiHJ4s2V4Di00db/nW4OWrEEBlrh7vJ/npZqyt9V9YeNv6alxi+DCESwusgvD4Cx5c3zh+2X6RB6BYwWHlFnd80rmsLe4R4fFUcc8E/ZR9vUFjP1CsQKqfJ5yfKR6V+n8jK8FjLpoaU9PHPo2H4V3FZM/fCLcxhE37vfaYI7/O7MqE/cdGpZIuz7g3c4toWCgNZJDn8iJCPmrgcbW5zbfDxvWU2K816ycgnUwSQ5dufrJpAbLNrjR1O8EPRkMDDp9bB7/4RVQvfDfP9GGoiHPHHgxGzY0Lf5bm+Bj1mRfB5/SXHd3IjhUCD9q7eD1/ANifEYALC5BJ4TB8RhQUPU8uM=
|
||||||
- secure: 2/SSqa7A+aIzTJrMuqfK53QoHqes8HZPpIXUC9BH+bP2V2n7LqlFCnLZ9OSFfiJYfgeYMQDILpt8GTXHYc7JgM/N9xXpywrpYNDCYo7GMhqRyUPQOuK9044IRnZmme289Ut6ozHHptZUeZp/9DEUNZcPOxTN+KbzbHrUL+9l5BxnAxJ3e0HihxhmaINrla3T36EetdfINigarB9muyvuCRdRhZjwxsSF1fo5P+ZgWvAIDhPgNJH8eyjxHVbTabk7efPtWNWu0HjyOqJaIVk+TNjuQhvQPHKpYel0gVlCAfUjq7ZP8hZurfC6NjCFcnfTZ3d4R8GDcWJ47pgBWND8saIQOigNd7KHBPntD4fEJqgBSq3ZWakNBYzOtm8CxMGmiJHDCVqAEGzUG+lowN+SnPS2UluL3QtZ7oL/7MeJqCscH7sPwHtmZY+o0Muqo0ZJ2T2TzekQNYOAE7jeSzG1xOa/NNghny5fT+w6asPxfeolkMgyzuRFp1SLaLUf/XRV4fux0meGY9NIXso47xMSfAYVAAXT1FA2OOwmM1O4yvm3Ur95oEGDNw6z7MnWOSKS663WFwuw2cCaheCfAwvoa5jZUMWMbyUM/cBTgCaQdmETpvCzZzUr5Ls/nBXjyiTdJaQLZATr7HSGZHgYVmEAhVwBvuhTar/6VUZUMKGc2P4=
|
- secure: 2/SSqa7A+aIzTJrMuqfK53QoHqes8HZPpIXUC9BH+bP2V2n7LqlFCnLZ9OSFfiJYfgeYMQDILpt8GTXHYc7JgM/N9xXpywrpYNDCYo7GMhqRyUPQOuK9044IRnZmme289Ut6ozHHptZUeZp/9DEUNZcPOxTN+KbzbHrUL+9l5BxnAxJ3e0HihxhmaINrla3T36EetdfINigarB9muyvuCRdRhZjwxsSF1fo5P+ZgWvAIDhPgNJH8eyjxHVbTabk7efPtWNWu0HjyOqJaIVk+TNjuQhvQPHKpYel0gVlCAfUjq7ZP8hZurfC6NjCFcnfTZ3d4R8GDcWJ47pgBWND8saIQOigNd7KHBPntD4fEJqgBSq3ZWakNBYzOtm8CxMGmiJHDCVqAEGzUG+lowN+SnPS2UluL3QtZ7oL/7MeJqCscH7sPwHtmZY+o0Muqo0ZJ2T2TzekQNYOAE7jeSzG1xOa/NNghny5fT+w6asPxfeolkMgyzuRFp1SLaLUf/XRV4fux0meGY9NIXso47xMSfAYVAAXT1FA2OOwmM1O4yvm3Ur95oEGDNw6z7MnWOSKS663WFwuw2cCaheCfAwvoa5jZUMWMbyUM/cBTgCaQdmETpvCzZzUr5Ls/nBXjyiTdJaQLZATr7HSGZHgYVmEAhVwBvuhTar/6VUZUMKGc2P4=
|
||||||
|
- secure: NmXh4uxqvvqxYvOBOiXE131HajCYhJyd9+7kc1YjllRZVYG11YLah9Np7qnRUyugNOdcBnWVQGlfDHOFe8GHQsZKt5PvsIzxszTor0GeDQOePX3L4YXPkZRJatmoJJ0COxdI6weCAWkI6Zr934RsOndT0mO55gk9c6eeXCcLdNjAJ3izGQHy5Wb2KTzwMhBfwjdTQ0s65c1rzz5dZ/JODilWfTHiHsz+4sKwWVmAvXDTjePd0X3svX775ot23QesJgtaC/p0AKSLcHg3zEjKkJJvvLooQyNn/zU/bio/UatDZWXnNMsTBfEr3qUedjoOY65g3EX/vYlbNRkF3Itk0dpuPooTFmezJASI4ZpewBS9OvPZheMmU/dy5Bx//622x7p4MHyao9IvYmSX0C92VWEd3gwkSzKCJtBEz4Csd5BaGhzeL41di6NSVx4IEiehC9191G1wk4Yj7S2t69N6OdAJEq+znQlYISF5ogCqip7PuesBMYTW4FaIgpnfW/OYP6VpWW87ohw/dz/CcTzP9MzuoM249EHNZKTfnJrmPJBRYSn+W4y9sTgGElPhY1U/NVQ+C/9Fov1kHFD25WeTDPdZe6yCczaUrcvfTDitfo6qnWf8ZW5dJMXN744idaZ25AT/SGoCzkPXMe+us5XLTAOtrbBMP8NXLMv5OtU999E=
|
||||||
|
|
|
||||||
|
|
@ -75,12 +75,12 @@ case class Coursier(scope: List[String],
|
||||||
|
|
||||||
val modules = splitArtifacts.map{
|
val modules = splitArtifacts.map{
|
||||||
case Seq(org, name, version) =>
|
case Seq(org, name, version) =>
|
||||||
Module(org, name, version)
|
(Module(org, name), version)
|
||||||
}
|
}
|
||||||
|
|
||||||
val deps = modules.map(mod =>
|
val deps = modules.map{case (mod, ver) =>
|
||||||
Dependency(mod, scope = Scope.Runtime)
|
Dependency(mod, ver, scope = Scope.Runtime)
|
||||||
)
|
}
|
||||||
|
|
||||||
val res = resolve(
|
val res = resolve(
|
||||||
deps.toSet,
|
deps.toSet,
|
||||||
|
|
@ -89,7 +89,7 @@ case class Coursier(scope: List[String],
|
||||||
).run
|
).run
|
||||||
|
|
||||||
def repr(dep: Dependency) =
|
def repr(dep: Dependency) =
|
||||||
s"${dep.module.organization}:${dep.module.name}:${dep.`type`}:${Some(dep.classifier).filter(_.nonEmpty).map(_+":").mkString}${dep.module.version}"
|
s"${dep.module.organization}:${dep.module.name}:${dep.`type`}:${Some(dep.classifier).filter(_.nonEmpty).map(_+":").mkString}${dep.version}"
|
||||||
|
|
||||||
val trDeps = res.dependencies.toList.sortBy(repr)
|
val trDeps = res.dependencies.toList.sortBy(repr)
|
||||||
|
|
||||||
|
|
@ -100,11 +100,11 @@ case class Coursier(scope: List[String],
|
||||||
println(s"${res.conflicts.size} conflict(s):\n ${res.conflicts.toList.map(repr).sorted.mkString(" \n")}")
|
println(s"${res.conflicts.size} conflict(s):\n ${res.conflicts.toList.map(repr).sorted.mkString(" \n")}")
|
||||||
}
|
}
|
||||||
|
|
||||||
val errDeps = trDeps.filter(dep => res.errors.contains(dep.module))
|
val errDeps = trDeps.filter(dep => res.errors.contains(dep.moduleVersion))
|
||||||
if (errDeps.nonEmpty) {
|
if (errDeps.nonEmpty) {
|
||||||
println(s"${errDeps.size} error(s):")
|
println(s"${errDeps.size} error(s):")
|
||||||
for (dep <- errDeps) {
|
for (dep <- errDeps) {
|
||||||
println(s" ${dep.module}:\n ${res.errors(dep.module).mkString("\n").replace("\n", " \n")}")
|
println(s" ${dep.module}:\n ${res.errors(dep.moduleVersion).mkString("\n").replace("\n", " \n")}")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -113,7 +113,7 @@ case class Coursier(scope: List[String],
|
||||||
|
|
||||||
val cachePolicy: CachePolicy = CachePolicy.Default
|
val cachePolicy: CachePolicy = CachePolicy.Default
|
||||||
|
|
||||||
val m = res.dependencies.groupBy(dep => res.projectsCache.get(dep.module).map(_._1))
|
val m = res.dependencies.groupBy(dep => res.projectsCache.get(dep.moduleVersion).map(_._1))
|
||||||
val (notFound, remaining0) = m.partition(_._1.isEmpty)
|
val (notFound, remaining0) = m.partition(_._1.isEmpty)
|
||||||
if (notFound.nonEmpty) {
|
if (notFound.nonEmpty) {
|
||||||
val notFound0 = notFound.values.flatten.toList.map(repr).sorted
|
val notFound0 = notFound.values.flatten.toList.map(repr).sorted
|
||||||
|
|
|
||||||
|
|
@ -73,13 +73,14 @@ trait Logger {
|
||||||
case class Remote(base: String, logger: Option[Logger] = None) extends Repository {
|
case class Remote(base: String, logger: Option[Logger] = None) extends Repository {
|
||||||
|
|
||||||
def find(module: Module,
|
def find(module: Module,
|
||||||
|
version: String,
|
||||||
cachePolicy: CachePolicy): EitherT[Task, String, Project] = {
|
cachePolicy: CachePolicy): EitherT[Task, String, Project] = {
|
||||||
|
|
||||||
val relPath =
|
val relPath =
|
||||||
module.organization.split('.').toSeq ++ Seq(
|
module.organization.split('.').toSeq ++ Seq(
|
||||||
module.name,
|
module.name,
|
||||||
module.version,
|
version,
|
||||||
s"${module.name}-${module.version}.pom"
|
s"${module.name}-$version.pom"
|
||||||
)
|
)
|
||||||
|
|
||||||
val url = base + relPath.mkString("/")
|
val url = base + relPath.mkString("/")
|
||||||
|
|
|
||||||
|
|
@ -26,9 +26,9 @@ object JsTests extends TestSuite {
|
||||||
|
|
||||||
'getProj{
|
'getProj{
|
||||||
repository.mavenCentral
|
repository.mavenCentral
|
||||||
.find(Module("ch.qos.logback", "logback-classic", "1.1.3"))
|
.find(Module("ch.qos.logback", "logback-classic"), "1.1.3")
|
||||||
.map{ proj =>
|
.map{ proj =>
|
||||||
assert(proj.parent == Some(Module("ch.qos.logback", "logback-parent", "1.1.3")))
|
assert(proj.parent == Some(Module("ch.qos.logback", "logback-parent"), "1.1.3"))
|
||||||
}
|
}
|
||||||
.run
|
.run
|
||||||
.runF
|
.runF
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ case class ArtifactDownloader(root: String, cache: File, logger: Option[Artifact
|
||||||
var bufferSize = 1024*1024
|
var bufferSize = 1024*1024
|
||||||
|
|
||||||
def artifact(module: Module,
|
def artifact(module: Module,
|
||||||
|
version: String,
|
||||||
classifier: String,
|
classifier: String,
|
||||||
`type`: String,
|
`type`: String,
|
||||||
cachePolicy: CachePolicy): EitherT[Task, String, File] = {
|
cachePolicy: CachePolicy): EitherT[Task, String, File] = {
|
||||||
|
|
@ -27,8 +28,8 @@ case class ArtifactDownloader(root: String, cache: File, logger: Option[Artifact
|
||||||
val relPath =
|
val relPath =
|
||||||
module.organization.split('.').toSeq ++ Seq(
|
module.organization.split('.').toSeq ++ Seq(
|
||||||
module.name,
|
module.name,
|
||||||
module.version,
|
version,
|
||||||
s"${module.name}-${module.version}${Some(classifier).filter(_.nonEmpty).map("-"+_).mkString}.${`type`}"
|
s"${module.name}-$version${Some(classifier).filter(_.nonEmpty).map("-"+_).mkString}.${`type`}"
|
||||||
)
|
)
|
||||||
|
|
||||||
val file = (cache /: relPath)(new File(_, _))
|
val file = (cache /: relPath)(new File(_, _))
|
||||||
|
|
@ -93,7 +94,7 @@ case class ArtifactDownloader(root: String, cache: File, logger: Option[Artifact
|
||||||
|
|
||||||
def artifact(dependency: Dependency,
|
def artifact(dependency: Dependency,
|
||||||
cachePolicy: CachePolicy = CachePolicy.Default): EitherT[Task, String, File] =
|
cachePolicy: CachePolicy = CachePolicy.Default): EitherT[Task, String, File] =
|
||||||
artifact(dependency.module, dependency.classifier, dependency.`type`, cachePolicy = cachePolicy)
|
artifact(dependency.module, dependency.version, dependency.classifier, dependency.`type`, cachePolicy = cachePolicy)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -140,13 +141,14 @@ case class Remote(root: String,
|
||||||
logger: Option[RemoteLogger] = None) extends Repository {
|
logger: Option[RemoteLogger] = None) extends Repository {
|
||||||
|
|
||||||
def find(module: Module,
|
def find(module: Module,
|
||||||
|
version: String,
|
||||||
cachePolicy: CachePolicy): EitherT[Task, String, Project] = {
|
cachePolicy: CachePolicy): EitherT[Task, String, Project] = {
|
||||||
|
|
||||||
val relPath =
|
val relPath =
|
||||||
module.organization.split('.').toSeq ++ Seq(
|
module.organization.split('.').toSeq ++ Seq(
|
||||||
module.name,
|
module.name,
|
||||||
module.version,
|
version,
|
||||||
s"${module.name}-${module.version}.pom"
|
s"${module.name}-$version.pom"
|
||||||
)
|
)
|
||||||
|
|
||||||
def localFile = {
|
def localFile = {
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,14 @@
|
||||||
package coursier
|
package coursier
|
||||||
|
|
||||||
|
import coursier.core.Resolver.ModuleVersion
|
||||||
|
|
||||||
import scalaz.EitherT
|
import scalaz.EitherT
|
||||||
import scalaz.concurrent.Task
|
import scalaz.concurrent.Task
|
||||||
|
|
||||||
package object core {
|
package object core {
|
||||||
|
|
||||||
def resolution(dependencies: Set[Dependency],
|
def resolution(dependencies: Set[Dependency],
|
||||||
fetch: Module => EitherT[Task, List[String], (Repository, Project)],
|
fetch: ModuleVersion => EitherT[Task, List[String], (Repository, Project)],
|
||||||
filter: Option[Dependency => Boolean],
|
filter: Option[Dependency => Boolean],
|
||||||
profileActivation: Option[(String, Activation, Map[String, String]) => Boolean]): Stream[Resolution] = {
|
profileActivation: Option[(String, Activation, Map[String, String]) => Boolean]): Stream[Resolution] = {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,32 +1,36 @@
|
||||||
package coursier.core
|
package coursier.core
|
||||||
|
|
||||||
case class Module(organization: String,
|
case class Module(organization: String,
|
||||||
name: String,
|
name: String) {
|
||||||
version: String) {
|
|
||||||
|
|
||||||
def trim: Module = copy(
|
def trim: Module = copy(
|
||||||
organization = organization.trim,
|
organization = organization.trim,
|
||||||
name = name.trim,
|
name = name.trim
|
||||||
version = version.trim
|
|
||||||
)
|
)
|
||||||
override def toString = s"$organization:$name:$version"
|
override def toString = s"$organization:$name"
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed abstract class Scope(val name: String)
|
sealed abstract class Scope(val name: String)
|
||||||
|
|
||||||
case class Dependency(module: Module,
|
case class Dependency(module: Module,
|
||||||
|
version: String,
|
||||||
scope: Scope,
|
scope: Scope,
|
||||||
`type`: String,
|
`type`: String,
|
||||||
classifier: String,
|
classifier: String,
|
||||||
exclusions: Set[(String, String)],
|
exclusions: Set[(String, String)],
|
||||||
optional: Boolean)
|
optional: Boolean) {
|
||||||
|
def moduleVersion = (module, version)
|
||||||
|
}
|
||||||
|
|
||||||
case class Project(module: Module,
|
case class Project(module: Module,
|
||||||
|
version: String,
|
||||||
dependencies: Seq[Dependency],
|
dependencies: Seq[Dependency],
|
||||||
parent: Option[Module],
|
parent: Option[(Module, String)],
|
||||||
dependencyManagement: Seq[Dependency],
|
dependencyManagement: Seq[Dependency],
|
||||||
properties: Map[String, String],
|
properties: Map[String, String],
|
||||||
profiles: Seq[Profile])
|
profiles: Seq[Profile]) {
|
||||||
|
def moduleVersion = (module, version)
|
||||||
|
}
|
||||||
|
|
||||||
object Scope {
|
object Scope {
|
||||||
case object Compile extends Scope("compile")
|
case object Compile extends Scope("compile")
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ import scalaz.{\/, EitherT}
|
||||||
import scalaz.concurrent.Task
|
import scalaz.concurrent.Task
|
||||||
|
|
||||||
trait Repository {
|
trait Repository {
|
||||||
def find(module: Module, cachePolicy: CachePolicy = CachePolicy.Default): EitherT[Task, String, Project]
|
def find(module: Module, version: String, cachePolicy: CachePolicy = CachePolicy.Default): EitherT[Task, String, Project]
|
||||||
def versions(organization: String, name: String, cachePolicy: CachePolicy = CachePolicy.Default): EitherT[Task, String, Versions]
|
def versions(organization: String, name: String, cachePolicy: CachePolicy = CachePolicy.Default): EitherT[Task, String, Versions]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,8 @@ import scalaz.{EitherT, \/-, \/, -\/}
|
||||||
|
|
||||||
object Resolver {
|
object Resolver {
|
||||||
|
|
||||||
|
type ModuleVersion = (Module, String)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Try to find `module` among `repositories`.
|
* Try to find `module` among `repositories`.
|
||||||
*
|
*
|
||||||
|
|
@ -20,9 +22,10 @@ object Resolver {
|
||||||
* the repository implementation.
|
* the repository implementation.
|
||||||
*/
|
*/
|
||||||
def find(repositories: Seq[Repository],
|
def find(repositories: Seq[Repository],
|
||||||
module: Module): EitherT[Task, List[String], (Repository, Project)] = {
|
module: Module,
|
||||||
|
version: String): EitherT[Task, List[String], (Repository, Project)] = {
|
||||||
|
|
||||||
val lookups = repositories.map(repo => repo -> repo.find(module).run)
|
val lookups = repositories.map(repo => repo -> repo.find(module, version).run)
|
||||||
val task = lookups.foldLeft(Task.now(-\/(Nil)): Task[List[String] \/ (Repository, Project)]) {
|
val task = lookups.foldLeft(Task.now(-\/(Nil)): Task[List[String] \/ (Repository, Project)]) {
|
||||||
case (acc, (repo, t)) =>
|
case (acc, (repo, t)) =>
|
||||||
acc.flatMap {
|
acc.flatMap {
|
||||||
|
|
@ -112,9 +115,9 @@ object Resolver {
|
||||||
dep.copy(
|
dep.copy(
|
||||||
module = dep.module.copy(
|
module = dep.module.copy(
|
||||||
organization = substituteProps(dep.module.organization),
|
organization = substituteProps(dep.module.organization),
|
||||||
name = substituteProps(dep.module.name),
|
name = substituteProps(dep.module.name)
|
||||||
version = substituteProps(dep.module.version)
|
|
||||||
),
|
),
|
||||||
|
version = substituteProps(dep.version),
|
||||||
`type` = substituteProps(dep.`type`),
|
`type` = substituteProps(dep.`type`),
|
||||||
scope = Parse.scope(substituteProps(dep.scope.name)),
|
scope = Parse.scope(substituteProps(dep.scope.name)),
|
||||||
exclusions = dep.exclusions
|
exclusions = dep.exclusions
|
||||||
|
|
@ -153,42 +156,22 @@ object Resolver {
|
||||||
def merge(dependencies: TraversableOnce[Dependency]): (Seq[Dependency], Seq[Dependency]) = {
|
def merge(dependencies: TraversableOnce[Dependency]): (Seq[Dependency], Seq[Dependency]) = {
|
||||||
val m = dependencies
|
val m = dependencies
|
||||||
.toList
|
.toList
|
||||||
.groupBy(dep => (dep.module.organization, dep.module.name))
|
.groupBy(dep => dep.module)
|
||||||
.mapValues{ deps =>
|
.mapValues{ deps =>
|
||||||
if (deps.lengthCompare(1) == 0) List(\/-(deps.head))
|
if (deps.lengthCompare(1) == 0) \/-(deps)
|
||||||
else {
|
else {
|
||||||
val scopeTypeClassifiers = (Set.empty[(Scope, String, String)] /: deps)((acc, dep) => acc + ((dep.scope, dep.`type`, dep.classifier)))
|
val versions = deps.map(_.version).distinct
|
||||||
|
|
||||||
val versions = deps.map(_.module.version).distinct
|
|
||||||
val versionOpt = mergeVersions(versions)
|
val versionOpt = mergeVersions(versions)
|
||||||
|
|
||||||
scopeTypeClassifiers.toList.flatMap{case (scope, type0, classifier) =>
|
|
||||||
val scopeTypeClassifierDeps =
|
|
||||||
deps.filter(dep =>
|
|
||||||
dep.scope == scope && dep.`type` == type0 && dep.classifier == classifier
|
|
||||||
)
|
|
||||||
|
|
||||||
def dep(version: String) = {
|
|
||||||
Dependency(
|
|
||||||
deps.head.module.copy(version = version),
|
|
||||||
scope,
|
|
||||||
type0,
|
|
||||||
classifier,
|
|
||||||
scopeTypeClassifierDeps.map(_.exclusions.toSet).reduce(exclusionsIntersect),
|
|
||||||
scopeTypeClassifierDeps.forall(_.optional)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
versionOpt match {
|
versionOpt match {
|
||||||
case Some(version) => List(\/-(dep(version)))
|
case Some(version) => \/-(deps.map(dep => dep.copy(version = version)))
|
||||||
case None => versions.map(version => -\/(dep(version)))
|
case None => -\/(deps)
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val l = m.values.toList.flatten
|
val l = m.values.toList
|
||||||
(l.collect{case -\/(dep) => dep}, l.collect{case \/-(dep) => dep})
|
(l.collect{case -\/(dep) => dep}.flatten, l.collect{case \/-(dep) => dep}.flatten)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -223,8 +206,8 @@ object Resolver {
|
||||||
var dep = dep0
|
var dep = dep0
|
||||||
|
|
||||||
for (mgmtDep <- m.get(dependencyManagementKey(dep0))) {
|
for (mgmtDep <- m.get(dependencyManagementKey(dep0))) {
|
||||||
if (dep.module.version.isEmpty)
|
if (dep.version.isEmpty)
|
||||||
dep = dep.copy(module = dep.module.copy(version = mgmtDep.module.version))
|
dep = dep.copy(version = mgmtDep.version)
|
||||||
if (dep.scope.name.isEmpty)
|
if (dep.scope.name.isEmpty)
|
||||||
dep = dep.copy(scope = mgmtDep.scope)
|
dep = dep.copy(scope = mgmtDep.scope)
|
||||||
|
|
||||||
|
|
@ -355,7 +338,7 @@ object Resolver {
|
||||||
Map(
|
Map(
|
||||||
"project.groupId" -> project.module.organization,
|
"project.groupId" -> project.module.organization,
|
||||||
"project.artifactId" -> project.module.name,
|
"project.artifactId" -> project.module.name,
|
||||||
"project.version" -> project.module.version
|
"project.version" -> project.version
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -390,8 +373,8 @@ object Resolver {
|
||||||
case class Resolution(rootDependencies: Set[Dependency],
|
case class Resolution(rootDependencies: Set[Dependency],
|
||||||
dependencies: Set[Dependency],
|
dependencies: Set[Dependency],
|
||||||
conflicts: Set[Dependency],
|
conflicts: Set[Dependency],
|
||||||
projectsCache: Map[Module, (Repository, Project)],
|
projectsCache: Map[ModuleVersion, (Repository, Project)],
|
||||||
errors: Map[Module, Seq[String]],
|
errors: Map[ModuleVersion, Seq[String]],
|
||||||
filter: Option[Dependency => Boolean],
|
filter: Option[Dependency => Boolean],
|
||||||
profileActivation: Option[(String, Activation, Map[String, String]) => Boolean]) {
|
profileActivation: Option[(String, Activation, Map[String, String]) => Boolean]) {
|
||||||
|
|
||||||
|
|
@ -402,7 +385,7 @@ object Resolver {
|
||||||
def transitiveDependencies =
|
def transitiveDependencies =
|
||||||
for {
|
for {
|
||||||
dep <- (dependencies -- conflicts).toList
|
dep <- (dependencies -- conflicts).toList
|
||||||
(_, proj) <- projectsCache.get(dep.module).toSeq
|
(_, proj) <- projectsCache.get((dep.moduleVersion)).toSeq
|
||||||
trDep <- finalDependencies(dep, proj).filter(filter getOrElse defaultFilter)
|
trDep <- finalDependencies(dep, proj).filter(filter getOrElse defaultFilter)
|
||||||
} yield trDep
|
} yield trDep
|
||||||
|
|
||||||
|
|
@ -419,9 +402,9 @@ object Resolver {
|
||||||
/**
|
/**
|
||||||
* The modules we miss some info about.
|
* The modules we miss some info about.
|
||||||
*/
|
*/
|
||||||
def missingFromCache: Set[Module] = {
|
def missingFromCache: Set[ModuleVersion] = {
|
||||||
val modules = dependencies.map(_.module)
|
val modules = dependencies.map(dep => (dep.moduleVersion))
|
||||||
val nextModules = nextDependenciesAndConflicts._2.map(_.module)
|
val nextModules = nextDependenciesAndConflicts._2.map(dep => (dep.moduleVersion))
|
||||||
|
|
||||||
(modules ++ nextModules)
|
(modules ++ nextModules)
|
||||||
.filterNot(mod => projectsCache.contains(mod) || errors.contains(mod))
|
.filterNot(mod => projectsCache.contains(mod) || errors.contains(mod))
|
||||||
|
|
@ -453,7 +436,7 @@ object Resolver {
|
||||||
val trDepsSeq =
|
val trDepsSeq =
|
||||||
for {
|
for {
|
||||||
dep <- updatedDeps
|
dep <- updatedDeps
|
||||||
(_, proj) <- projectsCache.get(dep.module).toList
|
(_, proj) <- projectsCache.get((dep.moduleVersion)).toList
|
||||||
trDep <- finalDependencies(dep, proj).filter(filter getOrElse defaultFilter)
|
trDep <- finalDependencies(dep, proj).filter(filter getOrElse defaultFilter)
|
||||||
} yield key(trDep) -> (key(dep), trDep.exclusions)
|
} yield key(trDep) -> (key(dep), trDep.exclusions)
|
||||||
|
|
||||||
|
|
@ -526,7 +509,7 @@ object Resolver {
|
||||||
/**
|
/**
|
||||||
* Do a new iteration, fetching the missing modules along the way.
|
* Do a new iteration, fetching the missing modules along the way.
|
||||||
*/
|
*/
|
||||||
def next(fetchModule: Module => EitherT[Task, List[String], (Repository, Project)]): Task[Resolution] = {
|
def next(fetchModule: ModuleVersion => EitherT[Task, List[String], (Repository, Project)]): Task[Resolution] = {
|
||||||
val missing = missingFromCache
|
val missing = missingFromCache
|
||||||
if (missing.isEmpty) Task.now(nextNoMissingUnsafe())
|
if (missing.isEmpty) Task.now(nextNoMissingUnsafe())
|
||||||
else fetch(missing.toList, fetchModule).map(_.nextIfNoMissing())
|
else fetch(missing.toList, fetchModule).map(_.nextIfNoMissing())
|
||||||
|
|
@ -535,7 +518,7 @@ object Resolver {
|
||||||
/**
|
/**
|
||||||
* Required modules for the dependency management of `project`.
|
* Required modules for the dependency management of `project`.
|
||||||
*/
|
*/
|
||||||
def dependencyManagementRequirements(project: Project): Set[Module] = {
|
def dependencyManagementRequirements(project: Project): Set[ModuleVersion] = {
|
||||||
val approxProperties =
|
val approxProperties =
|
||||||
project.parent
|
project.parent
|
||||||
.flatMap(projectsCache.get)
|
.flatMap(projectsCache.get)
|
||||||
|
|
@ -548,7 +531,7 @@ object Resolver {
|
||||||
|
|
||||||
val modules =
|
val modules =
|
||||||
(project.dependencies ++ profileDependencies)
|
(project.dependencies ++ profileDependencies)
|
||||||
.collect{ case dep if dep.scope == Scope.Import => dep.module } ++
|
.collect{ case dep if dep.scope == Scope.Import => (dep.moduleVersion) } ++
|
||||||
project.parent
|
project.parent
|
||||||
|
|
||||||
modules.toSet
|
modules.toSet
|
||||||
|
|
@ -562,12 +545,12 @@ object Resolver {
|
||||||
* these modules should be added to the cache, and `dependencyManagementMissing` checked again
|
* these modules should be added to the cache, and `dependencyManagementMissing` checked again
|
||||||
* for new missing modules.
|
* for new missing modules.
|
||||||
*/
|
*/
|
||||||
def dependencyManagementMissing(project: Project): Set[Module] = {
|
def dependencyManagementMissing(project: Project): Set[ModuleVersion] = {
|
||||||
|
|
||||||
@tailrec
|
@tailrec
|
||||||
def helper(toCheck: Set[Module],
|
def helper(toCheck: Set[ModuleVersion],
|
||||||
done: Set[Module],
|
done: Set[ModuleVersion],
|
||||||
missing: Set[Module]): Set[Module] = {
|
missing: Set[ModuleVersion]): Set[ModuleVersion] = {
|
||||||
|
|
||||||
if (toCheck.isEmpty) missing
|
if (toCheck.isEmpty) missing
|
||||||
else if (toCheck.exists(done)) helper(toCheck -- done, done, missing)
|
else if (toCheck.exists(done)) helper(toCheck -- done, done, missing)
|
||||||
|
|
@ -584,7 +567,7 @@ object Resolver {
|
||||||
helper(Set.empty, done, missing ++ toCheck)
|
helper(Set.empty, done, missing ++ toCheck)
|
||||||
}
|
}
|
||||||
|
|
||||||
helper(dependencyManagementRequirements(project), Set(project.module), Set.empty)
|
helper(dependencyManagementRequirements(project), Set(project.moduleVersion), Set.empty)
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -607,7 +590,7 @@ object Resolver {
|
||||||
|
|
||||||
val deps =
|
val deps =
|
||||||
dependencies0
|
dependencies0
|
||||||
.collect{ case dep if dep.scope == Scope.Import && projectsCache.contains(dep.module) => dep.module } ++
|
.collect{ case dep if dep.scope == Scope.Import && projectsCache.contains(dep.moduleVersion) => dep.moduleVersion } ++
|
||||||
project.parent.filter(projectsCache.contains)
|
project.parent.filter(projectsCache.contains)
|
||||||
val projs = deps.map(projectsCache(_)._2)
|
val projs = deps.map(projectsCache(_)._2)
|
||||||
|
|
||||||
|
|
@ -619,7 +602,7 @@ object Resolver {
|
||||||
|
|
||||||
project.copy(
|
project.copy(
|
||||||
dependencies = dependencies0
|
dependencies = dependencies0
|
||||||
.filterNot(dep => dep.scope == Scope.Import && depsSet(dep.module)) ++
|
.filterNot(dep => dep.scope == Scope.Import && depsSet(dep.moduleVersion)) ++
|
||||||
project.parent
|
project.parent
|
||||||
.filter(projectsCache.contains)
|
.filter(projectsCache.contains)
|
||||||
.toSeq
|
.toSeq
|
||||||
|
|
@ -635,8 +618,8 @@ object Resolver {
|
||||||
/**
|
/**
|
||||||
* Fetch `modules` with `fetchModules`, and add the resulting errors and projects to the cache.
|
* Fetch `modules` with `fetchModules`, and add the resulting errors and projects to the cache.
|
||||||
*/
|
*/
|
||||||
def fetch(modules: Seq[Module],
|
def fetch(modules: Seq[ModuleVersion],
|
||||||
fetchModule: Module => EitherT[Task, List[String], (Repository, Project)]): Task[Resolution] = {
|
fetchModule: ModuleVersion => EitherT[Task, List[String], (Repository, Project)]): Task[Resolution] = {
|
||||||
|
|
||||||
val lookups = modules.map(dep => fetchModule(dep).run.map(dep -> _))
|
val lookups = modules.map(dep => fetchModule(dep).run.map(dep -> _))
|
||||||
val gatheredLookups = Task.gatherUnordered(lookups, exceptionCancels = true)
|
val gatheredLookups = Task.gatherUnordered(lookups, exceptionCancels = true)
|
||||||
|
|
@ -654,7 +637,7 @@ object Resolver {
|
||||||
current <- accTask
|
current <- accTask
|
||||||
updated <- current.fetch(current.dependencyManagementMissing(proj).toList, fetchModule)
|
updated <- current.fetch(current.dependencyManagementMissing(proj).toList, fetchModule)
|
||||||
proj0 = updated.withDependencyManagement(proj)
|
proj0 = updated.withDependencyManagement(proj)
|
||||||
} yield updated.copy(projectsCache = updated.projectsCache + (proj0.module -> (repo, proj0)))
|
} yield updated.copy(projectsCache = updated.projectsCache + (proj0.moduleVersion -> (repo, proj0)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -700,7 +683,7 @@ object Resolver {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
def resolve(dependencies: Set[Dependency],
|
def resolve(dependencies: Set[Dependency],
|
||||||
fetch: Module => EitherT[Task, List[String], (Repository, Project)],
|
fetch: ModuleVersion => EitherT[Task, List[String], (Repository, Project)],
|
||||||
maxIterations: Option[Int],
|
maxIterations: Option[Int],
|
||||||
filter: Option[Dependency => Boolean],
|
filter: Option[Dependency => Boolean],
|
||||||
profileActivation: Option[(String, Activation, Map[String, String]) => Boolean]): Task[Resolution] = {
|
profileActivation: Option[(String, Activation, Map[String, String]) => Boolean]): Task[Resolution] = {
|
||||||
|
|
|
||||||
|
|
@ -56,10 +56,12 @@ object Xml {
|
||||||
else e
|
else e
|
||||||
}
|
}
|
||||||
name <- text(node, "artifactId", "Name")
|
name <- text(node, "artifactId", "Name")
|
||||||
version = text(node, "version", "Version").getOrElse("")
|
} yield Module(organization, name).trim
|
||||||
} yield Module(organization, name, version).trim
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private def readVersion(node: Node) =
|
||||||
|
text(node, "version", "Version").getOrElse("").trim
|
||||||
|
|
||||||
private val defaultScope = Scope.Other("")
|
private val defaultScope = Scope.Other("")
|
||||||
private val defaultType = "jar"
|
private val defaultType = "jar"
|
||||||
private val defaultClassifier = ""
|
private val defaultClassifier = ""
|
||||||
|
|
@ -67,6 +69,7 @@ object Xml {
|
||||||
def dependency(node: Node): String \/ Dependency = {
|
def dependency(node: Node): String \/ Dependency = {
|
||||||
for {
|
for {
|
||||||
mod <- module(node)
|
mod <- module(node)
|
||||||
|
version0 = readVersion(node)
|
||||||
scopeOpt = text(node, "scope", "").toOption
|
scopeOpt = text(node, "scope", "").toOption
|
||||||
.map(Parse.scope)
|
.map(Parse.scope)
|
||||||
typeOpt = text(node, "type", "").toOption
|
typeOpt = text(node, "type", "").toOption
|
||||||
|
|
@ -82,6 +85,7 @@ object Xml {
|
||||||
optional = text(node, "optional", "").toOption.toSeq.contains("true")
|
optional = text(node, "optional", "").toOption.toSeq.contains("true")
|
||||||
} yield Dependency(
|
} yield Dependency(
|
||||||
mod,
|
mod,
|
||||||
|
version0,
|
||||||
scopeOpt getOrElse defaultScope,
|
scopeOpt getOrElse defaultScope,
|
||||||
typeOpt getOrElse defaultType,
|
typeOpt getOrElse defaultType,
|
||||||
classifierOpt getOrElse defaultClassifier,
|
classifierOpt getOrElse defaultClassifier,
|
||||||
|
|
@ -150,12 +154,15 @@ object Xml {
|
||||||
|
|
||||||
for {
|
for {
|
||||||
projModule <- module(pom, groupIdIsOptional = true)
|
projModule <- module(pom, groupIdIsOptional = true)
|
||||||
|
projVersion = readVersion(pom)
|
||||||
|
|
||||||
parentOpt = pom.child
|
parentOpt = pom.child
|
||||||
.find(_.label == "parent")
|
.find(_.label == "parent")
|
||||||
parentModuleOpt <- parentOpt
|
parentModuleOpt <- parentOpt
|
||||||
.map(module(_).map(Some(_)))
|
.map(module(_).map(Some(_)))
|
||||||
.getOrElse(\/-(None))
|
.getOrElse(\/-(None))
|
||||||
|
parentVersionOpt = parentOpt
|
||||||
|
.map(readVersion)
|
||||||
|
|
||||||
xmlDeps = pom.child
|
xmlDeps = pom.child
|
||||||
.find(_.label == "dependencies")
|
.find(_.label == "dependencies")
|
||||||
|
|
@ -173,12 +180,12 @@ object Xml {
|
||||||
groupId <- Some(projModule.organization).filter(_.nonEmpty)
|
groupId <- Some(projModule.organization).filter(_.nonEmpty)
|
||||||
.orElse(parentModuleOpt.map(_.organization).filter(_.nonEmpty))
|
.orElse(parentModuleOpt.map(_.organization).filter(_.nonEmpty))
|
||||||
.toRightDisjunction("No organization found")
|
.toRightDisjunction("No organization found")
|
||||||
version <- Some(projModule.version).filter(_.nonEmpty)
|
version <- Some(projVersion).filter(_.nonEmpty)
|
||||||
.orElse(parentModuleOpt.map(_.version).filter(_.nonEmpty))
|
.orElse(parentVersionOpt.filter(_.nonEmpty))
|
||||||
.toRightDisjunction("No version found")
|
.toRightDisjunction("No version found")
|
||||||
|
|
||||||
_ <- parentModuleOpt
|
_ <- parentVersionOpt
|
||||||
.map(mod => if (mod.version.isEmpty) -\/("Parent version missing") else \/-(()))
|
.map(v => if (v.isEmpty) -\/("Parent version missing") else \/-(()))
|
||||||
.getOrElse(\/-(()))
|
.getOrElse(\/-(()))
|
||||||
_ <- parentModuleOpt
|
_ <- parentModuleOpt
|
||||||
.map(mod => if (mod.organization.isEmpty) -\/("Parent organization missing") else \/-(()))
|
.map(mod => if (mod.organization.isEmpty) -\/("Parent organization missing") else \/-(()))
|
||||||
|
|
@ -197,9 +204,10 @@ object Xml {
|
||||||
profiles <- xmlProfiles.toList.traverseU(profile)
|
profiles <- xmlProfiles.toList.traverseU(profile)
|
||||||
|
|
||||||
} yield Project(
|
} yield Project(
|
||||||
projModule.copy(organization = groupId, version = version),
|
projModule.copy(organization = groupId),
|
||||||
|
version,
|
||||||
deps,
|
deps,
|
||||||
parentModuleOpt,
|
parentModuleOpt.map((_, parentVersionOpt.getOrElse(""))),
|
||||||
depMgmts,
|
depMgmts,
|
||||||
properties.toMap,
|
properties.toMap,
|
||||||
profiles
|
profiles
|
||||||
|
|
|
||||||
|
|
@ -6,23 +6,25 @@ package object coursier {
|
||||||
type Dependency = core.Dependency
|
type Dependency = core.Dependency
|
||||||
object Dependency {
|
object Dependency {
|
||||||
def apply(module: Module,
|
def apply(module: Module,
|
||||||
|
version: String,
|
||||||
scope: Scope = Scope.Other(""), // Subsituted by Resolver with its own default scope (compile)
|
scope: Scope = Scope.Other(""), // Subsituted by Resolver with its own default scope (compile)
|
||||||
`type`: String = "jar",
|
`type`: String = "jar",
|
||||||
classifier: String = "",
|
classifier: String = "",
|
||||||
exclusions: Set[(String, String)] = Set.empty,
|
exclusions: Set[(String, String)] = Set.empty,
|
||||||
optional: Boolean = false): Dependency =
|
optional: Boolean = false): Dependency =
|
||||||
core.Dependency(module, scope, `type`, classifier, exclusions, optional)
|
core.Dependency(module, version, scope, `type`, classifier, exclusions, optional)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Project = core.Project
|
type Project = core.Project
|
||||||
object Project {
|
object Project {
|
||||||
def apply(module: Module,
|
def apply(module: Module,
|
||||||
|
version: String,
|
||||||
dependencies: Seq[Dependency] = Seq.empty,
|
dependencies: Seq[Dependency] = Seq.empty,
|
||||||
parent: Option[Module] = None,
|
parent: Option[ModuleVersion] = None,
|
||||||
dependencyManagement: Seq[Dependency] = Seq.empty,
|
dependencyManagement: Seq[Dependency] = Seq.empty,
|
||||||
properties: Map[String, String] = Map.empty,
|
properties: Map[String, String] = Map.empty,
|
||||||
profiles: Seq[Profile] = Seq.empty): Project =
|
profiles: Seq[Profile] = Seq.empty): Project =
|
||||||
core.Project(module, dependencies, parent, dependencyManagement, properties, profiles)
|
core.Project(module, version, dependencies, parent, dependencyManagement, properties, profiles)
|
||||||
}
|
}
|
||||||
|
|
||||||
type Profile = core.Profile
|
type Profile = core.Profile
|
||||||
|
|
@ -44,17 +46,19 @@ package object coursier {
|
||||||
|
|
||||||
type Module = core.Module
|
type Module = core.Module
|
||||||
object Module {
|
object Module {
|
||||||
def apply(organization: String, name: String, version: String): Module =
|
def apply(organization: String, name: String): Module =
|
||||||
core.Module(organization, name, version)
|
core.Module(organization, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ModuleVersion = (core.Module, String)
|
||||||
|
|
||||||
type Scope = core.Scope
|
type Scope = core.Scope
|
||||||
val Scope: core.Scope.type = core.Scope
|
val Scope: core.Scope.type = core.Scope
|
||||||
|
|
||||||
type Repository = core.Repository
|
type Repository = core.Repository
|
||||||
|
|
||||||
def fetchFrom(repositories: Seq[Repository]): Module => EitherT[Task, List[String], (Repository, Project)] =
|
def fetchFrom(repositories: Seq[Repository]): ModuleVersion => EitherT[Task, List[String], (Repository, Project)] =
|
||||||
core.Resolver.find(repositories, _)
|
modVersion => core.Resolver.find(repositories, modVersion._1, modVersion._2)
|
||||||
|
|
||||||
type Resolution = core.Resolver.Resolution
|
type Resolution = core.Resolver.Resolution
|
||||||
object Resolution {
|
object Resolution {
|
||||||
|
|
@ -62,15 +66,15 @@ package object coursier {
|
||||||
def apply(rootDependencies: Set[Dependency] = Set.empty,
|
def apply(rootDependencies: Set[Dependency] = Set.empty,
|
||||||
dependencies: Set[Dependency] = Set.empty,
|
dependencies: Set[Dependency] = Set.empty,
|
||||||
conflicts: Set[Dependency] = Set.empty,
|
conflicts: Set[Dependency] = Set.empty,
|
||||||
projectsCache: Map[Module, (Repository, Project)] = Map.empty,
|
projectsCache: Map[ModuleVersion, (Repository, Project)] = Map.empty,
|
||||||
errors: Map[Module, Seq[String]] = Map.empty,
|
errors: Map[ModuleVersion, Seq[String]] = Map.empty,
|
||||||
filter: Option[Dependency => Boolean] = None,
|
filter: Option[Dependency => Boolean] = None,
|
||||||
profileActivation: Option[(String, Profile.Activation, Map[String, String]) => Boolean] = None): Resolution =
|
profileActivation: Option[(String, Profile.Activation, Map[String, String]) => Boolean] = None): Resolution =
|
||||||
core.Resolver.Resolution(rootDependencies, dependencies, conflicts, projectsCache, errors, filter, profileActivation)
|
core.Resolver.Resolution(rootDependencies, dependencies, conflicts, projectsCache, errors, filter, profileActivation)
|
||||||
}
|
}
|
||||||
|
|
||||||
def resolve(dependencies: Set[Dependency],
|
def resolve(dependencies: Set[Dependency],
|
||||||
fetch: Module => EitherT[Task, List[String], (Repository, Project)],
|
fetch: ModuleVersion => EitherT[Task, List[String], (Repository, Project)],
|
||||||
maxIterations: Option[Int] = Some(200),
|
maxIterations: Option[Int] = Some(200),
|
||||||
filter: Option[Dependency => Boolean] = None,
|
filter: Option[Dependency => Boolean] = None,
|
||||||
profileActivation: Option[(String, Profile.Activation, Map[String, String]) => Boolean] = None): Task[Resolution] = {
|
profileActivation: Option[(String, Profile.Activation, Map[String, String]) => Boolean] = None): Task[Resolution] = {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ object CentralTests extends TestSuite {
|
||||||
val tests = TestSuite {
|
val tests = TestSuite {
|
||||||
'logback{
|
'logback{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("ch.qos.logback", "logback-classic", "1.1.3"))
|
val dep = Dependency(Module("ch.qos.logback", "logback-classic"), "1.1.3")
|
||||||
val res0 =
|
val res0 =
|
||||||
await(resolve(Set(dep), fetchFrom(repositories))
|
await(resolve(Set(dep), fetchFrom(repositories))
|
||||||
.runF)
|
.runF)
|
||||||
|
|
@ -28,8 +28,8 @@ object CentralTests extends TestSuite {
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(
|
dependencies = Set(
|
||||||
dep.withCompileScope,
|
dep.withCompileScope,
|
||||||
Dependency(Module("ch.qos.logback", "logback-core", "1.1.3")).withCompileScope,
|
Dependency(Module("ch.qos.logback", "logback-core"), "1.1.3").withCompileScope,
|
||||||
Dependency(Module("org.slf4j", "slf4j-api", "1.7.7")).withCompileScope
|
Dependency(Module("org.slf4j", "slf4j-api"), "1.7.7").withCompileScope
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -38,7 +38,7 @@ object CentralTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'asm{
|
'asm{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("org.ow2.asm", "asm-commons", "5.0.2"))
|
val dep = Dependency(Module("org.ow2.asm", "asm-commons"), "5.0.2")
|
||||||
val res0 =
|
val res0 =
|
||||||
await(resolve(Set(dep), fetchFrom(repositories))
|
await(resolve(Set(dep), fetchFrom(repositories))
|
||||||
.runF)
|
.runF)
|
||||||
|
|
@ -51,8 +51,8 @@ object CentralTests extends TestSuite {
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(
|
dependencies = Set(
|
||||||
dep.withCompileScope,
|
dep.withCompileScope,
|
||||||
Dependency(Module("org.ow2.asm", "asm-tree", "5.0.2")).withCompileScope,
|
Dependency(Module("org.ow2.asm", "asm-tree"), "5.0.2").withCompileScope,
|
||||||
Dependency(Module("org.ow2.asm", "asm", "5.0.2")).withCompileScope
|
Dependency(Module("org.ow2.asm", "asm"), "5.0.2").withCompileScope
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ object PomParsingTests extends TestSuite {
|
||||||
</dependency>
|
</dependency>
|
||||||
"""
|
"""
|
||||||
|
|
||||||
val expected = \/-(Dependency(Module("comp", "lib", "2.1"), classifier = "extra"))
|
val expected = \/-(Dependency(Module("comp", "lib"), "2.1", classifier = "extra"))
|
||||||
|
|
||||||
val result = Xml.dependency(xmlParse(depNode).right.get)
|
val result = Xml.dependency(xmlParse(depNode).right.get)
|
||||||
|
|
||||||
|
|
@ -75,7 +75,7 @@ object PomParsingTests extends TestSuite {
|
||||||
None,
|
None,
|
||||||
Activation(Nil),
|
Activation(Nil),
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("comp", "lib", "0.2"))),
|
Dependency(Module("comp", "lib"), "0.2")),
|
||||||
Nil,
|
Nil,
|
||||||
Map.empty
|
Map.empty
|
||||||
))
|
))
|
||||||
|
|
@ -107,7 +107,7 @@ object PomParsingTests extends TestSuite {
|
||||||
Activation(Nil),
|
Activation(Nil),
|
||||||
Nil,
|
Nil,
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("comp", "lib", "0.2"), scope = Scope.Test)),
|
Dependency(Module("comp", "lib"), "0.2", scope = Scope.Test)),
|
||||||
Map.empty
|
Map.empty
|
||||||
))
|
))
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,137 +10,137 @@ import coursier.test.compatibility._
|
||||||
object ResolverTests extends TestSuite {
|
object ResolverTests extends TestSuite {
|
||||||
|
|
||||||
implicit class ProjectOps(val p: Project) extends AnyVal {
|
implicit class ProjectOps(val p: Project) extends AnyVal {
|
||||||
def kv: (Module, (Repository, Project)) = p.module -> (testRepository, p)
|
def kv: (ModuleVersion, (Repository, Project)) = p.moduleVersion -> (testRepository, p)
|
||||||
}
|
}
|
||||||
|
|
||||||
val projects = Seq(
|
val projects = Seq(
|
||||||
Project(Module("acme", "config", "1.3.0")),
|
Project(Module("acme", "config"), "1.3.0"),
|
||||||
|
|
||||||
Project(Module("acme", "play", "2.4.0"), Seq(
|
Project(Module("acme", "play"), "2.4.0", Seq(
|
||||||
Dependency(Module("acme", "play-json", "2.4.0")))),
|
Dependency(Module("acme", "play-json"), "2.4.0"))),
|
||||||
|
|
||||||
Project(Module("acme", "play-json", "2.4.0")),
|
Project(Module("acme", "play-json"), "2.4.0"),
|
||||||
|
|
||||||
Project(Module("acme", "play", "2.4.1"),
|
Project(Module("acme", "play"), "2.4.1",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("acme", "play-json", "${playJsonVersion}")),
|
Dependency(Module("acme", "play-json"), "${playJsonVersion}"),
|
||||||
Dependency(Module("${project.groupId}", "${configName}", "1.3.0"))),
|
Dependency(Module("${project.groupId}", "${configName}"), "1.3.0")),
|
||||||
properties = Map(
|
properties = Map(
|
||||||
"playJsonVersion" -> "2.4.0",
|
"playJsonVersion" -> "2.4.0",
|
||||||
"configName" -> "config")),
|
"configName" -> "config")),
|
||||||
|
|
||||||
Project(Module("acme", "play-extra-no-config", "2.4.1"),
|
Project(Module("acme", "play-extra-no-config"), "2.4.1",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("acme", "play", "2.4.1"),
|
Dependency(Module("acme", "play"), "2.4.1",
|
||||||
exclusions = Set(("acme", "config"))))),
|
exclusions = Set(("acme", "config"))))),
|
||||||
|
|
||||||
Project(Module("acme", "play-extra-no-config-no", "2.4.1"),
|
Project(Module("acme", "play-extra-no-config-no"), "2.4.1",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("acme", "play", "2.4.1"),
|
Dependency(Module("acme", "play"), "2.4.1",
|
||||||
exclusions = Set(("*", "config"))))),
|
exclusions = Set(("*", "config"))))),
|
||||||
|
|
||||||
Project(Module("hudsucker", "mail", "10.0"),
|
Project(Module("hudsucker", "mail"), "10.0",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("${project.groupId}", "test-util", "${project.version}"),
|
Dependency(Module("${project.groupId}", "test-util"), "${project.version}",
|
||||||
scope = Scope.Test))),
|
scope = Scope.Test))),
|
||||||
|
|
||||||
Project(Module("hudsucker", "test-util", "10.0")),
|
Project(Module("hudsucker", "test-util"), "10.0"),
|
||||||
|
|
||||||
Project(Module("se.ikea", "parent", "18.0"),
|
Project(Module("se.ikea", "parent"), "18.0",
|
||||||
dependencyManagement = Seq(
|
dependencyManagement = Seq(
|
||||||
Dependency(Module("acme", "play", "2.4.0"),
|
Dependency(Module("acme", "play"), "2.4.0",
|
||||||
exclusions = Set(("acme", "play-json"))))),
|
exclusions = Set(("acme", "play-json"))))),
|
||||||
|
|
||||||
Project(Module("se.ikea", "billy", "18.0"),
|
Project(Module("se.ikea", "billy"), "18.0",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("acme", "play", ""))
|
Dependency(Module("acme", "play"), "")
|
||||||
),
|
),
|
||||||
parent = Some(Module("se.ikea", "parent", "18.0"))),
|
parent = Some(Module("se.ikea", "parent"), "18.0")),
|
||||||
|
|
||||||
Project(Module("org.gnome", "parent", "7.0"),
|
Project(Module("org.gnome", "parent"), "7.0",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("org.gnu", "glib", "13.4")))),
|
Dependency(Module("org.gnu", "glib"), "13.4"))),
|
||||||
|
|
||||||
Project(Module("org.gnome", "panel-legacy", "7.0"),
|
Project(Module("org.gnome", "panel-legacy"), "7.0",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("org.gnome", "desktop", "${project.version}"))),
|
Dependency(Module("org.gnome", "desktop"), "${project.version}")),
|
||||||
parent = Some(Module("org.gnome", "parent", "7.0"))),
|
parent = Some(Module("org.gnome", "parent"), "7.0")),
|
||||||
|
|
||||||
Project(Module("gov.nsa", "secure-pgp", "10.0"),
|
Project(Module("gov.nsa", "secure-pgp"), "10.0",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("gov.nsa", "crypto", "536.89")))),
|
Dependency(Module("gov.nsa", "crypto"), "536.89"))),
|
||||||
|
|
||||||
Project(Module("com.mailapp", "mail-client", "2.1"),
|
Project(Module("com.mailapp", "mail-client"), "2.1",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("gov.nsa", "secure-pgp", "10.0"),
|
Dependency(Module("gov.nsa", "secure-pgp"), "10.0",
|
||||||
exclusions = Set(("*", "${crypto.name}")))),
|
exclusions = Set(("*", "${crypto.name}")))),
|
||||||
properties = Map("crypto.name" -> "crypto", "dummy" -> "2")),
|
properties = Map("crypto.name" -> "crypto", "dummy" -> "2")),
|
||||||
|
|
||||||
Project(Module("com.thoughtworks.paranamer", "paranamer-parent", "2.6"),
|
Project(Module("com.thoughtworks.paranamer", "paranamer-parent"), "2.6",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("junit", "junit", ""))),
|
Dependency(Module("junit", "junit"), "")),
|
||||||
dependencyManagement = Seq(
|
dependencyManagement = Seq(
|
||||||
Dependency(Module("junit", "junit", "4.11"), scope = Scope.Test))),
|
Dependency(Module("junit", "junit"), "4.11", scope = Scope.Test))),
|
||||||
|
|
||||||
Project(Module("com.thoughtworks.paranamer", "paranamer", "2.6"),
|
Project(Module("com.thoughtworks.paranamer", "paranamer"), "2.6",
|
||||||
parent = Some(Module("com.thoughtworks.paranamer", "paranamer-parent", "2.6"))),
|
parent = Some(Module("com.thoughtworks.paranamer", "paranamer-parent"), "2.6")),
|
||||||
|
|
||||||
Project(Module("com.github.dummy", "libb", "0.3.3"),
|
Project(Module("com.github.dummy", "libb"), "0.3.3",
|
||||||
profiles = Seq(
|
profiles = Seq(
|
||||||
Profile("default", activeByDefault = Some(true), dependencies = Seq(
|
Profile("default", activeByDefault = Some(true), dependencies = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6"))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6")
|
||||||
))
|
))
|
||||||
)),
|
)),
|
||||||
|
|
||||||
Project(Module("com.github.dummy", "libb", "0.4.2"),
|
Project(Module("com.github.dummy", "libb"), "0.4.2",
|
||||||
Seq(
|
Seq(
|
||||||
Dependency(Module("org.scalaverification", "scala-verification", "1.12.4"))
|
Dependency(Module("org.scalaverification", "scala-verification"), "1.12.4")
|
||||||
),
|
),
|
||||||
profiles = Seq(
|
profiles = Seq(
|
||||||
Profile("default", activeByDefault = Some(true), dependencies = Seq(
|
Profile("default", activeByDefault = Some(true), dependencies = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6")),
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"),
|
||||||
Dependency(Module("org.scalaverification", "scala-verification", "1.12.4"), scope = Scope.Test)
|
Dependency(Module("org.scalaverification", "scala-verification"), "1.12.4", scope = Scope.Test)
|
||||||
))
|
))
|
||||||
)),
|
)),
|
||||||
|
|
||||||
Project(Module("com.github.dummy", "libb", "0.5.3"),
|
Project(Module("com.github.dummy", "libb"), "0.5.3",
|
||||||
properties = Map("special" -> "true"),
|
properties = Map("special" -> "true"),
|
||||||
profiles = Seq(
|
profiles = Seq(
|
||||||
Profile("default", activation = Profile.Activation(properties = Seq("special" -> None)), dependencies = Seq(
|
Profile("default", activation = Profile.Activation(properties = Seq("special" -> None)), dependencies = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6"))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6")
|
||||||
))
|
))
|
||||||
)),
|
)),
|
||||||
|
|
||||||
Project(Module("com.github.dummy", "libb", "0.5.4"),
|
Project(Module("com.github.dummy", "libb"), "0.5.4",
|
||||||
properties = Map("special" -> "true"),
|
properties = Map("special" -> "true"),
|
||||||
profiles = Seq(
|
profiles = Seq(
|
||||||
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("true"))), dependencies = Seq(
|
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("true"))), dependencies = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6"))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6")
|
||||||
))
|
))
|
||||||
)),
|
)),
|
||||||
|
|
||||||
Project(Module("com.github.dummy", "libb", "0.5.5"),
|
Project(Module("com.github.dummy", "libb"), "0.5.5",
|
||||||
properties = Map("special" -> "true"),
|
properties = Map("special" -> "true"),
|
||||||
profiles = Seq(
|
profiles = Seq(
|
||||||
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("!false"))), dependencies = Seq(
|
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("!false"))), dependencies = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6"))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6")
|
||||||
))
|
))
|
||||||
)),
|
)),
|
||||||
|
|
||||||
Project(Module("com.github.dummy", "libb-parent", "0.5.6"),
|
Project(Module("com.github.dummy", "libb-parent"), "0.5.6",
|
||||||
properties = Map("special" -> "true")),
|
properties = Map("special" -> "true")),
|
||||||
|
|
||||||
Project(Module("com.github.dummy", "libb", "0.5.6"),
|
Project(Module("com.github.dummy", "libb"), "0.5.6",
|
||||||
parent = Some(Module("com.github.dummy", "libb-parent", "0.5.6")),
|
parent = Some(Module("com.github.dummy", "libb-parent"), "0.5.6"),
|
||||||
properties = Map("special" -> "true"),
|
properties = Map("special" -> "true"),
|
||||||
profiles = Seq(
|
profiles = Seq(
|
||||||
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("!false"))), dependencies = Seq(
|
Profile("default", activation = Profile.Activation(properties = Seq("special" -> Some("!false"))), dependencies = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6"))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6")
|
||||||
))
|
))
|
||||||
))
|
))
|
||||||
)
|
)
|
||||||
|
|
||||||
val projectsMap = projects.map(p => p.module -> p).toMap
|
val projectsMap = projects.map(p => p.moduleVersion -> p).toMap
|
||||||
val testRepository: Repository = new TestRepository(projectsMap)
|
val testRepository: Repository = new TestRepository(projectsMap)
|
||||||
|
|
||||||
val repositories = Seq[Repository](
|
val repositories = Seq[Repository](
|
||||||
|
|
@ -161,7 +161,7 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'notFound{
|
'notFound{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("acme", "playy", "2.4.0"))
|
val dep = Dependency(Module("acme", "playy"), "2.4.0")
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories)
|
fetchFrom(repositories)
|
||||||
|
|
@ -170,7 +170,7 @@ object ResolverTests extends TestSuite {
|
||||||
val expected = Resolution(
|
val expected = Resolution(
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(dep.withCompileScope),
|
dependencies = Set(dep.withCompileScope),
|
||||||
errors = Map(dep.module -> Seq("Not found"))
|
errors = Map(dep.moduleVersion -> Seq("Not found"))
|
||||||
)
|
)
|
||||||
|
|
||||||
assert(res == expected)
|
assert(res == expected)
|
||||||
|
|
@ -178,7 +178,7 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'single{
|
'single{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("acme", "config", "1.3.0"))
|
val dep = Dependency(Module("acme", "config"), "1.3.0")
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories)
|
fetchFrom(repositories)
|
||||||
|
|
@ -187,7 +187,7 @@ object ResolverTests extends TestSuite {
|
||||||
val expected = Resolution(
|
val expected = Resolution(
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(dep.withCompileScope),
|
dependencies = Set(dep.withCompileScope),
|
||||||
projectsCache = Map(dep.module -> (testRepository, projectsMap(dep.module)))
|
projectsCache = Map(dep.moduleVersion -> (testRepository, projectsMap(dep.moduleVersion)))
|
||||||
)
|
)
|
||||||
|
|
||||||
assert(res == expected)
|
assert(res == expected)
|
||||||
|
|
@ -195,8 +195,8 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'oneTransitiveDependency{
|
'oneTransitiveDependency{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("acme", "play", "2.4.0"))
|
val dep = Dependency(Module("acme", "play"), "2.4.0")
|
||||||
val trDep = Dependency(Module("acme", "play-json", "2.4.0"))
|
val trDep = Dependency(Module("acme", "play-json"), "2.4.0")
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories)
|
fetchFrom(repositories)
|
||||||
|
|
@ -206,8 +206,8 @@ object ResolverTests extends TestSuite {
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(dep.withCompileScope, trDep.withCompileScope),
|
dependencies = Set(dep.withCompileScope, trDep.withCompileScope),
|
||||||
projectsCache = Map(
|
projectsCache = Map(
|
||||||
projectsMap(dep.module).kv,
|
projectsMap(dep.moduleVersion).kv,
|
||||||
projectsMap(trDep.module).kv
|
projectsMap(trDep.moduleVersion).kv
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -216,10 +216,10 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'twoTransitiveDependencyWithProps{
|
'twoTransitiveDependencyWithProps{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("acme", "play", "2.4.1"))
|
val dep = Dependency(Module("acme", "play"), "2.4.1")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("acme", "play-json", "2.4.0")),
|
Dependency(Module("acme", "play-json"), "2.4.0"),
|
||||||
Dependency(Module("acme", "config", "1.3.0"))
|
Dependency(Module("acme", "config"), "1.3.0")
|
||||||
)
|
)
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
|
|
@ -230,8 +230,8 @@ object ResolverTests extends TestSuite {
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
|
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
|
||||||
projectsCache = Map(
|
projectsCache = Map(
|
||||||
projectsMap(dep.module).kv
|
projectsMap(dep.moduleVersion).kv
|
||||||
) ++ trDeps.map(trDep => projectsMap(trDep.module).kv)
|
) ++ trDeps.map(trDep => projectsMap(trDep.moduleVersion).kv)
|
||||||
)
|
)
|
||||||
|
|
||||||
assert(res == expected)
|
assert(res == expected)
|
||||||
|
|
@ -239,11 +239,11 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'exclude{
|
'exclude{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("acme", "play-extra-no-config", "2.4.1"))
|
val dep = Dependency(Module("acme", "play-extra-no-config"), "2.4.1")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("acme", "play", "2.4.1"),
|
Dependency(Module("acme", "play"), "2.4.1",
|
||||||
exclusions = Set(("acme", "config"))),
|
exclusions = Set(("acme", "config"))),
|
||||||
Dependency(Module("acme", "play-json", "2.4.0"),
|
Dependency(Module("acme", "play-json"), "2.4.0",
|
||||||
exclusions = Set(("acme", "config")))
|
exclusions = Set(("acme", "config")))
|
||||||
)
|
)
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
|
|
@ -255,8 +255,8 @@ object ResolverTests extends TestSuite {
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
|
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
|
||||||
projectsCache = Map(
|
projectsCache = Map(
|
||||||
projectsMap(dep.module).kv
|
projectsMap(dep.moduleVersion).kv
|
||||||
) ++ trDeps.map(trDep => projectsMap(trDep.module).kv)
|
) ++ trDeps.map(trDep => projectsMap(trDep.moduleVersion).kv)
|
||||||
)
|
)
|
||||||
|
|
||||||
assert(res == expected)
|
assert(res == expected)
|
||||||
|
|
@ -264,11 +264,11 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'excludeOrgWildcard{
|
'excludeOrgWildcard{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("acme", "play-extra-no-config-no", "2.4.1"))
|
val dep = Dependency(Module("acme", "play-extra-no-config-no"), "2.4.1")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("acme", "play", "2.4.1"),
|
Dependency(Module("acme", "play"), "2.4.1",
|
||||||
exclusions = Set(("*", "config"))),
|
exclusions = Set(("*", "config"))),
|
||||||
Dependency(Module("acme", "play-json", "2.4.0"),
|
Dependency(Module("acme", "play-json"), "2.4.0",
|
||||||
exclusions = Set(("*", "config")))
|
exclusions = Set(("*", "config")))
|
||||||
)
|
)
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
|
|
@ -280,8 +280,8 @@ object ResolverTests extends TestSuite {
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
|
dependencies = Set(dep.withCompileScope) ++ trDeps.map(_.withCompileScope),
|
||||||
projectsCache = Map(
|
projectsCache = Map(
|
||||||
projectsMap(dep.module).kv
|
projectsMap(dep.moduleVersion).kv
|
||||||
) ++ trDeps.map(trDep => projectsMap(trDep.module).kv)
|
) ++ trDeps.map(trDep => projectsMap(trDep.moduleVersion).kv)
|
||||||
)
|
)
|
||||||
|
|
||||||
assert(res == expected)
|
assert(res == expected)
|
||||||
|
|
@ -289,7 +289,7 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'filter{
|
'filter{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("hudsucker", "mail", "10.0"))
|
val dep = Dependency(Module("hudsucker", "mail"), "10.0")
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories),
|
fetchFrom(repositories),
|
||||||
|
|
@ -300,7 +300,7 @@ object ResolverTests extends TestSuite {
|
||||||
rootDependencies = Set(dep.withCompileScope),
|
rootDependencies = Set(dep.withCompileScope),
|
||||||
dependencies = Set(dep.withCompileScope),
|
dependencies = Set(dep.withCompileScope),
|
||||||
projectsCache = Map(
|
projectsCache = Map(
|
||||||
projectsMap(dep.module).kv
|
projectsMap(dep.moduleVersion).kv
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -309,9 +309,9 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'parentDepMgmt{
|
'parentDepMgmt{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("se.ikea", "billy", "18.0"))
|
val dep = Dependency(Module("se.ikea", "billy"), "18.0")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("acme", "play", "2.4.0"),
|
Dependency(Module("acme", "play"), "2.4.0",
|
||||||
exclusions = Set(("acme", "play-json")))
|
exclusions = Set(("acme", "play-json")))
|
||||||
)
|
)
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
|
|
@ -330,10 +330,10 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'parentDependencies{
|
'parentDependencies{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("org.gnome", "panel-legacy", "7.0"))
|
val dep = Dependency(Module("org.gnome", "panel-legacy"), "7.0")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("org.gnu", "glib", "13.4")),
|
Dependency(Module("org.gnu", "glib"), "13.4"),
|
||||||
Dependency(Module("org.gnome", "desktop", "7.0")))
|
Dependency(Module("org.gnome", "desktop"), "7.0"))
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories),
|
fetchFrom(repositories),
|
||||||
|
|
@ -350,9 +350,9 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'propertiesInExclusions{
|
'propertiesInExclusions{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("com.mailapp", "mail-client", "2.1"))
|
val dep = Dependency(Module("com.mailapp", "mail-client"), "2.1")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("gov.nsa", "secure-pgp", "10.0"), exclusions = Set(("*", "crypto"))))
|
Dependency(Module("gov.nsa", "secure-pgp"), "10.0", exclusions = Set(("*", "crypto"))))
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories),
|
fetchFrom(repositories),
|
||||||
|
|
@ -369,7 +369,7 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'depMgmtInParentDeps{
|
'depMgmtInParentDeps{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("com.thoughtworks.paranamer", "paranamer", "2.6"))
|
val dep = Dependency(Module("com.thoughtworks.paranamer", "paranamer"), "2.6")
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories),
|
fetchFrom(repositories),
|
||||||
|
|
@ -386,9 +386,9 @@ object ResolverTests extends TestSuite {
|
||||||
}
|
}
|
||||||
'depsFromDefaultProfile{
|
'depsFromDefaultProfile{
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("com.github.dummy", "libb", "0.3.3"))
|
val dep = Dependency(Module("com.github.dummy", "libb"), "0.3.3")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6")))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"))
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories),
|
fetchFrom(repositories),
|
||||||
|
|
@ -407,9 +407,9 @@ object ResolverTests extends TestSuite {
|
||||||
val f =
|
val f =
|
||||||
for (version <- Seq("0.5.3", "0.5.4", "0.5.5", "0.5.6")) yield {
|
for (version <- Seq("0.5.3", "0.5.4", "0.5.5", "0.5.6")) yield {
|
||||||
async {
|
async {
|
||||||
val dep = Dependency(Module("com.github.dummy", "libb", version))
|
val dep = Dependency(Module("com.github.dummy", "libb"), version)
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6")))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"))
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories),
|
fetchFrom(repositories),
|
||||||
|
|
@ -430,9 +430,9 @@ object ResolverTests extends TestSuite {
|
||||||
'depsScopeOverrideFromProfile{
|
'depsScopeOverrideFromProfile{
|
||||||
async {
|
async {
|
||||||
// Like com.google.inject:guice:3.0 with org.sonatype.sisu.inject:cglib
|
// Like com.google.inject:guice:3.0 with org.sonatype.sisu.inject:cglib
|
||||||
val dep = Dependency(Module("com.github.dummy", "libb", "0.4.2"))
|
val dep = Dependency(Module("com.github.dummy", "libb"), "0.4.2")
|
||||||
val trDeps = Seq(
|
val trDeps = Seq(
|
||||||
Dependency(Module("org.escalier", "librairie-standard", "2.11.6")))
|
Dependency(Module("org.escalier", "librairie-standard"), "2.11.6"))
|
||||||
val res = await(resolve(
|
val res = await(resolve(
|
||||||
Set(dep),
|
Set(dep),
|
||||||
fetchFrom(repositories),
|
fetchFrom(repositories),
|
||||||
|
|
@ -452,9 +452,9 @@ object ResolverTests extends TestSuite {
|
||||||
'propertySubstitution{
|
'propertySubstitution{
|
||||||
val res =
|
val res =
|
||||||
Resolver.withProperties(
|
Resolver.withProperties(
|
||||||
Seq(Dependency(Module("a-company", "a-name", "${a.property}"))),
|
Seq(Dependency(Module("a-company", "a-name"), "${a.property}")),
|
||||||
Map("a.property" -> "a-version"))
|
Map("a.property" -> "a-version"))
|
||||||
val expected = Seq(Dependency(Module("a-company", "a-name", "a-version")))
|
val expected = Seq(Dependency(Module("a-company", "a-name"), "a-version"))
|
||||||
|
|
||||||
assert(res == expected)
|
assert(res == expected)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,10 +7,10 @@ import scalaz.{-\/, \/, EitherT}
|
||||||
import scalaz.concurrent.Task
|
import scalaz.concurrent.Task
|
||||||
import scalaz.Scalaz._
|
import scalaz.Scalaz._
|
||||||
|
|
||||||
class TestRepository(projects: Map[Module, Project]) extends Repository {
|
class TestRepository(projects: Map[(Module, String), Project]) extends Repository {
|
||||||
def find(module: Module, cachePolicy: CachePolicy) =
|
def find(module: Module, version: String, cachePolicy: CachePolicy) =
|
||||||
EitherT(Task.now(
|
EitherT(Task.now(
|
||||||
projects.get(module).toRightDisjunction("Not found")
|
projects.get((module, version)).toRightDisjunction("Not found")
|
||||||
))
|
))
|
||||||
def versions(organization: String, name: String, cachePolicy: CachePolicy) =
|
def versions(organization: String, name: String, cachePolicy: CachePolicy) =
|
||||||
EitherT(Task.now[String \/ Versions](
|
EitherT(Task.now[String \/ Versions](
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ "$1" = "clone" ]; then
|
||||||
|
git clone "https://${GH_TOKEN}@github.com/alexarchambault/coursier.git" -b gh-pages coursier-gh-pages >/dev/null 2>&1
|
||||||
|
else
|
||||||
|
git push origin gh-pages >/dev/null 2>&1
|
||||||
|
fi
|
||||||
|
|
@ -0,0 +1,26 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -ev
|
||||||
|
|
||||||
|
TRAVIS_SCALA_VERSION="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
sbt ++${TRAVIS_SCALA_VERSION} web/fastOptJS
|
||||||
|
|
||||||
|
HELPER="$(readlink -f "$(dirname "$0")/push-gh-pages-helper.sh")"
|
||||||
|
|
||||||
|
"$HELPER" clone
|
||||||
|
cd coursier-gh-pages
|
||||||
|
|
||||||
|
[ ! -e staging ] || git rm -r staging
|
||||||
|
|
||||||
|
mkdir staging
|
||||||
|
DIR="$(for i in "../web/target/scala-"*; do echo "$i"; done)"
|
||||||
|
cp "$DIR/web-"*.js* staging
|
||||||
|
cp "$DIR/classes/index"*.html staging
|
||||||
|
cp -R "$DIR/classes/css" staging
|
||||||
|
|
||||||
|
git config user.name "Travis-CI"
|
||||||
|
git config user.email "invalid@travis-ci.com"
|
||||||
|
git add staging
|
||||||
|
git commit -m "Deploy to gh-pages"
|
||||||
|
"$HELPER"
|
||||||
|
|
@ -23,6 +23,10 @@ function isMaster() {
|
||||||
[ "$TRAVIS_BRANCH" = "master" ]
|
[ "$TRAVIS_BRANCH" = "master" ]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isMasterOrDevelop() {
|
||||||
|
[ "$TRAVIS_BRANCH" = "master" -o "$TRAVIS_BRANCH" = "develop" ]
|
||||||
|
}
|
||||||
|
|
||||||
# web sub-project doesn't compile in 2.10 (no scalajs-react)
|
# web sub-project doesn't compile in 2.10 (no scalajs-react)
|
||||||
if echo "$TRAVIS_SCALA_VERSION" | grep -q "^2\.10"; then
|
if echo "$TRAVIS_SCALA_VERSION" | grep -q "^2\.10"; then
|
||||||
SBT_COMMANDS="cli/compile"
|
SBT_COMMANDS="cli/compile"
|
||||||
|
|
@ -32,8 +36,17 @@ fi
|
||||||
|
|
||||||
SBT_COMMANDS="$SBT_COMMANDS core-jvm/test core-js/test"
|
SBT_COMMANDS="$SBT_COMMANDS core-jvm/test core-js/test"
|
||||||
|
|
||||||
|
PUSH_GHPAGES=0
|
||||||
if isNotPr && isJdk7 && isMaster; then
|
if isNotPr && isJdk7 && isMaster; then
|
||||||
SBT_COMMANDS="$SBT_COMMANDS core-jvm/publish core-js/publish cli/publish"
|
SBT_COMMANDS="$SBT_COMMANDS core-jvm/publish core-js/publish cli/publish"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if isNotPr && isJdk7 && isMasterOrDevelop; then
|
||||||
|
if echo "$TRAVIS_SCALA_VERSION" | grep -q "^2\.11"; then
|
||||||
|
PUSH_GHPAGES=1
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
sbt ++${TRAVIS_SCALA_VERSION} $SBT_COMMANDS
|
sbt ++${TRAVIS_SCALA_VERSION} $SBT_COMMANDS
|
||||||
|
|
||||||
|
[ "$PUSH_GHPAGES" = 0 ] || "$(dirname "$0")/push-gh-pages.sh" "$TRAVIS_SCALA_VERSION"
|
||||||
|
|
|
||||||
|
|
@ -69,7 +69,7 @@ class Backend($: BackendScope[Unit, State]) {
|
||||||
|
|
||||||
def updateTree(resolution: Resolution, target: String, reverse: Boolean) = {
|
def updateTree(resolution: Resolution, target: String, reverse: Boolean) = {
|
||||||
def depsOf(dep: Dependency) =
|
def depsOf(dep: Dependency) =
|
||||||
resolution.projectsCache.get(dep.module).toSeq.flatMap(t => Resolver.finalDependencies(dep, t._2).filter(resolution.filter getOrElse Resolver.defaultFilter))
|
resolution.projectsCache.get(dep.moduleVersion).toSeq.flatMap(t => Resolver.finalDependencies(dep, t._2).filter(resolution.filter getOrElse Resolver.defaultFilter))
|
||||||
|
|
||||||
lazy val reverseDeps = {
|
lazy val reverseDeps = {
|
||||||
var m = Map.empty[Module, Seq[Dependency]]
|
var m = Map.empty[Module, Seq[Dependency]]
|
||||||
|
|
@ -169,7 +169,7 @@ class Backend($: BackendScope[Unit, State]) {
|
||||||
def addModule(e: ReactEventI) = {
|
def addModule(e: ReactEventI) = {
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
$.modState{ state =>
|
$.modState{ state =>
|
||||||
val modules = state.modules :+ Dependency(Module("", "", ""))
|
val modules = state.modules :+ Dependency(Module("", ""), "")
|
||||||
println(s"Modules:\n${modules.mkString("\n")}")
|
println(s"Modules:\n${modules.mkString("\n")}")
|
||||||
state.copy(modules = modules, editModuleIdx = modules.length - 1)
|
state.copy(modules = modules, editModuleIdx = modules.length - 1)
|
||||||
}
|
}
|
||||||
|
|
@ -211,26 +211,26 @@ object App {
|
||||||
|
|
||||||
def depItem(dep: Dependency) =
|
def depItem(dep: Dependency) =
|
||||||
<.tr(
|
<.tr(
|
||||||
^.`class` := (if (res.errors.contains(dep.module)) "danger" else ""),
|
^.`class` := (if (res.errors.contains(dep.moduleVersion)) "danger" else ""),
|
||||||
<.td(dep.module.organization),
|
<.td(dep.module.organization),
|
||||||
<.td(dep.module.name),
|
<.td(dep.module.name),
|
||||||
<.td(dep.module.version),
|
<.td(dep.version),
|
||||||
<.td(Seq[Seq[TagMod]](
|
<.td(Seq[Seq[TagMod]](
|
||||||
if (dep.scope == Scope.Compile) Seq() else Seq(infoLabel(dep.scope.name)),
|
if (dep.scope == Scope.Compile) Seq() else Seq(infoLabel(dep.scope.name)),
|
||||||
if (dep.`type`.isEmpty || dep.`type` == "jar") Seq() else Seq(infoLabel(dep.`type`)),
|
if (dep.`type`.isEmpty || dep.`type` == "jar") Seq() else Seq(infoLabel(dep.`type`)),
|
||||||
if (dep.classifier.isEmpty) Seq() else Seq(infoLabel(dep.classifier)),
|
if (dep.classifier.isEmpty) Seq() else Seq(infoLabel(dep.classifier)),
|
||||||
if (dep.optional) Seq(infoLabel("optional")) else Seq(),
|
if (dep.optional) Seq(infoLabel("optional")) else Seq(),
|
||||||
res.errors.get(dep.module).map(errs => errorLabel("Error", errs.mkString("; "))).toSeq
|
res.errors.get(dep.moduleVersion).map(errs => errorLabel("Error", errs.mkString("; "))).toSeq
|
||||||
)),
|
)),
|
||||||
<.td(Seq[Seq[TagMod]](
|
<.td(Seq[Seq[TagMod]](
|
||||||
res.projectsCache.get(dep.module) match {
|
res.projectsCache.get(dep.moduleVersion) match {
|
||||||
case Some((repo: Remote, _)) =>
|
case Some((repo: Remote, _)) =>
|
||||||
// FIXME Maven specific, generalize if/when adding support for Ivy
|
// FIXME Maven specific, generalize if/when adding support for Ivy
|
||||||
val relPath =
|
val relPath =
|
||||||
dep.module.organization.split('.').toSeq ++ Seq(
|
dep.module.organization.split('.').toSeq ++ Seq(
|
||||||
dep.module.name,
|
dep.module.name,
|
||||||
dep.module.version,
|
dep.version,
|
||||||
s"${dep.module.name}-${dep.module.version}"
|
s"${dep.module.name}-${dep.version}"
|
||||||
)
|
)
|
||||||
|
|
||||||
Seq(
|
Seq(
|
||||||
|
|
@ -274,9 +274,9 @@ object App {
|
||||||
def remove = apply("remove")
|
def remove = apply("remove")
|
||||||
}
|
}
|
||||||
|
|
||||||
val moduleEditModal = ReactComponentB[(Module, Int, Backend)]("EditModule")
|
val moduleEditModal = ReactComponentB[((Module, String), Int, Backend)]("EditModule")
|
||||||
.render{ P =>
|
.render{ P =>
|
||||||
val (module, moduleIdx, backend) = P
|
val ((module, version), moduleIdx, backend) = P
|
||||||
<.div(^.`class` := "modal fade", ^.id := "moduleEdit", ^.role := "dialog", ^.aria.labelledby := "moduleEditTitle",
|
<.div(^.`class` := "modal fade", ^.id := "moduleEdit", ^.role := "dialog", ^.aria.labelledby := "moduleEditTitle",
|
||||||
<.div(^.`class` := "modal-dialog", <.div(^.`class` := "modal-content",
|
<.div(^.`class` := "modal-dialog", <.div(^.`class` := "modal-content",
|
||||||
<.div(^.`class` := "modal-header",
|
<.div(^.`class` := "modal-header",
|
||||||
|
|
@ -304,8 +304,8 @@ object App {
|
||||||
<.div(^.`class` := "form-group",
|
<.div(^.`class` := "form-group",
|
||||||
<.label(^.`for` := "inputVersion", "Version"),
|
<.label(^.`for` := "inputVersion", "Version"),
|
||||||
<.input(^.`class` := "form-control", ^.id := "inputVersion", ^.placeholder := "Version",
|
<.input(^.`class` := "form-control", ^.id := "inputVersion", ^.placeholder := "Version",
|
||||||
^.onChange ==> backend.updateModule(moduleIdx, (dep, value) => dep.copy(module = dep.module.copy(version = value))),
|
^.onChange ==> backend.updateModule(moduleIdx, (dep, value) => dep.copy(version = value)),
|
||||||
^.value := module.version
|
^.value := version
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
<.div(^.`class` := "modal-footer",
|
<.div(^.`class` := "modal-footer",
|
||||||
|
|
@ -326,7 +326,7 @@ object App {
|
||||||
<.tr(
|
<.tr(
|
||||||
<.td(dep.module.organization),
|
<.td(dep.module.organization),
|
||||||
<.td(dep.module.name),
|
<.td(dep.module.name),
|
||||||
<.td(dep.module.version),
|
<.td(dep.version),
|
||||||
<.td(
|
<.td(
|
||||||
<.a(Attr("data-toggle") := "modal", Attr("data-target") := "#moduleEdit", ^.`class` := "icon-action",
|
<.a(Attr("data-toggle") := "modal", Attr("data-target") := "#moduleEdit", ^.`class` := "icon-action",
|
||||||
^.onClick ==> backend.editModule(idx),
|
^.onClick ==> backend.editModule(idx),
|
||||||
|
|
@ -363,7 +363,7 @@ object App {
|
||||||
deps.zipWithIndex.map((depItem _).tupled)
|
deps.zipWithIndex.map((depItem _).tupled)
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
moduleEditModal((deps.lift(editModuleIdx).fold(Module("", "", ""))(_.module), editModuleIdx, backend))
|
moduleEditModal((deps.lift(editModuleIdx).fold((Module("", ""), ""))(_.moduleVersion), editModuleIdx, backend))
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.build
|
.build
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue