1
0
Fork 0
mirror of https://github.com/ethauvin/kobalt.git synced 2025-04-26 08:27:12 -07:00

Incremental manager work.

This commit is contained in:
Cedric Beust 2015-12-21 00:32:55 +04:00
parent a399df754a
commit cb1aaf6a75
2 changed files with 99 additions and 0 deletions

View file

@ -0,0 +1,68 @@
package com.beust.kobalt.internal
import com.beust.kobalt.misc.KFiles
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import java.io.File
import java.io.FileReader
import java.nio.charset.Charset
import java.nio.file.Files
import java.nio.file.Paths
import java.util.*
data class TaskInfo(val taskName: String, var inputChecksum: String? = null, var outputChecksum: String? = null)
class BuildInfo(var tasks: List<TaskInfo>)
/**
* Manage the file .kobalt/build-info.kt, which keeps track of input and output checksums to manage
* incremental builds.
*/
class IncrementalManager(val fileName: String = IncrementalManager.BUILD_INFO_FILE) {
companion object {
val BUILD_INFO_FILE = KFiles.joinDir(KFiles.KOBALT_DOT_DIR, "build-info.json")
}
private fun buildInfo() = File(fileName).let { file ->
if (file.exists()) {
Gson().fromJson(FileReader(file), BuildInfo::class.java) ?: BuildInfo(emptyList())
} else {
BuildInfo(emptyList())
}
}
private fun taskInfos() = hashMapOf<String, TaskInfo>().apply {
buildInfo().tasks.forEach {
put(it.taskName, it)
}
}
private fun save(map: Map<String, TaskInfo>) {
val bi = BuildInfo(map.values.toList())
val json = GsonBuilder().setPrettyPrinting().create().toJson(bi)
Files.write(Paths.get(fileName), json.toByteArray(Charset.defaultCharset()))
}
private fun taskInfoFor(taskInfos: HashMap<String, TaskInfo>, taskName: String)
= taskInfos.getOrPut(taskName, { -> TaskInfo(taskName) })
fun saveInputChecksum(taskName: String, inputChecksum: String) {
with(taskInfos()) {
taskInfoFor(this, taskName).inputChecksum = inputChecksum
save(this)
}
}
fun inputChecksumFor(taskName: String) : String? =
taskInfoFor(taskInfos(), taskName).inputChecksum
fun saveOutputChecksum(taskName: String, outputChecksum: String) {
with(taskInfos()) {
taskInfoFor(this, taskName).outputChecksum = outputChecksum
save(this)
}
}
fun outputChecksumFor(taskName: String) : String? =
taskInfoFor(taskInfos(), taskName).outputChecksum
}

View file

@ -0,0 +1,31 @@
package com.beust.kobalt.internal
import org.testng.Assert
import org.testng.annotations.Test
import java.io.File
@Test
class IncrementalManagerTest {
val TASK = "task"
val TASK2 = "task2"
fun shouldSave() {
val file = File.createTempFile("kobalt-", "")
println("File: $file")
val im = IncrementalManager(file.absolutePath)
val v = im.inputChecksumFor(TASK)
Assert.assertNull(v)
im.saveInputChecksum(TASK, "44")
Assert.assertEquals(im.inputChecksumFor(TASK), "44")
im.saveInputChecksum(TASK, "42")
Assert.assertEquals(im.inputChecksumFor(TASK), "42")
im.saveInputChecksum(TASK2, "45")
Assert.assertEquals(im.inputChecksumFor(TASK2), "45")
Assert.assertEquals(im.inputChecksumFor(TASK), "42")
im.saveOutputChecksum(TASK, "49")
Assert.assertEquals(im.outputChecksumFor(TASK), "49")
}
}