From 182cf8328014c2624aea52b395db3495ed7e71c9 Mon Sep 17 00:00:00 2001 From: Javier Ortiz Bultron Date: Wed, 5 Sep 2018 09:44:41 -0500 Subject: [PATCH 1/2] Fix parsing issue #27 --- .../diffparser/unified/ParserState.java | 18 +- .../diffparser/unified/SvnDiffTest.java | 182 +++++++++++------- .../reflectoring/diffparser/unified/svn2.diff | 70 +++++++ 3 files changed, 191 insertions(+), 79 deletions(-) create mode 100644 src/test/resources/io/reflectoring/diffparser/unified/svn2.diff diff --git a/src/main/java/io/reflectoring/diffparser/unified/ParserState.java b/src/main/java/io/reflectoring/diffparser/unified/ParserState.java index b695ecb..f0aedfd 100644 --- a/src/main/java/io/reflectoring/diffparser/unified/ParserState.java +++ b/src/main/java/io/reflectoring/diffparser/unified/ParserState.java @@ -251,11 +251,12 @@ protected boolean matchesFromLinePattern(String line) { protected boolean matchesToLinePattern(String line) { return line.startsWith("+"); - } + } - protected boolean matchesHunkStartPattern(String line) { - return LINE_RANGE_PATTERN.matcher(line).matches(); - } + protected boolean matchesHunkStartPattern(String line) + { + return LINE_RANGE_PATTERN.matcher(line).matches(); + } protected boolean matchesEndPattern(String line, ParseWindow window) { if ("".equals(line.trim())) { @@ -282,14 +283,15 @@ protected boolean matchesEndPattern(String line, ParseWindow window) { // some diff tools like "svn diff" do not put an empty line between two diffs // we add that empty line and call the method again String nextFromFileLine = window.getFutureLine(3); - if(nextFromFileLine != null && matchesFromFilePattern(nextFromFileLine)){ + if (nextFromFileLine != null + && (matchesFromFilePattern(nextFromFileLine) + || matchesToFilePattern(nextFromFileLine))) + { window.addLine(1, ""); return matchesEndPattern(line, window); }else{ return false; } } - } - - + } } diff --git a/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java b/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java index 67f5ab9..6530904 100644 --- a/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java +++ b/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java @@ -1,61 +1,100 @@ package io.reflectoring.diffparser.unified; +import java.io.InputStream; +import java.util.List; + +import org.testng.annotations.Test; + import io.reflectoring.diffparser.api.DiffParser; import io.reflectoring.diffparser.api.UnifiedDiffParser; -import junit.framework.Assert; -import org.testng.annotations.Test; import io.reflectoring.diffparser.api.model.Diff; import io.reflectoring.diffparser.api.model.Hunk; import io.reflectoring.diffparser.api.model.Line; - -import java.io.InputStream; -import java.util.List; +import junit.framework.Assert; /** * Tests the DiffParser with a diff created by the "svn diff" command. */ -public class SvnDiffTest { - - @Test - public void testParse() throws Exception { - // given - DiffParser parser = new UnifiedDiffParser(); - InputStream in = getClass().getResourceAsStream("svn.diff"); - - // when - List diffs = parser.parse(in); - - // then - Assert.assertNotNull(diffs); - Assert.assertEquals(2, diffs.size()); - - Diff diff1 = diffs.get(0); - Assert.assertEquals("UnifiedDiffParser.java", diff1.getFromFileName()); - Assert.assertEquals("UnifiedDiffParser.java", diff1.getToFileName()); - Assert.assertEquals(1, diff1.getHunks().size()); - - List headerLines = diff1.getHeaderLines(); - Assert.assertEquals(2, headerLines.size()); - - Hunk hunk1 = diff1.getHunks().get(0); - Assert.assertEquals(73, hunk1.getFromFileRange().getLineStart()); - Assert.assertEquals(13, hunk1.getFromFileRange().getLineCount()); - Assert.assertEquals(73, hunk1.getToFileRange().getLineStart()); - Assert.assertEquals(13, hunk1.getToFileRange().getLineCount()); - - List lines = hunk1.getLines(); - Assert.assertEquals(16, lines.size()); - Assert.assertEquals(Line.LineType.TO, lines.get(3).getLineType()); - Assert.assertEquals(Line.LineType.FROM, lines.get(7).getLineType()); - Assert.assertEquals(Line.LineType.TO, lines.get(8).getLineType()); - - } - - @Test - public void testParse_WhenHunkRangeLineCountNotSpecified_ShouldSetHunkRangeLineCountToOne() throws Exception { - // given - DiffParser parser = new UnifiedDiffParser(); - String in = "" +public class SvnDiffTest +{ + + @Test + public void testParse() throws Exception + { + // given + DiffParser parser = new UnifiedDiffParser(); + InputStream in = getClass().getResourceAsStream("svn.diff"); + + // when + List diffs = parser.parse(in); + + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(2, diffs.size()); + + Diff diff1 = diffs.get(0); + Assert.assertEquals("UnifiedDiffParser.java", diff1.getFromFileName()); + Assert.assertEquals("UnifiedDiffParser.java", diff1.getToFileName()); + Assert.assertEquals(1, diff1.getHunks().size()); + + List headerLines = diff1.getHeaderLines(); + Assert.assertEquals(2, headerLines.size()); + + Hunk hunk1 = diff1.getHunks().get(0); + Assert.assertEquals(73, hunk1.getFromFileRange().getLineStart()); + Assert.assertEquals(13, hunk1.getFromFileRange().getLineCount()); + Assert.assertEquals(73, hunk1.getToFileRange().getLineStart()); + Assert.assertEquals(13, hunk1.getToFileRange().getLineCount()); + + List lines = hunk1.getLines(); + Assert.assertEquals(16, lines.size()); + Assert.assertEquals(Line.LineType.TO, lines.get(3).getLineType()); + Assert.assertEquals(Line.LineType.FROM, lines.get(7).getLineType()); + Assert.assertEquals(Line.LineType.TO, lines.get(8).getLineType()); + + // given + in = getClass().getResourceAsStream("svn2.diff"); + + // when + diffs = parser.parse(in); + + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(2, diffs.size()); + + diff1 = diffs.get(0); + Assert.assertEquals("MyClass1.java", diff1.getFromFileName()); + Assert.assertEquals("MyClass1.java", diff1.getToFileName()); + Assert.assertEquals(1, diff1.getHunks().size()); + + headerLines = diff1.getHeaderLines(); + Assert.assertEquals(2, headerLines.size()); + + hunk1 = diff1.getHunks().get(0); + Assert.assertEquals(0, hunk1.getFromFileRange().getLineStart()); + Assert.assertEquals(0, hunk1.getFromFileRange().getLineCount()); + Assert.assertEquals(1, hunk1.getToFileRange().getLineStart()); + Assert.assertEquals(30, hunk1.getToFileRange().getLineCount()); + + Diff diff2 = diffs.get(1); + Assert.assertEquals("MyClass2.java", diff2.getFromFileName()); + Assert.assertEquals("MyClass2.java", diff2.getToFileName()); + Assert.assertEquals(1, diff2.getHunks().size()); + + hunk1 = diff2.getHunks().get(0); + lines = hunk1.getLines(); + Assert.assertEquals(30, lines.size()); + Assert.assertEquals(Line.LineType.TO, lines.get(3).getLineType()); + Assert.assertEquals(Line.LineType.TO, lines.get(7).getLineType()); + Assert.assertEquals(Line.LineType.TO, lines.get(8).getLineType()); + } + + @Test + public void testParse_WhenHunkRangeLineCountNotSpecified_ShouldSetHunkRangeLineCountToOne() throws Exception + { + // given + DiffParser parser = new UnifiedDiffParser(); + String in = "" + "--- from 2015-12-21 17:53:29.082877088 -0500\n" + "+++ to 2015-12-21 08:41:52.663714666 -0500\n" + "@@ -10 +10 @@\n" @@ -63,40 +102,41 @@ public void testParse_WhenHunkRangeLineCountNotSpecified_ShouldSetHunkRangeLineC + "+to\n" + "\n"; - // when - List diffs = parser.parse(in.getBytes()); + // when + List diffs = parser.parse(in.getBytes()); - // then - Assert.assertNotNull(diffs); - Assert.assertEquals(1, diffs.size()); + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(1, diffs.size()); - Diff diff1 = diffs.get(0); - Assert.assertEquals(1, diff1.getHunks().size()); + Diff diff1 = diffs.get(0); + Assert.assertEquals(1, diff1.getHunks().size()); - Hunk hunk1 = diff1.getHunks().get(0); - Assert.assertEquals(1, hunk1.getFromFileRange().getLineCount()); - Assert.assertEquals(1, hunk1.getToFileRange().getLineCount()); - } + Hunk hunk1 = diff1.getHunks().get(0); + Assert.assertEquals(1, hunk1.getFromFileRange().getLineCount()); + Assert.assertEquals(1, hunk1.getToFileRange().getLineCount()); + } - @Test - public void testParse_WhenInputDoesNotEndWithEmptyLine_ShouldTransitionToEndState() throws Exception { - // given - DiffParser parser = new UnifiedDiffParser(); - String in = "" + @Test + public void testParse_WhenInputDoesNotEndWithEmptyLine_ShouldTransitionToEndState() throws Exception + { + // given + DiffParser parser = new UnifiedDiffParser(); + String in = "" + "--- from 2015-12-21 17:53:29.082877088 -0500\n" + "+++ to 2015-12-21 08:41:52.663714666 -0500\n" + "@@ -10,1 +10,1 @@\n" + "-from\n" + "+to\n"; - // when - List diffs = parser.parse(in.getBytes()); + // when + List diffs = parser.parse(in.getBytes()); - // then - Assert.assertNotNull(diffs); - Assert.assertEquals(1, diffs.size()); + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(1, diffs.size()); - Diff diff1 = diffs.get(0); - Assert.assertEquals(1, diff1.getHunks().size()); - } + Diff diff1 = diffs.get(0); + Assert.assertEquals(1, diff1.getHunks().size()); + } } diff --git a/src/test/resources/io/reflectoring/diffparser/unified/svn2.diff b/src/test/resources/io/reflectoring/diffparser/unified/svn2.diff new file mode 100644 index 0000000..8646069 --- /dev/null +++ b/src/test/resources/io/reflectoring/diffparser/unified/svn2.diff @@ -0,0 +1,70 @@ +Index: MyClass1.java +=================================================================== +--- MyClass1.java (nonexistent) ++++ MyClass1.java (working copy) +@@ -0,0 +1,30 @@ ++/* ++ * Copyright 2018 XXX ++ * All Rights Reserved ++ */ ++ ++package com.xxx; ++ ++/** ++ * ++ */ ++public class MyClass1 ++{ ++ @Override ++ public boolean equals(Object obj) ++ { ++ return super.equals(obj); ++ } ++ ++ @Override ++ public int hashCode() ++ { ++ return super.hashCode(); ++ } ++ ++ @Override ++ public String toString() ++ { ++ return super.toString(); ++ } ++} +Index: MyClass2.java +=================================================================== +--- MyClass2.java (nonexistent) ++++ MyClass2.java (working copy) +@@ -0,0 +1,30 @@ ++/* ++ * Copyright 2018 xxx ++ * All Rights Reserved ++ */ ++ ++package com.xxx; ++ ++/** ++ * ++ */ ++public class MyClass2 ++{ ++ @Override ++ public boolean equals(Object obj) ++ { ++ return super.equals(obj); ++ } ++ ++ @Override ++ public int hashCode() ++ { ++ return super.hashCode(); ++ } ++ ++ @Override ++ public String toString() ++ { ++ return super.toString(); ++ } ++} \ No newline at end of file From 42865466ab2c0442907e36ea5316a46f575adc60 Mon Sep 17 00:00:00 2001 From: Javier Ortiz Bultron Date: Fri, 7 Sep 2018 14:33:20 -0500 Subject: [PATCH 2/2] Reverted some formatting changes and simplified the fix. --- .../diffparser/unified/ParserState.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/main/java/io/reflectoring/diffparser/unified/ParserState.java b/src/main/java/io/reflectoring/diffparser/unified/ParserState.java index f0aedfd..ea21ce3 100644 --- a/src/main/java/io/reflectoring/diffparser/unified/ParserState.java +++ b/src/main/java/io/reflectoring/diffparser/unified/ParserState.java @@ -251,12 +251,12 @@ protected boolean matchesFromLinePattern(String line) { protected boolean matchesToLinePattern(String line) { return line.startsWith("+"); - } - + } + protected boolean matchesHunkStartPattern(String line) { - return LINE_RANGE_PATTERN.matcher(line).matches(); - } + return LINE_RANGE_PATTERN.matcher(line).matches(); + } protected boolean matchesEndPattern(String line, ParseWindow window) { if ("".equals(line.trim())) { @@ -280,18 +280,20 @@ protected boolean matchesEndPattern(String line, ParseWindow window) { // We reached the end of the stream. return true; } else { + if(line.trim().toLowerCase().startsWith("index")){ + return true; + } // some diff tools like "svn diff" do not put an empty line between two diffs // we add that empty line and call the method again String nextFromFileLine = window.getFutureLine(3); - if (nextFromFileLine != null - && (matchesFromFilePattern(nextFromFileLine) - || matchesToFilePattern(nextFromFileLine))) - { + if(nextFromFileLine != null && matchesFromFilePattern(nextFromFileLine)){ window.addLine(1, ""); return matchesEndPattern(line, window); }else{ return false; } } - } + } + + }