From 6be594e52eba83ba49a3c14a10bfb81f94b2e4f3 Mon Sep 17 00:00:00 2001 From: Alexandre Archambault Date: Wed, 26 Jun 2019 11:40:39 +0200 Subject: [PATCH] Take explicit artifact name and extension into account (#86) --- .../src/main/scala/lmcoursier/FromSbt.scala | 29 ++++++++------- .../lmcoursier/definitions/Dependency.scala | 33 +++++++++++------- .../lmcoursier/definitions/Publication.scala | 3 +- .../lmcoursier/definitions/ToCoursier.scala | 2 +- .../TemporaryInMemoryRepository.scala | 5 --- .../shared-1/default-artifact/README.md | 1 + .../shared-1/default-artifact/build.sbt | 13 +++++++ .../default-artifact/project/plugins.sbt | 13 +++++++ .../default-artifact/repo/a/b/1.0.0/b1.jar | Bin 0 -> 718 bytes .../default-artifact/repo/a/b/1.0.0/b2.jar | Bin 0 -> 718 bytes .../default-artifact/repo/a/b/1.0.0/ivy.xml | 14 ++++++++ .../sbt-test/shared-1/default-artifact/test | 5 +++ 12 files changed, 86 insertions(+), 32 deletions(-) create mode 100644 modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/README.md create mode 100644 modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/build.sbt create mode 100644 modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/project/plugins.sbt create mode 100644 modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/b1.jar create mode 100644 modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/b2.jar create mode 100644 modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/ivy.xml create mode 100644 modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/test diff --git a/modules/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala b/modules/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala index d5a061d07..0fee39809 100644 --- a/modules/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala +++ b/modules/lm-coursier/src/main/scala/lmcoursier/FromSbt.scala @@ -1,8 +1,7 @@ package lmcoursier import coursier.ivy.IvyXml.{mappings => ivyXmlMappings} - -import lmcoursier.definitions.{Attributes, Classifier, Configuration, Dependency, Info, Module, ModuleName, Organization, Project, Type} +import lmcoursier.definitions.{Classifier, Configuration, Dependency, Extension, Info, Module, ModuleName, Organization, Project, Publication, Type} import sbt.internal.librarymanagement.mavenint.SbtPomExtraProperties import sbt.librarymanagement.{Configuration => _, MavenRepository => _, _} @@ -76,7 +75,7 @@ object FromSbt { // FIXME Other `rule` fields are ignored here (Organization(rule.organization), ModuleName(rule.name)) }.toSet, - Attributes(Type(""), Classifier("")), + Publication("", Type(""), Extension(""), Classifier("")), optional = false, transitive = module.isTransitive ) @@ -87,24 +86,28 @@ object FromSbt { (Configuration(from.value), Configuration(to.value)) } - val attributes = + val publications = if (module.explicitArtifacts.isEmpty) - Seq(Attributes(Type(""), Classifier(""))) + Seq(Publication("", Type(""), Extension(""), Classifier(""))) else - module.explicitArtifacts.map { a => - Attributes( - `type` = Type(a.`type`), - classifier = a.classifier.fold(Classifier(""))(Classifier(_)) - ) - } + module + .explicitArtifacts + .map { a => + Publication( + name = a.name, + `type` = Type(a.`type`), + ext = Extension(a.extension), + classifier = a.classifier.fold(Classifier(""))(Classifier(_)) + ) + } for { (from, to) <- allMappings - attr <- attributes + pub <- publications } yield { val dep0 = dep .withConfiguration(to) - .withAttributes(attr) + .withPublication(pub) from -> dep0 } } diff --git a/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Dependency.scala b/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Dependency.scala index 864fae3a2..cd10b6680 100644 --- a/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Dependency.scala +++ b/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Dependency.scala @@ -9,24 +9,26 @@ final class Dependency private ( val version: String, val configuration: Configuration, val exclusions: Set[(Organization, ModuleName)], - val attributes: Attributes, + val publication: Publication, val optional: Boolean, val transitive: Boolean) extends Serializable { - - - + + + def attributes: Attributes = + publication.attributes + override def equals(o: Any): Boolean = o match { - case x: Dependency => (this.module == x.module) && (this.version == x.version) && (this.configuration == x.configuration) && (this.exclusions == x.exclusions) && (this.attributes == x.attributes) && (this.optional == x.optional) && (this.transitive == x.transitive) + case x: Dependency => (this.module == x.module) && (this.version == x.version) && (this.configuration == x.configuration) && (this.exclusions == x.exclusions) && (this.publication == x.publication) && (this.optional == x.optional) && (this.transitive == x.transitive) case _ => false } override def hashCode: Int = { - 37 * (37 * (37 * (37 * (37 * (37 * (37 * (37 * (17 + "lmcoursier.definitions.Dependency".##) + module.##) + version.##) + configuration.##) + exclusions.##) + attributes.##) + optional.##) + transitive.##) + 37 * (37 * (37 * (37 * (37 * (37 * (37 * (37 * (17 + "lmcoursier.definitions.Dependency".##) + module.##) + version.##) + configuration.##) + exclusions.##) + publication.##) + optional.##) + transitive.##) } override def toString: String = { - "Dependency(" + module + ", " + version + ", " + configuration + ", " + exclusions + ", " + attributes + ", " + optional + ", " + transitive + ")" + "Dependency(" + module + ", " + version + ", " + configuration + ", " + exclusions + ", " + publication + ", " + optional + ", " + transitive + ")" } - private[this] def copy(module: Module = module, version: String = version, configuration: Configuration = configuration, exclusions: Set[(Organization, ModuleName)] = exclusions, attributes: Attributes = attributes, optional: Boolean = optional, transitive: Boolean = transitive): Dependency = { - new Dependency(module, version, configuration, exclusions, attributes, optional, transitive) + private[this] def copy(module: Module = module, version: String = version, configuration: Configuration = configuration, exclusions: Set[(Organization, ModuleName)] = exclusions, publication: Publication = publication, optional: Boolean = optional, transitive: Boolean = transitive): Dependency = { + new Dependency(module, version, configuration, exclusions, publication, optional, transitive) } def withModule(module: Module): Dependency = { copy(module = module) @@ -40,8 +42,14 @@ final class Dependency private ( def withExclusions(exclusions: Set[(Organization, ModuleName)]): Dependency = { copy(exclusions = exclusions) } - def withAttributes(attributes: Attributes): Dependency = { - copy(attributes = attributes) + def withAttributes(attributes: Attributes): Dependency = + copy( + publication = publication + .withType(attributes.`type`) + .withClassifier(attributes.classifier) + ) + def withPublication(publication: Publication): Dependency = { + copy(publication = publication) } def withOptional(optional: Boolean): Dependency = { copy(optional = optional) @@ -52,5 +60,6 @@ final class Dependency private ( } object Dependency { - def apply(module: Module, version: String, configuration: Configuration, exclusions: Set[(Organization, ModuleName)], attributes: Attributes, optional: Boolean, transitive: Boolean): Dependency = new Dependency(module, version, configuration, exclusions, attributes, optional, transitive) + def apply(module: Module, version: String, configuration: Configuration, exclusions: Set[(Organization, ModuleName)], attributes: Attributes, optional: Boolean, transitive: Boolean): Dependency = new Dependency(module, version, configuration, exclusions, Publication("", attributes.`type`, Extension(""), attributes.classifier), optional, transitive) + def apply(module: Module, version: String, configuration: Configuration, exclusions: Set[(Organization, ModuleName)], publication: Publication, optional: Boolean, transitive: Boolean): Dependency = new Dependency(module, version, configuration, exclusions, publication, optional, transitive) } diff --git a/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Publication.scala b/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Publication.scala index e2ea83913..3f71aa8a3 100644 --- a/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Publication.scala +++ b/modules/lm-coursier/src/main/scala/lmcoursier/definitions/Publication.scala @@ -10,7 +10,8 @@ final class Publication private ( val ext: Extension, val classifier: Classifier) extends Serializable { - + def attributes: Attributes = + Attributes(`type`, classifier) override def equals(o: Any): Boolean = o match { case x: Publication => (this.name == x.name) && (this.`type` == x.`type`) && (this.ext == x.ext) && (this.classifier == x.classifier) diff --git a/modules/lm-coursier/src/main/scala/lmcoursier/definitions/ToCoursier.scala b/modules/lm-coursier/src/main/scala/lmcoursier/definitions/ToCoursier.scala index 3221c01c4..e8f3b2b11 100644 --- a/modules/lm-coursier/src/main/scala/lmcoursier/definitions/ToCoursier.scala +++ b/modules/lm-coursier/src/main/scala/lmcoursier/definitions/ToCoursier.scala @@ -47,7 +47,7 @@ object ToCoursier { case (org, name) => (coursier.core.Organization(org.value), coursier.core.ModuleName(name.value)) }, - attributes(dependency.attributes), + publication(dependency.publication), dependency.optional, dependency.transitive ) diff --git a/modules/lm-coursier/src/main/scala/lmcoursier/internal/TemporaryInMemoryRepository.scala b/modules/lm-coursier/src/main/scala/lmcoursier/internal/TemporaryInMemoryRepository.scala index 7bf2721bc..a5b7e0711 100644 --- a/modules/lm-coursier/src/main/scala/lmcoursier/internal/TemporaryInMemoryRepository.scala +++ b/modules/lm-coursier/src/main/scala/lmcoursier/internal/TemporaryInMemoryRepository.scala @@ -149,8 +149,6 @@ final class TemporaryInMemoryRepository private( .fold[Either[String, (Artifact.Source, Project)]](Left("No fallback URL found")) { case (url, _) => - println(s"($module, $version) -> $url") - val urlStr = url.toExternalForm val idx = urlStr.lastIndexOf('/') @@ -160,7 +158,6 @@ final class TemporaryInMemoryRepository private( val (dirUrlStr, fileName) = urlStr.splitAt(idx + 1) if (TemporaryInMemoryRepository.exists(url, localArtifactsShouldBeCached, cacheOpt)) { - println("returning proj") val proj = Project( module, version, @@ -194,13 +191,11 @@ final class TemporaryInMemoryRepository private( project: Project, overrideClassifiers: Option[Seq[Classifier]] ): Seq[(Publication, Artifact)] = { - println(s"artifacts($dependency)") fallbacks .get(dependency.moduleVersion) .toSeq .map { case (url, changing) => - println(s"$url, $changing") val url0 = url.toString val ext = url0.substring(url0.lastIndexOf('.') + 1) val pub = Publication( diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/README.md b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/README.md new file mode 100644 index 000000000..16cb3eefc --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/README.md @@ -0,0 +1 @@ +Adapted from https://github.com/sbt/sbt/tree/57a86e60f6d7c6fd428fb73a6786b62972fdae54/sbt/src/sbt-test/dependency-management/default-artifact diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/build.sbt b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/build.sbt new file mode 100644 index 000000000..5e6e57433 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/build.sbt @@ -0,0 +1,13 @@ + +resolvers += Resolver.file("buggy", file("repo"))( + Patterns( + ivyPatterns = Vector("[organization]/[module]/[revision]/ivy.xml"), + artifactPatterns = Vector("[organization]/[module]/[revision]/[artifact].[ext]"), + isMavenCompatible = false, + descriptorOptional = true, + skipConsistencyCheck = true + ) +) + +libraryDependencies += "a" % "b" % "1.0.0" % "compile->runtime" artifacts(Artifact("b1", "jar", "jar")) +libraryDependencies += "a" % "b" % "1.0.0" % "test->runtime" artifacts(Artifact("b1", "jar", "jar")) diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/project/plugins.sbt b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/project/plugins.sbt new file mode 100644 index 000000000..71a44ffd3 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/project/plugins.sbt @@ -0,0 +1,13 @@ +addSbtPlugin { + + val name = sys.props.getOrElse( + "plugin.name", + sys.error("plugin.name Java property not set") + ) + val version = sys.props.getOrElse( + "plugin.version", + sys.error("plugin.version Java property not set") + ) + + "io.get-coursier" % name % version +} \ No newline at end of file diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/b1.jar b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/b1.jar new file mode 100644 index 0000000000000000000000000000000000000000..619fa9368613a1a6314479f29f8b0ca95e9930cc GIT binary patch literal 718 zcmWIWW@Zs#;Nak3U=J|yU_b&Q3@i-3t|5-Po_=onzK(vLZmz*0dcJP|PBAci_C0gj z$6HtLBCofu*10q1HwPJ9F@Es$(;3|po@af}YJ2K1axtlX4*Jx+MnuRk#mUIKC}^Xn z!WmJ6Ptwz3#dw$hAW5{cMfv_k+GIt~~lIEjM)M>95sI z5r1_`9X+zXWa>B<)bzcAa+s@ky=LIN#I`{njqtlt@1%0XgF_Gmg?Ca)AW}o7>Idt;nB3Ajc zYBnq^>+eYTDJGpew{nkX*<#MW7LWIEPnF*4^|h3>rTIq0-_q@|FaPYnG$(zx%|-EL zN{4Tro0hg(e3`);uk6i1Q`I*Asd-#j(^Bx`ah72Ixq}r4bZ!+p?D^4qO+QbjL^7IR z>DG&aw;xx&6_sQ8`&YM7J%%|*+4F4EG@iP7Y^|gtN3=F%0IKZ2cNrVBB uc#z`^lz319uB3!)3MhV&Z2-kD0xSkH;jtay&B_LnVgkZiAZ^VA;sF3jz6q58 literal 0 HcmV?d00001 diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/b2.jar b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/b2.jar new file mode 100644 index 0000000000000000000000000000000000000000..619fa9368613a1a6314479f29f8b0ca95e9930cc GIT binary patch literal 718 zcmWIWW@Zs#;Nak3U=J|yU_b&Q3@i-3t|5-Po_=onzK(vLZmz*0dcJP|PBAci_C0gj z$6HtLBCofu*10q1HwPJ9F@Es$(;3|po@af}YJ2K1axtlX4*Jx+MnuRk#mUIKC}^Xn z!WmJ6Ptwz3#dw$hAW5{cMfv_k+GIt~~lIEjM)M>95sI z5r1_`9X+zXWa>B<)bzcAa+s@ky=LIN#I`{njqtlt@1%0XgF_Gmg?Ca)AW}o7>Idt;nB3Ajc zYBnq^>+eYTDJGpew{nkX*<#MW7LWIEPnF*4^|h3>rTIq0-_q@|FaPYnG$(zx%|-EL zN{4Tro0hg(e3`);uk6i1Q`I*Asd-#j(^Bx`ah72Ixq}r4bZ!+p?D^4qO+QbjL^7IR z>DG&aw;xx&6_sQ8`&YM7J%%|*+4F4EG@iP7Y^|gtN3=F%0IKZ2cNrVBB uc#z`^lz319uB3!)3MhV&Z2-kD0xSkH;jtay&B_LnVgkZiAZ^VA;sF3jz6q58 literal 0 HcmV?d00001 diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/ivy.xml b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/ivy.xml new file mode 100644 index 000000000..165b4c192 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/repo/a/b/1.0.0/ivy.xml @@ -0,0 +1,14 @@ + + + a + + + + + + + + + + + diff --git a/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/test b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/test new file mode 100644 index 000000000..cd1752ba7 --- /dev/null +++ b/modules/sbt-coursier/src/sbt-test/shared-1/default-artifact/test @@ -0,0 +1,5 @@ +# Verify that we successfully get the artifacts. +# This project depends on a module for which we cannot generate a "default artifact", +# because no such artifact exists. + +> update \ No newline at end of file