diff --git a/plugin/src/main/scala-2.10/coursier/Tasks.scala b/plugin/src/main/scala-2.10/coursier/Tasks.scala index eb7765d18..7927d2bf1 100644 --- a/plugin/src/main/scala-2.10/coursier/Tasks.scala +++ b/plugin/src/main/scala-2.10/coursier/Tasks.scala @@ -27,6 +27,29 @@ import scalaz.concurrent.{ Task, Strategy } object Tasks { + def allRecursiveInterDependencies(state: sbt.State, projectRef: sbt.ProjectRef) = { + + def dependencies(map: Map[String, Seq[String]], id: String): Set[String] = { + + def helper(map: Map[String, Seq[String]], acc: Set[String]): Set[String] = + if (acc.exists(map.contains)) { + val (kept, rem) = map.partition { case (k, _) => acc(k) } + helper(rem, acc ++ kept.valuesIterator.flatten) + } else + acc + + helper(map - id, map.getOrElse(id, Nil).toSet) + } + + val allProjectsDeps = + for (p <- structure(state).allProjects) + yield p.id -> p.dependencies.map(_.project.project) + + val deps = dependencies(allProjectsDeps.toMap, projectRef.project) + + structure(state).allProjectRefs.filter(p => deps(p.project)) + } + def coursierResolversTask: Def.Initialize[sbt.Task[Seq[Resolver]]] = ( externalResolvers, @@ -52,7 +75,11 @@ object Tasks { sbt.Keys.thisProjectRef ).flatMap { (state, projectRef) => - val allDependenciesTask = allDependencies.in(projectRef).get(state) + val projects = allRecursiveInterDependencies(state, projectRef) + + val allDependenciesTask = allDependencies + .forAllProjects(state, projectRef +: projects) + .map(_.values.toVector.flatten) for { allDependencies <- allDependenciesTask @@ -103,25 +130,7 @@ object Tasks { sbt.Keys.thisProjectRef ).flatMap { (state, projectRef) => - def dependencies(map: Map[String, Seq[String]], id: String): Set[String] = { - - def helper(map: Map[String, Seq[String]], acc: Set[String]): Set[String] = - if (acc.exists(map.contains)) { - val (kept, rem) = map.partition { case (k, _) => acc(k) } - helper(rem, acc ++ kept.valuesIterator.flatten) - } else - acc - - helper(map - id, map.getOrElse(id, Nil).toSet) - } - - val allProjectsDeps = - for (p <- structure(state).allProjects) - yield p.id -> p.dependencies.map(_.project.project) - - val deps = dependencies(allProjectsDeps.toMap, projectRef.project) - - val projects = structure(state).allProjectRefs.filter(p => deps(p.project)) + val projects = allRecursiveInterDependencies(state, projectRef) coursierProject.forAllProjects(state, projects).map(_.values.toVector) } diff --git a/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/a/src/main/scala/A.scala b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/a/src/main/scala/A.scala new file mode 100644 index 000000000..954405774 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/a/src/main/scala/A.scala @@ -0,0 +1,6 @@ + +case class A(msg: String) + +object A { + def default = A("OK") +} diff --git a/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/b/src/main/scala/Main.scala b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/b/src/main/scala/Main.scala new file mode 100644 index 000000000..59bb6d372 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/b/src/main/scala/Main.scala @@ -0,0 +1,9 @@ +import java.io.File +import java.nio.file.Files + +object Main extends App { + + val msg = shapeless.Generic[A].to(A.default).head + + Files.write(new File("output").toPath, msg.getBytes("UTF-8")) +} diff --git a/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/build.sbt b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/build.sbt new file mode 100644 index 000000000..9394f7ad7 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/build.sbt @@ -0,0 +1,26 @@ + +lazy val a = project + .settings(sharedSettings) + .settings( + libraryDependencies += "com.chuusai" %% "shapeless" % "2.3.234" from "https://oss.sonatype.org/content/repositories/releases/com/chuusai/shapeless_2.11/2.3.1/shapeless_2.11-2.3.1.jar" + ) + +lazy val b = project + .dependsOn(a) + .settings(sharedSettings) + +lazy val root = project + .in(file(".")) + .aggregate(a, b) + .settings(sharedSettings) + + +lazy val sharedSettings = Seq( + scalaVersion := "2.11.8", + coursierCachePolicies := { + if (sys.props("os.name").startsWith("Windows")) + coursierCachePolicies.value + else + Seq(coursier.CachePolicy.ForceDownload) + } +) diff --git a/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/project/plugins.sbt b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/project/plugins.sbt new file mode 100644 index 000000000..152225a9e --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/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/fallback-dependencies-inter-project/test b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/test new file mode 100644 index 000000000..ea53e1abb --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/fallback-dependencies-inter-project/test @@ -0,0 +1,3 @@ +$ delete output +> b/run +$ exists output