From 3fbbc9b78c737ae1cf3e6f2d21b15b3c2c05f6a0 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 14 Jul 2017 15:22:05 +0300 Subject: [PATCH 1/9] Basic template generation --- stage2/FakeContext.scala | 47 ++++++++++++++++++++++++++++ stage2/ToolsStage2.scala | 2 +- stage2/ToolsTasks.scala | 20 +++++++----- stage2/plugins.scala | 1 + tools/giter8/build/build.scala | 13 ++++++++ tools/giter8/build/build/build.scala | 9 ++++++ 6 files changed, 84 insertions(+), 8 deletions(-) create mode 100644 stage2/FakeContext.scala create mode 100644 tools/giter8/build/build.scala create mode 100644 tools/giter8/build/build/build.scala 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..f7d79702 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,13 @@ 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 = { + implicit val context: Context = FakeContext(stage2Args).copy(args = args.drop(1)) + + val giter = DirectoryDependency(cbtHome / "tools" / "giter8").dependency + lib.callReflective(giter, Some("createTemplate"), context) + } def gui = NailgunLauncher.main(Array( "0.0", (cbtHome / "tools" / "gui").getAbsolutePath, diff --git a/stage2/plugins.scala b/stage2/plugins.scala index ea1aa747..f8db3411 100644 --- a/stage2/plugins.scala +++ b/stage2/plugins.scala @@ -7,6 +7,7 @@ class plugins( context: Context, scalaVersion: String ) { ), None ) + final lazy val gitter = plugin( "giter8" ) final lazy val googleJavaFormat = plugin( "google-java-format" ) final lazy val proguard = plugin( "proguard" ) final lazy val sbtLayout = plugin( "sbt_layout" ) diff --git a/tools/giter8/build/build.scala b/tools/giter8/build/build.scala new file mode 100644 index 00000000..77313a81 --- /dev/null +++ b/tools/giter8/build/build.scala @@ -0,0 +1,13 @@ +import java.io.File + +import cbt._ +import giter8._ + +class Build(val context: Context) extends BaseBuild { + def createTemplate: String = { + val helper = new JgitHelper(new Git(new JGitInteractor), G8TemplateRenderer) + val dir = new File(context.args.head) + val config = Config("scala/scala-seed.g8") + helper.run(config, Seq.empty, dir).toString + } +} 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") + ) +} From 5019c28a9daba6cbfc10a55340aee3cc824a7f5a Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 14 Jul 2017 15:42:34 +0300 Subject: [PATCH 2/9] Basic arguments parsing --- tools/giter8/build/build.scala | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tools/giter8/build/build.scala b/tools/giter8/build/build.scala index 77313a81..640b53a8 100644 --- a/tools/giter8/build/build.scala +++ b/tools/giter8/build/build.scala @@ -6,8 +6,12 @@ import giter8._ class Build(val context: Context) extends BaseBuild { def createTemplate: String = { val helper = new JgitHelper(new Git(new JGitInteractor), G8TemplateRenderer) - val dir = new File(context.args.head) + val (dir, args) = context.args.toList match { + case Nil => (context.cwd, Seq.empty) + case x::Nil if x.startsWith("--") => (context.cwd, Seq(x)) + case x :: xs => (new File(x), xs) + } val config = Config("scala/scala-seed.g8") - helper.run(config, Seq.empty, dir).toString + helper.run(config, args, dir).toString } } From d65fa467f072435b1631391994c0f8eb547446eb Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 14 Jul 2017 16:22:03 +0300 Subject: [PATCH 3/9] Add arguments parsing --- tools/giter8/build/build.scala | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/tools/giter8/build/build.scala b/tools/giter8/build/build.scala index 640b53a8..6dda3e89 100644 --- a/tools/giter8/build/build.scala +++ b/tools/giter8/build/build.scala @@ -6,12 +6,26 @@ import giter8._ class Build(val context: Context) extends BaseBuild { def createTemplate: String = { val helper = new JgitHelper(new Git(new JGitInteractor), G8TemplateRenderer) - val (dir, args) = context.args.toList match { - case Nil => (context.cwd, Seq.empty) - case x::Nil if x.startsWith("--") => (context.cwd, Seq(x)) - case x :: xs => (new File(x), xs) - } - val config = Config("scala/scala-seed.g8") - helper.run(config, args, dir).toString + val result = + (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) + } + + result.fold(identity, identity) } + + private def validateArgument(arg: String) = + arg.matches("""--[\w]+=[\w]+""") } From 63f4c8f27fc58f7fa6774ba9afec1d3332485f3d Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 14 Jul 2017 16:34:21 +0300 Subject: [PATCH 4/9] Add g8 alias --- stage2/ToolsTasks.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/stage2/ToolsTasks.scala b/stage2/ToolsTasks.scala index f7d79702..a4b39972 100644 --- a/stage2/ToolsTasks.scala +++ b/stage2/ToolsTasks.scala @@ -29,6 +29,7 @@ class ToolsTasks( val giter = DirectoryDependency(cbtHome / "tools" / "giter8").dependency lib.callReflective(giter, Some("createTemplate"), context) } + def g8 = giter8 def gui = NailgunLauncher.main(Array( "0.0", (cbtHome / "tools" / "gui").getAbsolutePath, From ccb3e02acaacd0cda38608eab303fcce96d2d13e Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 14 Jul 2017 16:37:08 +0300 Subject: [PATCH 5/9] Get rid of implicit --- stage2/ToolsTasks.scala | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/stage2/ToolsTasks.scala b/stage2/ToolsTasks.scala index a4b39972..aba6d3d2 100644 --- a/stage2/ToolsTasks.scala +++ b/stage2/ToolsTasks.scala @@ -24,9 +24,8 @@ class ToolsTasks( )) def giter8 = { - implicit val context: Context = FakeContext(stage2Args).copy(args = args.drop(1)) - - val giter = DirectoryDependency(cbtHome / "tools" / "giter8").dependency + val context: Context = FakeContext(stage2Args).copy(args = args.drop(1)) + val giter = DirectoryDependency(cbtHome / "tools" / "giter8")(context).dependency lib.callReflective(giter, Some("createTemplate"), context) } def g8 = giter8 From aa7a74b1d26ce265129def89116ff6ef14869dc8 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 14 Jul 2017 17:54:26 +0300 Subject: [PATCH 6/9] Tests is good --- test/test.scala | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/test.scala b/test/test.scala index 9cb7fd9c..c90b189f 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 res = runCbt("../tools/giter8", Seq("createTemplate", "scala/scala-seed.g8", "test/temp", "--name=template")) + assert(res.exit0) + println(res.out contains "Template applied") + val templateDir = cbtHome / "test" / "temp" / "template" + assert(templateDir.exists) + deleteRecursively(templateDir) + } + /* // currently fails with // java.lang.UnsupportedOperationException: scalafix.rewrite.ScalafixMirror.fromMirror $anon#typeSignature requires the semantic api From e39192f9887d6d4093b50788665b3d83fd04d46d Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 17 Jul 2017 13:05:11 +0300 Subject: [PATCH 7/9] Throw an exception on not success --- stage2/ToolsTasks.scala | 10 ++++++++- tools/giter8/build/build.scala | 40 ++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 20 deletions(-) diff --git a/stage2/ToolsTasks.scala b/stage2/ToolsTasks.scala index aba6d3d2..1d05f72e 100644 --- a/stage2/ToolsTasks.scala +++ b/stage2/ToolsTasks.scala @@ -26,7 +26,15 @@ class ToolsTasks( def giter8 = { val context: Context = FakeContext(stage2Args).copy(args = args.drop(1)) val giter = DirectoryDependency(cbtHome / "tools" / "giter8")(context).dependency - lib.callReflective(giter, Some("createTemplate"), context) + 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( diff --git a/tools/giter8/build/build.scala b/tools/giter8/build/build.scala index 6dda3e89..4a81c38d 100644 --- a/tools/giter8/build/build.scala +++ b/tools/giter8/build/build.scala @@ -2,28 +2,30 @@ import java.io.File import cbt._ import giter8._ +import scala.util._ class Build(val context: Context) extends BaseBuild { - def createTemplate: String = { + def createTemplate = { val helper = new JgitHelper(new Git(new JGitInteractor), G8TemplateRenderer) - val result = - (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) - } - - result.fold(identity, identity) + (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) = From b7cc3452a60d58d8c6fa09ec9f75cda2a6663950 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 18 Jul 2017 22:15:28 +0300 Subject: [PATCH 8/9] Fix test --- test/test.scala | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/test.scala b/test/test.scala index c90b189f..63c222d9 100644 --- a/test/test.scala +++ b/test/test.scala @@ -515,11 +515,11 @@ object Main{ if (file.exists && !file.delete) throw new Exception(s"Unable to delete ${file.getAbsolutePath}") } - val res = runCbt("../tools/giter8", Seq("createTemplate", "scala/scala-seed.g8", "test/temp", "--name=template")) + 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") - val templateDir = cbtHome / "test" / "temp" / "template" - assert(templateDir.exists) + assert((templateDir / "template").exists) deleteRecursively(templateDir) } From 22e73376529575ceb8bf59dbfb7206403f62770a Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Tue, 21 Nov 2017 15:52:44 +0300 Subject: [PATCH 9/9] Remove not existing plugin defenition --- stage2/plugins.scala | 1 - 1 file changed, 1 deletion(-) diff --git a/stage2/plugins.scala b/stage2/plugins.scala index f8db3411..ea1aa747 100644 --- a/stage2/plugins.scala +++ b/stage2/plugins.scala @@ -7,7 +7,6 @@ class plugins( context: Context, scalaVersion: String ) { ), None ) - final lazy val gitter = plugin( "giter8" ) final lazy val googleJavaFormat = plugin( "google-java-format" ) final lazy val proguard = plugin( "proguard" ) final lazy val sbtLayout = plugin( "sbt_layout" )