diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java index d4981236a..d3e1990a9 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java @@ -45,6 +45,7 @@ import java.util.Collections; import java.util.Iterator; +import java.util.NoSuchElementException; import javaewah.EWAHCompressedBitmap; import javaewah.IntIterator; @@ -142,13 +143,24 @@ public Iterator iterator() { final Iterator it = oldPackIndex.getBitmaps().iterator(); return new Iterator() { + private Entry entry; + public boolean hasNext() { - return it.hasNext(); + while (entry == null && it.hasNext()) { + StoredBitmap sb = it.next(); + if (newPackIndex.findPosition(sb) != -1) + entry = new Entry(sb, sb.getFlags()); + } + return entry != null; } public Entry next() { - StoredBitmap sb = it.next(); - return new Entry(sb, sb.getFlags()); + if (!hasNext()) + throw new NoSuchElementException(); + + Entry res = entry; + entry = null; + return res; } public void remove() { @@ -171,6 +183,9 @@ public EWAHCompressedBitmap getBitmap(AnyObjectId objectId) { if (oldBitmap == null) return null; + if (newPackIndex.findPosition(objectId) == -1) + return null; + inflated.clear(); for (IntIterator i = oldBitmap.getBitmap().intIterator(); i.hasNext();) inflated.set(prevToNewMapping[i.next()]);