|
@@ -132,6 +132,11 @@ class Hunk(object):
|
132
|
132
|
out.append(line)
|
133
|
133
|
return out
|
134
|
134
|
|
|
135
|
+ def is_completed(self):
|
|
136
|
+ old_completed = self._old_addr[1] == len(self._get_old_text())
|
|
137
|
+ new_completed = self._new_addr[1] == len(self._get_new_text())
|
|
138
|
+ return old_completed and new_completed
|
|
139
|
+
|
135
|
140
|
|
136
|
141
|
class UnifiedDiff(object):
|
137
|
142
|
|
|
@@ -321,15 +326,24 @@ class DiffParser(object):
|
321
|
326
|
line = decode(line)
|
322
|
327
|
|
323
|
328
|
if diff.is_old_path(line):
|
324
|
|
- # FIXME: '--- ' breaks here, better to probe next line
|
325
|
|
- if diff._old_path and diff._new_path and diff._hunks:
|
326
|
|
- # See a new diff, yield previous diff if exists
|
327
|
|
- yield diff
|
328
|
|
- diff = UnifiedDiff(headers, line, None, [])
|
329
|
|
- headers = []
|
|
329
|
+ # This is a new diff when current hunk is not yet genreated or
|
|
330
|
+ # is completed. We yield previous diff if exists and construct
|
|
331
|
+ # a new one for this case. Otherwise it's acutally an 'old'
|
|
332
|
+ # line starts with '--- '.
|
|
333
|
+ #
|
|
334
|
+ if (not diff._hunks or diff._hunks[-1].is_completed()):
|
|
335
|
+ if diff._old_path and diff._new_path and diff._hunks:
|
|
336
|
+ yield diff
|
|
337
|
+ diff = UnifiedDiff(headers, line, None, [])
|
|
338
|
+ headers = []
|
|
339
|
+ else:
|
|
340
|
+ diff._hunks[-1].append(diff.parse_hunk_line(line))
|
330
|
341
|
|
331
|
342
|
elif diff.is_new_path(line) and diff._old_path:
|
332
|
|
- diff._new_path = line
|
|
343
|
+ if not diff._new_path:
|
|
344
|
+ diff._new_path = line
|
|
345
|
+ else:
|
|
346
|
+ diff._hunks[-1].append(diff.parse_hunk_line(line))
|
333
|
347
|
|
334
|
348
|
elif diff.is_hunk_meta(line):
|
335
|
349
|
hunk_meta = line
|