mirror of
https://github.com/ethauvin/kobalt.git
synced 2025-04-26 00:17:11 -07:00
Incremental manager work.
This commit is contained in:
parent
a399df754a
commit
cb1aaf6a75
2 changed files with 99 additions and 0 deletions
|
@ -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
|
||||
}
|
|
@ -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")
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue