From 9c1566dfa18c8aaea1fb8928148eeabca9dfaf4c Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Wed, 29 Nov 2017 20:02:37 -0500 Subject: [PATCH] Fix false positive on sbt 1.x module eviction warnings Fixes #187 --- .../librarymanagement/EvictionWarning.scala | 19 +++++++++++- ivy/src/test/scala/EvictionWarningSpec.scala | 29 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/sbt/librarymanagement/EvictionWarning.scala b/core/src/main/scala/sbt/librarymanagement/EvictionWarning.scala index 1aeb40ebf..6245b5f6c 100644 --- a/core/src/main/scala/sbt/librarymanagement/EvictionWarning.scala +++ b/core/src/main/scala/sbt/librarymanagement/EvictionWarning.scala @@ -84,7 +84,8 @@ object EvictionWarningOptions { ) lazy val defaultGuess: Function1[(ModuleID, Option[ModuleID], Option[ScalaModuleInfo]), Boolean] = - guessSecondSegment orElse guessSemVer orElse guessFalse + guessSbtOne orElse guessSecondSegment orElse guessSemVer orElse guessFalse + lazy val guessSecondSegment : PartialFunction[(ModuleID, Option[ModuleID], Option[ScalaModuleInfo]), Boolean] = { case (m1, Some(m2), Some(scalaModuleInfo)) @@ -98,6 +99,21 @@ object EvictionWarningOptions { case _ => false } } + + lazy val guessSbtOne + : PartialFunction[(ModuleID, Option[ModuleID], Option[ScalaModuleInfo]), Boolean] = { + case (m1, Some(m2), Some(scalaModuleInfo)) + if (m2.organization == "org.scala-sbt") && + (m2.name.endsWith("_" + scalaModuleInfo.scalaFullVersion) || + m2.name.endsWith("_" + scalaModuleInfo.scalaBinaryVersion)) => + (m1.revision, m2.revision) match { + case (VersionNumber(ns1, ts1, es1), VersionNumber(ns2, ts2, es2)) => + VersionNumber.SemVer + .isCompatible(VersionNumber(ns1, ts1, es1), VersionNumber(ns2, ts2, es2)) + case _ => false + } + } + lazy val guessSemVer : PartialFunction[(ModuleID, Option[ModuleID], Option[ScalaModuleInfo]), Boolean] = { case (m1, Some(m2), _) => @@ -108,6 +124,7 @@ object EvictionWarningOptions { case _ => false } } + lazy val guessFalse : PartialFunction[(ModuleID, Option[ModuleID], Option[ScalaModuleInfo]), Boolean] = { case (_, _, _) => false diff --git a/ivy/src/test/scala/EvictionWarningSpec.scala b/ivy/src/test/scala/EvictionWarningSpec.scala index 48ef1ff0a..e5eceacad 100644 --- a/ivy/src/test/scala/EvictionWarningSpec.scala +++ b/ivy/src/test/scala/EvictionWarningSpec.scala @@ -1,6 +1,9 @@ package sbt.librarymanagement import sbt.internal.librarymanagement.BaseIvySpecification +import sbt.internal.librarymanagement.cross.CrossVersionUtil +import sbt.librarymanagement.syntax._ +import org.scalatest.Assertions._ class EvictionWarningSpec extends BaseIvySpecification { // This is a specification to check the eviction warnings @@ -42,6 +45,22 @@ class EvictionWarningSpec extends BaseIvySpecification { """ should "be detected as eviction" in scalaLibTransitiveWarn2() it should "print out message about the eviction if it's enabled" in scalaLibTransitiveWarn3() + "Comparing sbt 0.x" should "use Second Segment Variation semantics" in { + val m1 = "org.scala-sbt" % "util-logging" % "0.13.16" + val m2 = "org.scala-sbt" % "util-logging" % "0.13.1" + assert( + EvictionWarningOptions + .defaultGuess((m1, Option(m2), Option(dummyScalaModuleInfo("2.10.6")))) == false) + } + + "Comparing sbt 1.x" should "use Semantic Versioning semantics" in { + val m1 = "org.scala-sbt" % "util-logging_2.12" % "1.0.0" + val m2 = "org.scala-sbt" % "util-logging_2.12" % "1.1.0" + assert( + EvictionWarningOptions + .defaultGuess((m1, Option(m2), Option(dummyScalaModuleInfo("2.12.4"))))) + } + def akkaActor214 = ModuleID("com.typesafe.akka", "akka-actor", "2.1.4").withConfigurations(Some("compile")) cross CrossVersion.binary def akkaActor230 = @@ -265,4 +284,14 @@ class EvictionWarningSpec extends BaseIvySpecification { "Run 'evicted' to see detailed eviction warnings" ) } + + def dummyScalaModuleInfo(v: String): ScalaModuleInfo = + ScalaModuleInfo( + scalaFullVersion = v, + scalaBinaryVersion = CrossVersionUtil.binaryScalaVersion(v), + configurations = Vector.empty, + checkExplicit = true, + filterImplicit = false, + overrideScalaVersion = true + ) }