From 573a54cd8b503f08f6f33180401ba830de174df4 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Fri, 1 Apr 2016 00:39:32 +0200 Subject: [PATCH] Add support for excludeDependencies in SBT plugin --- .../src/main/scala-2.10/coursier/Tasks.scala | 23 ++++++++++++++++++- .../exclude-dependencies/build.sbt | 5 ++++ .../exclude-dependencies/project/plugins.sbt | 11 +++++++++ .../src/main/scala/Main.scala | 21 +++++++++++++++++ .../sbt-coursier/exclude-dependencies/test | 3 +++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 plugin/src/sbt-test/sbt-coursier/exclude-dependencies/build.sbt create mode 100644 plugin/src/sbt-test/sbt-coursier/exclude-dependencies/project/plugins.sbt create mode 100644 plugin/src/sbt-test/sbt-coursier/exclude-dependencies/src/main/scala/Main.scala create mode 100644 plugin/src/sbt-test/sbt-coursier/exclude-dependencies/test diff --git a/plugin/src/main/scala-2.10/coursier/Tasks.scala b/plugin/src/main/scala-2.10/coursier/Tasks.scala index 2d1569a28..3583c0d8c 100644 --- a/plugin/src/main/scala-2.10/coursier/Tasks.scala +++ b/plugin/src/main/scala-2.10/coursier/Tasks.scala @@ -259,6 +259,24 @@ object Tasks { FromSbt.moduleVersion(_, sv, sbv) ).toMap + var anyNonSupportedExclusionRule = false + val exclusions = excludeDependencies.value.flatMap { + rule => + if ( + rule.artifact != "*" || + rule.configurations.nonEmpty || + rule.crossVersion != sbt.CrossVersion.Disabled + ) { + Console.err.println(s"Warning: unsupported exclusion rule $rule") + anyNonSupportedExclusionRule = true + Nil + } else + Seq((rule.organization, rule.name)) + }.toSet + + if (anyNonSupportedExclusionRule) + Console.err.println(s"Only supported exclusion rule fields: organization, name") + val resolvers = if (sbtClassifiers) coursierSbtResolvers.value @@ -269,7 +287,10 @@ object Tasks { val startRes = Resolution( - currentProject.dependencies.map { case (_, dep) => dep }.toSet, + currentProject.dependencies.map { + case (_, dep) => + dep.copy(exclusions = dep.exclusions ++ exclusions) + }.toSet, filter = Some(dep => !dep.optional), forceVersions = userForceVersions ++ forcedScalaModules(sv) ++ projects.map(_.moduleVersion) ) diff --git a/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/build.sbt b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/build.sbt new file mode 100644 index 000000000..17832bca7 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/build.sbt @@ -0,0 +1,5 @@ +scalaVersion := "2.11.8" + +libraryDependencies += "com.github.alexarchambault" %% "argonaut-shapeless_6.1" % "1.0.0-RC1" + +excludeDependencies += SbtExclusionRule("com.chuusai", "shapeless_2.11") diff --git a/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/project/plugins.sbt b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/project/plugins.sbt new file mode 100644 index 000000000..152225a9e --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/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/exclude-dependencies/src/main/scala/Main.scala b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/src/main/scala/Main.scala new file mode 100644 index 000000000..c8d199037 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/src/main/scala/Main.scala @@ -0,0 +1,21 @@ +import java.io.File +import java.nio.file.Files + +import scala.util.Try + +object Main extends App { + + def classFound(clsName: String) = Try( + Thread.currentThread() + .getContextClassLoader() + .loadClass(clsName) + ).toOption.nonEmpty + + val shapelessFound = classFound("shapeless.HList") + val argonautShapelessFound = classFound("argonaut.derive.MkEncodeJson") + + assert(argonautShapelessFound) + assert(!shapelessFound) + + Files.write(new File("output").toPath, "OK".getBytes("UTF-8")) +} diff --git a/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/test b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/test new file mode 100644 index 000000000..2182f57b0 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/exclude-dependencies/test @@ -0,0 +1,3 @@ +$ delete output +> run +$ exists output