Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Port changes up to version 4.15 of java-diff-utils #130

Merged
merged 2 commits into from
Jan 31, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 15 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,40 +1,38 @@
# kotlin-multiplatform-diff

![Build and test](https://github.com/petertrr/kotlin-multiplatform-diff/workflows/Build%20and%20test/badge.svg)
[![Codecov](https://codecov.io/gh/petertrr/kotlin-multiplatform-diff/branch/main/graph/badge.svg)](https://codecov.io/gh/petertrr/kotlin-multiplatform-diff)
[![License](https://img.shields.io/github/license/petertrr/kotlin-multiplatform-diff)](https://github.com/petertrr/kotlin-multiplatform-diff/blob/main/LICENSE)
[![codecov](https://codecov.io/gh/petertrr/kotlin-multiplatform-diff/branch/main/graph/badge.svg)](https://codecov.io/gh/petertrr/kotlin-multiplatform-diff)

[![Releases](https://img.shields.io/github/v/release/petertrr/kotlin-multiplatform-diff)](https://github.com/petertrr/kotlin-multiplatform-diff/releases)
[![Maven Central](https://img.shields.io/maven-central/v/io.github.petertrr/kotlin-multiplatform-diff)](https://mvnrepository.com/artifact/io.github.petertrr)
[![Awesome Kotlin Badge](https://kotlin.link/awesome-kotlin.svg)](https://github.com/KotlinBy/awesome-kotlin)
[![Kotlin](https://img.shields.io/badge/kotlin-1.9.24-blue.svg?logo=kotlin)](http://kotlinlang.org)

This is a port of [java-diff-utils](https://github.com/java-diff-utils/java-diff-utils) to Kotlin with multiplatform support.
All credit for the implementation goes to original authors.
All credit for the implementation goes to the original authors.

## Features

All features from version `4.12` of the original library are present, except for:
All features from version `4.15` of the original library are present, except for:

- fuzzy patches
- unified diff, which heavily uses file read/write and therefore needs a more complicated rewrite
- diff-utils-jgit, which uses JVM-only JGit

Please refer to the original guides for more information.

## Supported Platforms
Refer to the [original wiki][1] for more information.

Currently, artifacts for the following platforms are supported:
## Supported platforms

- JVM
- JS (both browser and Node.js)
- WebAssembly (JS and WASI)
- JS (browser and Node.js)
- WebAssembly (WASM/JS and WASM/WASI)
- Native

The supported Native targets are (following the Kotlin/Native [target support guidelines][1]):
Supported Native targets are (following the Kotlin/Native [target support guidelines][2]):

| Tier 1 | Tier 2 | Tier 3 |
|:------------------|:------------------|:---------|
| macosX64 | linuxX64 | mingwX64 |
| macosArm64 | linuxArm64 | |
| Tier 1 | Tier 2 | Tier 3 |
|:-----------|:-----------|:---------|
| macosX64 | linuxX64 | mingwX64 |
| macosArm64 | linuxArm64 | |

[1]: https://kotlinlang.org/docs/native-target-support.html
[1]: https://github.com/java-diff-utils/java-diff-utils/wiki
[2]: https://kotlinlang.org/docs/native-target-support.html
42 changes: 32 additions & 10 deletions src/commonMain/kotlin/io/github/petertrr/diffutils/patch/Patch.kt
Original file line number Diff line number Diff line change
Expand Up @@ -37,40 +37,62 @@
}

/**
* Apply this patch to the given target.
* Apply this patch to the given target list, returning a new list.
*
* @return The patched text
* @throws PatchFailedException If the patch cannot be applied
*/
public fun applyTo(target: List<T>): List<T> {
val result = target.toMutableList()
applyToExisting(result)
return result
}

/**
* Apply this patch to the given target list, directly modifying it.
*
* @return The patched text
* @throws PatchFailedException If the patch cannot be applied
*/
@Suppress("MemberVisibilityCanBePrivate")
public fun applyToExisting(target: MutableList<T>) {
val it = deltas.listIterator(deltas.size)

while (it.hasPrevious()) {
val delta = it.previous()
val verifyChunk = delta.verifyAndApplyTo(result)
conflictOutput.processConflict(verifyChunk, delta, result)
val verifyChunk = delta.verifyAndApplyTo(target)
conflictOutput.processConflict(verifyChunk, delta, target)
}

return result
}

/**
* Restore the text to its original form. Opposite of the [applyTo] method.
* Creates a new list, containing the restored state of the given target list.
* Opposite of the [applyTo] method.
*
* @param target The given target
* @return The restored text
*/
public fun restore(target: List<T>): List<T> {
val result = target.toMutableList()
restoreToExisting(result)
return result

Check warning on line 78 in src/commonMain/kotlin/io/github/petertrr/diffutils/patch/Patch.kt

View check run for this annotation

Codecov / codecov/patch

src/commonMain/kotlin/io/github/petertrr/diffutils/patch/Patch.kt#L77-L78

Added lines #L77 - L78 were not covered by tests
}

/**
* Restores all changes within the given target list.
* Opposite of the [applyToExisting] method.
*
* @param target The given target
* @return The restored text
*/
@Suppress("MemberVisibilityCanBePrivate")
public fun restoreToExisting(target: MutableList<T>) {
val it = deltas.listIterator(deltas.size)

while (it.hasPrevious()) {
val delta = it.previous()
delta.restore(result)
delta.restore(target)

Check warning on line 94 in src/commonMain/kotlin/io/github/petertrr/diffutils/patch/Patch.kt

View check run for this annotation

Codecov / codecov/patch

src/commonMain/kotlin/io/github/petertrr/diffutils/patch/Patch.kt#L94

Added line #L94 was not covered by tests
}

return result
}

/**
Expand Down Expand Up @@ -102,7 +124,7 @@
var startRevised = 0

val adjustedChanges = if (includeEquals) {
changes.sortedBy { it.startOriginal }
changes.sortedBy(Change::startOriginal)
} else {
changes
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@
package io.github.petertrr.diffutils.text

// As a "global" variable to avoid re-compiling the regex each time
private val defaultPattern = Regex("\\s+|[,.\\[\\](){}/\\\\*+\\-#]")
@Suppress("RegExpRedundantEscape") // To be PCRE compliant!
private val defaultPattern = Regex("""\s+|[,.\[\](){}\/\\*+\-#<>;:&']+""")

/**
* Splitting lines by word to achieve word by word diff checking.
Expand Down
Loading