mirror of https://github.com/sbt/sbt.git
warn when there is an sbt version conflict. fixes #80
This commit is contained in:
parent
98b60623af
commit
82f025bdec
|
|
@ -0,0 +1,20 @@
|
||||||
|
package sbt
|
||||||
|
|
||||||
|
import DependencyFilter._
|
||||||
|
|
||||||
|
final case class ConflictWarning(filter: ModuleFilter, group: ModuleID => String, level: Level.Value, failOnConflict: Boolean)
|
||||||
|
object ConflictWarning
|
||||||
|
{
|
||||||
|
def default: ConflictWarning = ConflictWarning( moduleFilter(organization = GlobFilter("org.scala-tools.sbt") | GlobFilter("org.scala-lang")), (_: ModuleID).organization, Level.Warn, false)
|
||||||
|
|
||||||
|
def apply(config: ConflictWarning, report: UpdateReport, log: Logger)
|
||||||
|
{
|
||||||
|
val conflicts = IvyActions.groupedConflicts(config.filter, config.group)(report)
|
||||||
|
if(!conflicts.isEmpty)
|
||||||
|
log.log(config.level, "Potentially incompatible versions specified:")
|
||||||
|
for( (label, versions) <- conflicts )
|
||||||
|
log.log(config.level, " " + label + ": " + versions.mkString(", "))
|
||||||
|
if(config.failOnConflict && !conflicts.isEmpty)
|
||||||
|
error("Conflicts in " + conflicts.map(_._1).mkString )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -32,6 +32,7 @@ object DependencyFilter extends DependencyFilterExtra
|
||||||
implicit def fnToModuleFilter(f: ModuleID => Boolean): ModuleFilter = new ModuleFilter { def apply(m: ModuleID) = f(m) }
|
implicit def fnToModuleFilter(f: ModuleID => Boolean): ModuleFilter = new ModuleFilter { def apply(m: ModuleID) = f(m) }
|
||||||
implicit def fnToArtifactFilter(f: Artifact => Boolean): ArtifactFilter = new ArtifactFilter { def apply(m: Artifact) = f(m) }
|
implicit def fnToArtifactFilter(f: Artifact => Boolean): ArtifactFilter = new ArtifactFilter { def apply(m: Artifact) = f(m) }
|
||||||
implicit def fnToConfigurationFilter(f: String => Boolean): ConfigurationFilter = new ConfigurationFilter { def apply(c: String) = f(c) }
|
implicit def fnToConfigurationFilter(f: String => Boolean): ConfigurationFilter = new ConfigurationFilter { def apply(c: String) = f(c) }
|
||||||
|
implicit def subDepFilterToFn[Arg](f: SubDepFilter[Arg, _]): Arg => Boolean = f apply _
|
||||||
}
|
}
|
||||||
trait DependencyFilter
|
trait DependencyFilter
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,18 @@ object IvyActions
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def groupedConflicts[T](moduleFilter: ModuleFilter, grouping: ModuleID => T)(report: UpdateReport): Map[T, Set[String]] =
|
||||||
|
report.configurations.flatMap { confReport =>
|
||||||
|
val evicted = confReport.evicted.filter(moduleFilter)
|
||||||
|
val evictedSet = evicted.map( m => (m.organization, m.name) ).toSet
|
||||||
|
val conflicted = confReport.allModules.filter( mod => evictedSet( (mod.organization, mod.name) ) )
|
||||||
|
grouped(grouping)(conflicted ++ evicted)
|
||||||
|
} toMap;
|
||||||
|
|
||||||
|
def grouped[T](grouping: ModuleID => T)(mods: Seq[ModuleID]): Map[T, Set[String]] =
|
||||||
|
mods groupBy(grouping) mapValues(_.map(_.revision).toSet)
|
||||||
|
|
||||||
|
|
||||||
def transitiveScratch(ivySbt: IvySbt, label: String, config: GetClassifiersConfiguration, log: Logger): UpdateReport =
|
def transitiveScratch(ivySbt: IvySbt, label: String, config: GetClassifiersConfiguration, log: Logger): UpdateReport =
|
||||||
{
|
{
|
||||||
import config.{configuration => c, id, ivyScala, modules => deps}
|
import config.{configuration => c, id, ivyScala, modules => deps}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue