aboutsummaryrefslogtreecommitdiff
path: root/stage2/ToolsTasks.scala
diff options
context:
space:
mode:
authorChristopher Vogt <oss.nsp@cvogt.org>2016-05-02 18:36:22 +0300
committerChristopher Vogt <oss.nsp@cvogt.org>2016-05-02 18:36:22 +0300
commit640297fef60ac0bb4c3a5736bab2121dbe98bab2 (patch)
tree11541be3d0c3c08eca1ce2e56daaa678ea48d241 /stage2/ToolsTasks.scala
parent7887c63f6fc56c666f1d0baf6ab54db0ce6c8033 (diff)
downloadcbt-640297fef60ac0bb4c3a5736bab2121dbe98bab2.tar.gz
cbt-640297fef60ac0bb4c3a5736bab2121dbe98bab2.tar.bz2
cbt-640297fef60ac0bb4c3a5736bab2121dbe98bab2.zip
rename admin into tools, which seems more appropriate
Diffstat (limited to 'stage2/ToolsTasks.scala')
-rw-r--r--stage2/ToolsTasks.scala141
1 files changed, 141 insertions, 0 deletions
diff --git a/stage2/ToolsTasks.scala b/stage2/ToolsTasks.scala
new file mode 100644
index 0000000..46f1336
--- /dev/null
+++ b/stage2/ToolsTasks.scala
@@ -0,0 +1,141 @@
+package cbt
+import scala.collection.immutable.Seq
+import java.io.{Console=>_,_}
+import java.nio.file._
+class ToolsTasks(
+ lib: Lib,
+ args: Seq[String],
+ cwd: File,
+ classLoaderCache: ClassLoaderCache,
+ cache: File,
+ cbtHome: File,
+ cbtHasChanged: Boolean
+){
+ private val paths = CbtPaths(cbtHome, cache)
+ import paths._
+ private val mavenCentral = MavenResolver(cbtHasChanged,mavenCache,MavenResolver.central)
+ implicit val logger: Logger = lib.logger
+ def resolve = {
+ ClassPath.flatten(
+ args(1).split(",").toVector.map{
+ d =>
+ val v = d.split(":")
+ mavenCentral.resolveOne(MavenDependency(v(0),v(1),v(2))).classpath
+ }
+ )
+ }
+ def dependencyTree = {
+ args(1).split(",").toVector.map{
+ d =>
+ val v = d.split(":")
+ mavenCentral.resolveOne(MavenDependency(v(0),v(1),v(2))).dependencyTree
+ }.mkString("\n\n")
+ }
+ def amm = ammonite
+ def ammonite = {
+ val version = args.lift(1).getOrElse(constants.scalaVersion)
+ val scalac = new ScalaCompilerDependency( cbtHasChanged,mavenCache, version )
+ val d = mavenCentral.resolveOne(
+ MavenDependency(
+ "com.lihaoyi","ammonite-repl_2.11.7",args.lift(1).getOrElse("0.5.7")
+ )
+ )
+ // FIXME: this does not work quite yet, throws NoSuchFileException: /ammonite/repl/frontend/ReplBridge$.class
+ lib.runMain(
+ "ammonite.repl.Main", Seq(), d.classLoader(classLoaderCache)
+ )
+ }
+ def scala = {
+ val version = args.lift(1).getOrElse(constants.scalaVersion)
+ val scalac = new ScalaCompilerDependency( cbtHasChanged, mavenCache, version )
+ lib.runMain(
+ "scala.tools.nsc.MainGenericRunner", Seq("-cp", scalac.classpath.string), scalac.classLoader(classLoaderCache)
+ )
+ }
+ def scaffoldBasicBuild: Unit = lib.scaffoldBasicBuild( cwd )
+ def scaffoldBuildBuild: Unit = lib.scaffoldBuildBuild( cwd )
+ def cbtEarlyDependencies = {
+ val scalaVersion = args.lift(1).getOrElse(constants.scalaVersion)
+ val scalaMajorVersion = scalaVersion.split("\\.").take(2).mkString(".")
+ val scalaXmlVersion = args.lift(2).getOrElse(constants.scalaXmlVersion)
+ val zincVersion = args.lift(3).getOrElse(constants.zincVersion)
+ val scalaDeps = Seq(
+ mavenCentral.resolveOne(MavenDependency("org.scala-lang","scala-reflect",scalaVersion)),
+ mavenCentral.resolveOne(MavenDependency("org.scala-lang","scala-compiler",scalaVersion))
+ )
+
+ val scalaXml = Dependencies(
+ mavenCentral.resolveOne(MavenDependency("org.scala-lang.modules","scala-xml_"+scalaMajorVersion,scalaXmlVersion)),
+ mavenCentral.resolveOne(MavenDependency("org.scala-lang","scala-library",scalaVersion))
+ )
+
+ val zinc = mavenCentral.resolveOne(MavenDependency("com.typesafe.zinc","zinc",zincVersion))
+
+ def valName(dep: BoundMavenDependency) = {
+ val words = dep.artifactId.split("_").head.split("-")
+ words(0) ++ words.drop(1).map(s => s(0).toString.toUpperCase ++ s.drop(1)).mkString ++ "_" ++ dep.version.replace(".","_") ++ "_"
+ }
+
+ def jarVal(dep: BoundMavenDependency) = "_" + valName(dep) +"Jar"
+ def transitive(dep: Dependency) = (dep +: lib.transitiveDependencies(dep).reverse).collect{case d: BoundMavenDependency => d}
+ def codeEach(dep: Dependency) = {
+ transitive(dep).tails.map(_.reverse).toVector.reverse.drop(1).map{
+ deps =>
+ val d = deps.last
+ val parents = deps.dropRight(1)
+ val parentString = if(parents.isEmpty) "rootClassLoader" else ( valName(parents.last) )
+ val n = valName(d)
+ s"""
+ // ${d.groupId}:${d.artifactId}:${d.version}
+ download(new URL(mavenUrl + "${d.basePath}.jar"), Paths.get(${n}File), "${d.jarSha1}");
+
+ String[] ${n}ClasspathArray = new String[]{${deps.sortBy(_.jar).map(valName(_)+"File").mkString(", ")}};
+ String ${n}Classpath = classpath( ${n}ClasspathArray );
+ ClassLoader $n =
+ classLoaderCache.contains( ${n}Classpath )
+ ? classLoaderCache.get( ${n}Classpath )
+ : classLoaderCache.put( classLoader( ${n}File, $parentString ), ${n}Classpath );"""
+ }
+ }
+ val assignments = codeEach(zinc) ++ codeEach(scalaXml)
+ val files = scalaDeps ++ transitive(scalaXml) ++ transitive(zinc)
+ //{ case (name, dep) => s"$name =\n ${tree(dep, 4)};" }.mkString("\n\n ")
+ val code = s"""// This file was auto-generated using `cbt tools cbtEarlyDependencies`
+package cbt;
+import java.io.*;
+import java.nio.file.*;
+import java.net.*;
+import java.security.*;
+import static cbt.Stage0Lib.*;
+import static cbt.NailgunLauncher.*;
+
+class EarlyDependencies{
+
+ /** ClassLoader for stage1 */
+ ClassLoader classLoader;
+ String[] classpathArray;
+ /** ClassLoader for zinc */
+ ClassLoader zinc;
+
+${files.map(d => s""" String ${valName(d)}File;""").mkString("\n")}
+
+ public EarlyDependencies(
+ String mavenCache, String mavenUrl, ClassLoaderCache2<ClassLoader> classLoaderCache, ClassLoader rootClassLoader
+ ) throws Exception {
+${files.map(d => s""" ${valName(d)}File = mavenCache + "${d.basePath}.jar";""").mkString("\n")}
+
+${scalaDeps.map(d => s""" download(new URL(mavenUrl + "${d.basePath}.jar"), Paths.get(${valName(d)}File), "${d.jarSha1}");""").mkString("\n")}
+${assignments.mkString("\n")}
+
+ classLoader = scalaXml_${scalaXmlVersion.replace(".","_")}_;
+ classpathArray = scalaXml_${scalaXmlVersion.replace(".","_")}_ClasspathArray;
+
+ zinc = zinc_${zincVersion.replace(".","_")}_;
+ }
+}
+"""
+ val file = nailgun ++ ("/" ++ "EarlyDependencies.java")
+ Files.write( file.toPath, code.getBytes )
+ println( Console.GREEN ++ "Wrote " ++ file.string ++ Console.RESET )
+ }
+}