commit ba570446954968ad7b2feb330d7b6371087d413b from: ale date: Thu Jul 23 19:55:02 2026 UTC Fase 3: GotDiffProvider para el gutter de líneas y Show Diff GotRevisionNumber envuelve el hash del commit base ('got info'). Nuevo GotDiffProvider resuelve la raíz VCS y ruta relativa de un archivo vía ProjectLevelVcsManager, y usa GotContentRevision (got cat -c :base) como contenido de referencia para el line-status-tracker y las acciones de diff nativas. GotContentRevision ahora reporta el hash real en vez de VcsRevisionNumber.NULL. Por ahora solo compara contra el commit base del work tree; comparar contra revisiones históricas queda para la Fase 5 (historial). commit - 201cc4e4a6b34d9ad7518c89b4cbe0d4a7a8907a commit + ba570446954968ad7b2feb330d7b6371087d413b blob - ac1cc93524bbae9807b2bb24fc2210a6b8af6352 blob + 3c6290cecb06079e14f45563523a392484d336b2 --- src/main/kotlin/dev/nezzontli/gotvcs/GotCommandLineWrapper.kt +++ src/main/kotlin/dev/nezzontli/gotvcs/GotCommandLineWrapper.kt @@ -55,4 +55,12 @@ class GotCommandLineWrapper { @Throws(VcsException::class) fun catAtBase(workDir: File, relativePath: String): String = run(workDir, "cat", "-c", ":base", "-P", relativePath) + + @Throws(VcsException::class) + fun baseCommit(workDir: File): String { + val output = run(workDir, "info") + val line = output.lineSequence().firstOrNull { it.trimStart().startsWith("work tree base commit:") } + ?: throw VcsException("got info no reportó un commit base para $workDir") + return line.substringAfter("work tree base commit:").trim() + } } blob - 71fc5d1ce6d080d0810c34ed9caf00cac683e449 blob + 2b11afcff5ba20367d7e32ba7829e39a6fc8cb26 --- src/main/kotlin/dev/nezzontli/gotvcs/GotContentRevision.kt +++ src/main/kotlin/dev/nezzontli/gotvcs/GotContentRevision.kt @@ -19,5 +19,9 @@ class GotContentRevision( override fun getFile(): FilePath = filePath - override fun getRevisionNumber(): VcsRevisionNumber = VcsRevisionNumber.NULL + override fun getRevisionNumber(): VcsRevisionNumber = try { + GotRevisionNumber(commandLine.baseCommit(workDir)) + } catch (e: VcsException) { + VcsRevisionNumber.NULL + } } blob - b5a39a068886b33c37f6f1679ea1a6aac2223b8b blob + c7ec1298940b9e9368ea674e3d1b32b8ecdd8718 --- src/main/kotlin/dev/nezzontli/gotvcs/GotVcs.kt +++ src/main/kotlin/dev/nezzontli/gotvcs/GotVcs.kt @@ -4,16 +4,20 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.vcs.AbstractVcs import com.intellij.openapi.vcs.VcsKey import com.intellij.openapi.vcs.changes.ChangeProvider +import com.intellij.openapi.vcs.diff.DiffProvider class GotVcs(project: Project) : AbstractVcs(project, NAME) { private val commandLine = GotCommandLineWrapper() private val changeProvider = GotChangeProvider(commandLine) + private val diffProvider = GotDiffProvider(project, commandLine) override fun getDisplayName(): String = NAME override fun getChangeProvider(): ChangeProvider = changeProvider + override fun getDiffProvider(): DiffProvider = diffProvider + companion object { const val NAME = "got" blob - /dev/null blob + 2e993f11cd12946885696846731a01e0c625bf13 (mode 644) --- /dev/null +++ src/main/kotlin/dev/nezzontli/gotvcs/GotDiffProvider.kt @@ -0,0 +1,63 @@ +package dev.nezzontli.gotvcs + +import com.intellij.openapi.project.Project +import com.intellij.openapi.vcs.FilePath +import com.intellij.openapi.vcs.ProjectLevelVcsManager +import com.intellij.openapi.vcs.VcsException +import com.intellij.openapi.vcs.changes.ContentRevision +import com.intellij.openapi.vcs.diff.DiffProvider +import com.intellij.openapi.vcs.diff.ItemLatestState +import com.intellij.openapi.vcs.history.VcsRevisionNumber +import com.intellij.openapi.vfs.VfsUtilCore +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.vcsUtil.VcsUtil +import java.io.File + +/** + * Alimenta el gutter de líneas modificadas y las acciones "Show Diff" a + * partir del commit base del work tree (`got info` + `got cat -c :base`). + * Solo compara contra la base actual; comparar contra revisiones históricas + * arbitrarias queda para la Fase 5 (historial). + */ +class GotDiffProvider( + private val project: Project, + private val commandLine: GotCommandLineWrapper, +) : DiffProvider { + + private fun rootAndRelativePath(file: VirtualFile): Pair? { + val vcsRoot = ProjectLevelVcsManager.getInstance(project).getVcsRootFor(file) ?: return null + val relativePath = VfsUtilCore.getRelativePath(file, vcsRoot) ?: return null + return File(vcsRoot.path) to relativePath + } + + private fun baseRevisionOrNull(workDir: File): VcsRevisionNumber? = try { + GotRevisionNumber(commandLine.baseCommit(workDir)) + } catch (e: VcsException) { + null + } + + override fun getCurrentRevision(file: VirtualFile): VcsRevisionNumber? { + val (workDir, _) = rootAndRelativePath(file) ?: return null + return baseRevisionOrNull(workDir) + } + + override fun getLastRevision(virtualFile: VirtualFile): ItemLatestState? { + val (workDir, _) = rootAndRelativePath(virtualFile) ?: return null + val revision = baseRevisionOrNull(workDir) ?: return null + return ItemLatestState(revision, true, true) + } + + override fun getLastRevision(filePath: FilePath): ItemLatestState? { + val virtualFile = filePath.virtualFile ?: return null + return getLastRevision(virtualFile) + } + + override fun createFileContent(revisionNumber: VcsRevisionNumber, selectedFile: VirtualFile): ContentRevision? { + val (workDir, relativePath) = rootAndRelativePath(selectedFile) ?: return null + val filePath = VcsUtil.getFilePath(selectedFile) + return GotContentRevision(filePath, workDir, relativePath, commandLine) + } + + override fun getLatestCommittedRevision(vcsRoot: VirtualFile): VcsRevisionNumber? = + baseRevisionOrNull(File(vcsRoot.path)) +} blob - /dev/null blob + 3a7eed70de7a0f802b493ff624bccb5d3e125ad8 (mode 644) --- /dev/null +++ src/main/kotlin/dev/nezzontli/gotvcs/GotRevisionNumber.kt @@ -0,0 +1,12 @@ +package dev.nezzontli.gotvcs + +import com.intellij.openapi.vcs.history.VcsRevisionNumber + +/** Identifica el commit base de un work tree got (hash resuelto vía `got info`). */ +data class GotRevisionNumber(private val commitId: String) : VcsRevisionNumber { + + override fun asString(): String = commitId.take(12) + + override fun compareTo(other: VcsRevisionNumber?): Int = + if (other is GotRevisionNumber) commitId.compareTo(other.commitId) else -1 +}