From 2ddfe5f3b246826c140f9dd9c901a37687349385 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Sat, 28 May 2016 00:50:07 +0200 Subject: [PATCH] Keep version actually used to fetch metadata, to get artifacts In case the one given by the metadata is wrong --- build.sbt | 6 +++++ .../scala/coursier/core/Definitions.scala | 12 ++++++++++ .../src/main/scala/coursier/ivy/IvyXml.scala | 1 + .../coursier/maven/MavenRepository.scala | 5 +++- .../scala/coursier/maven/MavenSource.scala | 6 ++--- .../src/main/scala/coursier/maven/Pom.scala | 1 + .../FallbackDependenciesRepository.scala | 1 + .../main/scala-2.10/coursier/FromSbt.scala | 1 + .../org.apache.ws.commons/XmlSchema/1.1 | 2 ++ .../scala/coursier/test/CentralTests.scala | 23 ++++++++++++++++--- .../test/scala/coursier/test/package.scala | 1 + 11 files changed, 52 insertions(+), 7 deletions(-) create mode 100644 tests/shared/src/test/resources/resolutions/org.apache.ws.commons/XmlSchema/1.1 diff --git a/build.sbt b/build.sbt index 8b490bb44..2351dfee6 100644 --- a/build.sbt +++ b/build.sbt @@ -146,6 +146,12 @@ lazy val core = crossProject import com.typesafe.tools.mima.core.ProblemFilters._ Seq( + // Since 1.0.0-M13 + // Extra `actualVersion` field in `Project` + ProblemFilters.exclude[MissingTypesProblem]("coursier.core.Project$"), + ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Project.apply"), + ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Project.copy"), + ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Project.this"), // Since 1.0.0-M12 // Extra `authentication` field ProblemFilters.exclude[MissingMethodProblem]("coursier.core.Artifact.apply"), diff --git a/core/shared/src/main/scala/coursier/core/Definitions.scala b/core/shared/src/main/scala/coursier/core/Definitions.scala index ea77c0b4e..4683c55d0 100644 --- a/core/shared/src/main/scala/coursier/core/Definitions.scala +++ b/core/shared/src/main/scala/coursier/core/Definitions.scala @@ -81,6 +81,11 @@ final case class Project( profiles: Seq[Profile], versions: Option[Versions], snapshotVersioning: Option[SnapshotVersioning], + /** + * Optional exact version used to get this project metadata. + * May not match `version` for projects having a wrong version in their metadata. + */ + actualVersionOpt: Option[String], // Ivy-specific // First String is configuration @@ -94,6 +99,13 @@ final case class Project( /** All configurations that each configuration extends, including the ones it extends transitively */ lazy val allConfigurations: Map[String, Set[String]] = Orders.allConfigurations(configurations) + + /** + * Version used to get this project metadata if available, else the version from metadata. + * May not match `version` for projects having a wrong version in their metadata, if the actual version was kept + * around. + */ + def actualVersion: String = actualVersionOpt.getOrElse(version) } /** Extra project info, not used during resolution */ diff --git a/core/shared/src/main/scala/coursier/ivy/IvyXml.scala b/core/shared/src/main/scala/coursier/ivy/IvyXml.scala index d674e4af7..3654688bf 100644 --- a/core/shared/src/main/scala/coursier/ivy/IvyXml.scala +++ b/core/shared/src/main/scala/coursier/ivy/IvyXml.scala @@ -156,6 +156,7 @@ object IvyXml { Nil, None, None, + None, if (publicationsOpt.isEmpty) // no publications node -> default JAR artifact Seq("*" -> Publication(module.name, "jar", "jar", "")) diff --git a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala index f408333ea..dc3267a74 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala @@ -222,7 +222,7 @@ case class MavenRepository( } } - F.bind(findVersioning(module, version, None, fetch).run) { eitherProj => + val res = F.bind(findVersioning(module, version, None, fetch).run) { eitherProj => if (eitherProj.isLeft && version.contains("-SNAPSHOT")) F.map(withSnapshotVersioning.run)(eitherProj0 => if (eitherProj0.isLeft) @@ -233,6 +233,9 @@ case class MavenRepository( else F.point(eitherProj) } + + // keep exact version used to get metadata, in case the one inside the metadata is wrong + F.map(res)(_.map(proj => proj.copy(actualVersionOpt = Some(version)))) } def findVersioning[F[_]]( diff --git a/core/shared/src/main/scala/coursier/maven/MavenSource.scala b/core/shared/src/main/scala/coursier/maven/MavenSource.scala index 09d74b2e3..4a020eaed 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenSource.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenSource.scala @@ -57,11 +57,11 @@ case class MavenSource( val path = dependency.module.organization.split('.').toSeq ++ Seq( MavenRepository.dirModuleName(dependency.module, sbtAttrStub), - project.version, - s"${dependency.module.name}-${versioning getOrElse project.version}${Some(publication.classifier).filter(_.nonEmpty).map("-" + _).mkString}.${publication.ext}" + project.actualVersion, + s"${dependency.module.name}-${versioning getOrElse project.actualVersion}${Some(publication.classifier).filter(_.nonEmpty).map("-" + _).mkString}.${publication.ext}" ) - val changing0 = changing.getOrElse(project.version.contains("-SNAPSHOT")) + val changing0 = changing.getOrElse(project.actualVersion.contains("-SNAPSHOT")) var artifact = Artifact( root + path.mkString("/"), diff --git a/core/shared/src/main/scala/coursier/maven/Pom.scala b/core/shared/src/main/scala/coursier/maven/Pom.scala index 0a5e88c45..866045125 100644 --- a/core/shared/src/main/scala/coursier/maven/Pom.scala +++ b/core/shared/src/main/scala/coursier/maven/Pom.scala @@ -237,6 +237,7 @@ object Pom { profiles, None, None, + None, Nil, Info( description, diff --git a/plugin/src/main/scala-2.10/coursier/FallbackDependenciesRepository.scala b/plugin/src/main/scala-2.10/coursier/FallbackDependenciesRepository.scala index d2bf6358d..b2d495970 100644 --- a/plugin/src/main/scala-2.10/coursier/FallbackDependenciesRepository.scala +++ b/plugin/src/main/scala-2.10/coursier/FallbackDependenciesRepository.scala @@ -46,6 +46,7 @@ case class FallbackDependenciesRepository( Nil, None, None, + None, Nil, Info.empty ) diff --git a/plugin/src/main/scala-2.10/coursier/FromSbt.scala b/plugin/src/main/scala-2.10/coursier/FromSbt.scala index 28ac928da..2442144ce 100644 --- a/plugin/src/main/scala-2.10/coursier/FromSbt.scala +++ b/plugin/src/main/scala-2.10/coursier/FromSbt.scala @@ -129,6 +129,7 @@ object FromSbt { Nil, None, None, + None, Nil, Info.empty ) diff --git a/tests/shared/src/test/resources/resolutions/org.apache.ws.commons/XmlSchema/1.1 b/tests/shared/src/test/resources/resolutions/org.apache.ws.commons/XmlSchema/1.1 new file mode 100644 index 000000000..da865dd5d --- /dev/null +++ b/tests/shared/src/test/resources/resolutions/org.apache.ws.commons/XmlSchema/1.1 @@ -0,0 +1,2 @@ +org.apache.ws.commons:XmlSchema:1.1:compile +stax:stax-api: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 0be67d2fe..eb75226e4 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -72,7 +72,7 @@ object CentralTests extends TestSuite { .get(dep.moduleVersion) .map { case (_, proj) => proj } val dep0 = dep.copy( - version = projOpt.fold(dep.version)(_.version) + version = projOpt.fold(dep.version)(_.actualVersion) ) (dep0.module.organization, dep0.module.nameWithAttributes, dep0.version, dep0.configuration) } @@ -89,13 +89,13 @@ object CentralTests extends TestSuite { assert(result == expected) } - def ensureArtifactHasExtension(module: Module, version: String, extension: String): Future[Unit] = async { + def withArtifact[T](module: Module, version: String)(f: Artifact => T): Future[T] = async { val dep = Dependency(module, version, transitive = false) val res = await(resolve(Set(dep))) res.artifacts match { case Seq(artifact) => - assert(artifact.url.endsWith("." + extension)) + f(artifact) case other => throw new Exception( s"Unexpected artifact list size: ${other.size}\n" + @@ -104,6 +104,11 @@ object CentralTests extends TestSuite { } } + def ensureArtifactHasExtension(module: Module, version: String, extension: String): Future[Unit] = + withArtifact(module, version) { artifact => + assert(artifact.url.endsWith("." + extension)) + } + val tests = TestSuite { 'logback - { @@ -232,6 +237,18 @@ object CentralTests extends TestSuite { ) } + 'versionFromDependency - { + val mod = Module("org.apache.ws.commons", "XmlSchema") + val version = "1.1" + val expectedArtifactUrl = "https://repo1.maven.org/maven2/org/apache/ws/commons/XmlSchema/1.1/XmlSchema-1.1.jar" + + * - resolutionCheck(mod, version) + + * - withArtifact(mod, version) { artifact => + assert(artifact.url == expectedArtifactUrl) + } + } + 'mavenScopes - { def check(config: String) = resolutionCheck( Module("com.android.tools", "sdklib"), diff --git a/tests/shared/src/test/scala/coursier/test/package.scala b/tests/shared/src/test/scala/coursier/test/package.scala index aab39b85e..e3dc40cfa 100644 --- a/tests/shared/src/test/scala/coursier/test/package.scala +++ b/tests/shared/src/test/scala/coursier/test/package.scala @@ -75,6 +75,7 @@ package object test { profiles, versions, snapshotVersioning, + None, publications, Info.empty )