From add5666d89777d58fc599eae8b20df6624abde08 Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Mon, 10 Oct 2022 18:00:32 +0200 Subject: [PATCH] Fixed unstage hunk regression in commit 3b1486e --- .../git/workspace/UnstageHunkUseCase.kt | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/UnstageHunkUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/UnstageHunkUseCase.kt index d94fade..5e547cc 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/UnstageHunkUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/workspace/UnstageHunkUseCase.kt @@ -23,8 +23,8 @@ class UnstageHunkUseCase @Inject constructor( try { val entryContent = rawFileManager.getRawContent( - repository = git.repository, - side = DiffEntry.Side.OLD, + repository = repository, + side = DiffEntry.Side.NEW, entry = diffEntry, oldTreeIterator = null, newTreeIterator = null @@ -37,31 +37,33 @@ class UnstageHunkUseCase @Inject constructor( val hunkLines = hunk.lines.filter { it.lineType != LineType.CONTEXT } + val addedLines = hunkLines + .filter { it.lineType == LineType.ADDED } + .sortedBy { it.newLineNumber } + val removedLines = hunkLines + .filter { it.lineType == LineType.REMOVED } + .sortedBy { it.newLineNumber } + + var linesRemoved = 0 + + // Start by removing the added lines to the index + for (line in addedLines) { + textLines.removeAt(line.newLineNumber + linesRemoved) + linesRemoved-- + } + var linesAdded = 0 - for (line in hunkLines) { - when (line.lineType) { - LineType.ADDED -> { - textLines.add(line.oldLineNumber + linesAdded, line.text) - linesAdded++ - } - LineType.REMOVED -> { - textLines.removeAt(line.oldLineNumber + linesAdded) - linesAdded-- - } - - else -> throw NotImplementedError("Line type not implemented for stage hunk") - } + // Restore previously removed lines to the index + for (line in removedLines) { + // Check how many lines before this one have been deleted + val previouslyRemovedLines = addedLines.count { it.newLineNumber < line.newLineNumber } + textLines.add(line.newLineNumber + linesAdded - previouslyRemovedLines, line.text) + linesAdded++ } val stagedFileText = textLines.joinToString("") - dirCacheEditor.add( - HunkEdit( - diffEntry.newPath, - repository, - ByteBuffer.wrap(stagedFileText.toByteArray()) - ) - ) + dirCacheEditor.add(HunkEdit(diffEntry.newPath, repository, ByteBuffer.wrap(stagedFileText.toByteArray()))) dirCacheEditor.commit() completedWithErrors = false