39
39
public final class UnifiedDiffReader {
40
40
41
41
static final Pattern UNIFIED_DIFF_CHUNK_REGEXP = Pattern .compile ("^@@\\ s+-(?:(\\ d+)(?:,(\\ d+))?)\\ s+\\ +(?:(\\ d+)(?:,(\\ d+))?)\\ s+@@" );
42
+ static final Pattern TIMESTAMP_REGEXP = Pattern .compile ("(\\ d{4}-\\ d{2}-\\ d{2}[T ]\\ d{2}:\\ d{2}:\\ d{2}\\ .\\ d{3,})" );
42
43
43
44
private final InternalUnifiedDiffReader READER ;
44
45
private final UnifiedDiff data = new UnifiedDiff ();
@@ -49,9 +50,9 @@ public final class UnifiedDiffReader {
49
50
private final UnifiedDiffLine TO_FILE = new UnifiedDiffLine (true , "^\\ +\\ +\\ +\\ s" , this ::processToFile );
50
51
51
52
private final UnifiedDiffLine CHUNK = new UnifiedDiffLine (false , UNIFIED_DIFF_CHUNK_REGEXP , this ::processChunk );
52
- private final UnifiedDiffLine LINE_NORMAL = new UnifiedDiffLine ("^\\ s+ " , this ::processNormalLine );
53
+ private final UnifiedDiffLine LINE_NORMAL = new UnifiedDiffLine ("^\\ s" , this ::processNormalLine );
53
54
private final UnifiedDiffLine LINE_DEL = new UnifiedDiffLine ("^-" , this ::processDelLine );
54
- private final UnifiedDiffLine LINE_ADD = new UnifiedDiffLine ("^+" , this ::processAddLine );
55
+ private final UnifiedDiffLine LINE_ADD = new UnifiedDiffLine ("^\\ +" , this ::processAddLine );
55
56
56
57
private UnifiedDiffFile actualFile ;
57
58
@@ -81,20 +82,37 @@ private UnifiedDiff parse() throws IOException, UnifiedDiffParserException {
81
82
82
83
while (line != null ) {
83
84
if (!CHUNK .validLine (line )) {
84
- processLine (line , DIFF_COMMAND , INDEX , FROM_FILE , TO_FILE );
85
- } else {
86
- processLine (line , CHUNK );
85
+ initFileIfNecessary ();
86
+ while (!CHUNK .validLine (line )) {
87
+ if (processLine (line , DIFF_COMMAND , INDEX , FROM_FILE , TO_FILE ) == false ) {
88
+ throw new UnifiedDiffParserException ("expected file start line not found" );
89
+ }
90
+ line = READER .readLine ();
91
+ }
92
+ }
93
+ processLine (line , CHUNK );
94
+ while ((line = READER .readLine ()) != null ) {
95
+ if (processLine (line , LINE_NORMAL , LINE_ADD , LINE_DEL ) == false ) {
96
+ throw new UnifiedDiffParserException ("expected data line not found" );
97
+ }
98
+ if (originalTxt .size () == old_size && revisedTxt .size () == new_size ) {
99
+ finalizeChunk ();
100
+ break ;
101
+ }
87
102
}
88
103
line = READER .readLine ();
104
+ if (line == null || line .startsWith ("--" )) {
105
+ break ;
106
+ }
89
107
}
90
108
91
- finalizeChunk ();
92
-
93
- String tailTxt = "" ;
94
- while (READER .ready ()) {
95
- tailTxt += READER .readLine () + "\n " ;
109
+ if (READER .ready ()) {
110
+ String tailTxt = "" ;
111
+ while (READER .ready ()) {
112
+ tailTxt += READER .readLine () + "\n " ;
113
+ }
114
+ data .setTailTxt (tailTxt );
96
115
}
97
- data .setTailTxt (tailTxt );
98
116
99
117
return data ;
100
118
}
@@ -114,30 +132,31 @@ public static UnifiedDiff parseUnifiedDiff(InputStream stream) throws IOExceptio
114
132
return parser .parse ();
115
133
}
116
134
117
- private void processLine (String line , UnifiedDiffLine ... rules ) throws UnifiedDiffParserException {
135
+ private boolean processLine (String line , UnifiedDiffLine ... rules ) throws UnifiedDiffParserException {
118
136
for (UnifiedDiffLine rule : rules ) {
119
137
if (rule .processLine (line )) {
120
138
LOG .info (" >>> processed rule " + rule .toString ());
121
- return ;
139
+ return true ;
122
140
}
123
141
}
124
142
LOG .info (" >>> no rule matched " + line );
125
- throw new UnifiedDiffParserException ("parsing error at line " + line );
143
+ return false ;
144
+ //throw new UnifiedDiffParserException("parsing error at line " + line);
126
145
}
127
146
128
147
private void initFileIfNecessary () {
129
148
if (!originalTxt .isEmpty () || !revisedTxt .isEmpty ()) {
130
- finalizeChunk ();
131
- actualFile = null ;
149
+ throw new IllegalStateException ();
132
150
}
151
+ actualFile = null ;
133
152
if (actualFile == null ) {
134
153
actualFile = new UnifiedDiffFile ();
135
154
data .addFile (actualFile );
136
155
}
137
156
}
138
157
139
158
private void processDiff (MatchResult match , String line ) {
140
- initFileIfNecessary ();
159
+ // initFileIfNecessary();
141
160
LOG .log (Level .INFO , "start {0}" , line );
142
161
String [] fromTo = parseFileNames (READER .lastLine ());
143
162
actualFile .setFromFile (fromTo [0 ]);
@@ -181,7 +200,7 @@ private void processDelLine(MatchResult match, String line) {
181
200
}
182
201
183
202
private void processChunk (MatchResult match , String chunkStart ) {
184
- finalizeChunk ();
203
+ // finalizeChunk();
185
204
old_ln = toInteger (match , 1 , 1 );
186
205
old_size = toInteger (match , 2 , 0 );
187
206
new_ln = toInteger (match , 3 , 1 );
@@ -195,27 +214,43 @@ private void processChunk(MatchResult match, String chunkStart) {
195
214
}
196
215
197
216
private static Integer toInteger (MatchResult match , int group , int defValue ) throws NumberFormatException {
198
- return Integer .valueOf (Objects .toString ( match .group (group ) , "" + defValue ));
217
+ return Integer .valueOf (Objects .toString (match .group (group ), "" + defValue ));
199
218
}
200
219
201
220
private void processIndex (MatchResult match , String line ) {
202
- initFileIfNecessary ();
221
+ // initFileIfNecessary();
203
222
LOG .log (Level .INFO , "index {0}" , line );
204
223
actualFile .setIndex (line .substring (6 ));
205
224
}
206
225
207
226
private void processFromFile (MatchResult match , String line ) {
208
- initFileIfNecessary ();
227
+ // initFileIfNecessary();
209
228
actualFile .setFromFile (extractFileName (line ));
229
+ actualFile .setFromTimestamp (extractTimestamp (line ));
210
230
}
211
231
212
232
private void processToFile (MatchResult match , String line ) {
213
- initFileIfNecessary ();
233
+ // initFileIfNecessary();
214
234
actualFile .setToFile (extractFileName (line ));
235
+ actualFile .setToTimestamp (extractTimestamp (line ));
236
+ }
237
+
238
+ private String extractFileName (String _line ) {
239
+ Matcher matcher = TIMESTAMP_REGEXP .matcher (_line );
240
+ String line = _line ;
241
+ if (matcher .find ()) {
242
+ line = line .substring (1 , matcher .start ());
243
+ }
244
+ return line .substring (4 ).replaceFirst ("^(a|b)\\ /" , "" )
245
+ .replace (TIMESTAMP_REGEXP .toString (), "" ).trim ();
215
246
}
216
247
217
- private String extractFileName (String line ) {
218
- return line .substring (4 ).replaceFirst ("^(a|b)\\ /" , "" );
248
+ private String extractTimestamp (String line ) {
249
+ Matcher matcher = TIMESTAMP_REGEXP .matcher (line );
250
+ if (matcher .find ()) {
251
+ return matcher .group ();
252
+ }
253
+ return null ;
219
254
}
220
255
221
256
final class UnifiedDiffLine {
0 commit comments