Update PackBitmapIndexRemapper to handle mappings not in the new pack.
Previously, the code assumed all commits in the old pack would also be present in the new pack. This assumption caused an ArrayIndexOutOfBoundsException during remapping of ids. Fix the iterator to only return entries that may be remapped. Furthermore, update getBitmap() to return null if commit does not exist in the new pack. Change-Id: I065babe8cd39a7654c916bd01c7012135733dddf
This commit is contained in:
parent
4c638be79f
commit
eaa52b12f5
|
@ -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<Entry> iterator() {
|
|||
|
||||
final Iterator<StoredBitmap> it = oldPackIndex.getBitmaps().iterator();
|
||||
return new Iterator<Entry>() {
|
||||
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()]);
|
||||
|
|
Loading…
Reference in New Issue