Skip to content

Commit 73ec9e9

Browse files
committed
fixes #114 - decompressing deltas - refactoring
1 parent 507ced4 commit 73ec9e9

File tree

2 files changed

+72
-65
lines changed

2 files changed

+72
-65
lines changed

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@ This project uses a custom versioning scheme (and not [Semantic Versioning](http
99

1010
### Changed
1111

12+
## [4.10]
13+
14+
### Changed
15+
16+
* bugfixing on new UnifiedDiff reader / writer for multifile useage
17+
* bugfix for wrong DiffRow type while transforming from a patch that removed a line in one changeset
18+
1219
## [4.9]
1320

1421
### Changed

java-diff-utils/src/main/java/com/github/difflib/text/DiffRowGenerator.java

Lines changed: 65 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -225,89 +225,89 @@ public List<DiffRow> generateDiffRows(final List<String> original, Patch<String>
225225
int endPos = 0;
226226
final List<AbstractDelta<String>> deltaList = patch.getDeltas();
227227

228-
decompressDeltas(deltaList);
228+
for (AbstractDelta<String> originalDelta : deltaList) {
229+
for (AbstractDelta<String> delta : decompressDeltas(originalDelta)) {
230+
endPos = transformDeltaIntoDiffRow(original, endPos, diffRows, delta);
231+
}
232+
}
229233

230-
for (AbstractDelta<String> delta : deltaList) {
231-
Chunk<String> orig = delta.getSource();
232-
Chunk<String> rev = delta.getTarget();
234+
// Copy the final matching chunk if any.
235+
for (String line : original.subList(endPos, original.size())) {
236+
diffRows.add(buildDiffRow(Tag.EQUAL, line, line));
237+
}
238+
return diffRows;
239+
}
233240

234-
for (String line : original.subList(endPos, orig.getPosition())) {
235-
diffRows.add(buildDiffRow(Tag.EQUAL, line, line));
236-
}
241+
/**
242+
* Transforms one patch delta into a DiffRow object.
243+
*/
244+
private int transformDeltaIntoDiffRow(final List<String> original, int endPos, List<DiffRow> diffRows, AbstractDelta<String> delta) {
245+
Chunk<String> orig = delta.getSource();
246+
Chunk<String> rev = delta.getTarget();
247+
248+
for (String line : original.subList(endPos, orig.getPosition())) {
249+
diffRows.add(buildDiffRow(Tag.EQUAL, line, line));
250+
}
237251

238-
// Inserted DiffRow
239-
if (delta.getType() == DeltaType.INSERT) {
240-
endPos = orig.last() + 1;
252+
switch (delta.getType()) {
253+
case INSERT:
241254
for (String line : rev.getLines()) {
242255
diffRows.add(buildDiffRow(Tag.INSERT, "", line));
243256
}
244-
continue;
245-
}
246-
247-
// Deleted DiffRow
248-
if (delta.getType() == DeltaType.DELETE) {
249-
endPos = orig.last() + 1;
257+
break;
258+
case DELETE:
250259
for (String line : orig.getLines()) {
251260
diffRows.add(buildDiffRow(Tag.DELETE, line, ""));
252261
}
253-
continue;
254-
}
255-
256-
if (showInlineDiffs) {
257-
diffRows.addAll(generateInlineDiffs(delta));
258-
} else {
259-
for (int j = 0; j < Math.max(orig.size(), rev.size()); j++) {
260-
diffRows.add(buildDiffRow(Tag.CHANGE,
261-
orig.getLines().size() > j ? orig.getLines().get(j) : "",
262-
rev.getLines().size() > j ? rev.getLines().get(j) : ""));
262+
break;
263+
default:
264+
if (showInlineDiffs) {
265+
diffRows.addAll(generateInlineDiffs(delta));
266+
} else {
267+
for (int j = 0; j < Math.max(orig.size(), rev.size()); j++) {
268+
diffRows.add(buildDiffRow(Tag.CHANGE,
269+
orig.getLines().size() > j ? orig.getLines().get(j) : "",
270+
rev.getLines().size() > j ? rev.getLines().get(j) : ""));
271+
}
263272
}
264-
}
265-
endPos = orig.last() + 1;
266273
}
267274

268-
// Copy the final matching chunk if any.
269-
for (String line : original.subList(endPos, original.size())) {
270-
diffRows.add(buildDiffRow(Tag.EQUAL, line, line));
271-
}
272-
return diffRows;
275+
return orig.last() + 1;
273276
}
274277

275278
/**
276-
* Decompresses ChangeDeltas with different source and target size to a ChangeDelta with same size and
277-
* a following InsertDelta or DeleteDelta. With this problems of building DiffRows getting smaller.
278-
* @param deltaList
279+
* Decompresses ChangeDeltas with different source and target size to a
280+
* ChangeDelta with same size and a following InsertDelta or DeleteDelta.
281+
* With this problems of building DiffRows getting smaller.
282+
*
283+
* @param deltaList
279284
*/
280-
private void decompressDeltas(final List<AbstractDelta<String>> deltaList) {
281-
for (int idx = 0; idx < deltaList.size(); idx++) {
282-
AbstractDelta<String> delta = deltaList.get(idx);
283-
if (delta.getType() == DeltaType.CHANGE && delta.getSource().size() != delta.getTarget().size()) {
284-
//System.out.println("decompress this " + delta);
285-
286-
List<AbstractDelta<String>> corrected = new ArrayList<>();
287-
int minSize = Math.min(delta.getSource().size(), delta.getTarget().size());
288-
Chunk<String> orig = delta.getSource();
289-
Chunk<String> rev = delta.getTarget();
290-
291-
deltaList.set(idx, new ChangeDelta<String>(
292-
new Chunk<>(orig.getPosition(), orig.getLines().subList(0, minSize)),
293-
new Chunk<>(rev.getPosition(), rev.getLines().subList(0, minSize))));
294-
295-
if (orig.getLines().size() < rev.getLines().size()) {
296-
deltaList.add(idx + 1, new InsertDelta<String>(
297-
new Chunk<>(orig.getPosition() + minSize, Collections.emptyList()),
298-
new Chunk<>(rev.getPosition() + minSize, rev.getLines().subList(minSize, rev.getLines().size()))));
299-
} else {
300-
deltaList.add(idx + 1, new DeleteDelta<String>(
301-
new Chunk<>(orig.getPosition() + minSize, orig.getLines().subList(minSize, orig.getLines().size())),
302-
new Chunk<>(rev.getPosition() + minSize, Collections.emptyList())));
303-
}
304-
305-
//System.out.println(" to " + corrected);
285+
private List<AbstractDelta<String>> decompressDeltas(AbstractDelta<String> delta) {
286+
if (delta.getType() == DeltaType.CHANGE && delta.getSource().size() != delta.getTarget().size()) {
287+
List<AbstractDelta<String>> deltas = new ArrayList<>();
288+
//System.out.println("decompress this " + delta);
289+
290+
int minSize = Math.min(delta.getSource().size(), delta.getTarget().size());
291+
Chunk<String> orig = delta.getSource();
292+
Chunk<String> rev = delta.getTarget();
293+
294+
deltas.add(new ChangeDelta<String>(
295+
new Chunk<>(orig.getPosition(), orig.getLines().subList(0, minSize)),
296+
new Chunk<>(rev.getPosition(), rev.getLines().subList(0, minSize))));
297+
298+
if (orig.getLines().size() < rev.getLines().size()) {
299+
deltas.add(new InsertDelta<String>(
300+
new Chunk<>(orig.getPosition() + minSize, Collections.emptyList()),
301+
new Chunk<>(rev.getPosition() + minSize, rev.getLines().subList(minSize, rev.getLines().size()))));
302+
} else {
303+
deltas.add(new DeleteDelta<String>(
304+
new Chunk<>(orig.getPosition() + minSize, orig.getLines().subList(minSize, orig.getLines().size())),
305+
new Chunk<>(rev.getPosition() + minSize, Collections.emptyList())));
306306
}
307-
idx++;
307+
return deltas;
308308
}
309-
310-
//System.out.println("got now " + deltaList);
309+
310+
return Collections.singletonList(delta);
311311
}
312312

313313
private DiffRow buildDiffRow(Tag type, String orgline, String newline) {

0 commit comments

Comments
 (0)