Skip to content

Commit 7203d48

Browse files
committed
mmoved header to inner processing to allow a header for each diff block
1 parent e413d79 commit 7203d48

File tree

2 files changed

+56
-24
lines changed

2 files changed

+56
-24
lines changed

java-diff-utils/src/main/java/com/github/difflib/unifieddiff/UnifiedDiffReader.java

Lines changed: 52 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -72,26 +72,45 @@ public final class UnifiedDiffReader {
7272
// [/^---\s/, from_file], [/^\+\+\+\s/, to_file], [/^@@\s+\-(\d+),?(\d+)?\s+\+(\d+),?(\d+)?\s@@/, chunk],
7373
// [/^-/, del], [/^\+/, add], [/^\\ No newline at end of file$/, eof]];
7474
private UnifiedDiff parse() throws IOException, UnifiedDiffParserException {
75-
String headerTxt = "";
76-
LOG.log(Level.FINE, "header parsing");
77-
String line = null;
78-
while (READER.ready()) {
79-
line = READER.readLine();
80-
LOG.log(Level.FINE, "parsing line {0}", line);
81-
if (DIFF_COMMAND.validLine(line) || INDEX.validLine(line)
82-
|| FROM_FILE.validLine(line) || TO_FILE.validLine(line)
83-
|| NEW_FILE_MODE.validLine(line)) {
84-
break;
85-
} else {
86-
headerTxt += line + "\n";
87-
}
88-
}
89-
if (!"".equals(headerTxt)) {
90-
data.setHeader(headerTxt);
91-
}
92-
75+
// String headerTxt = "";
76+
// LOG.log(Level.FINE, "header parsing");
77+
// String line = null;
78+
// while (READER.ready()) {
79+
// line = READER.readLine();
80+
// LOG.log(Level.FINE, "parsing line {0}", line);
81+
// if (DIFF_COMMAND.validLine(line) || INDEX.validLine(line)
82+
// || FROM_FILE.validLine(line) || TO_FILE.validLine(line)
83+
// || NEW_FILE_MODE.validLine(line)) {
84+
// break;
85+
// } else {
86+
// headerTxt += line + "\n";
87+
// }
88+
// }
89+
// if (!"".equals(headerTxt)) {
90+
// data.setHeader(headerTxt);
91+
// }
92+
93+
String line = READER.readLine();
9394
while (line != null) {
94-
if (!CHUNK.validLine(line)) {
95+
String headerTxt = "";
96+
LOG.log(Level.FINE, "header parsing");
97+
while (line != null) {
98+
LOG.log(Level.FINE, "parsing line {0}", line);
99+
if (validLine(line, DIFF_COMMAND, SIMILARITY_INDEX, INDEX,
100+
FROM_FILE, TO_FILE,
101+
RENAME_FROM, RENAME_TO,
102+
NEW_FILE_MODE, DELETED_FILE_MODE,
103+
CHUNK)) {
104+
break;
105+
} else {
106+
headerTxt += line + "\n";
107+
}
108+
line = READER.readLine();
109+
}
110+
if (!"".equals(headerTxt)) {
111+
data.setHeader(headerTxt);
112+
}
113+
if (line != null && !CHUNK.validLine(line)) {
95114
initFileIfNecessary();
96115
while (line != null && !CHUNK.validLine(line)) {
97116
if (!processLine(line, DIFF_COMMAND, SIMILARITY_INDEX, INDEX,
@@ -107,7 +126,7 @@ private UnifiedDiff parse() throws IOException, UnifiedDiffParserException {
107126
processLine(line, CHUNK);
108127
while ((line = READER.readLine()) != null) {
109128
line = checkForNoNewLineAtTheEndOfTheFile(line);
110-
129+
111130
if (!processLine(line, LINE_NORMAL, LINE_ADD, LINE_DEL)) {
112131
throw new UnifiedDiffParserException("expected data line not found");
113132
}
@@ -186,6 +205,19 @@ private boolean processLine(String line, UnifiedDiffLine... rules) throws Unifie
186205
return false;
187206
//throw new UnifiedDiffParserException("parsing error at line " + line);
188207
}
208+
209+
private boolean validLine(String line, UnifiedDiffLine ... rules) {
210+
if (line == null) {
211+
return false;
212+
}
213+
for (UnifiedDiffLine rule : rules) {
214+
if (rule.validLine(line)) {
215+
LOG.fine(" >>> accepted rule " + rule.toString());
216+
return true;
217+
}
218+
}
219+
return false;
220+
}
189221

190222
private void initFileIfNecessary() {
191223
if (!originalTxt.isEmpty() || !revisedTxt.isEmpty()) {

java-diff-utils/src/test/java/com/github/difflib/unifieddiff/UnifiedDiffReaderTest.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -370,18 +370,18 @@ public void testParseIssue122() throws IOException {
370370
UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff(
371371
UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue122.diff"));
372372

373-
assertThat(diff.getFiles().size()).isEqualTo(22);
373+
assertThat(diff.getFiles().size()).isEqualTo(1);
374374

375-
assertThat(diff.getFiles()).extracting(f -> f.getFromFile()).contains("rt/management/src/test/java/org/apache/cxf/management/jmx/MBServerConnectorFactoryTest.java");
375+
assertThat(diff.getFiles()).extracting(f -> f.getFromFile()).contains("coders/wpg.c");
376376
}
377377

378378
@Test
379379
public void testParseIssue123() throws IOException {
380380
UnifiedDiff diff = UnifiedDiffReader.parseUnifiedDiff(
381381
UnifiedDiffReaderTest.class.getResourceAsStream("problem_diff_issue123.diff"));
382382

383-
assertThat(diff.getFiles().size()).isEqualTo(22);
383+
assertThat(diff.getFiles().size()).isEqualTo(2);
384384

385-
assertThat(diff.getFiles()).extracting(f -> f.getFromFile()).contains("rt/management/src/test/java/org/apache/cxf/management/jmx/MBServerConnectorFactoryTest.java");
385+
assertThat(diff.getFiles()).extracting(f -> f.getFromFile()).contains("src/java/main/org/apache/zookeeper/server/FinalRequestProcessor.java");
386386
}
387387
}

0 commit comments

Comments
 (0)