mirror of
https://github.com/ethauvin/kobalt.git
synced 2025-04-26 08:27:12 -07:00
Handle script jar files compiled by different versions gracefully.
This commit is contained in:
parent
cb0acdd352
commit
7a81b8169f
2 changed files with 34 additions and 21 deletions
|
@ -11,7 +11,6 @@ import com.beust.kobalt.kotlin.BuildFile
|
|||
import com.beust.kobalt.kotlin.BuildFileCompiler
|
||||
import com.beust.kobalt.maven.DepFactory
|
||||
import com.beust.kobalt.maven.Http
|
||||
import com.beust.kobalt.maven.KobaltException
|
||||
import com.beust.kobalt.maven.LocalRepo
|
||||
import com.beust.kobalt.misc.*
|
||||
import com.beust.kobalt.wrapper.Wrapper
|
||||
|
@ -145,25 +144,8 @@ private class Main @Inject constructor(
|
|||
if (! buildFile.exists()) {
|
||||
error(buildFile.path.toFile().path + " does not exist")
|
||||
} else {
|
||||
var allProjects = arrayListOf<Project>()
|
||||
try {
|
||||
allProjects.addAll(buildFileCompilerFactory.create(listOf(buildFile), pluginInfo)
|
||||
.compileBuildFiles(args))
|
||||
} catch(ex: KobaltException) {
|
||||
throw ex
|
||||
} catch(ex: Throwable) {
|
||||
ex.printStackTrace()
|
||||
// This can happen if the ABI for the build script file changed. Try to wipe .kobalt.
|
||||
log(2, "Couldn't parse preBuildScript.jar: ${ex.message}")
|
||||
if (! File(".kobalt").deleteRecursively()) {
|
||||
warn("Couldn't delete the .kobalt directory, please delete it manually and try again")
|
||||
return 1
|
||||
} else {
|
||||
log(1, "Deleted .kobalt")
|
||||
allProjects.addAll(buildFileCompilerFactory.create(listOf(buildFile), pluginInfo)
|
||||
.compileBuildFiles(args))
|
||||
}
|
||||
}
|
||||
val allProjects = buildFileCompilerFactory.create(listOf(buildFile), pluginInfo)
|
||||
.compileBuildFiles(args)
|
||||
|
||||
//
|
||||
// Now that we have projects, add all the repos from repo contributors that need a Project
|
||||
|
@ -171,6 +153,7 @@ private class Main @Inject constructor(
|
|||
allProjects.forEach { addReposFromContributors(it) }
|
||||
|
||||
log(2, "Final list of repos:\n " + Kobalt.repos.joinToString("\n "))
|
||||
|
||||
if (args.tasks) {
|
||||
//
|
||||
// List of tasks
|
||||
|
|
|
@ -26,6 +26,11 @@ import java.util.*
|
|||
import java.util.jar.JarInputStream
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* Manage the compilation of Build.kt. There are two passes for this processing:
|
||||
* 1) Extract the repos() and plugins() statements in a separate .kt and compile it into preBuildScript.jar.
|
||||
* 2) Actually build the whole Build.kt file after adding to the classpath whatever phase 1 found (plugins, repos)
|
||||
*/
|
||||
public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val buildFiles: List<BuildFile>,
|
||||
@Assisted val pluginInfo: PluginInfo, val files: KFiles, val plugins: Plugins,
|
||||
val jvmCompiler: JvmCompiler, val pluginProperties: PluginProperties) {
|
||||
|
@ -39,14 +44,20 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b
|
|||
private val SCRIPT_JAR = "buildScript.jar"
|
||||
|
||||
fun compileBuildFiles(args: Args): List<Project> {
|
||||
//
|
||||
// Create the KobaltContext
|
||||
//
|
||||
val context = KobaltContext(args)
|
||||
context.pluginInfo = pluginInfo
|
||||
context.pluginProperties = pluginProperties
|
||||
Kobalt.context = context
|
||||
|
||||
//
|
||||
// Find all the projects in the build file, possibly compiling them
|
||||
//
|
||||
val allProjects = findProjects(context)
|
||||
|
||||
plugins.applyPlugins(context, allProjects)
|
||||
|
||||
return allProjects
|
||||
}
|
||||
|
||||
|
@ -56,6 +67,15 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b
|
|||
val pluginUrls = findPlugInUrls(context, buildFile)
|
||||
val buildScriptJarFile = File(KFiles.findBuildScriptLocation(buildFile, SCRIPT_JAR))
|
||||
|
||||
// If the script jar files were generated by a different version, wipe them in case the API
|
||||
// changed in-between
|
||||
buildScriptJarFile.parentFile.let { dir ->
|
||||
if (! isSameVersionFile(dir)) {
|
||||
log(1, "Detected new installation, wiping $dir")
|
||||
dir.listFiles().map { it.delete() }
|
||||
}
|
||||
}
|
||||
|
||||
maybeCompileBuildFile(context, buildFile, buildScriptJarFile, pluginUrls)
|
||||
val buildScriptInfo = parseBuildScriptJarFile(buildScriptJarFile, pluginUrls)
|
||||
result.addAll(buildScriptInfo.projects)
|
||||
|
@ -127,6 +147,7 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b
|
|||
if (! isUpToDate(buildFile, File(buildScriptJar))) {
|
||||
buildScriptJarFile.parentFile.mkdirs()
|
||||
generateJarFile(context, BuildFile(Paths.get(pluginSourceFile.path), "Plugins"), buildScriptJarFile)
|
||||
generateVersionFile(buildScriptJarFile.parentFile)
|
||||
}
|
||||
|
||||
//
|
||||
|
@ -144,6 +165,15 @@ public class BuildFileCompiler @Inject constructor(@Assisted("buildFiles") val b
|
|||
return result
|
||||
}
|
||||
|
||||
private val VERSION_FILE = "version.txt"
|
||||
|
||||
private fun generateVersionFile(directory: File) {
|
||||
KFiles.saveFile(File(directory, VERSION_FILE), Kobalt.version)
|
||||
}
|
||||
|
||||
private fun isSameVersionFile(directory: File) =
|
||||
File(directory, VERSION_FILE).readText() == Kobalt.version
|
||||
|
||||
private fun generateJarFile(context: KobaltContext, buildFile: BuildFile, buildScriptJarFile: File) {
|
||||
val kotlintDeps = jvmCompiler.calculateDependencies(null, context, listOf<IClasspathDependency>())
|
||||
val deps: List<String> = kotlintDeps.map { it.jarFile.get().absolutePath }
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue