diff options
author | Jan Christopher Vogt <oss.nsp@cvogt.org> | 2017-04-02 04:02:30 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-02 04:02:30 -0400 |
commit | 5d4660e9263e1da005f02a78ee0b027d1d3846be (patch) | |
tree | aa99905c6399aee8c935d2d00864d7e58ce3b6f0 | |
parent | 2476e2ec1100813ae4e05cf2183feff8bf5ec8ea (diff) | |
parent | d4797818603d64153da51adb19ef34a96b32d858 (diff) | |
download | cbt-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.scala | 12 | ||||
-rw-r--r-- | stage1/ClassPath.scala | 30 | ||||
-rw-r--r-- | stage1/resolver.scala | 5 | ||||
-rw-r--r-- | stage2/BuildBuild.scala | 3 | ||||
-rw-r--r-- | stage2/Plugin.scala | 3 | ||||
-rw-r--r-- | stage2/plugins/DynamicOverrides.scala | 2 | ||||
-rw-r--r-- | stage2/plugins/MultipleScalaVersions.scala | 4 |
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 ) + """) } } |