From d71df26087b6e48dfea7f940880a8582d00a5386 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Fri, 1 Apr 2016 01:39:19 +0200 Subject: [PATCH 1/5] Basic property substitution in version in POMs --- .../main/scala/coursier/core/Resolution.scala | 63 +++++++++++-------- .../opencv/3.0.0-1.1 | 2 + .../scala/coursier/test/CentralTests.scala | 9 +++ 3 files changed, 48 insertions(+), 26 deletions(-) create mode 100644 tests/shared/src/test/resources/resolutions/org.bytedeco.javacpp-presets/opencv/3.0.0-1.1 diff --git a/core/shared/src/main/scala/coursier/core/Resolution.scala b/core/shared/src/main/scala/coursier/core/Resolution.scala index bcf610cfe..9763284bd 100644 --- a/core/shared/src/main/scala/coursier/core/Resolution.scala +++ b/core/shared/src/main/scala/coursier/core/Resolution.scala @@ -322,21 +322,7 @@ object Resolution { ) } - /** - * Get the dependencies of `project`, knowing that it came from dependency - * `from` (that is, `from.module == project.module`). - * - * Substitute properties, update scopes, apply exclusions, and get extra - * parameters from dependency management along the way. - */ - def finalDependencies( - from: Dependency, - project: Project - ): Seq[Dependency] = { - - // Here, we're substituting properties also in dependencies that - // come from parents or dependency management. This may not be - // the right thing to do. + def projectProperties(project: Project): Seq[(String, String)] = { // FIXME The extra properties should only be added for Maven projects, not Ivy ones val properties0 = Seq( @@ -358,7 +344,39 @@ object Resolution { ) } - val properties = propertiesMap(properties0) + // loose attempt at substituting properties in each others in properties0 + // doesn't try to go recursive for now, but that could be made so if necessary + + val (done, remaining) = properties0.partition { + case (_, value) => + propRegex.findFirstIn(value).isEmpty + } + + lazy val doneMap = done.toMap + + done ++ remaining.map { + case (k, v) => + k -> substituteProps(v, doneMap) + } + } + + /** + * Get the dependencies of `project`, knowing that it came from dependency + * `from` (that is, `from.module == project.module`). + * + * Substitute properties, update scopes, apply exclusions, and get extra + * parameters from dependency management along the way. + */ + def finalDependencies( + from: Dependency, + project: Project + ): Seq[Dependency] = { + + // Here, we're substituting properties also in dependencies that + // come from parents or dependency management. This may not be + // the right thing to do. + + val properties = propertiesMap(projectProperties(project)) val (actualConfig, configurations) = withParentConfigurations(from.configuration, project.configurations) @@ -690,11 +708,7 @@ final case class Resolution( .map(_._2.properties) .fold(project.properties)(project.properties ++ _) - val approxProperties = propertiesMap(approxProperties0) ++ Seq( - "project.groupId" -> project.module.organization, - "project.artifactId" -> project.module.name, - "project.version" -> project.version - ) + val approxProperties = propertiesMap(approxProperties0) ++ projectProperties(project) val profileDependencies = profiles( @@ -775,11 +789,7 @@ final case class Resolution( .map(projectCache(_)._2.properties.toMap) .fold(project.properties)(project.properties ++ _) - val approxProperties = propertiesMap(approxProperties0) ++ Seq( - "project.groupId" -> project.module.organization, - "project.artifactId" -> project.module.name, - "project.version" -> project.version - ) + val approxProperties = propertiesMap(approxProperties0) ++ projectProperties(project) val profiles0 = profiles( project, @@ -827,6 +837,7 @@ final case class Resolution( val depsSet = deps.toSet project.copy( + version = substituteProps(project.version, approxProperties), dependencies = dependencies0 .filterNot{case (config, dep) => diff --git a/tests/shared/src/test/resources/resolutions/org.bytedeco.javacpp-presets/opencv/3.0.0-1.1 b/tests/shared/src/test/resources/resolutions/org.bytedeco.javacpp-presets/opencv/3.0.0-1.1 new file mode 100644 index 000000000..06fea600f --- /dev/null +++ b/tests/shared/src/test/resources/resolutions/org.bytedeco.javacpp-presets/opencv/3.0.0-1.1 @@ -0,0 +1,2 @@ +org.bytedeco:javacpp:1.1:compile +org.bytedeco.javacpp-presets:opencv:3.0.0-1.1:compile diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index a90aeb56b..695965f97 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -174,6 +174,15 @@ object CentralTests extends TestSuite { extraRepo = Some(MavenRepository("https://oss.sonatype.org/content/repositories/public/")) ) } + + 'versionProperty - { + // nasty one - in its POM, its version contains "${parent.project.version}" + resolutionCheck( + Module("org.bytedeco.javacpp-presets", "opencv"), + "3.0.0-1.1" + ) + } + 'parentProjectProperties - { resolutionCheck( Module("com.github.fommil.netlib", "all"), From 92fa4f38db4cdab8b5fb678c069630729efa7beb Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Fri, 1 Apr 2016 01:40:08 +0200 Subject: [PATCH 2/5] Cleaning --- .../scala/coursier/test/CentralTests.scala | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index 695965f97..05f834f29 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -105,7 +105,8 @@ object CentralTests extends TestSuite { } val tests = TestSuite { - 'logback{ + + 'logback - { async { val dep = Dependency(Module("ch.qos.logback", "logback-classic"), "1.1.3") val res = await(resolve(Set(dep))).clearCaches @@ -120,7 +121,8 @@ object CentralTests extends TestSuite { assert(res == expected) } } - 'asm{ + + 'asm - { async { val dep = Dependency(Module("org.ow2.asm", "asm-commons"), "5.0.2") val res = await(resolve(Set(dep))).clearCaches @@ -135,7 +137,8 @@ object CentralTests extends TestSuite { assert(res == expected) } } - 'jodaVersionInterval{ + + 'jodaVersionInterval - { async { val dep = Dependency(Module("joda-time", "joda-time"), "[2.2,2.8]") val res0 = await(resolve(Set(dep))) @@ -153,19 +156,22 @@ object CentralTests extends TestSuite { assert(proj.version == "2.8") } } - 'spark{ + + 'spark - { resolutionCheck( Module("org.apache.spark", "spark-core_2.11"), "1.3.1" ) } - 'argonautShapeless{ + + 'argonautShapeless - { resolutionCheck( Module("com.github.alexarchambault", "argonaut-shapeless_6.1_2.11"), "0.2.0" ) } - 'snapshotMetadata{ + + 'snapshotMetadata - { // Let's hope this one won't change too much resolutionCheck( Module("com.github.fommil", "java-logging"), @@ -189,6 +195,7 @@ object CentralTests extends TestSuite { "1.1.2" ) } + 'latestRevision - { * - resolutionCheck( Module("com.chuusai", "shapeless_2.11"), @@ -210,6 +217,7 @@ object CentralTests extends TestSuite { "7.0.+" ) } + 'mavenScopes - { def check(config: String) = resolutionCheck( Module("com.android.tools", "sdklib"), From cffbe747ed380ba43b51f79da63e223e8e8bdcaf Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Fri, 1 Apr 2016 01:50:56 +0200 Subject: [PATCH 3/5] Minor refactoring --- .../main/scala/coursier/maven/MavenSource.scala | 17 ++++++++++++----- .../test/scala/coursier/test/CentralTests.scala | 4 ++-- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/core/shared/src/main/scala/coursier/maven/MavenSource.scala b/core/shared/src/main/scala/coursier/maven/MavenSource.scala index 0d47c9839..b5997ae42 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenSource.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenSource.scala @@ -149,12 +149,19 @@ case class MavenSource( } object MavenSource { + + val typeExtensions: Map[String, String] = Map( + "eclipse-plugin" -> "jar", + "hk2-jar" -> "jar", + "orbit" -> "jar", + "scala-jar" -> "jar", + "jar" -> "jar", + "bundle" -> "jar", + "doc" -> "jar", + "src" -> "jar" + ) def typeExtension(`type`: String): String = - `type` match { - // see similar things in sbt-maven-resolver/src/main/scala/sbt/mavenint/MavenRepositoryResolver.scala in SBT 0.13.8 - case "eclipse-plugin" | "hk2-jar" | "orbit" | "scala-jar" | "jar" | "bundle" | "doc" | "src" => "jar" - case other => other - } + typeExtensions.getOrElse(`type`, `type`) } \ No newline at end of file diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index 05f834f29..ec554a445 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -230,7 +230,7 @@ object CentralTests extends TestSuite { } 'packaging - { - * - { + 'aar - { // random aar-based module found on Central ensureArtifactHasExtension( Module("com.yandex.android", "speechkit"), @@ -239,7 +239,7 @@ object CentralTests extends TestSuite { ) } - * - { + 'bundle - { // has packaging bundle - ensuring coursier gives its artifact the .jar extension ensureArtifactHasExtension( Module("com.google.guava", "guava"), From f167b36c1c3416641817b9e2fe7f30d581c87c54 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Fri, 1 Apr 2016 01:57:31 +0200 Subject: [PATCH 4/5] Give the .jar extension to maven-plugin packages --- .../src/main/scala/coursier/maven/MavenSource.scala | 1 + .../src/test/scala/coursier/test/CentralTests.scala | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/core/shared/src/main/scala/coursier/maven/MavenSource.scala b/core/shared/src/main/scala/coursier/maven/MavenSource.scala index b5997ae42..e28cf9b0b 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenSource.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenSource.scala @@ -152,6 +152,7 @@ object MavenSource { val typeExtensions: Map[String, String] = Map( "eclipse-plugin" -> "jar", + "maven-plugin" -> "jar", "hk2-jar" -> "jar", "orbit" -> "jar", "scala-jar" -> "jar", diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index ec554a445..e2943290e 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -247,6 +247,15 @@ object CentralTests extends TestSuite { "jar" ) } + + 'mavenPlugin - { + // has packaging maven-plugin - ensuring coursier gives its artifact the .jar extension + ensureArtifactHasExtension( + Module("org.bytedeco", "javacpp"), + "1.1", + "jar" + ) + } } } From cc0ece263df35501a6e477c76c2d6513b4e7492e Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Fri, 1 Apr 2016 02:27:59 +0200 Subject: [PATCH 5/5] Add non regression test --- .../resolutions/com.nativelibs4java/jnaerator-runtime/0.12 | 3 +++ .../shared/src/test/scala/coursier/test/CentralTests.scala | 7 +++++++ 2 files changed, 10 insertions(+) create mode 100644 tests/shared/src/test/resources/resolutions/com.nativelibs4java/jnaerator-runtime/0.12 diff --git a/tests/shared/src/test/resources/resolutions/com.nativelibs4java/jnaerator-runtime/0.12 b/tests/shared/src/test/resources/resolutions/com.nativelibs4java/jnaerator-runtime/0.12 new file mode 100644 index 000000000..e2b74d3f9 --- /dev/null +++ b/tests/shared/src/test/resources/resolutions/com.nativelibs4java/jnaerator-runtime/0.12 @@ -0,0 +1,3 @@ +com.nativelibs4java:jnaerator-runtime:0.12:compile +com.nativelibs4java:ochafik-util:0.12:compile +net.java.dev.jna:jna:4.1.0:compile diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index e2943290e..e9ff6a343 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -196,6 +196,13 @@ object CentralTests extends TestSuite { ) } + 'parentDependencyManagementProperties - { + resolutionCheck( + Module("com.nativelibs4java", "jnaerator-runtime"), + "0.12" + ) + } + 'latestRevision - { * - resolutionCheck( Module("com.chuusai", "shapeless_2.11"),