From bf1863db32f7a4f1133312df0d90d21b2e6b61c1 Mon Sep 17 00:00:00 2001 From: Cedric Beust Date: Tue, 12 Jul 2016 03:19:17 -0800 Subject: [PATCH] Fix the profile rebuild. Fixes https://github.com/cbeust/kobalt/issues/278 --- .../com/beust/kobalt/app/BuildFileCompiler.kt | 10 ++++- .../beust/kobalt/app/BuildScriptJarFile.kt | 39 +++++++++++++++++++ .../com/beust/kobalt/app/ParsedBuildFile.kt | 9 ++++- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/com/beust/kobalt/app/BuildScriptJarFile.kt diff --git a/src/main/kotlin/com/beust/kobalt/app/BuildFileCompiler.kt b/src/main/kotlin/com/beust/kobalt/app/BuildFileCompiler.kt index 540b0b1b..aac58c59 100644 --- a/src/main/kotlin/com/beust/kobalt/app/BuildFileCompiler.kt +++ b/src/main/kotlin/com/beust/kobalt/app/BuildFileCompiler.kt @@ -125,7 +125,9 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b // in this case, we won't recompile the build file. A potential solution for this would be // to have a side file that describes which profiles the current buildScript.jar was // compiled with. - if (args.profiles.isNullOrEmpty() && buildScriptUtil.isUpToDate(buildFile, buildScriptJarFile)) { + val bs = BuildScriptJarFile(buildScriptJarFile) + val same = bs.sameProfiles(args.profiles) + if (same && buildScriptUtil.isUpToDate(buildFile, buildScriptJarFile)) { log(2, " Build file is up to date") return TaskResult() } else { @@ -141,6 +143,12 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b output = buildScriptJarFile }.compile(context = context) + + // + // Generate the file that contains the list of active profiles for this build file + // + BuildScriptJarFile(buildScriptJarFile).saveProfiles(args.profiles) + return result } } diff --git a/src/main/kotlin/com/beust/kobalt/app/BuildScriptJarFile.kt b/src/main/kotlin/com/beust/kobalt/app/BuildScriptJarFile.kt new file mode 100644 index 00000000..bc446874 --- /dev/null +++ b/src/main/kotlin/com/beust/kobalt/app/BuildScriptJarFile.kt @@ -0,0 +1,39 @@ +package com.beust.kobalt.app + +import java.io.File +import java.io.FileWriter + +class BuildScriptJarFile(val jarFile: File) { + val file = File(jarFile.parent, "profiles") + + fun saveProfiles(profiles: String?) { + if (profiles != null) { + FileWriter(file).use { + it.write(profiles.split(",").sorted().joinToString(" ")) + } + } else { + file.delete() + } + } + + /** + * @{profiles} is a comma-separated list of profiles, or null + */ + fun sameProfiles(profiles: String?) : Boolean { + if (! file.exists()) { + return profiles == null + } else { + val fileContent = file.readText().trim() + if (fileContent.isEmpty() && profiles == null) { + return true + } else if (profiles != null) { + val savedProfiles = fileContent.split(" ").sorted() + val expected = profiles.split(",").sorted() + return savedProfiles == expected + } else { + return fileContent.isEmpty() + } + } + } +} + diff --git a/src/main/kotlin/com/beust/kobalt/app/ParsedBuildFile.kt b/src/main/kotlin/com/beust/kobalt/app/ParsedBuildFile.kt index c443b0c8..18ee36cb 100644 --- a/src/main/kotlin/com/beust/kobalt/app/ParsedBuildFile.kt +++ b/src/main/kotlin/com/beust/kobalt/app/ParsedBuildFile.kt @@ -26,6 +26,7 @@ class ParsedBuildFile(val buildFile: BuildFile, val context: KobaltContext, val val profileLines = arrayListOf() val pluginUrls = arrayListOf() val projects = arrayListOf() + val activeProfiles = arrayListOf() private val preBuildScript = arrayListOf( "import com.beust.kobalt.*", @@ -85,6 +86,7 @@ class ParsedBuildFile(val buildFile: BuildFile, val context: KobaltContext, val if (line.matches(Regex("[ \\t]*val[ \\t]+$it[ \\t]+=.*"))) { with("val $it = true") { log(2, "Activating profile $it in build file") + activeProfiles.add(it) profileLines.add(this) return this } @@ -138,13 +140,18 @@ class ParsedBuildFile(val buildFile: BuildFile, val context: KobaltContext, val private fun generateJarFile(context: KobaltContext, buildFile: BuildFile, buildScriptJarFile: File, originalFile: BuildFile) { + + // + // Compile the jar file + // val kotlintDeps = dependencyManager.calculateDependencies(null, context) val deps: List = kotlintDeps.map { it.jarFile.get().absolutePath } + val outputJar = File(buildScriptJarFile.absolutePath) val result = kotlinCompilePrivate { classpath(files.kobaltJar) classpath(deps) sourceFiles(buildFile.path.toFile().absolutePath) - output = File(buildScriptJarFile.absolutePath) + output = outputJar }.compile(context = context) if (! result.success) { throw KobaltException("Couldn't compile ${originalFile.realPath}:\n"