]> source.dussan.org Git - jgit.git/commitdiff
Update PackBitmapIndexRemapper to handle mappings not in the new pack. 10/11910/1
authorColby Ranger <cranger@google.com>
Mon, 15 Apr 2013 16:35:07 +0000 (09:35 -0700)
committerColby Ranger <cranger@google.com>
Mon, 15 Apr 2013 16:35:07 +0000 (09:35 -0700)
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

org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/PackBitmapIndexRemapper.java

index d4981236ad840a9bfd41304deb7ee38becdb3620..d3e1990a922f42d66e895124f71f182998432831 100644 (file)
@@ -45,6 +45,7 @@ package org.eclipse.jgit.internal.storage.file;
 
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 import javaewah.EWAHCompressedBitmap;
 import javaewah.IntIterator;
@@ -142,13 +143,24 @@ public class PackBitmapIndexRemapper extends PackBitmapIndex
 
                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 class PackBitmapIndexRemapper extends PackBitmapIndex
                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()]);