From 08e9230aeb0bbc2e94395f6ebc2993ff263ef0ef Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Fri, 12 Dec 2014 17:46:19 -0500 Subject: [PATCH 1/2] Fixes #1615. Move the invocation of eviction warning. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This moves the invocation of eviction warning so it’s called only when actual ivy update is being performed. --- ivy/src/main/scala/sbt/EvictionWarning.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ivy/src/main/scala/sbt/EvictionWarning.scala b/ivy/src/main/scala/sbt/EvictionWarning.scala index 7279b77da..38d626a86 100644 --- a/ivy/src/main/scala/sbt/EvictionWarning.scala +++ b/ivy/src/main/scala/sbt/EvictionWarning.scala @@ -41,6 +41,8 @@ final class EvictionWarningOptions private[sbt] ( } object EvictionWarningOptions { + def empty: EvictionWarningOptions = + new EvictionWarningOptions(Vector(), false, false, false, false, defaultGuess) def default: EvictionWarningOptions = new EvictionWarningOptions(Vector(Compile), true, true, false, false, defaultGuess) def full: EvictionWarningOptions = From ccef278865549b3c5c174bf4fae9567ab98eb80e Mon Sep 17 00:00:00 2001 From: Eugene Yokota Date: Fri, 12 Dec 2014 23:30:05 -0500 Subject: [PATCH 2/2] 'evicted' task to display all evictions --- ivy/src/main/scala/sbt/EvictionWarning.scala | 41 ++++++++++++++++++-- 1 file changed, 38 insertions(+), 3 deletions(-) diff --git a/ivy/src/main/scala/sbt/EvictionWarning.scala b/ivy/src/main/scala/sbt/EvictionWarning.scala index 38d626a86..0e0234de5 100644 --- a/ivy/src/main/scala/sbt/EvictionWarning.scala +++ b/ivy/src/main/scala/sbt/EvictionWarning.scala @@ -9,6 +9,7 @@ final class EvictionWarningOptions private[sbt] ( val warnScalaVersionEviction: Boolean, val warnDirectEvictions: Boolean, val warnTransitiveEvictions: Boolean, + val infoAllEvictions: Boolean, val showCallers: Boolean, val guessCompatible: Function1[(ModuleID, Option[ModuleID], Option[IvyScala]), Boolean]) { private[sbt] def configStrings = configurations map { _.name } @@ -21,6 +22,8 @@ final class EvictionWarningOptions private[sbt] ( copy(warnDirectEvictions = warnDirectEvictions) def withWarnTransitiveEvictions(warnTransitiveEvictions: Boolean): EvictionWarningOptions = copy(warnTransitiveEvictions = warnTransitiveEvictions) + def withInfoAllEvictions(infoAllEvictions: Boolean): EvictionWarningOptions = + copy(infoAllEvictions = infoAllEvictions) def withShowCallers(showCallers: Boolean): EvictionWarningOptions = copy(showCallers = showCallers) def withGuessCompatible(guessCompatible: Function1[(ModuleID, Option[ModuleID], Option[IvyScala]), Boolean]): EvictionWarningOptions = @@ -30,23 +33,25 @@ final class EvictionWarningOptions private[sbt] ( warnScalaVersionEviction: Boolean = warnScalaVersionEviction, warnDirectEvictions: Boolean = warnDirectEvictions, warnTransitiveEvictions: Boolean = warnTransitiveEvictions, + infoAllEvictions: Boolean = infoAllEvictions, showCallers: Boolean = showCallers, guessCompatible: Function1[(ModuleID, Option[ModuleID], Option[IvyScala]), Boolean] = guessCompatible): EvictionWarningOptions = new EvictionWarningOptions(configurations = configurations, warnScalaVersionEviction = warnScalaVersionEviction, warnDirectEvictions = warnDirectEvictions, warnTransitiveEvictions = warnTransitiveEvictions, + infoAllEvictions = infoAllEvictions, showCallers = showCallers, guessCompatible = guessCompatible) } object EvictionWarningOptions { def empty: EvictionWarningOptions = - new EvictionWarningOptions(Vector(), false, false, false, false, defaultGuess) + new EvictionWarningOptions(Vector(), false, false, false, false, false, defaultGuess) def default: EvictionWarningOptions = - new EvictionWarningOptions(Vector(Compile), true, true, false, false, defaultGuess) + new EvictionWarningOptions(Vector(Compile), true, true, false, false, false, defaultGuess) def full: EvictionWarningOptions = - new EvictionWarningOptions(Vector(Compile), true, true, true, true, defaultGuess) + new EvictionWarningOptions(Vector(Compile), true, true, true, true, true, defaultGuess) lazy val defaultGuess: Function1[(ModuleID, Option[ModuleID], Option[IvyScala]), Boolean] = guessSecondSegment orElse guessSemVer orElse guessFalse @@ -80,6 +85,18 @@ final class EvictionPair private[sbt] ( val showCallers: Boolean) { override def toString: String = EvictionPair.evictionPairLines.showLines(this).mkString + override def equals(o: Any): Boolean = o match { + case o: EvictionPair => + (this.organization == o.organization) && + (this.name == o.name) + case _ => false + } + override def hashCode: Int = { + var hash = 1 + hash = hash * 31 + this.organization.## + hash = hash * 31 + this.name.## + hash + } } object EvictionPair { @@ -107,6 +124,7 @@ final class EvictionWarning private[sbt] ( val transitiveEvictions: Seq[EvictionPair], val allEvictions: Seq[EvictionPair]) { def reportedEvictions: Seq[EvictionPair] = scalaEvictions ++ directEvictions ++ transitiveEvictions + private[sbt] def infoAllTheThings: List[String] = EvictionWarning.infoAllTheThings(this) } object EvictionWarning { @@ -203,4 +221,21 @@ object EvictionWarning { out.toList } + + private[sbt] def infoAllTheThings(a: EvictionWarning): List[String] = + if (a.options.infoAllEvictions) { + import ShowLines._ + val evo = a.options + val out: mutable.ListBuffer[String] = mutable.ListBuffer() + a.allEvictions foreach { ev => + if ((a.scalaEvictions contains ev) && evo.warnScalaVersionEviction) () + else if ((a.directEvictions contains ev) && evo.warnDirectEvictions) () + else if ((a.transitiveEvictions contains ev) && evo.warnTransitiveEvictions) () + else { + out ++= ev.lines + } + } + if (out.isEmpty) Nil + else List("Here are other libraries that were evicted:") ::: out.toList + } else Nil }