From f9552680039bb3f837dc4acc1e7ecc03895804d4 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Fri, 27 Sep 2024 23:31:24 +0200 Subject: [PATCH 01/29] introduced a more complicated test which can only be solved using the linear space version --- .../difflib/algorithm/myers/MyersDiff.java | 4 +- .../myers/MyersDiffWithLinearSpace.java | 4 +- .../difflib/text/DiffRowGeneratorTest.java | 57 +++++++++++++----- .../com/github/difflib/text/test.zip | Bin 0 -> 110173 bytes 4 files changed, 47 insertions(+), 18 deletions(-) create mode 100644 java-diff-utils/src/test/resources/com/github/difflib/text/test.zip diff --git a/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiff.java b/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiff.java index 54ffed91..2517de46 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiff.java +++ b/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiff.java @@ -187,13 +187,13 @@ public static DiffAlgorithmFactory factory() { @Override public DiffAlgorithmI create() { - return new MyersDiff(); + return new MyersDiff<>(); } @Override public DiffAlgorithmI create(BiPredicate < T, T > equalizer) { - return new MyersDiff(equalizer); + return new MyersDiff<>(equalizer); } }; } diff --git a/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiffWithLinearSpace.java b/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiffWithLinearSpace.java index 6d4451b0..ca4114c4 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiffWithLinearSpace.java +++ b/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MyersDiffWithLinearSpace.java @@ -231,13 +231,13 @@ public static DiffAlgorithmFactory factory() { @Override public DiffAlgorithmI create() { - return new MyersDiffWithLinearSpace(); + return new MyersDiffWithLinearSpace<>(); } @Override public DiffAlgorithmI create(BiPredicate < T, T > equalizer) { - return new MyersDiffWithLinearSpace(equalizer); + return new MyersDiffWithLinearSpace<>(equalizer); } }; } diff --git a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java index 897a37f9..f881c474 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java @@ -1,7 +1,12 @@ package com.github.difflib.text; +import com.github.difflib.DiffUtils; +import com.github.difflib.algorithm.myers.MyersDiffWithLinearSpace; import java.io.File; import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; @@ -721,7 +726,7 @@ public void testIssue129WithDeltaDecompression() { assertThat(txt).isEqualTo("EQUAL EQUAL EQUAL CHANGE INSERT INSERT EQUAL EQUAL EQUAL"); } - + @Test public void testIssue129SkipDeltaDecompression() { List lines1 = Arrays.asList( @@ -743,17 +748,17 @@ public void testIssue129SkipDeltaDecompression() { "banana2", "banana3"); int[] entry = {1}; - String txt = - DiffRowGenerator.create() - .showInlineDiffs(true) - .decompressDeltas(false) - .oldTag((tag, isOpening) -> isOpening ? "==old" + tag + "==>" : "<==old==") - .newTag((tag, isOpening) -> isOpening ? "==new" + tag + "==>" : "<==new==") - .build() - .generateDiffRows(lines1, lines2) - .stream() - .map(row -> row.getTag().toString()) - .collect(joining(" ")); + String txt + = DiffRowGenerator.create() + .showInlineDiffs(true) + .decompressDeltas(false) + .oldTag((tag, isOpening) -> isOpening ? "==old" + tag + "==>" : "<==old==") + .newTag((tag, isOpening) -> isOpening ? "==new" + tag + "==>" : "<==new==") + .build() + .generateDiffRows(lines1, lines2) + .stream() + .map(row -> row.getTag().toString()) + .collect(joining(" ")); // .forEachOrdered(row -> { // System.out.printf("%4d %-8s %-80s %-80s\n", entry[0]++, // row.getTag(), row.getOldLine(), row.getNewLine()); @@ -761,7 +766,7 @@ public void testIssue129SkipDeltaDecompression() { assertThat(txt).isEqualTo("EQUAL EQUAL EQUAL CHANGE CHANGE CHANGE EQUAL EQUAL EQUAL"); } - + @Test public void testIssue129SkipWhitespaceChanges() throws IOException { String original = Files.lines(Paths.get("target/test-classes/com/github/difflib/text/issue129_1.txt")).collect(joining("\n")); @@ -780,9 +785,33 @@ public void testIssue129SkipWhitespaceChanges() throws IOException { Arrays.asList(revised.split("\n"))); assertThat(rows).hasSize(13); - + rows.stream() .filter(item -> item.getTag() != DiffRow.Tag.EQUAL) .forEach(System.out::println); } + + @Test + public void testIssue188HangOnExamples() throws IOException, URISyntaxException { + try (FileSystem zipFs = FileSystems.newFileSystem(Paths.get("target/test-classes/com/github/difflib/text/test.zip"), null);) { + List original = Files.readAllLines(zipFs.getPath("old.html")); + List revised = Files.readAllLines(zipFs.getPath("new.html")); + + DiffRowGenerator generator = DiffRowGenerator.create() + .lineNormalizer(line -> line) + .showInlineDiffs(true) + .mergeOriginalRevised(true) + .inlineDiffByWord(true) + .decompressDeltas(true) + .oldTag(f -> f ? "" : "") + .newTag(f -> f ? "" : "") + .build(); + + //List rows = generator.generateDiffRows(original, revised); + List rows = generator.generateDiffRows(original, DiffUtils.diff(original, revised, new MyersDiffWithLinearSpace<>() )); + + System.out.println(rows); + } + } } + diff --git a/java-diff-utils/src/test/resources/com/github/difflib/text/test.zip b/java-diff-utils/src/test/resources/com/github/difflib/text/test.zip new file mode 100644 index 0000000000000000000000000000000000000000..7b071fcda15a824af0fe38c29196582251aeae10 GIT binary patch literal 110173 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¥GN5PUFApm4A@+9BE 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 Date: Sat, 23 Nov 2024 21:39:25 +0100 Subject: [PATCH 02/29] upgraded some plugins and dependencies --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 52b653da..0203eaa3 100644 --- a/pom.xml +++ b/pom.xml @@ -65,13 +65,13 @@ org.junit.jupiter junit-jupiter - 5.7.1 + 5.11.3 test org.assertj assertj-core - 3.19.0 + 3.26.3 test @@ -81,7 +81,7 @@ org.apache.maven.plugins maven-release-plugin - 2.5.3 + 3.1.1 true false @@ -91,7 +91,7 @@ org.apache.felix maven-bundle-plugin - 3.3.0 + 3.5.1 bundle-manifest @@ -105,7 +105,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.1.1 + 3.11.1 ${javadoc.opts} none @@ -122,7 +122,7 @@ org.apache.maven.plugins maven-checkstyle-plugin - 3.1.0 + 3.6.0 verify-style @@ -176,7 +176,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M4 + 3.5.2 **/LR*.java @@ -199,7 +199,7 @@ org.apache.maven.plugins maven-gpg-plugin - 1.6 + 3.2.7 sign-artifacts From ace11bc484d2dd8051ca33840257db72712e9b90 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:00:14 +0100 Subject: [PATCH 03/29] [maven-release-plugin] prepare release java-diff-utils-parent-4.13 --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 6d0fbdd2..7e7d7c82 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13-SNAPSHOT + 4.13 java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index c18e88b0..27da211f 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13-SNAPSHOT + 4.13 UTF-8 diff --git a/pom.xml b/pom.xml index 0203eaa3..799c35f3 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.13-SNAPSHOT + 4.13 java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - HEAD + java-diff-utils-parent-4.13 GitHub Issues From 0f7c32b98393f118546555c5bf633860de5ffd1f Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:00:16 +0100 Subject: [PATCH 04/29] [maven-release-plugin] prepare for next development iteration --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 7e7d7c82..8220036b 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13 + 4.14-SNAPSHOT java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 27da211f..802dd9a0 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13 + 4.14-SNAPSHOT UTF-8 diff --git a/pom.xml b/pom.xml index 799c35f3..6d4ae5f8 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.13 + 4.14-SNAPSHOT java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - java-diff-utils-parent-4.13 + HEAD GitHub Issues From dad43159a85a68656c73d2d2cc6c6c86b9bac4ab Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:08:00 +0100 Subject: [PATCH 05/29] [maven-release-plugin] rollback the release of java-diff-utils-parent-4.13 --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 8220036b..6d0fbdd2 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.13-SNAPSHOT java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 802dd9a0..c18e88b0 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.13-SNAPSHOT UTF-8 diff --git a/pom.xml b/pom.xml index 6d4ae5f8..0203eaa3 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.13-SNAPSHOT java-diff-utils-parent pom From 52e61d653fca450ca0df5e51d32e8486fdd531f5 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:10:34 +0100 Subject: [PATCH 06/29] upgraded some plugins and dependencies --- pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0203eaa3..09ec71e2 100644 --- a/pom.xml +++ b/pom.xml @@ -81,11 +81,17 @@ org.apache.maven.plugins maven-release-plugin - 3.1.1 + + 3.0.0-M7 true false forked-path + sign-release-artifacts From 23c80bc30dcfd8b1c152359725970ff1bab4b83d Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:13:47 +0100 Subject: [PATCH 07/29] [maven-release-plugin] prepare release java-diff-utils-parent-4.13 --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 6d0fbdd2..7e7d7c82 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13-SNAPSHOT + 4.13 java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index c18e88b0..27da211f 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13-SNAPSHOT + 4.13 UTF-8 diff --git a/pom.xml b/pom.xml index 09ec71e2..408ad040 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.13-SNAPSHOT + 4.13 java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - HEAD + java-diff-utils-parent-4.13 GitHub Issues From 94aafa7e68fe11917b06fd09db9d08107b3fb640 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:13:49 +0100 Subject: [PATCH 08/29] [maven-release-plugin] prepare for next development iteration --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 7e7d7c82..8220036b 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13 + 4.14-SNAPSHOT java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 27da211f..802dd9a0 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.13 + 4.14-SNAPSHOT UTF-8 diff --git a/pom.xml b/pom.xml index 408ad040..a15e39a9 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.13 + 4.14-SNAPSHOT java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - java-diff-utils-parent-4.13 + HEAD GitHub Issues From 509d5071fd4b90299127e3188b7b06c58fc44452 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:36:20 +0100 Subject: [PATCH 09/29] added missing sources plugin --- pom.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/pom.xml b/pom.xml index a15e39a9..c0552ad1 100644 --- a/pom.xml +++ b/pom.xml @@ -108,6 +108,20 @@ + + org.apache.maven.plugins + maven-source-plugin + 4.0.0-beta-1 + + + attach-sources + verify + + jar-no-fork + + + + org.apache.maven.plugins maven-javadoc-plugin From 1fdcf13803ed38a96da4dfbeb48c1288ee187d77 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:38:43 +0100 Subject: [PATCH 10/29] added missing sources plugin --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c0552ad1..2ff6c49e 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,7 @@ org.apache.maven.plugins maven-source-plugin - 4.0.0-beta-1 + 3.3.1 attach-sources From 1560c2203470382e6b1fb84f3454484042fa0dd9 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:40:23 +0100 Subject: [PATCH 11/29] [maven-release-plugin] prepare release java-diff-utils-parent-4.14 --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 8220036b..48e8059a 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.14 java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 802dd9a0..dbac789c 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.14 UTF-8 diff --git a/pom.xml b/pom.xml index 2ff6c49e..9cbad909 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.14 java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - HEAD + java-diff-utils-parent-4.14 GitHub Issues From b7c1aaeb2ecb013ba2e09c7b7d1c9fece2170655 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:40:25 +0100 Subject: [PATCH 12/29] [maven-release-plugin] prepare for next development iteration --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 48e8059a..057a9939 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14 + 4.15-SNAPSHOT java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index dbac789c..15c8bbd3 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14 + 4.15-SNAPSHOT UTF-8 diff --git a/pom.xml b/pom.xml index 9cbad909..20833896 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.14 + 4.15-SNAPSHOT java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - java-diff-utils-parent-4.14 + HEAD GitHub Issues From 5245ee8b778a039a5b51c1ed67f2ce91c5c70ad5 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:43:15 +0100 Subject: [PATCH 13/29] [maven-release-plugin] rollback the release of java-diff-utils-parent-4.14 --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 057a9939..8220036b 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.15-SNAPSHOT + 4.14-SNAPSHOT java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 15c8bbd3..802dd9a0 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.15-SNAPSHOT + 4.14-SNAPSHOT UTF-8 diff --git a/pom.xml b/pom.xml index 20833896..2ff6c49e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.15-SNAPSHOT + 4.14-SNAPSHOT java-diff-utils-parent pom From 0307c80edb51fb79ec2c3c72a2aed8357d2eb9be Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:49:57 +0100 Subject: [PATCH 14/29] downgraded plugins again, certificate problems for java 8 --- pom.xml | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 2ff6c49e..9cfd03d2 100644 --- a/pom.xml +++ b/pom.xml @@ -81,12 +81,7 @@ org.apache.maven.plugins maven-release-plugin - - 3.0.0-M7 + 2.5.3 true false @@ -108,24 +103,10 @@ - - org.apache.maven.plugins - maven-source-plugin - 3.3.1 - - - attach-sources - verify - - jar-no-fork - - - - org.apache.maven.plugins maven-javadoc-plugin - 3.11.1 + 3.1.1 ${javadoc.opts} none @@ -219,7 +200,7 @@ org.apache.maven.plugins maven-gpg-plugin - 3.2.7 + 1.6 sign-artifacts From 1d8148ac056ecaaf61495c636e2f35488446ad5a Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:51:38 +0100 Subject: [PATCH 15/29] [maven-release-plugin] prepare release java-diff-utils-parent-4.14 --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 8220036b..48e8059a 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.14 java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 802dd9a0..dbac789c 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.14 UTF-8 diff --git a/pom.xml b/pom.xml index 9cfd03d2..b0b79a87 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.14-SNAPSHOT + 4.14 java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - HEAD + java-diff-utils-parent-4.14 GitHub Issues From af9d84cd71bb39aaec1c9db72e79857737a4b620 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:51:42 +0100 Subject: [PATCH 16/29] [maven-release-plugin] prepare for next development iteration --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 48e8059a..057a9939 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14 + 4.15-SNAPSHOT java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index dbac789c..15c8bbd3 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.14 + 4.15-SNAPSHOT UTF-8 diff --git a/pom.xml b/pom.xml index b0b79a87..6945139c 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.14 + 4.15-SNAPSHOT java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - java-diff-utils-parent-4.14 + HEAD GitHub Issues From 71981d8faaff266654964ce3334e7faf64d2b9f2 Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:58:04 +0100 Subject: [PATCH 17/29] [maven-release-plugin] prepare release java-diff-utils-parent-4.15 --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 057a9939..daac9fe1 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.15-SNAPSHOT + 4.15 java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 15c8bbd3..13ecfd39 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.15-SNAPSHOT + 4.15 UTF-8 diff --git a/pom.xml b/pom.xml index 6945139c..f5d42c12 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.15-SNAPSHOT + 4.15 java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - HEAD + java-diff-utils-parent-4.15 GitHub Issues From 4b3367674af140eedf5be9dd95308fc51c499bef Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Sat, 23 Nov 2024 22:58:05 +0100 Subject: [PATCH 18/29] [maven-release-plugin] prepare for next development iteration --- java-diff-utils-jgit/pom.xml | 2 +- java-diff-utils/pom.xml | 2 +- pom.xml | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index daac9fe1..9e3f2b96 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -4,7 +4,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.15 + 4.16-SNAPSHOT java-diff-utils-jgit java-diff-utils-jgit diff --git a/java-diff-utils/pom.xml b/java-diff-utils/pom.xml index 13ecfd39..95560b01 100644 --- a/java-diff-utils/pom.xml +++ b/java-diff-utils/pom.xml @@ -7,7 +7,7 @@ io.github.java-diff-utils java-diff-utils-parent - 4.15 + 4.16-SNAPSHOT UTF-8 diff --git a/pom.xml b/pom.xml index f5d42c12..31300b5b 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 io.github.java-diff-utils java-diff-utils-parent - 4.15 + 4.16-SNAPSHOT java-diff-utils-parent pom @@ -29,7 +29,7 @@ scm:git:https://github.com/java-diff-utils/java-diff-utils.git scm:git:ssh://git@github.com:java-diff-utils/java-diff-utils.git https://github.com/java-diff-utils/java-diff-utils.git - java-diff-utils-parent-4.15 + HEAD GitHub Issues From 0f8365b35d30faa300b442cd90f57f95a60eaf45 Mon Sep 17 00:00:00 2001 From: Tobias Date: Sat, 23 Nov 2024 23:09:14 +0100 Subject: [PATCH 19/29] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 70dfa521..06c39d76 100644 --- a/README.md +++ b/README.md @@ -125,7 +125,7 @@ Just add the code below to your maven dependencies: io.github.java-diff-utils java-diff-utils - 4.12 + 4.15 ``` From 527e83cee1babf73ed0e31358088794be05cd381 Mon Sep 17 00:00:00 2001 From: tw Date: Wed, 5 Feb 2025 21:25:54 +0100 Subject: [PATCH 20/29] fixes #197 - corrected revised filename output --- .../main/java/com/github/difflib/UnifiedDiffUtils.java | 2 +- .../com/github/difflib/GenerateUnifiedDiffTest.java | 10 ++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java index 727008db..a6f83b64 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java @@ -352,7 +352,7 @@ public static List generateOriginalAndDiff(List original, List generateOriginalAndDiff(List original, List revised, String originalFileName, String revisedFileName) { String originalFileNameTemp = originalFileName; - String revisedFileNameTemp = originalFileName; + String revisedFileNameTemp = revisedFileName; if (originalFileNameTemp == null) { originalFileNameTemp = "original"; } diff --git a/java-diff-utils/src/test/java/com/github/difflib/GenerateUnifiedDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/GenerateUnifiedDiffTest.java index e13d41aa..b8667818 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/GenerateUnifiedDiffTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/GenerateUnifiedDiffTest.java @@ -51,8 +51,14 @@ public void testGenerateUnifiedWithOneDelta() throws IOException { @Test public void testGenerateUnifiedDiffWithoutAnyDeltas() { List test = Arrays.asList("abc"); - Patch patch = DiffUtils.diff(test, test); - UnifiedDiffUtils.generateUnifiedDiff("abc", "abc", test, patch, 0); + List testRevised = Arrays.asList("abc2"); + Patch patch = DiffUtils.diff(test, testRevised); + String unifiedDiffTxt = String.join("\n", UnifiedDiffUtils.generateUnifiedDiff("abc1", "abc2", test, patch, 0)); + System.out.println(unifiedDiffTxt); + + assertThat(unifiedDiffTxt) + .as("original filename should be abc1").contains("--- abc1") + .as("revised filename should be abc2").contains("+++ abc2"); } @Test From b5b7dacc6e0720bbfc634b5d15e283be13e570f9 Mon Sep 17 00:00:00 2001 From: epictecch <57089715+epictecch@users.noreply.github.com> Date: Wed, 5 Feb 2025 21:48:53 +0100 Subject: [PATCH 21/29] added support for merging inline deltas split by whitespace or a minor equality (#168) (#191) Co-authored-by: Tobias --- .../github/difflib/text/DiffRowGenerator.java | 31 +++++++- .../text/deltamerge/DeltaMergeUtils.java | 79 +++++++++++++++++++ .../text/deltamerge/InlineDeltaMergeInfo.java | 51 ++++++++++++ .../difflib/text/DiffRowGeneratorTest.java | 46 +++++++++++ 4 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java create mode 100644 java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/InlineDeltaMergeInfo.java diff --git a/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java b/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java index 3711bfb6..e540004c 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java +++ b/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java @@ -24,6 +24,8 @@ import com.github.difflib.patch.InsertDelta; import com.github.difflib.patch.Patch; import com.github.difflib.text.DiffRow.Tag; +import com.github.difflib.text.deltamerge.DeltaMergeUtils; +import com.github.difflib.text.deltamerge.InlineDeltaMergeInfo; import java.util.*; import java.util.function.BiFunction; import java.util.function.BiPredicate; @@ -75,6 +77,14 @@ public final class DiffRowGenerator { public static final Function> SPLITTER_BY_WORD = line -> splitStringPreserveDelimiter(line, SPLIT_BY_WORD_PATTERN); public static final Pattern WHITESPACE_PATTERN = Pattern.compile("\\s+"); + public static final Function>> DEFAULT_INLINE_DELTA_MERGER = InlineDeltaMergeInfo::getDeltas; + + /** + * Merge diffs which are separated by equalities consisting of whitespace only. + */ + public static final Function>> WHITESPACE_EQUALITIES_MERGER = deltaMergeInfo -> DeltaMergeUtils + .mergeInlineDeltas(deltaMergeInfo, (equalities -> equalities.stream().allMatch(String::isBlank))); + public static Builder create() { return new Builder(); } @@ -170,6 +180,7 @@ static void wrapInTag(List sequence, int startPosition, private final boolean reportLinesUnchanged; private final Function lineNormalizer; private final Function processDiffs; + private final Function>> inlineDeltaMerger; private final boolean showInlineDiffs; private final boolean replaceOriginalLinefeedInChangesWithSpaces; @@ -194,11 +205,13 @@ private DiffRowGenerator(Builder builder) { reportLinesUnchanged = builder.reportLinesUnchanged; lineNormalizer = builder.lineNormalizer; processDiffs = builder.processDiffs; + inlineDeltaMerger = builder.inlineDeltaMerger; replaceOriginalLinefeedInChangesWithSpaces = builder.replaceOriginalLinefeedInChangesWithSpaces; Objects.requireNonNull(inlineDiffSplitter); Objects.requireNonNull(lineNormalizer); + Objects.requireNonNull(inlineDeltaMerger); } /** @@ -370,7 +383,10 @@ private List generateInlineDiffs(AbstractDelta delta) { origList = inlineDiffSplitter.apply(joinedOrig); revList = inlineDiffSplitter.apply(joinedRev); - List> inlineDeltas = DiffUtils.diff(origList, revList, equalizer).getDeltas(); + List> originalInlineDeltas = DiffUtils.diff(origList, revList, equalizer) + .getDeltas(); + List> inlineDeltas = inlineDeltaMerger + .apply(new InlineDeltaMergeInfo(originalInlineDeltas, origList, revList)); Collections.reverse(inlineDeltas); for (AbstractDelta inlineDelta : inlineDeltas) { @@ -465,6 +481,7 @@ public static class Builder { private Function processDiffs = null; private BiPredicate equalizer = null; private boolean replaceOriginalLinefeedInChangesWithSpaces = false; + private Function>> inlineDeltaMerger = DEFAULT_INLINE_DELTA_MERGER; private Builder() { } @@ -673,5 +690,17 @@ public Builder replaceOriginalLinefeedInChangesWithSpaces(boolean replace) { this.replaceOriginalLinefeedInChangesWithSpaces = replace; return this; } + + /** + * Provide an inline delta merger for use case specific delta optimizations. + * + * @param inlineDeltaMerger + * @return + */ + public Builder inlineDeltaMerger( + Function>> inlineDeltaMerger) { + this.inlineDeltaMerger = inlineDeltaMerger; + return this; + } } } diff --git a/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java b/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java new file mode 100644 index 00000000..0d9a0a16 --- /dev/null +++ b/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java @@ -0,0 +1,79 @@ +/* + * Copyright 2009-2024 java-diff-utils. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.difflib.text.deltamerge; + +import java.util.ArrayList; +import java.util.List; +import java.util.function.Predicate; + +import com.github.difflib.patch.AbstractDelta; +import com.github.difflib.patch.ChangeDelta; +import com.github.difflib.patch.Chunk; + +/** + * Provides utility features for merge inline deltas + * + * @author Christian Meier + */ +final public class DeltaMergeUtils { + + public static List> mergeInlineDeltas(InlineDeltaMergeInfo deltaMergeInfo, + Predicate> replaceEquality) { + final List> originalDeltas = deltaMergeInfo.getDeltas(); + if (originalDeltas.size() < 2) { + return originalDeltas; + } + + final List> newDeltas = new ArrayList<>(); + newDeltas.add(originalDeltas.get(0)); + for (int i = 1; i < originalDeltas.size(); i++) { + final AbstractDelta previousDelta = newDeltas.getLast(); + final AbstractDelta currentDelta = originalDeltas.get(i); + + final List equalities = deltaMergeInfo.getOrigList().subList( + previousDelta.getSource().getPosition() + previousDelta.getSource().size(), + currentDelta.getSource().getPosition()); + + if (replaceEquality.test(equalities)) { + // Merge the previous delta, the equality and the current delta into one + // ChangeDelta and replace the previous delta by this new ChangeDelta. + final List allSourceLines = new ArrayList<>(); + allSourceLines.addAll(previousDelta.getSource().getLines()); + allSourceLines.addAll(equalities); + allSourceLines.addAll(currentDelta.getSource().getLines()); + + final List allTargetLines = new ArrayList<>(); + allTargetLines.addAll(previousDelta.getTarget().getLines()); + allTargetLines.addAll(equalities); + allTargetLines.addAll(currentDelta.getTarget().getLines()); + + final ChangeDelta replacement = new ChangeDelta<>( + new Chunk<>(previousDelta.getSource().getPosition(), allSourceLines), + new Chunk<>(previousDelta.getTarget().getPosition(), allTargetLines)); + + newDeltas.removeLast(); + newDeltas.add(replacement); + } else { + newDeltas.add(currentDelta); + } + } + + return newDeltas; + } + + private DeltaMergeUtils() { + } +} diff --git a/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/InlineDeltaMergeInfo.java b/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/InlineDeltaMergeInfo.java new file mode 100644 index 00000000..cc6b399a --- /dev/null +++ b/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/InlineDeltaMergeInfo.java @@ -0,0 +1,51 @@ +/* + * Copyright 2009-2024 java-diff-utils. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.github.difflib.text.deltamerge; + +import java.util.List; + +import com.github.difflib.patch.AbstractDelta; + +/** + * Holds the information required to merge deltas originating from an inline + * diff + * + * @author Christian Meier + */ +public final class InlineDeltaMergeInfo { + + private final List> deltas; + private final List origList; + private final List revList; + + public InlineDeltaMergeInfo(List> deltas, List origList, List revList) { + this.deltas = deltas; + this.origList = origList; + this.revList = revList; + } + + public List> getDeltas() { + return deltas; + } + + public List getOrigList() { + return origList; + } + + public List getRevList() { + return revList; + } +} diff --git a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java index f881c474..76c03044 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java @@ -12,6 +12,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.function.Function; import java.util.regex.Pattern; import static java.util.stream.Collectors.joining; import static java.util.stream.Collectors.toList; @@ -20,6 +21,10 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.Test; +import com.github.difflib.patch.AbstractDelta; +import com.github.difflib.text.deltamerge.DeltaMergeUtils; +import com.github.difflib.text.deltamerge.InlineDeltaMergeInfo; + public class DiffRowGeneratorTest { @Test @@ -791,6 +796,47 @@ public void testIssue129SkipWhitespaceChanges() throws IOException { .forEach(System.out::println); } + @Test + public void testGeneratorWithWhitespaceDeltaMerge() { + final DiffRowGenerator generator = DiffRowGenerator.create().showInlineDiffs(true).mergeOriginalRevised(true) + .inlineDiffByWord(true).oldTag(f -> "~").newTag(f -> "**") // + .lineNormalizer(StringUtils::htmlEntites) // do not replace tabs + .inlineDeltaMerger(DiffRowGenerator.WHITESPACE_EQUALITIES_MERGER).build(); + + assertInlineDiffResult(generator, "No diff", "No diff", "No diff"); + assertInlineDiffResult(generator, " x whitespace before diff", " y whitespace before diff", + " ~x~**y** whitespace before diff"); + assertInlineDiffResult(generator, "Whitespace after diff x ", "Whitespace after diff y ", + "Whitespace after diff ~x~**y** "); + assertInlineDiffResult(generator, "Diff x x between", "Diff y y between", "Diff ~x x~**y y** between"); + assertInlineDiffResult(generator, "Hello \t world", "Hi \t universe", "~Hello \t world~**Hi \t universe**"); + assertInlineDiffResult(generator, "The quick brown fox jumps over the lazy dog", "A lazy dog jumps over a fox", + "~The quick brown fox ~**A lazy dog **jumps over ~the lazy dog~**a fox**"); + } + + @Test + public void testGeneratorWithMergingDeltasForShortEqualities() { + final Function>> shortEqualitiesMerger = deltaMergeInfo -> DeltaMergeUtils + .mergeInlineDeltas(deltaMergeInfo, + (equalities -> equalities.stream().mapToInt(String::length).sum() < 6)); + + final DiffRowGenerator generator = DiffRowGenerator.create().showInlineDiffs(true).mergeOriginalRevised(true) + .inlineDiffByWord(true).oldTag(f -> "~").newTag(f -> "**").inlineDeltaMerger(shortEqualitiesMerger) + .build(); + + assertInlineDiffResult(generator, "No diff", "No diff", "No diff"); + assertInlineDiffResult(generator, "aaa bbb ccc", "xxx bbb zzz", "~aaa bbb ccc~**xxx bbb zzz**"); + assertInlineDiffResult(generator, "aaa bbbb ccc", "xxx bbbb zzz", "~aaa~**xxx** bbbb ~ccc~**zzz**"); + } + + private void assertInlineDiffResult(DiffRowGenerator generator, String original, String revised, String expected) { + final List rows = generator.generateDiffRows(Arrays.asList(original), Arrays.asList(revised)); + print(rows); + + assertEquals(1, rows.size()); + assertEquals(expected, rows.get(0).getOldLine().toString()); + } + @Test public void testIssue188HangOnExamples() throws IOException, URISyntaxException { try (FileSystem zipFs = FileSystems.newFileSystem(Paths.get("target/test-classes/com/github/difflib/text/test.zip"), null);) { From 803fc4a18838a7d02a26ff916688fb0aa85391ad Mon Sep 17 00:00:00 2001 From: tw Date: Wed, 5 Feb 2025 22:04:26 +0100 Subject: [PATCH 22/29] fixes #191 - downgraded patch to Java 8 compliance --- .../main/java/com/github/difflib/text/DiffRowGenerator.java | 2 +- .../com/github/difflib/text/deltamerge/DeltaMergeUtils.java | 4 ++-- .../java/com/github/difflib/text/DiffRowGeneratorTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java b/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java index e540004c..9ec50a84 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java +++ b/java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java @@ -83,7 +83,7 @@ public final class DiffRowGenerator { * Merge diffs which are separated by equalities consisting of whitespace only. */ public static final Function>> WHITESPACE_EQUALITIES_MERGER = deltaMergeInfo -> DeltaMergeUtils - .mergeInlineDeltas(deltaMergeInfo, (equalities -> equalities.stream().allMatch(String::isBlank))); + .mergeInlineDeltas(deltaMergeInfo, equalities -> equalities.stream().allMatch(s -> s==null || s.replaceAll("\\s+", "").equals(""))); public static Builder create() { return new Builder(); diff --git a/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java b/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java index 0d9a0a16..b2580957 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/text/deltamerge/DeltaMergeUtils.java @@ -40,7 +40,7 @@ public static List> mergeInlineDeltas(InlineDeltaMergeInfo final List> newDeltas = new ArrayList<>(); newDeltas.add(originalDeltas.get(0)); for (int i = 1; i < originalDeltas.size(); i++) { - final AbstractDelta previousDelta = newDeltas.getLast(); + final AbstractDelta previousDelta = newDeltas.get(newDeltas.size()-1); final AbstractDelta currentDelta = originalDeltas.get(i); final List equalities = deltaMergeInfo.getOrigList().subList( @@ -64,7 +64,7 @@ public static List> mergeInlineDeltas(InlineDeltaMergeInfo new Chunk<>(previousDelta.getSource().getPosition(), allSourceLines), new Chunk<>(previousDelta.getTarget().getPosition(), allTargetLines)); - newDeltas.removeLast(); + newDeltas.remove(newDeltas.size()-1); newDeltas.add(replacement); } else { newDeltas.add(currentDelta); diff --git a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java index 76c03044..7725bb0b 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java @@ -818,7 +818,7 @@ public void testGeneratorWithWhitespaceDeltaMerge() { public void testGeneratorWithMergingDeltasForShortEqualities() { final Function>> shortEqualitiesMerger = deltaMergeInfo -> DeltaMergeUtils .mergeInlineDeltas(deltaMergeInfo, - (equalities -> equalities.stream().mapToInt(String::length).sum() < 6)); + equalities -> equalities.stream().mapToInt(String::length).sum() < 6); final DiffRowGenerator generator = DiffRowGenerator.create().showInlineDiffs(true).mergeOriginalRevised(true) .inlineDiffByWord(true).oldTag(f -> "~").newTag(f -> "**").inlineDeltaMerger(shortEqualitiesMerger) From 110a0da37bf02aced82dab720ea57982dd42c458 Mon Sep 17 00:00:00 2001 From: tw Date: Wed, 5 Feb 2025 22:44:27 +0100 Subject: [PATCH 23/29] fixes #191 - downgraded patch to Java 8 compliance --- .../test/java/com/github/difflib/text/DiffRowGeneratorTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java index 7725bb0b..beccad8c 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/text/DiffRowGeneratorTest.java @@ -839,7 +839,7 @@ private void assertInlineDiffResult(DiffRowGenerator generator, String original, @Test public void testIssue188HangOnExamples() throws IOException, URISyntaxException { - try (FileSystem zipFs = FileSystems.newFileSystem(Paths.get("target/test-classes/com/github/difflib/text/test.zip"), null);) { + try (FileSystem zipFs = FileSystems.newFileSystem(Paths.get("target/test-classes/com/github/difflib/text/test.zip"), (ClassLoader) null);) { List original = Files.readAllLines(zipFs.getPath("old.html")); List revised = Files.readAllLines(zipFs.getPath("new.html")); From 8397e20ddcdedc40be2de7f2f7885490f59dc5a4 Mon Sep 17 00:00:00 2001 From: rushii <33725716+rushiiMachine@users.noreply.github.com> Date: Wed, 5 Feb 2025 14:23:11 -0800 Subject: [PATCH 24/29] fix: parsing unified diff chunk headers (#198) The regex matching chunk headers does not account for diffs generated with --show-function-line --- .../src/main/java/com/github/difflib/UnifiedDiffUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java index a6f83b64..94786b6c 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/UnifiedDiffUtils.java @@ -36,7 +36,7 @@ public final class UnifiedDiffUtils { private static final Pattern UNIFIED_DIFF_CHUNK_REGEXP = Pattern - .compile("^@@\\s+-(?:(\\d+)(?:,(\\d+))?)\\s+\\+(?:(\\d+)(?:,(\\d+))?)\\s+@@$"); + .compile("^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@.*$"); private static final String NULL_FILE_INDICATOR = "/dev/null"; /** From 01a7fb16cfc33abc3e6ac4adcc2db79438f56fcf Mon Sep 17 00:00:00 2001 From: tw Date: Sun, 9 Feb 2025 20:53:14 +0100 Subject: [PATCH 25/29] updates test dependencies --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 31300b5b..aa1deae3 100644 --- a/pom.xml +++ b/pom.xml @@ -65,13 +65,13 @@ org.junit.jupiter junit-jupiter - 5.11.3 + 5.11.4 test org.assertj assertj-core - 3.26.3 + 3.27.3 test From c1aa689dce9fa2703292f7282e919bc0b1a9fa2d Mon Sep 17 00:00:00 2001 From: Davide Santonocito Date: Wed, 5 Mar 2025 15:43:04 +0100 Subject: [PATCH 26/29] Fix a typo in DiffUtils.java javadocs --- .../java/com/github/difflib/DiffUtils.java | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/DiffUtils.java b/java-diff-utils/src/main/java/com/github/difflib/DiffUtils.java index 8917772b..e0ac521f 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/DiffUtils.java +++ b/java-diff-utils/src/main/java/com/github/difflib/DiffUtils.java @@ -42,7 +42,7 @@ public final class DiffUtils { /** * Sets the default diff algorithm factory to be used by all diff routines. * - * @param factory a {@link DiffAlgorithmFactory} represnting the new default diff algorithm factory. + * @param factory a {@link DiffAlgorithmFactory} representing the new default diff algorithm factory. */ public static void withDefaultDiffAlgorithmFactory(DiffAlgorithmFactory factory) { DEFAULT_DIFF = factory; @@ -52,9 +52,9 @@ public static void withDefaultDiffAlgorithmFactory(DiffAlgorithmFactory factory) * Computes the difference between two sequences of elements using the default diff algorithm. * * @param a generic representing the type of the elements to be compared. - * @param original a {@link List} represnting the original sequence of elements. Must not be {@code null}. - * @param revised a {@link List} represnting the revised sequence of elements. Must not be {@code null}. - * @param progress a {@link DiffAlgorithmListener} represnting the progress listener. Can be {@code null}. + * @param original a {@link List} representing the original sequence of elements. Must not be {@code null}. + * @param revised a {@link List} representing the revised sequence of elements. Must not be {@code null}. + * @param progress a {@link DiffAlgorithmListener} representing the progress listener. Can be {@code null}. * @return The patch describing the difference between the original and revised sequences. Never {@code null}. */ public static Patch diff(List original, List revised, DiffAlgorithmListener progress) { @@ -65,8 +65,8 @@ public static Patch diff(List original, List revised, DiffAlgorithm * Computes the difference between two sequences of elements using the default diff algorithm. * * @param a generic representing the type of the elements to be compared. - * @param original a {@link List} represnting the original sequence of elements. Must not be {@code null}. - * @param revised a {@link List} represnting the revised sequence of elements. Must not be {@code null}. + * @param original a {@link List} representing the original sequence of elements. Must not be {@code null}. + * @param revised a {@link List} representing the revised sequence of elements. Must not be {@code null}. * @return The patch describing the difference between the original and revised sequences. Never {@code null}. */ public static Patch diff(List original, List revised) { @@ -77,9 +77,9 @@ public static Patch diff(List original, List revised) { * Computes the difference between two sequences of elements using the default diff algorithm. * * @param a generic representing the type of the elements to be compared. - * @param original a {@link List} represnting the original sequence of elements. Must not be {@code null}. - * @param revised a {@link List} represnting the revised sequence of elements. Must not be {@code null}. - * @param includeEqualParts a {@link boolean} represnting whether to include equal parts in the resulting patch. + * @param original a {@link List} representing the original sequence of elements. Must not be {@code null}. + * @param revised a {@link List} representing the revised sequence of elements. Must not be {@code null}. + * @param includeEqualParts a {@link boolean} representing whether to include equal parts in the resulting patch. * @return The patch describing the difference between the original and revised sequences. Never {@code null}. */ public static Patch diff(List original, List revised, boolean includeEqualParts) { @@ -89,9 +89,9 @@ public static Patch diff(List original, List revised, boolean inclu /** * Computes the difference between two strings using the default diff algorithm. * - * @param sourceText a {@link String} represnting the original string. Must not be {@code null}. - * @param targetText a {@link String} represnting the revised string. Must not be {@code null}. - * @param progress a {@link DiffAlgorithmListener} represnting the progress listener. Can be {@code null}. + * @param sourceText a {@link String} representing the original string. Must not be {@code null}. + * @param targetText a {@link String} representing the revised string. Must not be {@code null}. + * @param progress a {@link DiffAlgorithmListener} representing the progress listener. Can be {@code null}. * @return The patch describing the difference between the original and revised strings. Never {@code null}. */ public static Patch diff(String sourceText, String targetText, @@ -105,9 +105,9 @@ public static Patch diff(String sourceText, String targetText, * Computes the difference between the original and revised list of elements * with default diff algorithm * - * @param source a {@link List} represnting the original text. Must not be {@code null}. - * @param target a {@link List} represnting the revised text. Must not be {@code null}. - * @param equalizer a {@link BiPredicate} represnting the equalizer object to replace the default compare + * @param source a {@link List} representing the original text. Must not be {@code null}. + * @param target a {@link List} representing the revised text. Must not be {@code null}. + * @param equalizer a {@link BiPredicate} representing the equalizer object to replace the default compare * algorithm (Object.equals). If {@code null} the default equalizer of the * default algorithm is used. * @return The patch describing the difference between the original and @@ -131,10 +131,10 @@ public static Patch diff(List original, List revised, * Computes the difference between the original and revised list of elements * with default diff algorithm * - * @param original a {@link List} represnting the original text. Must not be {@code null}. - * @param revised a {@link List} represnting the revised text. Must not be {@code null}. - * @param algorithm a {@link DiffAlgorithmI} represnting the diff algorithm. Must not be {@code null}. - * @param progress a {@link DiffAlgorithmListener} represnting the diff algorithm listener. + * @param original a {@link List} representing the original text. Must not be {@code null}. + * @param revised a {@link List} representing the revised text. Must not be {@code null}. + * @param algorithm a {@link DiffAlgorithmI} representing the diff algorithm. Must not be {@code null}. + * @param progress a {@link DiffAlgorithmListener} representing the diff algorithm listener. * @param includeEqualParts Include equal data parts into the patch. * @return The patch describing the difference between the original and * revised sequences. Never {@code null}. @@ -154,9 +154,9 @@ public static Patch diff(List original, List revised, * Computes the difference between the original and revised list of elements * with default diff algorithm * - * @param original a {@link List} represnting the original text. Must not be {@code null}. - * @param revised a {@link List} represnting the revised text. Must not be {@code null}. - * @param algorithm a {@link DiffAlgorithmI} represnting the diff algorithm. Must not be {@code null}. + * @param original a {@link List} representing the original text. Must not be {@code null}. + * @param revised a {@link List} representing the revised text. Must not be {@code null}. + * @param algorithm a {@link DiffAlgorithmI} representing the diff algorithm. Must not be {@code null}. * @return The patch describing the difference between the original and * revised sequences. Never {@code null}. */ @@ -169,8 +169,8 @@ public static Patch diff(List original, List revised, DiffAlgorithm * "trick" to make out of texts lists of characters, like DiffRowGenerator * does and merges those changes at the end together again. * - * @param original a {@link String} represnting the original text. Must not be {@code null}. - * @param revised a {@link String} represnting the revised text. Must not be {@code null}. + * @param original a {@link String} representing the original text. Must not be {@code null}. + * @param revised a {@link String} representing the revised text. Must not be {@code null}. * @return The patch describing the difference between the original and * revised sequences. Never {@code null}. */ @@ -194,8 +194,8 @@ public static Patch diffInline(String original, String revised) { /** * Applies the given patch to the original list and returns the revised list. * - * @param original a {@link List} represnting the original list. - * @param patch a {@link List} represnting the patch to apply. + * @param original a {@link List} representing the original list. + * @param patch a {@link List} representing the patch to apply. * @return the revised list. * @throws PatchFailedException if the patch cannot be applied. */ @@ -207,8 +207,8 @@ public static List patch(List original, Patch patch) /** * Applies the given patch to the revised list and returns the original list. * - * @param revised a {@link List} represnting the revised list. - * @param patch a {@link Patch} represnting the patch to apply. + * @param revised a {@link List} representing the revised list. + * @param patch a {@link Patch} representing the patch to apply. * @return the original list. * @throws PatchFailedException if the patch cannot be applied. */ From d15ecbb5683a29d94910fb3d2d08148398809346 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Tue, 25 Mar 2025 23:16:19 +0700 Subject: [PATCH 27/29] Fix typo javadoc --- .../java/com/github/difflib/algorithm/jgit/HistogramDiff.java | 2 +- .../com/github/difflib/algorithm/DiffAlgorithmListener.java | 2 +- .../src/main/java/com/github/difflib/patch/Chunk.java | 2 +- .../src/main/java/com/github/difflib/patch/Patch.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/java-diff-utils-jgit/src/main/java/com/github/difflib/algorithm/jgit/HistogramDiff.java b/java-diff-utils-jgit/src/main/java/com/github/difflib/algorithm/jgit/HistogramDiff.java index e3f6cd5b..6d15f609 100644 --- a/java-diff-utils-jgit/src/main/java/com/github/difflib/algorithm/jgit/HistogramDiff.java +++ b/java-diff-utils-jgit/src/main/java/com/github/difflib/algorithm/jgit/HistogramDiff.java @@ -28,7 +28,7 @@ import org.eclipse.jgit.diff.SequenceComparator; /** - * HistorgramDiff using JGit - Library. This one is much more performant than the orginal Myers + * HistorgramDiff using JGit - Library. This one is much more performant than the original Myers * implementation. * * @author toben diff --git a/java-diff-utils/src/main/java/com/github/difflib/algorithm/DiffAlgorithmListener.java b/java-diff-utils/src/main/java/com/github/difflib/algorithm/DiffAlgorithmListener.java index 37d51813..a141d7be 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/algorithm/DiffAlgorithmListener.java +++ b/java-diff-utils/src/main/java/com/github/difflib/algorithm/DiffAlgorithmListener.java @@ -24,7 +24,7 @@ public interface DiffAlgorithmListener { /** * This is a step within the diff algorithm. Due to different implementations the value - * is not strict incrementing to the max and is not garantee to reach the max. It could + * is not strict incrementing to the max and is not guarantee to reach the max. It could * stop before. * @param value * @param max diff --git a/java-diff-utils/src/main/java/com/github/difflib/patch/Chunk.java b/java-diff-utils/src/main/java/com/github/difflib/patch/Chunk.java index 7e55ac0d..50054074 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/patch/Chunk.java +++ b/java-diff-utils/src/main/java/com/github/difflib/patch/Chunk.java @@ -26,7 +26,7 @@ * *

* Text is represented as Object[] because the diff engine is - * capable of handling more than plain ascci. In fact, arrays or lists of any + * capable of handling more than plain ascii. In fact, arrays or lists of any * type that implements {@link java.lang.Object#hashCode hashCode()} and * {@link java.lang.Object#equals equals()} correctly can be subject to * differencing using this library. diff --git a/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java b/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java index aaff7d94..305f2de7 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java +++ b/java-diff-utils/src/main/java/com/github/difflib/patch/Patch.java @@ -224,7 +224,7 @@ private int findPositionWithFuzzAndMoreDelta(PatchApplyingContext ctx, Abstra private ConflictOutput conflictOutput = CONFLICT_PRODUCES_EXCEPTION; /** - * Alter normal conflict output behaviour to e.g. inclide some conflict + * Alter normal conflict output behaviour to e.g. include some conflict * statements in the result, like git does it. */ public Patch withConflictOutput(ConflictOutput conflictOutput) { From 8e8ba4793965b02dc6d1196045edbf2634c7d4a1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 May 2025 18:52:05 +0000 Subject: [PATCH 28/29] Bump org.eclipse.jgit:org.eclipse.jgit in /java-diff-utils-jgit Bumps [org.eclipse.jgit:org.eclipse.jgit](https://github.com/eclipse-jgit/jgit) from 5.13.3.202401111512-r to 7.2.1.202505142326-r. - [Commits](https://github.com/eclipse-jgit/jgit/compare/v5.13.3.202401111512-r...v7.2.1.202505142326-r) --- updated-dependencies: - dependency-name: org.eclipse.jgit:org.eclipse.jgit dependency-version: 7.2.1.202505142326-r dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- java-diff-utils-jgit/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 9e3f2b96..93e12d59 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jgit org.eclipse.jgit - 5.13.3.202401111512-r + 7.2.1.202505142326-r com.googlecode.javaewah From 755024eceec4246e3453dea5e157b3b04ad69cf3 Mon Sep 17 00:00:00 2001 From: tw Date: Sat, 24 May 2025 23:11:54 +0200 Subject: [PATCH 29/29] downgrade jgit --- java-diff-utils-jgit/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-diff-utils-jgit/pom.xml b/java-diff-utils-jgit/pom.xml index 93e12d59..5b01d2c5 100644 --- a/java-diff-utils-jgit/pom.xml +++ b/java-diff-utils-jgit/pom.xml @@ -18,9 +18,10 @@ test + org.eclipse.jgit org.eclipse.jgit - 7.2.1.202505142326-r + 5.13.3.202401111512-r com.googlecode.javaewah