aboutsummaryrefslogtreecommitdiff
path: root/stage2/BuildBuild.scala
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2017-03-19 19:51:38 -0400
committerChristopher Vogt <oss.nsp@cvogt.org>2017-03-20 02:56:26 -0400
commitd6245c8dc5c7b2f885d538b39f685327da252863 (patch)
tree846bdd92ad022dbe5a7a45e0b9d5e75bbf7779c8 /stage2/BuildBuild.scala
parentca099eba708f3618bed75a5940a5a5ae1d10b684 (diff)
downloadcbt-d6245c8dc5c7b2f885d538b39f685327da252863.tar.gz
cbt-d6245c8dc5c7b2f885d538b39f685327da252863.tar.bz2
cbt-d6245c8dc5c7b2f885d538b39f685327da252863.zip
Unify reflectively loading builds from directories.
THis is mostly cleanup and a little bit feature. Before it was done partially in 3 places, BuildBuild, loadRoot and GitDependency. Now DirectoryDependencies also support referencing sub-builds. Also introduce scalariform for the first few files of cbt's core code :).
Diffstat (limited to 'stage2/BuildBuild.scala')
-rw-r--r--stage2/BuildBuild.scala90
1 files changed, 3 insertions, 87 deletions
diff --git a/stage2/BuildBuild.scala b/stage2/BuildBuild.scala
index dea0f12..71a229c 100644
--- a/stage2/BuildBuild.scala
+++ b/stage2/BuildBuild.scala
@@ -5,11 +5,7 @@ import java.io.File
class ConcreteBuildBuild(val context: Context) extends BuildBuild
class plugins(implicit context: Context){
// TODO: move this out of the OO
- private def plugin(dir: String) = cbt.DirectoryDependency(
- context.copy(
- workingDirectory = context.cbtHome / "plugins" / dir
- )
- )
+ private def plugin(dir: String) = cbt.DirectoryDependency(context.cbtHome / "plugins" / dir)
final lazy val googleJavaFormat = plugin( "google-java-format" )
final lazy val proguard = plugin( "proguard" )
final lazy val sbtLayout = plugin( "sbt_layout" )
@@ -24,94 +20,14 @@ class plugins(implicit context: Context){
}
trait BuildBuild extends BaseBuild{
+ override def dependencies = super.dependencies :+ context.cbtDependency
+
object plugins extends plugins
assert(
projectDirectory.getName === lib.buildDirectoryName,
s"You can't extend ${lib.buildBuildClassName} in: " + projectDirectory + "/" + lib.buildDirectoryName
)
-
- protected def managedContext = context.copy(
- workingDirectory = managedBuildDirectory,
- parentBuild=Some(this)
- )
-
- override def dependencies =
- super.dependencies :+ context.cbtDependency
-
- def managedBuildDirectory: java.io.File = lib.realpath( projectDirectory.parent )
- def managedBuild = taskCache[BuildBuild]("managedBuild").memoize{
- val managedBuildFile = projectDirectory++("/"++lib.buildFileName)
- logger.composition("Loading build at " ++ managedBuildDirectory.toString)
- val build = (
- if( !managedBuildFile.exists ){
- throw new Exception(
- s"No file ${lib.buildFileName} (lower case) found in " ++ projectDirectory.getPath
- )
- } else {
- val contents = new String(Files.readAllBytes(managedBuildFile.toPath))
- val cbtUrl = ("cbt:"++GitDependency.GitUrl.regex++"#[a-z0-9A-Z]+").r
- cbtUrl
- .findFirstIn(contents)
- .flatMap{
- url =>
- val Array(base,hash) = url.drop(4).split("#")
- if(context.cbtHome.string.contains(hash))
- None
- else Some{
- // Note: cbt can't use an old version of itself for building,
- // otherwise we'd have to recursively build all versions since
- // the beginning. Instead CBT always needs to build the pure Java
- // Launcher in the checkout with itself and then run it via reflection.
- val build = GitDependency(base, hash, Some("nailgun_launcher")).asInstanceOf[BaseBuild]
- val ctx = managedContext.copy( cbtHome = build.projectDirectory.getParentFile )
- build.classLoader
- .loadClass( "cbt.NailgunLauncher" )
- .getMethod( "getBuild", classOf[AnyRef] )
- .invoke( null, ctx )
- }
- }.getOrElse{
- val buildClasses =
- lib.iterateClasses( compileTarget, classLoader, false )
- .filter(_.getSimpleName == lib.buildClassName)
- .filter(classOf[BaseBuild] isAssignableFrom _)
- if( buildClasses.size == 0 ){
- throw new Exception(
- s"You need to define a class ${lib.buildClassName} extending an appropriate super class in\n"
- + (projectDirectory / lib.buildFileName) ++ "\nbut none found."
- )
- } else if( buildClasses.size > 1 ){
- throw new Exception(
- s"You need to define exactly one class ${lib.buildClassName} extending an appropriate build super class, but multiple found in " + projectDirectory + ":\n" + buildClasses.mkString("\n")
- )
- } else {
- val buildClass = buildClasses.head
- if( !buildClass.getConstructors.exists(_.getParameterTypes.toList == List(classOf[Context])) ){
- throw new Exception(
- s"Expected class ${lib.buildClassName}(val context: Context), but found different constructor in\n"
- + projectDirectory ++ "\n"
- + buildClass ++ "(" ++ buildClass.getConstructors.map(_.getParameterTypes.mkString(", ")).mkString("; ") + ")" )
- }
- buildClass.getConstructors.head.newInstance(managedContext)
- }
- }
- }
- )
- try{
- build.asInstanceOf[BuildInterface]
- } catch {
- case e: ClassCastException if e.getMessage.contains(s"${lib.buildClassName} cannot be cast to cbt.BuildInterface") =>
- throw new Exception(s"Your ${lib.buildClassName} class needs to extend BaseBuild in: "+projectDirectory, e)
- }
- }
-
- @deprecated("use finalbuild(File)","")
- override def finalBuild: BuildInterface = finalBuild( context.cwd )
- override def finalBuild( current: File ): BuildInterface = {
- val p = projectDirectory.getCanonicalFile
- val c = current.getCanonicalFile
- if( c == p ) this else managedBuild.finalBuild( current )
- }
}
trait CbtInternal extends BuildBuild{