File status tracking supported.

[?]
Mar 27, 2021, 4:35 PM
OPFG6CZ26PPTGTH7ULLRQGZGR3YEIEJOV5W2E3WN7PFRZS62CVLQC

Dependencies

  • [2] UERDG6LD Added more plugin files to Pijul
  • [3] FNNW5IEA Added more plugin files to Pijul

Change contents

  • edit in src/main/kotlin/com/github/jonathanxd/dracon/vfs/PijulVirtualFileStatusProvider.kt at line 3
    [3.194]
    [3.194]
    import com.github.jonathanxd.dracon.pijul.SuccessStatusCode
    import com.github.jonathanxd.dracon.pijul.pijul
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/vfs/PijulVirtualFileStatusProvider.kt at line 12
    [3.534][3.534:570]()
    TODO("Not yet implemented")
    [3.534]
    [3.570]
    val status = pijul(this.project).fileStatus(this.project, virtualFile)
    return if (status.statusCode is SuccessStatusCode) {
    status.result ?: FileStatus.UNKNOWN
    } else {
    FileStatus.UNKNOWN
    }
  • file deletion: PijulDiffJson.kt (----------)
    [3.3420][2.0:18](),[2.18][2.19:19]()
    package com.github.jonathanxd.dracon.pijul
    object PijulDiffJson {
    fun parseJson() {
    }
    }
  • file addition: diff (d--r------)
    [3.3420]
  • file addition: PijulDiffJson.kt (----------)
    [0.364]
    package com.github.jonathanxd.dracon.pijul.diff
    import com.google.gson.GsonBuilder
    import com.google.gson.annotations.SerializedName
    import com.intellij.openapi.vcs.FileStatus
    import kotlinx.coroutines.flow.Flow
    import kotlinx.coroutines.flow.map
    import kotlin.reflect.javaType
    import kotlin.reflect.typeOf
    object PijulDiffJson {
    val GSON = GsonBuilder().disableHtmlEscaping().create()
    // TODO: Use Kotlin Flow and Flow-based Json reading
    @OptIn(ExperimentalStdlibApi::class)
    fun parseJson(json: String): List<ChangeEntry> =
    GSON.fromJson<Map<String, List<ChangeData>>>(json, typeOf<Map<String, List<ChangeData>>>().javaType).entries.map {
    ChangeEntry(it.key, it.value)
    }
    }
    fun List<ChangeEntry>.toFileStatusMap(): Map<String, List<FileStatus>> =
    this.associateBy { it.path }.mapValues {
    it.value.data.map { it.toFileStatus() }
    }
    fun ChangeData.toFileStatus(): FileStatus =
    when (this.operation) {
    "replacement", "edit" -> FileStatus.MODIFIED
    "file move" -> FileStatus.ADDED
    "file del" -> FileStatus.DELETED
    "file undel" -> FileStatus.ADDED
    "file add" -> FileStatus.ADDED
    // "solve name conflict" -> ?
    // "unsolve name conflict" -> ?
    // "solve order conflict" -> ?
    // "unsolve order conflict" -> ?
    // "resurrect zombies" -> ????????????????????
    else -> FileStatus.UNKNOWN
    }
    data class ChangeEntry(val path: String, val data: List<ChangeData>)
    data class ChangeData(@SerializedName("operation") val operation: String, @SerializedName("line") val line: Any?)
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/pijul/Pijul.kt at line 39
    [3.6022][3.6022:6028]()
    }
    [3.6022]
    [3.6028]
    fun findPijulDirectory(root: VirtualFile): VirtualFile? =
    findPijulDirectory(Paths.get(VcsUtil.getFilePath(root).path))
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/pijul/Pijul.kt at line 43
    [3.6029][3.6029:6158]()
    fun findPijulDirectory(root: VirtualFile): VirtualFile? {
    var dir: Path? = Paths.get(VcsUtil.getFilePath(root).path)
    [3.6029]
    [3.6158]
    fun findPijulDirectory(root: Path): VirtualFile? {
    var dir: Path? = root
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/pijul/Pijul.kt at line 46
    [3.6159][3.6159:6307]()
    while (dir != null) {
    if (isPijulRepository(dir)) {
    return LocalFileSystem.getInstance().findFileByNioFile(dir)
    [3.6159]
    [3.6307]
    while (dir != null) {
    if (isPijulRepository(dir)) {
    return LocalFileSystem.getInstance().findFileByNioFile(dir)
    }
    dir = dir.parent
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/pijul/Pijul.kt at line 52
    [3.6321][3.6321:6350]()
    dir = dir.parent
    [3.6321]
    [3.6350]
    return null
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/pijul/Pijul.kt at line 56
    [3.6361][3.6361:6387]()
    return null
    }
    [3.6361]
    [3.6387]
    fun isUnderPijul(root: VirtualFile): Boolean = findPijulDirectory(root) != null
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/pijul/Pijul.kt at line 58
    [3.6388][3.6388:6477]()
    fun isUnderPijul(root: VirtualFile): Boolean = this.findPijulDirectory(root) != null
    [3.6388]
    [3.6477]
    fun isUnderPijul(root: Path): Boolean = findPijulDirectory(root) != null
    }
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 5
    [3.11119]
    [3.11119]
    import com.github.jonathanxd.dracon.pijul.diff.PijulDiffJson
    import com.github.jonathanxd.dracon.pijul.diff.toFileStatusMap
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 11
    [3.11347][3.11347:11394]()
    import com.intellij.openapi.components.Service
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 14
    [3.11522]
    [3.11522]
    import com.intellij.openapi.vcs.ProjectLevelVcsManager
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 27
    [3.11957]
    [3.11957]
    import kotlin.io.path.ExperimentalPathApi
    import kotlin.io.path.relativeTo
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 71
    [3.13472]
    [3.13472]
    @OptIn(ExperimentalPathApi::class)
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 74
    [3.13603]
    [3.13603]
    val root = ProjectLevelVcsManager.getInstance(project).getVcsRootFor(file)
    ?: return PijulOperationResult("file_status", SuccessStatusCode, FileStatus.UNKNOWN)
    val rootPath = Paths.get(VcsUtil.getFilePath(root).path)
    val execution = this.execPijul(project, rootPath, listOf("diff", "--json"), delay = 10L)
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 80
    [3.13604]
    [3.13604]
    return this.doExecutionWithMapper("file_status", execution) {
    val changes = PijulDiffJson.parseJson(it)
    val changeMap = changes.toFileStatusMap()
    val fPath = Paths.get(VcsUtil.getFilePath(file.path).path).relativeTo(rootPath).toString()
    if (fPath.isEmpty()) {
    FileStatus.SUPPRESSED
    } else {
    changeMap[fPath]?.firstOrNull()
    }
    }
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 105
    [3.14133]
    [3.14133]
    }
    }
    fun <T> doExecutionWithMapper(name: String,
    execution: PijulExecution,
    regularStreamStringMapper: (String) -> T?): PijulOperationResult<T> {
    val status = runBlocking(Dispatchers.IO) {
    execution.status.first()
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 114
    [3.14143]
    [3.14143]
    return if (status == 0) {
    val std = runBlocking(Dispatchers.IO) {
    execution.regularStream.toList().joinToString("\n")
    }
    PijulOperationResult(name, SuccessStatusCode, regularStreamStringMapper(std))
    } else {
    val error = runBlocking(Dispatchers.IO) {
    execution.errorStream.toList().joinToString("\n")
    }
    PijulOperationResult(name, NonZeroExitStatusCode(status, error), Unit) as PijulOperationResult<T>
    }
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 138
    [3.14394][3.14394:14458]()
    args: List<String>): PijulExecution {
    [3.14394]
    [3.14458]
    args: List<String>,
    delay: Long = 1000L): PijulExecution {
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/cmd/PijulCmd.kt at line 157
    [3.15048][3.15048:15081]()
    delay(1000L)
    [3.15048]
    [3.15081]
    delay(delay)
  • edit in src/main/kotlin/com/github/jonathanxd/dracon/actions/PijulInit.kt at line 5
    [3.18767]
    [3.18767]
    import com.github.jonathanxd.dracon.pijul.Pijul
  • replacement in src/main/kotlin/com/github/jonathanxd/dracon/actions/PijulInit.kt at line 37
    [3.20331][3.20331:20384]()
    if (pijul(project).isUnderPijul(root)) {
    [3.20331]
    [3.20384]
    if (Pijul.isUnderPijul(root)) {