From 3fd060a75ac7105af297d40b3c035bc32fe2db80 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sun, 3 Jan 2016 19:36:21 +0100 Subject: [PATCH] Add support for intransitive dependencies --- .../scala/coursier/core/Definitions.scala | 4 +++- .../main/scala/coursier/core/Resolution.scala | 19 ++++++++------- .../src/main/scala/coursier/ivy/IvyXml.scala | 24 ++++++++++++------- .../src/main/scala/coursier/maven/Pom.scala | 3 ++- .../src/main/scala/coursier/package.scala | 6 +++-- .../main/scala-2.10/coursier/FromSbt.scala | 3 ++- 6 files changed, 38 insertions(+), 21 deletions(-) diff --git a/core/shared/src/main/scala/coursier/core/Definitions.scala b/core/shared/src/main/scala/coursier/core/Definitions.scala index de4604840..57a7c6c69 100644 --- a/core/shared/src/main/scala/coursier/core/Definitions.scala +++ b/core/shared/src/main/scala/coursier/core/Definitions.scala @@ -44,7 +44,9 @@ case class Dependency( // Maven-specific attributes: Attributes, - optional: Boolean + optional: Boolean, + + transitive: Boolean ) { def moduleVersion = (module, version) } diff --git a/core/shared/src/main/scala/coursier/core/Resolution.scala b/core/shared/src/main/scala/coursier/core/Resolution.scala index bd534e015..f8bbaf818 100644 --- a/core/shared/src/main/scala/coursier/core/Resolution.scala +++ b/core/shared/src/main/scala/coursier/core/Resolution.scala @@ -434,14 +434,17 @@ case class Resolution( new mutable.HashMap[Dependency, Seq[Dependency]]() private def finalDependencies0(dep: Dependency) = finalDependenciesCache.synchronized { - finalDependenciesCache.getOrElseUpdate(dep, - projectCache.get(dep.moduleVersion) match { - case Some((_, proj)) => - finalDependencies(dep, proj) - .filter(filter getOrElse defaultFilter) - case None => Nil - } - ) + finalDependenciesCache.getOrElseUpdate(dep, { + if (dep.transitive) + projectCache.get(dep.moduleVersion) match { + case Some((_, proj)) => + finalDependencies(dep, proj) + .filter(filter getOrElse defaultFilter) + case None => Nil + } + else + Nil + }) } /** diff --git a/core/shared/src/main/scala/coursier/ivy/IvyXml.scala b/core/shared/src/main/scala/coursier/ivy/IvyXml.scala index 5f15e255d..002bd000e 100644 --- a/core/shared/src/main/scala/coursier/ivy/IvyXml.scala +++ b/core/shared/src/main/scala/coursier/ivy/IvyXml.scala @@ -69,14 +69,22 @@ object IvyXml { rawConf <- node.attribute("conf").toOption.toSeq (fromConf, toConf) <- mappings(rawConf) attr = node.attributesFromNamespace(attributesNamespace) - } yield fromConf -> Dependency( - Module(org, name, attr.toMap), - version, - toConf, - allConfsExcludes ++ excludes.getOrElse(fromConf, Set.empty), - Attributes("jar", ""), // should come from possible artifact nodes - optional = false - ) + } yield { + val transitive = node.attribute("transitive").toOption match { + case Some("false") => false + case _ => true + } + + fromConf -> Dependency( + Module(org, name, attr.toMap), + version, + toConf, + allConfsExcludes ++ excludes.getOrElse(fromConf, Set.empty), + Attributes("jar", ""), // should come from possible artifact nodes + optional = false, + transitive = transitive + ) + } } private def publications(node: Node): Map[String, Seq[Publication]] = diff --git a/core/shared/src/main/scala/coursier/maven/Pom.scala b/core/shared/src/main/scala/coursier/maven/Pom.scala index 7f42eeaab..c0b734898 100644 --- a/core/shared/src/main/scala/coursier/maven/Pom.scala +++ b/core/shared/src/main/scala/coursier/maven/Pom.scala @@ -53,7 +53,8 @@ object Pom { "", exclusions.map(mod => (mod.organization, mod.name)).toSet, Attributes(typeOpt getOrElse defaultType, classifierOpt getOrElse defaultClassifier), - optional + optional, + transitive = true ) } diff --git a/core/shared/src/main/scala/coursier/package.scala b/core/shared/src/main/scala/coursier/package.scala index 8a19dd3cc..d15ba3985 100644 --- a/core/shared/src/main/scala/coursier/package.scala +++ b/core/shared/src/main/scala/coursier/package.scala @@ -13,7 +13,8 @@ package object coursier { configuration: String = "", attributes: Attributes = Attributes(), exclusions: Set[(String, String)] = Set.empty, - optional: Boolean = false + optional: Boolean = false, + transitive: Boolean = true ): Dependency = core.Dependency( module, @@ -21,7 +22,8 @@ package object coursier { configuration, exclusions, attributes, - optional + optional, + transitive ) } diff --git a/plugin/src/main/scala-2.10/coursier/FromSbt.scala b/plugin/src/main/scala-2.10/coursier/FromSbt.scala index 2a1b653b1..4e19c3a53 100644 --- a/plugin/src/main/scala-2.10/coursier/FromSbt.scala +++ b/plugin/src/main/scala-2.10/coursier/FromSbt.scala @@ -47,7 +47,8 @@ object FromSbt { exclusions = module.exclusions.map { rule => // FIXME Other `rule` fields are ignored here (rule.organization, rule.name) - }.toSet + }.toSet, + transitive = module.isTransitive ) val mapping = module.configurations.getOrElse("compile")