Take explicit artifact name and extension into account (#86)

This commit is contained in:
Alexandre Archambault 2019-06-26 11:40:39 +02:00 committed by GitHub
parent dcc7d87503
commit 6be594e52e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 86 additions and 32 deletions

View File

@ -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
}
}

View File

@ -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)
}

View File

@ -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)

View File

@ -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
)

View File

@ -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(

View File

@ -0,0 +1 @@
Adapted from https://github.com/sbt/sbt/tree/57a86e60f6d7c6fd428fb73a6786b62972fdae54/sbt/src/sbt-test/dependency-management/default-artifact

View File

@ -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"))

View File

@ -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
}

View File

@ -0,0 +1,14 @@
<ivy-module xmlns:e="http://ant.apache.org/ivy/extra" version="2.0">
<info organisation="a" module="b" revision="1.0.0" status="release" publication="20160201120702">
<description>a</description>
</info>
<configurations>
<conf name="runtime" description="..."/>
</configurations>
<publications>
<artifact name="b1" type="jar" ext="jar" conf="runtime"/>
<artifact name="fake" type="jar" ext="jar" conf="runtime"/>
</publications>
<dependencies>
</dependencies>
</ivy-module>

View File

@ -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