diff --git a/stage2/FakeContext.scala b/stage2/FakeContext.scala new file mode 100644 index 00000000..b3dc4a76 --- /dev/null +++ b/stage2/FakeContext.scala @@ -0,0 +1,47 @@ +package cbt + +import java.io.File +import java.util.concurrent.ConcurrentHashMap +import java.{lang, util} + +class FakeContext(stage2Args: Stage2Args) extends Context { + override def cbtRootHome(): File = stage2Args.cbtHome + + override def projectDirectory(): File = stage2Args.cbtHome + + override def permanentKeys(): ConcurrentHashMap[String, AnyRef] = new ConcurrentHashMap + + override def parentBuildOrNull(): BuildInterface = null + + override def cbtLastModified(): Long = stage2Args.stage2LastModified + + override def persistentCache(): util.Map[AnyRef, AnyRef] = stage2Args.persistentCache + + override def start(): Long = 0 + + override def transientCache(): util.Map[AnyRef, AnyRef] = stage2Args.transientCache + + override def argsArray(): Array[String] = Array.empty + + override def cache(): File = stage2Args.cache + + override def compatibilityTarget(): File = stage2Args.compatibilityTarget + + override def startCompat(): lang.Long = new lang.Long(0) + + override def enabledLoggersArray(): Array[String] = Array.empty + + override def cbtHasChangedCompat(): lang.Boolean = false + + override def cwd(): File = stage2Args.cwd + + override def permanentClassLoaders(): ConcurrentHashMap[AnyRef, ClassLoader] = new ConcurrentHashMap() + + override def scalaVersionOrNull(): String = null + + override def cbtHome(): File = stage2Args.cbtHome +} + +object FakeContext { + def apply(stage2Args: Stage2Args): FakeContext = new FakeContext(stage2Args) +} diff --git a/stage2/ToolsStage2.scala b/stage2/ToolsStage2.scala index 7765e82e..4dc02fe2 100644 --- a/stage2/ToolsStage2.scala +++ b/stage2/ToolsStage2.scala @@ -4,7 +4,7 @@ object ToolsStage2 extends Stage2Base{ def run( _args: Stage2Args ): ExitCode = { val args = _args.args.dropWhile(Seq("tools") contains _) val lib = new Lib(_args.logger) - val toolsTasks = new ToolsTasks(lib, args, _args.cwd, _args.cache, _args.cbtHome, _args.stage2LastModified)(_args.classLoaderCache) + val toolsTasks = new ToolsTasks(lib, args, _args) lib.callReflective(toolsTasks, args.lift(0), null) } } diff --git a/stage2/ToolsTasks.scala b/stage2/ToolsTasks.scala index 20591a25..1d05f72e 100644 --- a/stage2/ToolsTasks.scala +++ b/stage2/ToolsTasks.scala @@ -1,15 +1,14 @@ package cbt +import java.io.{Console => _, _} import java.net._ -import java.io.{Console=>_,_} -import java.nio.file._ class ToolsTasks( lib: Lib, args: Seq[String], - cwd: File, - cache: File, - cbtHome: File, - cbtLastModified: Long -)(implicit classLoaderCache: ClassLoaderCache){ + stage2Args: Stage2Args +){ + import stage2Args.{args => _, stage2LastModified => _, _} + private val cbtLastModified = stage2Args.stage2LastModified + def apply: String = "Available methods: " ++ lib.taskNames(getClass).mkString(" ") override def toString = lib.usage(this.getClass, super.toString) private val paths = CbtPaths(cbtHome, cache) @@ -23,6 +22,21 @@ class ToolsTasks( def `search-class` = java.awt.Desktop.getDesktop().browse(new URI( "http://search.maven.org/#search%7Cga%7C1%7Cc%3A%22" ++ URLEncoder.encode(args(1),"UTF-8") ++ "%22" )) + + def giter8 = { + val context: Context = FakeContext(stage2Args).copy(args = args.drop(1)) + val giter = DirectoryDependency(cbtHome / "tools" / "giter8")(context).dependency + try{ + lib.redirectOutToErr(lib.callReflective(giter, Some("createTemplate"), context)) + ExitCode.Success + } catch { + case e: Throwable => + System.err.println(e.getCause.getMessage) + ExitCode.Failure + } + + } + def g8 = giter8 def gui = NailgunLauncher.main(Array( "0.0", (cbtHome / "tools" / "gui").getAbsolutePath, diff --git a/test/test.scala b/test/test.scala index 9cb7fd9c..63c222d9 100644 --- a/test/test.scala +++ b/test/test.scala @@ -321,6 +321,8 @@ object Main{ } compile("../examples/uber-jar-example") + compile("../tools/giter8") + if( compat && fork ){ // FIXME: this should not be excluded in forking val res = task("docJar","simple-fixed-cbt") assert( res.out endsWith "simple-fixed-cbt_2.11-0.1-javadoc.jar\n", res.out ) @@ -506,6 +508,21 @@ object Main{ assert(res.exit0) } + { + def deleteRecursively(file: File): Unit = { + if (file.isDirectory) + file.listFiles.foreach(deleteRecursively) + if (file.exists && !file.delete) + throw new Exception(s"Unable to delete ${file.getAbsolutePath}") + } + val templateDir = cbtHome / "test" / "temp" + val res = runCbt("../tools/giter8", Seq("createTemplate", "scala/scala-seed.g8", templateDir.getPath, "--name=template")) + assert(res.exit0) + println(res.out contains "Template applied") + assert((templateDir / "template").exists) + deleteRecursively(templateDir) + } + /* // currently fails with // java.lang.UnsupportedOperationException: scalafix.rewrite.ScalafixMirror.fromMirror $anon#typeSignature requires the semantic api diff --git a/tools/giter8/build/build.scala b/tools/giter8/build/build.scala new file mode 100644 index 00000000..4a81c38d --- /dev/null +++ b/tools/giter8/build/build.scala @@ -0,0 +1,33 @@ +import java.io.File + +import cbt._ +import giter8._ +import scala.util._ + +class Build(val context: Context) extends BaseBuild { + def createTemplate = { + val helper = new JgitHelper(new Git(new JGitInteractor), G8TemplateRenderer) + (context.args.toList match { + case t :: Nil => Right(t, context.cwd, Seq.empty) + case t :: x :: Nil if x.startsWith("--") => Right(t, context.cwd, Seq(x)) + case t :: x :: xs => Right(t, new File(x), xs) + case Nil => Left("Please, specify a template name") + }) + .right.flatMap { case (template, dir, args) => + Either.cond(args.forall(validateArgument), + (template, dir, args), + """Incorrect arguments, it should be --= + |Example --name=my_cool_project + """.stripMargin) + } + .right.flatMap { case (template, dir, args) => + val config = Config(template) + helper.run(config, args, dir) + } + .fold(f => Failure(new Exception(f)), s => Success(s)) + .get + } + + private def validateArgument(arg: String) = + arg.matches("""--[\w]+=[\w]+""") +} diff --git a/tools/giter8/build/build/build.scala b/tools/giter8/build/build/build.scala new file mode 100644 index 00000000..428beef7 --- /dev/null +++ b/tools/giter8/build/build/build.scala @@ -0,0 +1,9 @@ +import cbt._ + +class Build(val context: Context) extends BuildBuild { + override def dependencies: Seq[Dependency] = + super.dependencies ++ + Resolver(mavenCentral).bind( + ScalaDependency("org.foundweekends.giter8", "giter8-lib", "0.9.0") + ) +}