diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 00000000..5daea7bd --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/JarTemplate.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/JarTemplate.kt index 1b35ce0a..1966b747 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/JarTemplate.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/api/JarTemplate.kt @@ -1,6 +1,7 @@ package com.beust.kobalt.api import com.beust.kobalt.Args +import com.beust.kobalt.misc.KFiles import com.beust.kobalt.misc.log import java.io.File import java.io.FileOutputStream @@ -23,11 +24,7 @@ abstract class JarTemplate(val jarName: String) : ITemplate { log(2, "Extracting: $entry to ${f.absolutePath}") FileOutputStream(f).use { fos -> - var read = ins.read() - while (ins.available() > 0 && read != -1) { - fos.write(read) - read = ins.read() - } + KFiles.copy(ins, fos) } entry = ins.nextEntry } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt index eef60ede..f90017ad 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/KFiles.kt @@ -7,6 +7,8 @@ import com.beust.kobalt.internal.build.BuildFile import com.beust.kobalt.maven.Md5 import java.io.File import java.io.IOException +import java.io.InputStream +import java.io.OutputStream import java.nio.file.Files import java.nio.file.Path import java.nio.file.Paths @@ -261,6 +263,14 @@ class KFiles { } } + fun copy(from: InputStream, to: OutputStream) { + var read = from.read() + while (from.available() > 0 && read != -1) { + to.write(read) + read = from.read() + } + } + fun createTempFile(suffix : String = "", deleteOnExit: Boolean = false) : File = File.createTempFile("kobalt", suffix, File(SystemProperties.tmpDir)).let { if (deleteOnExit) it.deleteOnExit() diff --git a/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt b/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt index ce0597a9..3ffcde1d 100644 --- a/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt +++ b/src/main/kotlin/com/beust/kobalt/app/IdeaFilesTemplate.kt @@ -3,6 +3,7 @@ package com.beust.kobalt.app import com.beust.kobalt.Args import com.beust.kobalt.Constants import com.beust.kobalt.api.ITemplate +import com.beust.kobalt.api.ITemplateContributor import com.beust.kobalt.api.Kobalt import com.beust.kobalt.app.remote.DependencyData import com.beust.kobalt.misc.KFiles @@ -10,6 +11,8 @@ import com.beust.kobalt.misc.log import com.beust.kobalt.plugin.KobaltPlugin import com.google.inject.Inject import java.io.File +import java.io.FileOutputStream +import java.nio.file.Paths /** * A template that generates IDEA files. @@ -22,22 +25,48 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { override val instructions = "IDEA files generated" companion object { - val IDEA_DIR = ".idea" + val IDEA_DIR = File(".idea").apply { mkdirs() } } override fun generateTemplate(args: Args, classLoader: ClassLoader) { val dependencyData = Kobalt.INJECTOR.getInstance(DependencyData::class.java) val data = dependencyData.dependenciesDataFor(Constants.BUILD_FILE_PATH, args) - val outputDir = KFiles.makeDir(".")//KFiles.makeDir(homeDir("t/idea")) + val outputDir = File(".")// KFiles.makeDir(".")//KFiles.makeDir(homeDir("t/idea")) generateLibraries(data, outputDir) generateModulesXml(data, outputDir) - generateImlFiles(data, outputDir) + generateImlFiles(classLoader, data, outputDir) + generateMiscXml(classLoader, outputDir) } - private fun generateImlFiles(data: DependencyData.GetDependenciesData, outputDir: File) { + private fun templatePath(fileName: String) = + KFiles.joinDir(ITemplateContributor.DIRECTORY_NAME, templateName, fileName) + + private fun writeTemplate(classLoader: ClassLoader, outputDir: File, fileName: String) { + log(2, "Opening template " + templatePath(fileName)) + val ins = classLoader.getResource(templatePath(fileName)).openConnection().inputStream + val outputFile = File(KFiles.joinDir(outputDir.absolutePath, fileName)) + outputFile.parentFile.mkdir() + FileOutputStream(outputFile).use { fos -> + KFiles.copy(ins, fos) + } + log(2, "Created " + outputFile.path) + } + + private fun generateMiscXml(classLoader: ClassLoader, outputDir: File) + = writeTemplate(classLoader, Paths.get(outputDir.path, IDEA_DIR.path).normalize().toFile(), "misc.xml") + + private fun generateImlFiles(classLoader: ClassLoader, data: DependencyData.GetDependenciesData, outputDir: File) { + // + // Build.kt.iml + // + writeTemplate(classLoader, File(KFiles.joinDir(outputDir.absolutePath, "kobalt")), "Build.kt.iml") + + // + // iml files for each individual project + // data.projects.forEach { project -> - KFiles.makeDir(outputDir.absolutePath, File(imlName(project)).parent) - val file = File(KFiles.joinDir(outputDir.path, imlName(project))) + val file = File(outputDir.absolutePath, imlName(project)) + file.parentFile.mkdirs() with(arrayListOf()) { add("""""") add("""""") @@ -67,10 +96,10 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { // add(""" """) - (project.name + compileSuffix()).let { + (project.name + COMPILE_SUFFIX).let { add(" ") } - (project.name + testSuffix()).let { + (project.name + TEST_SUFFIX).let { add(" ") } @@ -91,10 +120,10 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { } private fun imlName(project: DependencyData.ProjectData) = - KFiles.joinDir(project.directory, project.name + ".iml") + Paths.get(KFiles.joinDir(project.directory, project.name + ".iml")).normalize().toString() private fun generateModulesXml(data: DependencyData.GetDependenciesData, outputDir: File) { - val modulesXmlFile = File(KFiles.joinDir(IDEA_DIR, outputDir.path, "modules.xml")) + val modulesXmlFile = File(KFiles.joinDir(IDEA_DIR.path, outputDir.path, "modules.xml")) with(arrayListOf()) { add("""""") add("""""") @@ -102,8 +131,7 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { add(" ") fun moduleLine(iml: String) - = " " + = " " add(moduleLine("kobalt/Build.kt.iml")) data.projects.forEach { @@ -117,13 +145,13 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { } } - private fun compileSuffix() = " (Compile)" - private fun testSuffix() = " (Test)" + private val COMPILE_SUFFIX = " (Compile)" + private val TEST_SUFFIX = " (Test)" private fun generateLibraries(data: DependencyData.GetDependenciesData, outputDir: File) { data.projects.forEach { - generateLibrary(it.name, it.compileDependencies, compileSuffix(), outputDir) - generateLibrary(it.name, it.testDependencies, testSuffix(), outputDir) + generateLibrary(it.name, it.compileDependencies, COMPILE_SUFFIX, outputDir) + generateLibrary(it.name, it.testDependencies, TEST_SUFFIX, outputDir) } val kobaltDd = DependencyData.DependencyData("kobalt", "compile", KFiles.joinDir(KFiles.distributionsDir, Kobalt.version, "kobalt", "wrapper", @@ -134,7 +162,7 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { private fun generateLibrary(name: String, compileDependencies: List, suffix: String, outputDir: File) { val libraryName = name + suffix - val librariesOutputDir = KFiles.makeDir(outputDir.path, "libraries") + val librariesOutputDir = KFiles.joinAndMakeDir(IDEA_DIR.path, outputDir.path, "libraries") with(arrayListOf()) { add("""""") add(""" """) @@ -145,7 +173,7 @@ class IdeaFilesTemplate @Inject constructor() : ITemplate { add("") val fileName = libraryName.replace(" ", "_").replace("-", "_").replace("(", "_").replace(")", "_") .replace(".", "_") - writeFile(this, File(KFiles.joinDir(IDEA_DIR, librariesOutputDir.path, fileName + ".xml"))) + writeFile(this, File(librariesOutputDir, fileName + ".xml")) } } diff --git a/src/main/resources/templates/idea/Build.kt.iml b/src/main/resources/templates/idea/Build.kt.iml new file mode 100644 index 00000000..08db0a21 --- /dev/null +++ b/src/main/resources/templates/idea/Build.kt.iml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/templates/idea/misc.xml b/src/main/resources/templates/idea/misc.xml new file mode 100644 index 00000000..7cd97580 --- /dev/null +++ b/src/main/resources/templates/idea/misc.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file