aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Christopher Vogt <oss.nsp@cvogt.org>2017-04-02 04:02:30 -0400
committerGitHub <noreply@github.com>2017-04-02 04:02:30 -0400
commit5d4660e9263e1da005f02a78ee0b027d1d3846be (patch)
treeaa99905c6399aee8c935d2d00864d7e58ce3b6f0
parent2476e2ec1100813ae4e05cf2183feff8bf5ec8ea (diff)
parentd4797818603d64153da51adb19ef34a96b32d858 (diff)
downloadcbt-5d4660e9263e1da005f02a78ee0b027d1d3846be.tar.gz
cbt-5d4660e9263e1da005f02a78ee0b027d1d3846be.tar.bz2
cbt-5d4660e9263e1da005f02a78ee0b027d1d3846be.zip
Merge pull request #465 from cvogt/verify-classpath
Verify classpath
-rw-r--r--libraries/file/file.scala12
-rw-r--r--stage1/ClassPath.scala30
-rw-r--r--stage1/resolver.scala5
-rw-r--r--stage2/BuildBuild.scala3
-rw-r--r--stage2/Plugin.scala3
-rw-r--r--stage2/plugins/DynamicOverrides.scala2
-rw-r--r--stage2/plugins/MultipleScalaVersions.scala4
7 files changed, 50 insertions, 9 deletions
diff --git a/libraries/file/file.scala b/libraries/file/file.scala
index 900e9ec..d420964 100644
--- a/libraries/file/file.scala
+++ b/libraries/file/file.scala
@@ -79,14 +79,14 @@ trait Module {
case v @ ( file, _ ) if collector.isDefinedAt( v ) => file -> collector( v )
}
if ( !allowDuplicates ) {
- val relatives = map.unzip._2
- val duplicateFiles = ( relatives diff relatives.distinct ).distinct
+ val duplicates = map.groupBy( _._2 ).filter( _._2.size > 1 ).mapValues( _.map( _._1 ).toSeq.sorted ).toSeq.sortBy( _._1 )
assert(
- duplicateFiles.isEmpty, {
- val rs = relatives.toSet
+ duplicates.isEmpty,
+ {
"Conflicting:\n\n" +
- map.filter( rs contains _._2 ).groupBy( _._2 ).mapValues( _.map( _._1 ).sorted ).toSeq.sortBy( _._1 ).map {
- case ( name, files ) => s"$name:\n" ++ files.mkString( "\n" )
+ duplicates.map {
+ case ( path, locations ) =>
+ path + " in:\n" + locations.mkString( "\n" )
}.mkString( "\n\n" )
}
)
diff --git a/stage1/ClassPath.scala b/stage1/ClassPath.scala
index 539efc7..b13bdaf 100644
--- a/stage1/ClassPath.scala
+++ b/stage1/ClassPath.scala
@@ -27,4 +27,34 @@ case class ClassPath(files: Seq[File] = Seq()){
if( f.getName.endsWith(".jar") /* !f.isDirectory */ ) "" else "/"
)
}.sorted
+
+ def verify( lib: Stage1Lib ) = {
+ val ( directories, jarFiles ) = files.partition(_.isDirectory)
+ val all = lib.autoRelative(
+ directories
+ ) ++ jarFiles.flatMap{ f =>
+ import collection.JavaConverters._
+ new java.util.jar.JarFile(f).entries.asScala.filterNot(_.isDirectory).toVector.map(
+ f -> _.toString
+ )
+ }
+ val duplicates =
+ all
+ .groupBy( _._2 )
+ .filter( _._2.size > 1 )
+ .filter( _._1 endsWith ".class" )
+ .mapValues( _.map( _._1 ) )
+ .toSeq
+ .sortBy( _._1 )
+ assert(
+ duplicates.isEmpty,
+ {
+ "Conflicting:\n\n" +
+ duplicates.map{
+ case ( path, locations ) =>
+ path + " exits in multiple locations:\n" + locations.mkString("\n")
+ }.mkString("\n\n")
+ }
+ )
+ }
}
diff --git a/stage1/resolver.scala b/stage1/resolver.scala
index 48099e5..f4a9b13 100644
--- a/stage1/resolver.scala
+++ b/stage1/resolver.scala
@@ -130,8 +130,9 @@ trait DependencyImplementation extends Dependency{
}
// FIXME: these probably need to update outdated as well
- def classpath : ClassPath = exportedClasspath ++ dependencyClasspath
- def dependencyClasspath : ClassPath = taskCache[DependencyImplementation]( "dependencyClasspath" ).memoize{
+ def classpath: ClassPath = exportedClasspath ++ dependencyClasspath
+ def verifyClasspath: Unit = classpath.verify(lib)
+ def dependencyClasspath: ClassPath = taskCache[DependencyImplementation]( "dependencyClasspath" ).memoize{
ClassPath(
transitiveDependencies
.flatMap(_.exportedClasspath.files)
diff --git a/stage2/BuildBuild.scala b/stage2/BuildBuild.scala
index 8430f49..299ec21 100644
--- a/stage2/BuildBuild.scala
+++ b/stage2/BuildBuild.scala
@@ -9,6 +9,9 @@ trait BuildBuild extends BaseBuild{
object plugins extends plugins( context, scalaVersion )
+ /** CBT relies on hierarchical classloaders */
+ final override def flatClassLoader = false
+
assert(
projectDirectory.getName === lib.buildDirectoryName,
s"You can't extend ${lib.buildBuildClassName} in: " + projectDirectory + "/" + lib.buildDirectoryName
diff --git a/stage2/Plugin.scala b/stage2/Plugin.scala
index 2cc242d..5faf80c 100644
--- a/stage2/Plugin.scala
+++ b/stage2/Plugin.scala
@@ -2,4 +2,7 @@ package cbt
trait Plugin extends BaseBuild{
override def dependencies = super.dependencies :+ context.cbtDependency
object plugins extends plugins( context, scalaVersion )
+
+ /** CBT relies on hierarchical classloaders */
+ final override def flatClassLoader = false
}
diff --git a/stage2/plugins/DynamicOverrides.scala b/stage2/plugins/DynamicOverrides.scala
index 8d67be7..b7c2832 100644
--- a/stage2/plugins/DynamicOverrides.scala
+++ b/stage2/plugins/DynamicOverrides.scala
@@ -48,6 +48,7 @@ trait DynamicOverrides extends BaseBuild{
(
baseName,
s"""
+ import _root_.cbt._
class $baseName(context: _root_.cbt.Context)
extends $parent(context)$mixin{
$body
@@ -58,6 +59,7 @@ trait DynamicOverrides extends BaseBuild{
(
overrideName,
s"""
+ import _root_.cbt._
class $baseName(context: _root_.cbt.Context)
extends $parent(context)$mixin{
$body
diff --git a/stage2/plugins/MultipleScalaVersions.scala b/stage2/plugins/MultipleScalaVersions.scala
index 5d896dd..6bd5543 100644
--- a/stage2/plugins/MultipleScalaVersions.scala
+++ b/stage2/plugins/MultipleScalaVersions.scala
@@ -4,6 +4,8 @@ trait MultipleScalaVersions extends DynamicOverrides{
def scalaVersions: Seq[String] = Seq(scalaVersion, "2.10.6")
def cross: Seq[MultipleScalaVersions] =
scalaVersions.map{ v =>
- newBuild[MultipleScalaVersions](context.copy(scalaVersion = Some(v)))("")
+ newBuild[MultipleScalaVersions](context.copy(scalaVersion = Some(v)))("""
+ override def sources = super.sources :+ ( projectDirectory / "src_" ++ scalaMajorVersion )
+ """)
}
}