From bd082a562bbc24658a6be5fa8ec161ed35c48122 Mon Sep 17 00:00:00 2001 From: Martin Duhem Date: Mon, 7 Mar 2016 11:44:34 +0100 Subject: [PATCH 1/2] Check that default artifact exists when trying to retrieve it. When concatenating the artifacts coming from two modules, we sometimes attempted to create a default artifact from the organization and name of the module. However, this may fail because a module a % b "1.0" may not have an artifact named "b.jar" (see sbt/sbt#2431). Fixes sbt/sbt#2431. --- .../librarymanagement/ivyint/MergeDescriptors.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala index 03e043043..390266a69 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala @@ -79,8 +79,8 @@ private final class MergedDescriptors(a: DependencyDescriptor, b: DependencyDesc { if (as.isEmpty) if (bs.isEmpty) as - else defaultArtifact(a) +: explicitConfigurations(b, bs) - else if (bs.isEmpty) explicitConfigurations(a, as) :+ defaultArtifact(b) + else defaultArtifact(a) ++ explicitConfigurations(b, bs) + else if (bs.isEmpty) explicitConfigurations(a, as) ++ defaultArtifact(b) else concat(explicitConfigurations(a, as), explicitConfigurations(b, bs)) } private[this] def explicitConfigurations(base: DependencyDescriptor, arts: Array[DependencyArtifactDescriptor]): Array[DependencyArtifactDescriptor] = @@ -93,11 +93,11 @@ private final class MergedDescriptors(a: DependencyDescriptor, b: DependencyDesc else art } - private[this] def defaultArtifact(a: DependencyDescriptor): DependencyArtifactDescriptor = + private[this] def defaultArtifact(a: DependencyDescriptor): Array[DependencyArtifactDescriptor] = { val dd = new DefaultDependencyArtifactDescriptor(a, a.getDependencyRevisionId.getName, "jar", "jar", null, null) addConfigurations(dd, a.getModuleConfigurations) - dd + a.getAllDependencyArtifacts.filter(_ == dd) } private[this] def copyWithConfigurations(dd: DependencyArtifactDescriptor, confs: Seq[String]): DependencyArtifactDescriptor = { From 8e333984f2e48c0d9ad7cc8f9531619dca4c10b0 Mon Sep 17 00:00:00 2001 From: Martin Duhem Date: Mon, 14 Mar 2016 08:51:25 +0100 Subject: [PATCH 2/2] Create default artifact for deps from POM files Dependency descriptors that are created from POM files do not specify their artifacts. In those cases, it is correct to create a default artifact. --- .../internal/librarymanagement/ivyint/MergeDescriptors.scala | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala index 390266a69..475e6056f 100644 --- a/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala +++ b/librarymanagement/src/main/scala/sbt/internal/librarymanagement/ivyint/MergeDescriptors.scala @@ -97,7 +97,10 @@ private final class MergedDescriptors(a: DependencyDescriptor, b: DependencyDesc { val dd = new DefaultDependencyArtifactDescriptor(a, a.getDependencyRevisionId.getName, "jar", "jar", null, null) addConfigurations(dd, a.getModuleConfigurations) - a.getAllDependencyArtifacts.filter(_ == dd) + // If the dependency descriptor is empty, then it means that it has been created from a POM file. In this case, + // it is correct to create a seemingly non-existent dependency artifact. + if (a.getAllDependencyArtifacts.isEmpty) Array(dd) + else a.getAllDependencyArtifacts filter (_ == dd) } private[this] def copyWithConfigurations(dd: DependencyArtifactDescriptor, confs: Seq[String]): DependencyArtifactDescriptor = {