Add strict reconciliation, and versionReconciliation key

This commit is contained in:
Alexandre Archambault 2019-08-14 16:23:43 +02:00
parent ecba0288a6
commit 59ec5d2b95
10 changed files with 95 additions and 19 deletions

View File

@ -38,11 +38,18 @@
"name": "include", "name": "include",
"type": "Set[lmcoursier.definitions.Module]", "type": "Set[lmcoursier.definitions.Module]",
"doc": "Use \"*\" in either organization or name to match any." "doc": "Use \"*\" in either organization or name to match any."
},
{
"name": "includeByDefault",
"type": "Boolean",
"default": "true",
"since": "2.0.0-RC4"
} }
], ],
"extraCompanion": [ "extraCompanion": [
"/** ModuleMatchers that matches to any modules. */", "/** ModuleMatchers that matches to any modules. */",
"def all: ModuleMatchers = ModuleMatchers(Set.empty, Set.empty)" "def all: ModuleMatchers = ModuleMatchers(Set.empty, Set.empty)",
"def only(mod: Module): ModuleMatchers = ModuleMatchers(Set.empty, Set(mod), includeByDefault = false)"
] ]
} }
] ]

View File

@ -10,22 +10,23 @@ package lmcoursier.definitions
*/ */
final class ModuleMatchers private ( final class ModuleMatchers private (
val exclude: Set[lmcoursier.definitions.Module], val exclude: Set[lmcoursier.definitions.Module],
val include: Set[lmcoursier.definitions.Module]) extends Serializable { val include: Set[lmcoursier.definitions.Module],
val includeByDefault: Boolean) extends Serializable {
private def this(exclude: Set[lmcoursier.definitions.Module], include: Set[lmcoursier.definitions.Module]) = this(exclude, include, true)
override def equals(o: Any): Boolean = o match { override def equals(o: Any): Boolean = o match {
case x: ModuleMatchers => (this.exclude == x.exclude) && (this.include == x.include) case x: ModuleMatchers => (this.exclude == x.exclude) && (this.include == x.include) && (this.includeByDefault == x.includeByDefault)
case _ => false case _ => false
} }
override def hashCode: Int = { override def hashCode: Int = {
37 * (37 * (37 * (17 + "lmcoursier.definitions.ModuleMatchers".##) + exclude.##) + include.##) 37 * (37 * (37 * (37 * (17 + "lmcoursier.definitions.ModuleMatchers".##) + exclude.##) + include.##) + includeByDefault.##)
} }
override def toString: String = { override def toString: String = {
"ModuleMatchers(" + exclude + ", " + include + ")" "ModuleMatchers(" + exclude + ", " + include + ", " + includeByDefault + ")"
} }
private[this] def copy(exclude: Set[lmcoursier.definitions.Module] = exclude, include: Set[lmcoursier.definitions.Module] = include): ModuleMatchers = { private[this] def copy(exclude: Set[lmcoursier.definitions.Module] = exclude, include: Set[lmcoursier.definitions.Module] = include, includeByDefault: Boolean = includeByDefault): ModuleMatchers = {
new ModuleMatchers(exclude, include) new ModuleMatchers(exclude, include, includeByDefault)
} }
def withExclude(exclude: Set[lmcoursier.definitions.Module]): ModuleMatchers = { def withExclude(exclude: Set[lmcoursier.definitions.Module]): ModuleMatchers = {
copy(exclude = exclude) copy(exclude = exclude)
@ -33,9 +34,14 @@ final class ModuleMatchers private (
def withInclude(include: Set[lmcoursier.definitions.Module]): ModuleMatchers = { def withInclude(include: Set[lmcoursier.definitions.Module]): ModuleMatchers = {
copy(include = include) copy(include = include)
} }
def withIncludeByDefault(includeByDefault: Boolean): ModuleMatchers = {
copy(includeByDefault = includeByDefault)
}
} }
object ModuleMatchers { object ModuleMatchers {
/** ModuleMatchers that matches to any modules. */ /** ModuleMatchers that matches to any modules. */
def all: ModuleMatchers = ModuleMatchers(Set.empty, Set.empty) def all: ModuleMatchers = ModuleMatchers(Set.empty, Set.empty)
def only(mod: Module): ModuleMatchers = ModuleMatchers(Set.empty, Set(mod), includeByDefault = false)
def apply(exclude: Set[lmcoursier.definitions.Module], include: Set[lmcoursier.definitions.Module]): ModuleMatchers = new ModuleMatchers(exclude, include) def apply(exclude: Set[lmcoursier.definitions.Module], include: Set[lmcoursier.definitions.Module]): ModuleMatchers = new ModuleMatchers(exclude, include)
def apply(exclude: Set[lmcoursier.definitions.Module], include: Set[lmcoursier.definitions.Module], includeByDefault: Boolean): ModuleMatchers = new ModuleMatchers(exclude, include, includeByDefault)
} }

View File

@ -1,13 +1,15 @@
/**
* This code is generated using [[http://www.scala-sbt.org/contraband/ sbt-contraband]].
*/
// DO NOT EDIT MANUALLY
package lmcoursier.definitions package lmcoursier.definitions
sealed abstract class Reconciliation extends Serializable sealed abstract class Reconciliation extends Serializable
object Reconciliation { object Reconciliation {
case object Default extends Reconciliation case object Default extends Reconciliation
case object Relaxed extends Reconciliation case object Relaxed extends Reconciliation
case object Strict extends Reconciliation
def apply(input: String): Option[Reconciliation] =
input match {
case "default" => Some(Default)
case "relaxed" => Some(Relaxed)
case "strict" => Some(Strict)
case _ => None
}
} }

View File

@ -49,6 +49,7 @@ object ToCoursier {
r match { r match {
case Reconciliation.Default => coursier.core.Reconciliation.Default case Reconciliation.Default => coursier.core.Reconciliation.Default
case Reconciliation.Relaxed => coursier.core.Reconciliation.Relaxed case Reconciliation.Relaxed => coursier.core.Reconciliation.Relaxed
case Reconciliation.Strict => coursier.core.Reconciliation.Strict
} }
def reconciliation(rs: Vector[(ModuleMatchers, Reconciliation)]): def reconciliation(rs: Vector[(ModuleMatchers, Reconciliation)]):

View File

@ -9,7 +9,8 @@ import lmcoursier.definitions.{CacheLogger, Configuration, Project, Publication}
import lmcoursier.internal.SbtCoursierCache import lmcoursier.internal.SbtCoursierCache
import sbt.{AutoPlugin, Classpaths, Compile, Setting, TaskKey, Test, settingKey, taskKey} import sbt.{AutoPlugin, Classpaths, Compile, Setting, TaskKey, Test, settingKey, taskKey}
import sbt.Keys._ import sbt.Keys._
import sbt.librarymanagement.{Resolver, URLRepository} import sbt.librarymanagement.DependencyBuilders.OrganizationArtifactName
import sbt.librarymanagement.{ModuleID, Resolver, URLRepository}
object SbtCoursierShared extends AutoPlugin { object SbtCoursierShared extends AutoPlugin {
@ -35,6 +36,7 @@ object SbtCoursierShared extends AutoPlugin {
val coursierFallbackDependencies = taskKey[Seq[FallbackDependency]]("") val coursierFallbackDependencies = taskKey[Seq[FallbackDependency]]("")
val mavenProfiles = settingKey[Set[String]]("") val mavenProfiles = settingKey[Set[String]]("")
val versionReconciliation = taskKey[Seq[ModuleID]]("")
val coursierUseSbtCredentials = settingKey[Boolean]("") val coursierUseSbtCredentials = settingKey[Boolean]("")
@deprecated("Use coursierExtraCredentials rather than coursierCredentials", "1.1.0-M14") @deprecated("Use coursierExtraCredentials rather than coursierCredentials", "1.1.0-M14")
@ -166,7 +168,8 @@ object SbtCoursierShared extends AutoPlugin {
confs ++ extraSources.toSeq ++ extraDocs.toSeq confs ++ extraSources.toSeq ++ extraDocs.toSeq
}, },
mavenProfiles := Set.empty mavenProfiles := Set.empty,
versionReconciliation := Seq.empty
) ++ { ) ++ {
if (pubSettings) if (pubSettings)
IvyXml.generateIvyXmlSettings() IvyXml.generateIvyXmlSettings()

View File

@ -10,6 +10,7 @@ import lmcoursier.internal.{InterProjectRepository, ResolutionParams, Resolution
import coursier.sbtcoursier.Keys._ import coursier.sbtcoursier.Keys._
import coursier.sbtcoursiershared.InputsTasks.{credentialsTask, strictTask} import coursier.sbtcoursiershared.InputsTasks.{credentialsTask, strictTask}
import coursier.sbtcoursiershared.SbtCoursierShared.autoImport._ import coursier.sbtcoursiershared.SbtCoursierShared.autoImport._
import coursier.util.{ModuleMatcher, ModuleMatchers}
import sbt.Def import sbt.Def
import sbt.Keys._ import sbt.Keys._
@ -75,6 +76,16 @@ object ResolutionTasks {
val verbosityLevel = coursierVerbosity.value val verbosityLevel = coursierVerbosity.value
val userEnabledProfiles = mavenProfiles.value val userEnabledProfiles = mavenProfiles.value
val versionReconciliations0 = versionReconciliation.value.map { mod =>
Reconciliation(mod.revision) match {
case Some(rec) =>
val (mod0, _) = FromSbt.moduleVersion(mod, sv, sbv)
val matcher = ModuleMatchers.only(Organization(mod0.organization.value), ModuleName(mod0.name.value))
matcher -> rec
case None =>
throw new Exception(s"Unrecognized reconciliation: '${mod.revision}'")
}
}
val typelevel = Organization(scalaOrganization.value) == Typelevel.typelevelOrg val typelevel = Organization(scalaOrganization.value) == Typelevel.typelevelOrg
@ -141,7 +152,8 @@ object ResolutionTasks {
.withMaxIterations(maxIterations) .withMaxIterations(maxIterations)
.withProfiles(userEnabledProfiles) .withProfiles(userEnabledProfiles)
.withForceVersion(userForceVersions.map { case (k, v) => (ToCoursier.module(k), v) }.toMap) .withForceVersion(userForceVersions.map { case (k, v) => (ToCoursier.module(k), v) }.toMap)
.withTypelevel(typelevel), .withTypelevel(typelevel)
.addReconciliation(versionReconciliations0: _*),
strictOpt = strictOpt strictOpt = strictOpt
), ),
verbosityLevel, verbosityLevel,

View File

@ -0,0 +1,19 @@
lazy val shared = Seq(
scalaVersion := "2.12.8",
libraryDependencies ++= Seq(
"com.github.alexarchambault" %% "argonaut-shapeless_6.2" % "1.2.0-M4",
"com.chuusai" %% "shapeless" % "2.3.3"
),
versionReconciliation += "*" % "*" % "strict"
)
lazy val a = project
.settings(shared)
lazy val b = project
.settings(shared)
.settings(
// strict cm should be fine if we force the conflicting module version
dependencyOverrides += "com.chuusai" %% "shapeless" % "2.3.3"
)

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,2 @@
-> a/update
> b/update

View File

@ -1,6 +1,6 @@
package coursier.sbtlmcoursier package coursier.sbtlmcoursier
import lmcoursier.definitions.Authentication import lmcoursier.definitions.{Authentication, ModuleMatchers, Reconciliation}
import lmcoursier.{CoursierConfiguration, CoursierDependencyResolution, Inputs} import lmcoursier.{CoursierConfiguration, CoursierDependencyResolution, Inputs}
import coursier.sbtcoursiershared.InputsTasks.{credentialsTask, strictTask} import coursier.sbtcoursiershared.InputsTasks.{credentialsTask, strictTask}
import coursier.sbtcoursiershared.{InputsTasks, SbtCoursierShared} import coursier.sbtcoursiershared.{InputsTasks, SbtCoursierShared}
@ -95,6 +95,16 @@ object LmCoursierPlugin extends AutoPlugin {
val fallbackDeps = coursierFallbackDependencies.value val fallbackDeps = coursierFallbackDependencies.value
val autoScalaLib = autoScalaLibrary.value && scalaModuleInfo.value.forall(_.overrideScalaVersion) val autoScalaLib = autoScalaLibrary.value && scalaModuleInfo.value.forall(_.overrideScalaVersion)
val profiles = mavenProfiles.value val profiles = mavenProfiles.value
val versionReconciliations0 = versionReconciliation.value.map { mod =>
Reconciliation(mod.revision) match {
case Some(rec) =>
val (mod0, _) = lmcoursier.FromSbt.moduleVersion(mod, scalaVer, sbv)
val matcher = ModuleMatchers.only(mod0)
matcher -> rec
case None =>
throw new Exception(s"Unrecognized reconciliation: '${mod.revision}'")
}
}
val userForceVersions = Inputs.forceVersions(dependencyOverrides.value, scalaVer, sbv) val userForceVersions = Inputs.forceVersions(dependencyOverrides.value, scalaVer, sbv)
@ -138,6 +148,7 @@ object LmCoursierPlugin extends AutoPlugin {
.withClassifiers(classifiers.toVector.flatten) .withClassifiers(classifiers.toVector.flatten)
.withHasClassifiers(classifiers.nonEmpty) .withHasClassifiers(classifiers.nonEmpty)
.withMavenProfiles(profiles.toVector.sorted) .withMavenProfiles(profiles.toVector.sorted)
.withReconciliation(versionReconciliations0.toVector)
.withScalaOrganization(scalaOrg) .withScalaOrganization(scalaOrg)
.withScalaVersion(scalaVer) .withScalaVersion(scalaVer)
.withAuthenticationByRepositoryId(authenticationByRepositoryId.toVector.sortBy(_._1)) .withAuthenticationByRepositoryId(authenticationByRepositoryId.toVector.sortBy(_._1))