From 75b4adeb768b5ff3e4ac825dad876b349c4e818b Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Fri, 7 Jul 2023 18:42:26 +0200 Subject: [PATCH] Implemented display of full file in diff (instead of hunks) Fixes #37 --- .../gitnuro/git/diff/FormatDiffUseCase.kt | 7 +--- .../gitnuro/git/diff/FormatHunksUseCase.kt | 42 +++++++++++++++---- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatDiffUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatDiffUseCase.kt index d007a71..f47b0fe 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatDiffUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatDiffUseCase.kt @@ -75,11 +75,8 @@ class FormatDiffUseCase @Inject constructor( // If we can, generate text diff (if one of the files has never been a binary file) val hasGeneratedTextDiff = canGenerateTextDiffUseCase(rawOld, rawNew) { oldRawText, newRawText -> - if (isDisplayFullFile) { - TODO() - } else { - diffResult = DiffResult.Text(diffEntry, formatHunksUseCase(fileHeader, oldRawText, newRawText)) - } + diffResult = + DiffResult.Text(diffEntry, formatHunksUseCase(fileHeader, oldRawText, newRawText, isDisplayFullFile)) } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatHunksUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatHunksUseCase.kt index 0451116..9e19edf 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatHunksUseCase.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/diff/FormatHunksUseCase.kt @@ -9,7 +9,7 @@ import javax.inject.Inject import kotlin.math.max import kotlin.math.min -private const val CONTEXT_LINES = 2 +private const val CONTEXT_LINES = 3 /** * Generator of [Hunk] lists from [DiffEntry] @@ -19,24 +19,48 @@ class FormatHunksUseCase @Inject constructor() { fileHeader: FileHeader, rawOld: RawText, rawNew: RawText, + isDisplayFullFile: Boolean, ): List { return if (fileHeader.patchType == PatchType.UNIFIED) - format(fileHeader.toEditList(), rawOld, rawNew) + format(fileHeader.toEditList(), rawOld, rawNew, isDisplayFullFile) else emptyList() } - private fun format(edits: EditList, oldRawText: RawText, newRawText: RawText): List { + private fun format( + edits: EditList, + oldRawText: RawText, + newRawText: RawText, + isDisplayFullFile: Boolean + ): List { var curIdx = 0 val hunksList = mutableListOf() - while (curIdx < edits.size) { + while (curIdx < edits.count()) { var curEdit = edits[curIdx] - val endIdx = findCombinedEnd(edits, curIdx) + + val endIdx: Int = if (isDisplayFullFile) + edits.lastIndex + else + findCombinedEnd(edits, curIdx) + val endEdit = edits[endIdx] - var oldCurrentLine = max(0, curEdit.beginA - CONTEXT_LINES) - var newCurrentLine = max(0, curEdit.beginB - CONTEXT_LINES) - val oldEndLine = min(oldRawText.size(), endEdit.endA + CONTEXT_LINES) - val newEndLine = min(newRawText.size(), endEdit.endB + CONTEXT_LINES) + + var oldCurrentLine: Int + var newCurrentLine: Int + val oldEndLine: Int + val newEndLine: Int + + if (isDisplayFullFile) { + oldCurrentLine = 0 + newCurrentLine = 0 + oldEndLine = oldRawText.size() + newEndLine = newRawText.size() + } else { + oldCurrentLine = max(0, curEdit.beginA - CONTEXT_LINES) + newCurrentLine = max(0, curEdit.beginB - CONTEXT_LINES) + oldEndLine = min(oldRawText.size(), endEdit.endA + CONTEXT_LINES) + newEndLine = min(newRawText.size(), endEdit.endB + CONTEXT_LINES) + } val headerText = createHunkHeader(oldCurrentLine, oldEndLine, newCurrentLine, newEndLine) val lines = mutableListOf()