diff --git a/sbt-coursier/src/main/scala/coursier/Tasks.scala b/sbt-coursier/src/main/scala/coursier/Tasks.scala index da58bafb8..52e47cec2 100644 --- a/sbt-coursier/src/main/scala/coursier/Tasks.scala +++ b/sbt-coursier/src/main/scala/coursier/Tasks.scala @@ -64,23 +64,25 @@ object Tasks { } def coursierRecursiveResolversTask: Def.Initialize[sbt.Task[Seq[Resolver]]] = - ( - sbt.Keys.state, - sbt.Keys.thisProjectRef - ).flatMap { (state, projectRef) => + Def.taskDyn { + + val state = sbt.Keys.state.value + val projectRef = sbt.Keys.thisProjectRef.value val projects = allRecursiveInterDependencies(state, projectRef) - coursierResolvers + val t = coursierResolvers .forAllProjects(state, projectRef +: projects) .map(_.values.toVector.flatten) + + Def.task(t.value) } def coursierFallbackDependenciesTask: Def.Initialize[sbt.Task[Seq[(Module, String, URL, Boolean)]]] = - ( - sbt.Keys.state, - sbt.Keys.thisProjectRef - ).flatMap { (state, projectRef) => + Def.taskDyn { + + val state = sbt.Keys.state.value + val projectRef = sbt.Keys.thisProjectRef.value val projects = allRecursiveInterDependencies(state, projectRef) @@ -88,9 +90,8 @@ object Tasks { .forAllProjects(state, projectRef +: projects) .map(_.values.toVector.flatten) - for { - allDependencies <- allDependenciesTask - } yield { + Def.task { + val allDependencies = allDependenciesTask.value FromSbt.fallbackDependencies( allDependencies, @@ -101,10 +102,10 @@ object Tasks { } def coursierProjectTask: Def.Initialize[sbt.Task[Project]] = - ( - sbt.Keys.state, - sbt.Keys.thisProjectRef - ).flatMap { (state, projectRef) => + Def.taskDyn { + + val state = sbt.Keys.state.value + val projectRef = sbt.Keys.thisProjectRef.value // should projectID.configurations be used instead? val configurations = ivyConfigurations.in(projectRef).get(state) @@ -140,9 +141,9 @@ object Tasks { res } - for { - allDependencies <- allDependenciesTask - } yield { + Def.task { + + val allDependencies = allDependenciesTask.value val configMap = configurations.map(cfg => cfg.name -> cfg.extendsConfigs.map(_.name)).toMap @@ -164,14 +165,16 @@ object Tasks { } def coursierInterProjectDependenciesTask: Def.Initialize[sbt.Task[Seq[Project]]] = - ( - sbt.Keys.state, - sbt.Keys.thisProjectRef - ).flatMap { (state, projectRef) => + Def.taskDyn { + + val state = sbt.Keys.state.value + val projectRef = sbt.Keys.thisProjectRef.value val projects = allRecursiveInterDependencies(state, projectRef) - coursierProject.forAllProjects(state, projects).map(_.values.toVector) + val t = coursierProject.forAllProjects(state, projects).map(_.values.toVector) + + Def.task(t.value) } def coursierPublicationsTask( @@ -405,8 +408,10 @@ object Tasks { } def parentProjectCacheTask: Def.Initialize[sbt.Task[Map[Seq[sbt.Resolver],Seq[coursier.ProjectCache]]]] = - (sbt.Keys.state, - sbt.Keys.thisProjectRef).flatMap{ (state, projectRef) => + Def.taskDyn { + + val state = sbt.Keys.state.value + val projectRef = sbt.Keys.thisProjectRef.value val projectDeps = structure(state).allProjects .find(_.id == projectRef.project) @@ -415,14 +420,22 @@ object Tasks { val projects = structure(state).allProjectRefs.filter(p => projectDeps(p.project)) - coursierRecursiveResolvers.forAllProjects(state, projects).flatMap{ m => - coursierResolution.forAllProjects(state, m.keys.toSeq).map{ n => - n.foldLeft(Map.empty[Seq[Resolver], Seq[ProjectCache]]){ case (caches, (ref, resolution)) => - m.get(ref).fold(caches)(resolvers => - caches.updated(resolvers, resolution.projectCache +: caches.getOrElse(resolvers, Seq.empty))) + val t = + for { + m <- coursierRecursiveResolvers.forAllProjects(state, projects) + n <- coursierResolution.forAllProjects(state, m.keys.toSeq) + } yield + n.foldLeft(Map.empty[Seq[Resolver], Seq[ProjectCache]]) { + case (caches, (ref, resolution)) => + m.get(ref).fold(caches) { resolvers => + caches.updated( + resolvers, + resolution.projectCache +: caches.getOrElse(resolvers, Nil) + ) + } } - } - } + + Def.task(t.value) } private val noOptionalFilter: Option[Dependency => Boolean] = Some(dep => !dep.optional) diff --git a/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala b/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala index 8a6458901..ebf24abf6 100644 --- a/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala +++ b/tests/shared/src/test/scala/coursier/test/ResolutionTests.scala @@ -239,8 +239,16 @@ object ResolutionTests extends TestSuite { Set(dep) )) - // A missing POM dependency is not reported correctly. That's why the method is deprecated. - assert(res.errors == Seq.empty) + val directDependencyErrors = + for { + dep <- res.dependencies.toSeq + err <- res.errorCache + .get(dep.moduleVersion) + .toSeq + } yield (dep, err) + + // Error originates from a dependency import, not directly from a dependency + assert(directDependencyErrors.isEmpty) // metadataErrors have that assert(res.metadataErrors == Seq((Module("acme", "missing-pom"), "1.0.0") -> List("Not found"))) diff --git a/web/src/main/resources/index.html b/web/src/main/resources/index.html index a478079bd..65e7975b0 100644 --- a/web/src/main/resources/index.html +++ b/web/src/main/resources/index.html @@ -126,7 +126,7 @@ $('.nav-tabs a').on('shown.bs.tab', function (e) { diff --git a/web/src/main/scala/coursier/web/Main.scala b/web/src/main/scala/coursier/web/Main.scala index f5e9e0831..2fa379284 100644 --- a/web/src/main/scala/coursier/web/Main.scala +++ b/web/src/main/scala/coursier/web/Main.scala @@ -1,10 +1,11 @@ package coursier.web import japgolly.scalajs.react.React -import scala.scalajs.js.annotation.JSExport + +import scala.scalajs.js.annotation.{JSExport, JSExportTopLevel} import org.scalajs.dom.document -@JSExport +@JSExportTopLevel("CoursierWeb") object Main { @JSExport def main(): Unit = {