Improvements, a lot
[?]
Apr 10, 2021, 9:46 PM
RE4EKNSLYGCITZZEOPIRJAWTKIONGP7IY6S77BQO7JQL2CK27RZACDependencies
- [2]
OMZXJL6QReady for pijul push! First nightly build will be released shortly! - [3]
2N67RQZCAdd auto installation support and cache content of ContentRevision - [4]
5AUENX2YAdd support to view files affected by a revision - [5]
FNNW5IEAAdded more plugin files to Pijul - [6]
QXUEMZ3BInitial CahngeProvider - [7]
ZCRW57C5Improved support for revisions - [8]
FRFFQV7VBasic show history support. - [9]
6CR2EFUNFirst ChangeProvider implementation!!! Wheehooo - [10]
Q7FXTHVUFirst record support, YEAAAH, RECOOORD - [11]
Q35OTML2Remove use of coroutines, which was blocking IntelliJ UI in larger repositories Improvements for bigger repositories, now Dracon caches the changes that happened in a revision in a file, so everytime Dracon needs to query the changes of a revision, it loads directly from memory instead of doing a full-scan in Pijul repository. For tiny projects it is not a problem, but for medium ones it takes more than five minutes to scan the entire repository (and it was tested with a repo of only 700 records, however there was changes that had more than 60.000 lines). The cache file is saved in IntelliJ Data Path (project specific) and is compressed with gzip, so it will not use so much disk space (the cost worths the gains). - [12]
ISO7J5ZHMore caches, better and generic cache code. Now Dracon listen to file changes to drop cached data. Implemented caches: - File contents in specific revision (never dropped) - Pijul ls and Pijul diff results - File Revision and File changes by patch - some others.. Dracon is incredible fast now, but still will take some time for bigger repos. - [13]
37OJKSWJImproved caching code a lot - [14]
A7IL6I3VMore files to support .ignore - [15]
NTRPUMVQImproved README and added roadmap. - [16]
GGYFPXNDInitial plugin - [17]
OPFG6CZ2File status tracking supported. - [18]
B43WNBLF- Add Show History to Pijul menu - Always ignore .idea and .pijul in tracking. - Make findPijul a generic function to allow to find editor-server. - Only show one revision for directories. - Add `Hunk::resolvePath(Path)` to resolve the affected file to a Java NIO Path. - Fix StringOutOfBounds in Change Parsering Algorithm - Use editor-server instead of copie for interfacing with `pijul record` file. - Fix FileStatus provider not returning correctly for untracked files. - Add CommittedChangesProvider for Pijul. - [19]
MTPTFTHGInitial plugin 2
Change contents
- edit in src/main/resources/messages/DraconBundle.properties at line 81
index.check.text=Checking revisions...index.load.rev.for.text=Loading revision <tt>{0}</tt> for file <tt>{1}</tt>index.check.rev.text=Checking revision <tt>{0}</tt>... - edit in src/main/resources/messages/DraconBundle.properties at line 88
index.copy.text=Copying files... - edit in src/main/resources/META-INF/plugin.xml at line 52
<projectCloseHandler implementation="com.github.jonathanxd.dracon.handler.DraconCloseHandler" /> - edit in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 11
import org.apache.commons.codec.digest.DigestUtils - edit in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 16
import java.security.MessageDigest - edit in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 19
import kotlin.io.path.exists - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 98
val tempDir = FileUtilRt.createTempDirectory("dracon_diffs-all-", revisionHash + UUID.randomUUID().toString())val sha1 = DigestUtils.sha1Hex(revisionHash)val tempDir = FileUtilRt.createTempDirectory("dracon_diffs-all-", sha1) - edit in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 103
if (Files.exists(tmpTarget.resolve(".pijul"))) {val ls = pijul(project).trackedFiles(project, tmpTarget)if (ls.statusCode !is SuccessStatusCode) {throw IllegalStateException("Failed to load state of all files in revision $revisionHash during reset. $ls")}i.fraction += 0.0001val trackedFiles = ls.result!!trackedFiles.forEachWithProgress(i) { it, indic ->indic.text2 = DraconBundle.message("index.item.description.text", it.toString())if (Files.isRegularFile(it)) {pathToRevisionState[it] = Files.readAllBytes(it)}}return pathToRevisionState} - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 155
throw IllegalStateException("Failed to load state of all files in revision $revisionHash during reset. $revisions")throw IllegalStateException("Failed to load state of all files in revision $revisionHash during reset. $ls") - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 175
FileUtilRt.delete(tempDir)//FileUtilRt.delete(tempDir) - edit in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 180
fun loadStateInRevisionForAllFilesForFile(revisionHash: String,project: Project,root: Path,file: Path): ByteArray {val sha1 = DigestUtils.sha1Hex(revisionHash)val tempDir = FileUtilRt.createTempDirectory("dracon_diffs-all-", sha1)val tmpTarget = tempDir.toPath()if (Files.exists(tmpTarget.resolve(".pijul"))) {val relativeToRoot = file.relativeTo(root)val relativeToTmpTarget = tmpTarget.resolve(relativeToRoot)if (Files.exists(relativeToTmpTarget)) {return Files.readAllBytes(relativeToTmpTarget)}}copyFolder(root, tmpTarget, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING)val revisions = pijul(project).latestRevisionNumber(project, tmpTarget).resultval reset = pijul(project).reset(project, tmpTarget)if (reset.statusCode !is SuccessStatusCode) {throw IllegalStateException("Failed to load state of all files in revision $revisionHash during reset. $revisions")}if (revisions == null || revisions.hash != revisionHash) {val rollbackOp = pijul(project).rollbackTo(revisionHash, project, tmpTarget)if (rollbackOp.statusCode !is SuccessStatusCode) {throw IllegalStateException("Failed to load state of all files in revision $revisionHash during unrecord. $rollbackOp")}}try {val relativeToRoot = file.relativeTo(root)val relativeToTmpTarget = tmpTarget.resolve(relativeToRoot)return if (Files.exists(relativeToTmpTarget)) {Files.readAllBytes(relativeToTmpTarget)} else {ByteArray(0)}} finally {//FileUtilRt.delete(tempDir)}}@OptIn(ExperimentalPathApi::class) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 238
val tempDir = FileUtilRt.createTempDirectory("dracon_diffs-all-","${allRevisions.size}-" + UUID.randomUUID().toString())val sha1 = DigestUtils.sha1Hex(allRevisions.toString())val tempDir = FileUtilRt.createTempDirectory("dracon_diffs-all-", sha1) - edit in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 241
- replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 258
if (indexOfFirstRevision + allRevisions.size >= pijulRevisions.size) {if (indexOfFirstRevision + allRevisions.size > pijulRevisions.size) { - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 274
throw IllegalStateException("Failed to load state of all files in revisions '$allRevisions' during reset. $reset")IllegalStateException("Failed to load state of all files in revisions '$allRevisions' during reset. $reset").printStackTrace()return revisionToPathToState - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 323
FileUtilRt.delete(tempDir)//FileUtilRt.delete(tempDir)}}@OptIn(ExperimentalPathApi::class)fun loadFileStateInRevision(revision: String,project: Project,root: Path,cachePath: Path,file: Path,i: ProgressIndicator,cacheAllRevisions: Boolean = true): FileStateInCache {val dir = resolveDirForRevision(cachePath, revision, createIfNotExists = false)val fileRelativeToRoot = file.relativeTo(root)if (!Files.exists(dir)) {val allRevisions = pijul(project).allRevisions(project, root).result!!.map { it.hash }val revisions = if (allRevisions[0] == revision) {listOf(revision)} else {allRevisions.subList(0, allRevisions.indexOf(revision) + 1)}val cacheMap = createCacheForRevisionFromTo(revisions,project,root,cachePath,i,cacheAllRevisions)if (!cacheMap.containsKey(revision)) {throw IllegalStateException("Failed to load state of all files in revision $revision")}}val fileInCache = dir.resolve(fileRelativeToRoot)return if (Files.exists(fileInCache) && Files.isRegularFile(fileInCache)) {FileStateInCache(file, fileInCache, false, Files.readAllBytes(fileInCache))} else {FileStateInCache(file, fileInCache, true, ByteArray(0))}}data class FileStateInCache(val originalPath: Path,val pathInCache: Path,val deleted: Boolean,val content: ByteArray) {override fun equals(other: Any?): Boolean {if (this === other) return trueif (javaClass != other?.javaClass) return falseother as FileStateInCacheif (originalPath != other.originalPath) return falseif (pathInCache != other.pathInCache) return falseif (deleted != other.deleted) return falseif (!content.contentEquals(other.content)) return falsereturn true}override fun hashCode(): Int {var result = originalPath.hashCode()result = 31 * result + pathInCache.hashCode()result = 31 * result + deleted.hashCode()result = 31 * result + content.contentHashCode()return result}}fun resolveDirForRevision(cachePath: Path, revision: String, createIfNotExists: Boolean = true): Path {val path = cachePath.resolve(revision)if (createIfNotExists)Files.createDirectories(path)return path}@OptIn(ExperimentalPathApi::class)fun createCacheForRevisionFromTo(allRevisions: List<String>,project: Project,root: Path,cachePath: Path,i: ProgressIndicator,cacheAllRevisions: Boolean = true): Map<String, Path> {if (allRevisions.isEmpty()) {throw IllegalArgumentException("Provided 'allRevisions' argument must not be empty.")}val revisionsToCache = allRevisions.toMutableList()i.text2 = DraconBundle.message("index.check.text")val revisionToPath = mutableMapOf<String, Path>()var lastFoundCachedRevisionPath: Path? = nullvar lastFoundCachedRevision: String? = nullfor (rev in allRevisions) {i.text2 = DraconBundle.message("index.check.rev.text", rev)val path = resolveDirForRevision(cachePath, rev, createIfNotExists = false)if (path.exists()) {revisionsToCache.remove(rev)lastFoundCachedRevisionPath = pathlastFoundCachedRevision = revrevisionToPath["rev"] = path}}i.text2 = DraconBundle.message("index.item.description.finish.text")if (revisionsToCache.isEmpty()) {return revisionToPath}if (!cacheAllRevisions) {val last = revisionsToCache.last()revisionsToCache.clear()revisionsToCache.add(last)}val temporaryWorkingDirectory = cachePath.resolve(".tmp-work-dir-" + UUID.randomUUID().toString())Files.createDirectories(temporaryWorkingDirectory)if (lastFoundCachedRevision != null && lastFoundCachedRevisionPath != null) {// Copies last found revision into temporaryWorkingDirectory// This prevents from rolling back from revisions that are already cached.copyFolder(lastFoundCachedRevisionPath, temporaryWorkingDirectory)} else {// Copy current .pijul working dir into temporaryWorkingDirectorycopyFolder(root, temporaryWorkingDirectory)}val revisions = pijul(project).allRevisions(project, temporaryWorkingDirectory)if (revisions.statusCode !is SuccessStatusCode) {throw IllegalStateException("Failed to load state of all files in revisions '$revisionsToCache' during all revisions hash retrieval. $revisions")}val pijulRevisions = revisions.result!!.map { it.hash }val indexOfFirstRevision = pijulRevisions.indexOf(revisionsToCache[0])if (indexOfFirstRevision == -1) {throw IllegalArgumentException("Could not find revision ${revisionsToCache[0]} in Pijul repository!")} else {if (indexOfFirstRevision + revisionsToCache.size > pijulRevisions.size) {throw IllegalArgumentException("There are more revisions to unrecord than the amount of recorded changes in Pijul Repository.")} else {val revisionSubList = pijulRevisions.subList(indexOfFirstRevision, indexOfFirstRevision + revisionsToCache.size)if (revisionsToCache != revisionSubList) {throw IllegalArgumentException("Revisions to load must sequentially match a sub sequence of revisions in Pijul repository. " +"Changes found in pijul: $revisionSubList. Changes to unrecord: $revisionsToCache")}}}i.text2 = DraconBundle.message("index.reset.text")val reset = pijul(project).reset(project, temporaryWorkingDirectory)if (reset.statusCode !is SuccessStatusCode) {IllegalStateException("Failed to load state of all files in revisions '$revisionsToCache' during reset. $reset").printStackTrace()return revisionToPath}i.fraction += 0.0001revisionsToCache.withIndex().toList().forEachWithProgress(i) { (index, rev), indicator ->indicator.text2 = DraconBundle.message("index.revision.description.text", rev)val resolvedPathForRevision = resolveDirForRevision(cachePath, rev, createIfNotExists = false)if (Files.exists(resolvedPathForRevision)) {deleteFilesInsideDirectory(temporaryWorkingDirectory)copyFolder(resolvedPathForRevision, temporaryWorkingDirectory)} else {val rollback = pijul(project).rollbackTo(rev, project, temporaryWorkingDirectory)if (rollback.statusCode !is SuccessStatusCode) {throw IllegalStateException("Failed to load state of all files in revision '$rev' during rollback. $rollback")}/*if (index == 0) {} else {val unrecord = pijul(project).unrecord(project, temporaryWorkingDirectory, revisionsToCache[index - 1])if (unrecord.statusCode !is SuccessStatusCode) {throw IllegalStateException("Failed to load state of all files in revision '$rev' during unrecord. $unrecord")}}*/indicator.text2 = DraconBundle.message("index.copy.text")copyFolder(temporaryWorkingDirectory, resolvedPathForRevision)}revisionToPath[rev] = resolvedPathForRevision}i.text2 = DraconBundle.message("index.item.description.finish.text")try {return revisionToPath} finally {FileUtilRt.delete(temporaryWorkingDirectory.toFile()) - edit in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 539
val copyOptions = arrayOf(*options, StandardCopyOption.COPY_ATTRIBUTES, StandardCopyOption.REPLACE_EXISTING) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/RevisionContentResolver.kt at line 552
Files.copy(file, target.resolve(source.relativize(file)), *options)Files.copy(file, target.resolve(source.relativize(file)), *copyOptions)return FileVisitResult.CONTINUE}})}fun deleteFilesInsideDirectory(path: Path) {Files.walkFileTree(path, object : SimpleFileVisitor<Path>() {override fun preVisitDirectory(dir: Path, attrs: BasicFileAttributes): FileVisitResult {return if (dir != path) FileVisitResult.CONTINUEelse FileVisitResult.SKIP_SUBTREE}override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult {Files.delete(file) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/revision/PijulVcsFileRevision.kt at line 39
private val content = this.project.service<FileRevisionCache>().loadAsync(this)private val content by lazy {this.project.service<FileRevisionCache>().loadAsync(this)} - file move: push → push
- replacement in src/main/kotlin/com/github/jonathanxd/dracon/push/PijulOutgoingChangesProvider.kt at line 58
pijul(project).changes(project, ctx.root, it, -1, {pijul(project).changes(project, ctx.root, it, 1, { - edit in src/main/kotlin/com/github/jonathanxd/dracon/provider/PijulHistoryProvider.kt at line 30
import kotlin.io.path.isDirectory - replacement in src/main/kotlin/com/github/jonathanxd/dracon/provider/PijulHistoryProvider.kt at line 141
}.forEach { path, hunks ->}.filter { pathToView.isDirectory() || it.key == pathToView }.forEach { path, hunks -> - file deletion: PijulHash.kt
package com.github.jonathanxd.dracon.logimport com.intellij.vcs.log.Hashclass PijulHash(val hash: String) : Hash {override fun asString(): String = this.hashoverride fun toShortString(): String = this.hash.substring(0, 10)} - file addition: PijulHash.kt[3.6847]
package com.github.jonathanxd.dracon.logimport com.intellij.vcs.log.Hashclass PijulHash(val hash: String) : Hash {override fun asString(): String = this.hashoverride fun toShortString(): String = this.hash.substring(0, 10)} - file addition: handler[3.107]
- file addition: DraconCloseHandler.kt[0.12858]
package com.github.jonathanxd.dracon.handlerimport com.github.jonathanxd.dracon.cache.FileRevisionCacheimport com.intellij.openapi.components.serviceIfCreatedimport com.intellij.openapi.project.Projectimport com.intellij.openapi.project.ProjectCloseHandlerclass DraconCloseHandler: ProjectCloseHandler {override fun canClose(project: Project): Boolean {val fileRevisionCache = project.serviceIfCreated<FileRevisionCache>()fileRevisionCache?.invalidate()return true}} - replacement in src/main/kotlin/com/github/jonathanxd/dracon/content/PijulContentRevision.kt at line 31
private val content = this.project.service<FileRevisionCache>().loadAsync(this)private val content by lazy {this.project.service<FileRevisionCache>().loadAsync(this)} - edit in src/main/kotlin/com/github/jonathanxd/dracon/config/PijulSettings.kt at line 21
fun isToCacheAllRevisions(): Boolean =this.state.cacheAllRevisions - edit in src/main/kotlin/com/github/jonathanxd/dracon/config/PijulSettings.kt at line 41
@get:OptionTag("CACHE_ALL_REVISIONS")var cacheAllRevisions by property(defaultValue = true) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 123
val execution = this.createPainlessExecPijulOperation(project, rootPath, listOf("diff", "--json"))val execution = this.createPainlessExecPijulOperation(project, rootPath, listOf("diff", "--json"), logOutput = false) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 172
val execution = this.createPainlessExecPijulOperation(project, root, listOf("diff", "--json"))val execution = this.createPainlessExecPijulOperation(project, root, listOf("diff", "--json"), logOutput = false) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 245
val execution = this.createPainlessExecPijulOperation(project, root, listOf("diff", "--json"))val execution = this.createPainlessExecPijulOperation(project, root, listOf("diff", "--json"), logOutput = false) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 706
}?.map { entry ->}?.asSequence()?.map { entry -> - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 980
args: List<String>args: List<String>,logOutput: Boolean = true, - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 991
input.split("\n").forEach {draconConsoleWriter(project).logCommand("pijul", args, it)if (logOutput) {if (input.trim().isNotEmpty()) {input.split("\n").forEach {draconConsoleWriter(project).logCommand("pijul", args, it)}} - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 999
error.split("\n").forEach {draconConsoleWriter(project).logCommandError("pijul", args, it)if (error.trim().isNotEmpty()) {error.split("\n").forEach {draconConsoleWriter(project).logCommandError("pijul", args, it)} - edit in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 3
import com.github.jonathanxd.dracon.config.PijulSettings - edit in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 9
import com.github.jonathanxd.iutils.`object`.Lazyimport com.intellij.execution.Executor - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 13
import com.intellij.openapi.progress.EmptyProgressIndicatorimport com.intellij.openapi.progress.ProgressIndicatorimport com.intellij.openapi.progress.forEachWithProgressimport com.intellij.openapi.progress.withPushPopimport com.intellij.openapi.progress.* - edit in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 15
import com.intellij.openapi.project.getProjectDataPathimport com.intellij.openapi.util.ThrowableComputable - edit in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 18
import java.nio.file.Files - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 23
class FileRevisionCache(val project: Project) : CacheService<FileRevisionRef, ByteArray> {override val cache = DataCache<FileRevisionRef, ByteArray>(this.project, "file_revision")class FileRevisionCache(val project: Project) {//override val cache = DataCache<String, Map<String, ByteArray>>(this.project, "path_revision")fun cachePath(): Path =this.project.getProjectDataPath("com.github.jonathanxd.dracon").resolve("revision-cache") - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 37
val fileRev = FileRevisionRef(file.filePathAsString(), rev.hash)val cache = this.cachePath() - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 39[3.21078]→[2.50049:50235](∅→∅),[2.50235]→[3.21230:21252](∅→∅),[3.21230]→[3.21230:21252](∅→∅),[3.21252]→[2.50236:50291](∅→∅)
return this.cache.queryOrLoadAsyncExpanded(fileRev) {val revisions = loadStateInEveryRevisionForAllFiles(listOf(rev.hash),project,root,EmptyProgressIndicator())Files.createDirectories(cache)val completableFuture = CompletableFuture<ByteArray>() - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 43
val revisionsForHash = revisions[rev.hash]!!val stringKeys = revisionsForHash.mapKeys { (k, _) -> k.filePathAsString() }stringKeys[it.filePath]!! to stringKeys.map { (k, v) -> FileRevisionRef(k, rev.hash) to v }ProgressManager.getInstance().run(object : Task.Backgroundable(project,DraconBundle.message("index.load.rev.for.text", rev.hash.substring(0, 10), file.fileName.toString()),true) {override fun run(indicator: ProgressIndicator) {indicator.isIndeterminate = falsetry {val revision = loadFileStateInRevision(rev.hash,project,root,cache,file,indicator,project.service<PijulSettings>().isToCacheAllRevisions())completableFuture.complete(revision.content)} catch (t: Throwable) {t.printStackTrace()completableFuture.completeExceptionally(t)}}})return completableFuture.handle { t, u ->u?.printStackTrace()t ?: ByteArray(0) - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 76
fun loadAndPrecacheRevisions(amount: Int, i: ProgressIndicator) {fun invalidate() {deleteFilesInsideDirectory(this.cachePath())}/*fun loadAndPrecacheRevisions(amount: Int, i: ProgressIndicator) { - edit in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 100
- replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 103
stateMap.entries.forEachWithProgress(indic) { (path, bytes), indicator2 ->indicator2.text2 =DraconBundle.message("index.revision.file.description.text", path.toString(), rev)val revRef = FileRevisionRef(path.filePathAsString(), rev)this.cache.updateCache(revRef) {bytes}this.cache.updateCache(rev) {stateMap.mapKeys { (k, _) -> k.filePathAsString() } - edit in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 106
- edit in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 109
- replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/FileRevisionCache.kt at line 114[3.3409]→[3.3409:3415](∅→∅),[3.3415]→[3.21339:21421](∅→∅),[3.21339]→[3.21339:21421](∅→∅),[3.21421]→[3.32580:32596](∅→∅)
}}data class FileRevisionRef(val filePath: String,val revision: String) : Serializable[3.3347]}*/} - replacement in src/main/kotlin/com/github/jonathanxd/dracon/cache/DataCache.kt at line 32
private val updateExecutor = Executors.newWorkStealingPool(16)private val updateExecutor = Executors.newSingleThreadExecutor() - replacement in src/main/kotlin/com/github/jonathanxd/dracon/activity/PijulIndexActivity.kt at line 18
fileRevisionCache.loadAndPrecacheRevisions(PRE_INDEX_REVISION_AMOUNT, indicator)//fileRevisionCache.loadAndPrecacheRevisions(PRE_INDEX_REVISION_AMOUNT, indicator) - replacement in gradle.properties at line 14
platformVersion = LATEST-EAP-SNAPSHOTplatformVersion = 211.6693.111 - replacement in build.gradle.kts at line 120
File("./README.md").readText().lines().run {projectDir.resolve("README.md").readText().lines().run {