From cb2cc6f79e69136df585befa34c6c0cf0fe84e3e Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Mon, 13 Mar 2023 15:01:55 +0800 Subject: [PATCH 1/4] Add generateOriginalAndDiff method and test class --- .../com/github/difflib/UnifiedDiffUtils.java | 143 +++++++++++++++++- .../difflib/examples/OriginalAndDiffTest.java | 39 +++++ 2 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java 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 06a61073..b65550b9 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 @@ -19,11 +19,11 @@ import com.github.difflib.patch.Chunk; import com.github.difflib.patch.AbstractDelta; import com.github.difflib.patch.Patch; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; + +import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; +import java.util.stream.Collectors; /** * @@ -313,4 +313,141 @@ private static List getDeltaText(AbstractDelta delta) { private UnifiedDiffUtils() { } + + /** + * Compare the differences between two files and return to the original file and diff format + * + * (This method compares the original file with the comparison file to obtain a diff, and inserts the diff into the corresponding position of the original file. + * You can see all the differences and unmodified places from the original file. + * Also, this will be very easy and useful for making side-by-side comparison display applications, + * for example, if you use diff2html (https://github.com/rtfpessoa/diff2html#usage) + * Wait for tools to display your differences on html pages, you only need to insert the return value into your js code) + * + * @param original Original file content + * @param revised revised file content + * + */ + public static List generateOriginalAndDiff(List original, List revised) { + return generateOriginalAndDiff(original, revised, null, null); + } + + + /** + * Compare the differences between two files and return to the original file and diff format + * + * (This method compares the original file with the comparison file to obtain a diff, and inserts the diff into the corresponding position of the original file. + * You can see all the differences and unmodified places from the original file. + * Also, this will be very easy and useful for making side-by-side comparison display applications, + * for example, if you use diff2html (https://github.com/rtfpessoa/diff2html#usage) + * Wait for tools to display your differences on html pages, you only need to insert the return value into your js code) + * + * @param original Original file content + * @param revised revised file content + * @param originalFileName Original file name + * @param revisedFileName revised file name + */ + public static List generateOriginalAndDiff(List original, List revised, String originalFileName, String revisedFileName) { + originalFileName = originalFileName == null ? "original" : originalFileName; + revisedFileName = revisedFileName == null ? "revised" : revisedFileName; + Patch patch = com.github.difflib.DiffUtils.diff(original, revised); + List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); + if (unifiedDiff.size() == 0) { + unifiedDiff.add("--- " + originalFileName); + unifiedDiff.add("+++ " + revisedFileName); + unifiedDiff.add("@@ -0,0 +0,0 @@"); + } else if (unifiedDiff.size() >= 3 && !unifiedDiff.get(2).contains("@@ -1,")) { + unifiedDiff.set(1, unifiedDiff.get(1)); + unifiedDiff.add(2, "@@ -0,0 +0,0 @@"); + } + List original1 = original.stream().map(v -> " " + v).collect(Collectors.toList()); + return insertOrig(original1, unifiedDiff); + } + + + //Insert the diff format to the original file + private static List insertOrig(List original, List unifiedDiff) { + List result = new ArrayList<>(); + List> diffList = new ArrayList<>(); + List d = new ArrayList<>(); + for (int i = 0; i < unifiedDiff.size(); i++) { + String u = unifiedDiff.get(i); + if (u.startsWith("@@") && !"@@ -0,0 +0,0 @@".equals(u) && !u.contains("@@ -1,")) { + List twoList = new ArrayList<>(); + twoList.addAll(d); + diffList.add(twoList); + d.clear(); + d.add(u); + continue; + } + if (i == unifiedDiff.size() - 1) { + d.add(u); + List twoList = new ArrayList<>(); + twoList.addAll(d); + diffList.add(twoList); + d.clear(); + break; + } + d.add(u); + } + for (int i = 0; i < diffList.size(); i++) { + List diff = diffList.get(i); + List nexDiff = i == diffList.size() - 1 ? null : diffList.get(i + 1); + String simb = i == 0 ? diff.get(2) : diff.get(0); + String nexSimb = nexDiff == null ? null : nexDiff.get(0); + insert(result, diff); + Map map = getRowMap(simb); + if (null != nexSimb) { + Map nexMap = getRowMap(nexSimb); + int start = 0; + if (map.get("orgRow") != 0) { + start = map.get("orgRow") + map.get("orgDel") - 1; + } + int end = nexMap.get("revRow") - 2; + insert(result, getOrigList(original, start, end)); + } + + if (simb.contains("@@ -1,") && null == nexSimb && map.get("orgDel") != original.size()) { + insert(result, getOrigList(original, 0, original.size() - 1)); + } else if (null == nexSimb && (map.get("orgRow") + map.get("orgDel") - 1) < original.size()) { + int start = (map.get("orgRow") + map.get("orgDel") - 1); + start = start == -1 ? 0 : start; + insert(result, getOrigList(original, start, original.size() - 1)); + } + } + return result; + } + + //Insert the unchanged content in the source file into result + private static void insert(List result, List noChangeContent) { + for (String ins : noChangeContent) { + result.add(ins); + } + } + + //Parse the line containing @@ to get the modified line number to delete or add a few lines + private static Map getRowMap(String str) { + Map map = new HashMap<>(); + if (str.startsWith("@@")) { + String[] sp = str.split(" "); + String org = sp[1]; + String[] orgSp = org.split(","); + map.put("orgRow", Integer.valueOf(orgSp[0].substring(1))); + map.put("orgDel", Integer.valueOf(orgSp[1])); + String[] revSp = org.split(","); + map.put("revRow", Integer.valueOf(revSp[0].substring(1))); + map.put("revAdd", Integer.valueOf(revSp[1])); + } + return map; + } + + //Get the specified part of the line from the original file + private static List getOrigList(List original1, int start, int end) { + List list = new ArrayList<>(); + if (original1.size() >= 1 && start <= end && end < original1.size()) { + for (; start <= end; start++) { + list.add(original1.get(start)); + } + } + return list; + } } diff --git a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java new file mode 100644 index 00000000..060fb47f --- /dev/null +++ b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java @@ -0,0 +1,39 @@ +package com.github.difflib.examples; + +import com.github.difflib.TestConstants; +import com.github.difflib.UnifiedDiffUtils; +import org.junit.jupiter.api.Test; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import static java.util.stream.Collectors.joining; + +public class OriginalAndDiffTest { + + @Test + public void testGenerateOriginalAndDiff() throws IOException { + List origLines = fileToLines(TestConstants.MOCK_FOLDER + "original.txt"); + List revLines = fileToLines(TestConstants.MOCK_FOLDER + "revised.txt"); + + List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines,revLines); + System.out.println(originalAndDiff.stream().collect(joining("\n"))); + } + + public static List fileToLines(String filename) throws FileNotFoundException, IOException { + List lines = new ArrayList<>(); + String line = ""; + try (BufferedReader in = new BufferedReader(new FileReader(filename))) { + while ((line = in.readLine()) != null) { + lines.add(line); + } + } + return lines; + } + + +} From e7910910693d60eb82c0f08a7ae0429993c155c0 Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Tue, 14 Mar 2023 10:27:32 +0800 Subject: [PATCH 2/4] Add generateOriginalAndDiff method and test class.I split long code into short methods, changed ambiguous variable names to explicit variable names --- .../com/github/difflib/UnifiedDiffUtils.java | 42 +++++++++++-------- .../difflib/examples/OriginalAndDiffTest.java | 2 - 2 files changed, 25 insertions(+), 19 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 b65550b9..575a30e5 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 @@ -20,7 +20,11 @@ import com.github.difflib.patch.AbstractDelta; import com.github.difflib.patch.Patch; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; @@ -351,7 +355,7 @@ public static List generateOriginalAndDiff(List original, List patch = com.github.difflib.DiffUtils.diff(original, revised); List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); - if (unifiedDiff.size() == 0) { + if (unifiedDiff.isEmpty()) { unifiedDiff.add("--- " + originalFileName); unifiedDiff.add("+++ " + revisedFileName); unifiedDiff.add("@@ -0,0 +0,0 @@"); @@ -359,8 +363,8 @@ public static List generateOriginalAndDiff(List original, List original1 = original.stream().map(v -> " " + v).collect(Collectors.toList()); - return insertOrig(original1, unifiedDiff); + List originalWithPrefix = original.stream().map(v -> " " + v).collect(Collectors.toList()); + return insertOrig(originalWithPrefix, unifiedDiff); } @@ -368,27 +372,33 @@ public static List generateOriginalAndDiff(List original, List insertOrig(List original, List unifiedDiff) { List result = new ArrayList<>(); List> diffList = new ArrayList<>(); - List d = new ArrayList<>(); + List diff = new ArrayList<>(); for (int i = 0; i < unifiedDiff.size(); i++) { String u = unifiedDiff.get(i); if (u.startsWith("@@") && !"@@ -0,0 +0,0 @@".equals(u) && !u.contains("@@ -1,")) { List twoList = new ArrayList<>(); - twoList.addAll(d); + twoList.addAll(diff); diffList.add(twoList); - d.clear(); - d.add(u); + diff.clear(); + diff.add(u); continue; } if (i == unifiedDiff.size() - 1) { - d.add(u); + diff.add(u); List twoList = new ArrayList<>(); - twoList.addAll(d); + twoList.addAll(diff); diffList.add(twoList); - d.clear(); + diff.clear(); break; } - d.add(u); + diff.add(u); } + insertOrig(diffList,result,original); + return result; + } + + //Insert the diff format to the original file + private static void insertOrig(List> diffList, List result,List original) { for (int i = 0; i < diffList.size(); i++) { List diff = diffList.get(i); List nexDiff = i == diffList.size() - 1 ? null : diffList.get(i + 1); @@ -405,7 +415,6 @@ private static List insertOrig(List original, List unifi int end = nexMap.get("revRow") - 2; insert(result, getOrigList(original, start, end)); } - if (simb.contains("@@ -1,") && null == nexSimb && map.get("orgDel") != original.size()) { insert(result, getOrigList(original, 0, original.size() - 1)); } else if (null == nexSimb && (map.get("orgRow") + map.get("orgDel") - 1) < original.size()) { @@ -414,7 +423,6 @@ private static List insertOrig(List original, List unifi insert(result, getOrigList(original, start, original.size() - 1)); } } - return result; } //Insert the unchanged content in the source file into result @@ -441,11 +449,11 @@ private static Map getRowMap(String str) { } //Get the specified part of the line from the original file - private static List getOrigList(List original1, int start, int end) { + private static List getOrigList(List originalWithPrefix, int start, int end) { List list = new ArrayList<>(); - if (original1.size() >= 1 && start <= end && end < original1.size()) { + if (originalWithPrefix.size() >= 1 && start <= end && end < originalWithPrefix.size()) { for (; start <= end; start++) { - list.add(original1.get(start)); + list.add(originalWithPrefix.get(start)); } } return list; diff --git a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java index 060fb47f..62057cc7 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java @@ -34,6 +34,4 @@ public static List fileToLines(String filename) throws FileNotFoundExcep } return lines; } - - } From 61407b49c39ae6aa2442f917ae038c78dd7d32a1 Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Tue, 14 Mar 2023 11:02:32 +0800 Subject: [PATCH 3/4] fixes #164 --- .../java/com/github/difflib/UnifiedDiffUtils.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 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 575a30e5..c5e1d103 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 @@ -351,9 +351,13 @@ public static List generateOriginalAndDiff(List original, List generateOriginalAndDiff(List original, List revised, String originalFileName, String revisedFileName) { - originalFileName = originalFileName == null ? "original" : originalFileName; - revisedFileName = revisedFileName == null ? "revised" : revisedFileName; - Patch patch = com.github.difflib.DiffUtils.diff(original, revised); + if (originalFileName == null) { + originalFileName = "original"; + } + if (revisedFileName == null) { + revisedFileName = "revised"; + } + Patch patch = DiffUtils.diff(original, revised); List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); if (unifiedDiff.isEmpty()) { unifiedDiff.add("--- " + originalFileName); @@ -367,7 +371,6 @@ public static List generateOriginalAndDiff(List original, List insertOrig(List original, List unifiedDiff) { List result = new ArrayList<>(); From 7d9d1ca2f6b059ebfb1faacd0c5e2933f34f9b35 Mon Sep 17 00:00:00 2001 From: xutao <1506085843@qq.com> Date: Wed, 22 Mar 2023 10:07:37 +0800 Subject: [PATCH 4/4] fix build issues --- .../com/github/difflib/UnifiedDiffUtils.java | 27 ++++++++++--------- .../difflib/examples/OriginalAndDiffTest.java | 15 ++++++++--- 2 files changed, 26 insertions(+), 16 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 c5e1d103..e926560d 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 @@ -351,17 +351,19 @@ public static List generateOriginalAndDiff(List original, List generateOriginalAndDiff(List original, List revised, String originalFileName, String revisedFileName) { - if (originalFileName == null) { - originalFileName = "original"; + String originalFileNameTemp = originalFileName; + String revisedFileNameTemp = originalFileName; + if (originalFileNameTemp == null) { + originalFileNameTemp = "original"; } - if (revisedFileName == null) { - revisedFileName = "revised"; + if (revisedFileNameTemp == null) { + revisedFileNameTemp = "revised"; } Patch patch = DiffUtils.diff(original, revised); - List unifiedDiff = generateUnifiedDiff(originalFileName, revisedFileName, original, patch, 0); + List unifiedDiff = generateUnifiedDiff(originalFileNameTemp, revisedFileNameTemp, original, patch, 0); if (unifiedDiff.isEmpty()) { - unifiedDiff.add("--- " + originalFileName); - unifiedDiff.add("+++ " + revisedFileName); + unifiedDiff.add("--- " + originalFileNameTemp); + unifiedDiff.add("+++ " + revisedFileNameTemp); unifiedDiff.add("@@ -0,0 +0,0 @@"); } else if (unifiedDiff.size() >= 3 && !unifiedDiff.get(2).contains("@@ -1,")) { unifiedDiff.set(1, unifiedDiff.get(1)); @@ -396,12 +398,12 @@ private static List insertOrig(List original, List unifi } diff.add(u); } - insertOrig(diffList,result,original); + insertOrig(diffList, result, original); return result; } //Insert the diff format to the original file - private static void insertOrig(List> diffList, List result,List original) { + private static void insertOrig(List> diffList, List result, List original) { for (int i = 0; i < diffList.size(); i++) { List diff = diffList.get(i); List nexDiff = i == diffList.size() - 1 ? null : diffList.get(i + 1); @@ -421,7 +423,7 @@ private static void insertOrig(List> diffList, List result, if (simb.contains("@@ -1,") && null == nexSimb && map.get("orgDel") != original.size()) { insert(result, getOrigList(original, 0, original.size() - 1)); } else if (null == nexSimb && (map.get("orgRow") + map.get("orgDel") - 1) < original.size()) { - int start = (map.get("orgRow") + map.get("orgDel") - 1); + int start = map.get("orgRow") + map.get("orgDel") - 1; start = start == -1 ? 0 : start; insert(result, getOrigList(original, start, original.size() - 1)); } @@ -455,8 +457,9 @@ private static Map getRowMap(String str) { private static List getOrigList(List originalWithPrefix, int start, int end) { List list = new ArrayList<>(); if (originalWithPrefix.size() >= 1 && start <= end && end < originalWithPrefix.size()) { - for (; start <= end; start++) { - list.add(originalWithPrefix.get(start)); + int startTemp = start; + for (; startTemp <= end; startTemp++) { + list.add(originalWithPrefix.get(startTemp)); } } return list; diff --git a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java index 62057cc7..7f2d3b29 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/examples/OriginalAndDiffTest.java @@ -12,15 +12,22 @@ import java.util.List; import static java.util.stream.Collectors.joining; +import static org.junit.jupiter.api.Assertions.fail; public class OriginalAndDiffTest { @Test - public void testGenerateOriginalAndDiff() throws IOException { - List origLines = fileToLines(TestConstants.MOCK_FOLDER + "original.txt"); - List revLines = fileToLines(TestConstants.MOCK_FOLDER + "revised.txt"); + public void testGenerateOriginalAndDiff() { + List origLines = null; + List revLines = null; + try { + origLines = fileToLines(TestConstants.MOCK_FOLDER + "original.txt"); + revLines = fileToLines(TestConstants.MOCK_FOLDER + "revised.txt"); + } catch (IOException e) { + fail(e.getMessage()); + } - List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines,revLines); + List originalAndDiff = UnifiedDiffUtils.generateOriginalAndDiff(origLines, revLines); System.out.println(originalAndDiff.stream().collect(joining("\n"))); }