From 08ce64796bd6d7987390c860d21cc12e08e69341 Mon Sep 17 00:00:00 2001 From: sergeych Date: Tue, 21 Mar 2023 05:27:24 +0100 Subject: [PATCH] some fixes in merge3 --- build.gradle.kts | 6 ++--- kotlin-js-store/yarn.lock | 20 ++++++++-------- .../kotlin/net.sergeych.merge3/merge3.kt | 24 +++++++++++-------- src/commonTest/kotlin/testMerge.kt | 14 +++++++++++ 4 files changed, 41 insertions(+), 23 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4c8cc26..362491b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,13 +1,14 @@ plugins { - kotlin("multiplatform") version "1.8.0" + kotlin("multiplatform") version "1.7.21" `maven-publish` } group = "net.sergeych" -version = "0.0.1-SNAPSHOT" +version = "0.0.3-SNAPSHOT" repositories { mavenCentral() + mavenLocal() maven("https://maven.universablockchain.com") } @@ -43,7 +44,6 @@ kotlin { dependencies { implementation("dev.gitlive:kotlin-diff-utils:4.1.4") implementation("net.sergeych:mp_stools:[1.3.3,)") - } } val commonTest by getting { diff --git a/kotlin-js-store/yarn.lock b/kotlin-js-store/yarn.lock index 635a634..a0adb4d 100644 --- a/kotlin-js-store/yarn.lock +++ b/kotlin-js-store/yarn.lock @@ -281,7 +281,7 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn@^8.5.0, acorn@^8.7.1: +acorn@^8.4.1, acorn@^8.5.0: version "8.8.2" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a" integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw== @@ -652,7 +652,7 @@ engine.io@~6.4.1: engine.io-parser "~5.0.3" ws "~8.11.0" -enhanced-resolve@^5.10.0: +enhanced-resolve@^5.9.3: version "5.12.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== @@ -1781,7 +1781,7 @@ void-elements@^2.0.0: resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec" integrity sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung== -watchpack@^2.4.0: +watchpack@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== @@ -1827,21 +1827,21 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@5.74.0: - version "5.74.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" - integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== +webpack@5.73.0: + version "5.73.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.73.0.tgz#bbd17738f8a53ee5760ea2f59dce7f3431d35d38" + integrity sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.7.1" + acorn "^8.4.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.10.0" + enhanced-resolve "^5.9.3" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" @@ -1854,7 +1854,7 @@ webpack@5.74.0: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.4.0" + watchpack "^2.3.1" webpack-sources "^3.2.3" which@^1.2.1: diff --git a/src/commonMain/kotlin/net.sergeych.merge3/merge3.kt b/src/commonMain/kotlin/net.sergeych.merge3/merge3.kt index 88c9de9..d223b1b 100644 --- a/src/commonMain/kotlin/net.sergeych.merge3/merge3.kt +++ b/src/commonMain/kotlin/net.sergeych.merge3/merge3.kt @@ -5,9 +5,6 @@ import dev.gitlive.difflib.patch.AbstractDelta import dev.gitlive.difflib.patch.ChangeDelta import dev.gitlive.difflib.patch.DeleteDelta import dev.gitlive.difflib.patch.InsertDelta -import net.sergeych.mp_logger.Log -import net.sergeych.mp_logger.LogTag -import net.sergeych.mp_logger.debug import net.sergeych.sprintf.sprintf /** @@ -77,14 +74,18 @@ sealed class MergedBlock { /** * Perform 3-way merge. See [merge3] for details. */ -private class Merge3(val source: List, val variantA: List, val variantB: List) : - LogTag("MRG3", Log.Level.INFO) { +private class Merge3(val source: List, val variantA: List, val variantB: List, + val showDebug: Boolean = false) { private val reindex = source.indices.toMutableList() private val changeCount = MutableList(source.size) { 0 } val result = source.toMutableList() + private fun debug( f: ()-> String ) { + if( showDebug ) println(f()) + } + private fun trace() { debug { result.indices.joinToString("") { "%3d".sprintf(it) } } @@ -139,15 +140,20 @@ private class Merge3(val source: List, val variantA: List, val variantB debug { "deleting $count elements @$sourcePosition" } val position = findPosition(sourcePosition) var sp = sourcePosition + // how much to shoft reindex, depends on actual deletions count: + var shift = count for (i in position until position + count) { // it this position is already removed, do nothing - if (reindex[sp] < 0) continue + if (reindex[sp] < 0) { + shift-- + continue + } reindex[sp++] = -1 result.removeAt(position) changeCount.removeAt(position) } while (sp < reindex.size) { - reindex[sp].let { if (it > 0) reindex[sp] = it - count } + reindex[sp].let { if (it > 0) reindex[sp] = it - shift } sp++ } } @@ -257,6 +263,4 @@ private class Merge3(val source: List, val variantA: List, val variantB * See [MergeResult] for interpreting results */ fun merge3(source: List, a: List, b: List, showDebug: Boolean = false): MergeResult = - Merge3(source, a, b).also { - if (showDebug) it.logLevel = Log.Level.DEBUG - }.perform() \ No newline at end of file + Merge3(source, a, b, showDebug).perform() \ No newline at end of file diff --git a/src/commonTest/kotlin/testMerge.kt b/src/commonTest/kotlin/testMerge.kt index e6ddc05..6cdd1b8 100644 --- a/src/commonTest/kotlin/testMerge.kt +++ b/src/commonTest/kotlin/testMerge.kt @@ -19,6 +19,20 @@ class BasicTest { assertEquals("Bye cruel world!!!", m.merged.str) // assertTrue(m.noConflicts) } + @Test + fun testMergeNoConflicts3() { + Log.connectConsole() + val src = "1Hello, world!".toList() + val a = "Hello, friend!".toList() + val b = "Bye world!".toList() + + val m = merge3(src, a, b, true) + println(m.merged.str) +// println(m.conflicts) + println(m.changedAreas) + assertEquals("Bye friend!", m.merged.str) +// assertTrue(m.noConflicts) + } @Test fun testMergeNoConflicts2() {