diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java index 0979db1e7..e57faaf85 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/diff/HistogramDiff.java @@ -43,6 +43,9 @@ package org.eclipse.jgit.diff; +import java.util.ArrayList; +import java.util.List; + /** * An extended form of Bram Cohen's patience diff algorithm. *

@@ -130,15 +133,14 @@ public void setMaxChainLength(int maxLen) { public void diffNonCommon(EditList edits, HashedSequenceComparator cmp, HashedSequence a, HashedSequence b, Edit region) { - new State(edits, cmp, a, b).diffReplace(region); + new State(edits, cmp, a, b).diffRegion(region); } private class State { private final HashedSequenceComparator cmp; - private final HashedSequence a; - private final HashedSequence b; + private final List queue = new ArrayList(); /** Result edits we have determined that must be made to convert a to b. */ final EditList edits; @@ -151,7 +153,13 @@ private class State { this.edits = edits; } - void diffReplace(Edit r) { + void diffRegion(Edit r) { + diffReplace(r); + while (!queue.isEmpty()) + diff(queue.remove(queue.size() - 1)); + } + + private void diffReplace(Edit r) { Edit lcs = new HistogramDiffIndex(maxChainLength, cmp, a, b, r) .findLongestCommonSequence(); if (lcs != null) { @@ -163,8 +171,8 @@ void diffReplace(Edit r) { // edits.add(r); } else { - diff(r.before(lcs)); - diff(r.after(lcs)); + queue.add(r.after(lcs)); + queue.add(r.before(lcs)); } } else if (fallback instanceof LowLevelDiffAlgorithm) {