import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.text.ParseException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
// shouldn't throw anything
}
+ /**
+ * Try to pass non-existing object as uninteresting, with ignoring setting.
+ * Use a repo with bitmap indexes because then PackWriter will use
+ * PackWriterBitmapWalker which had problems with this situation.
+ *
+ * @throws IOException
+ * @throws ParseException
+ */
+ @Test
+ public void testIgnoreNonExistingObjectsWithBitmaps() throws IOException,
+ ParseException {
+ final ObjectId nonExisting = ObjectId
+ .fromString("0000000000000000000000000000000000000001");
+ new GC(db).gc();
+ createVerifyOpenPack(EMPTY_SET_OBJECT,
+ Collections.singleton(nonExisting), false, true, true);
+ // shouldn't throw anything
+ }
+
/**
* Create pack basing on only interesting objects, then precisely verify
* content. No delta reuse here.
final Set<ObjectId> uninterestings, final boolean thin,
final boolean ignoreMissingUninteresting)
throws MissingObjectException, IOException {
+ createVerifyOpenPack(interestings, uninterestings, thin,
+ ignoreMissingUninteresting, false);
+ }
+
+ private void createVerifyOpenPack(final Set<ObjectId> interestings,
+ final Set<ObjectId> uninterestings, final boolean thin,
+ final boolean ignoreMissingUninteresting, boolean useBitmaps)
+ throws MissingObjectException, IOException {
NullProgressMonitor m = NullProgressMonitor.INSTANCE;
writer = new PackWriter(config, db.newObjectReader());
+ writer.setUseBitmaps(useBitmaps);
writer.setThin(thin);
writer.setIgnoreMissingUninteresting(ignoreMissingUninteresting);
writer.preparePack(m, interestings, uninterestings);
Set<? extends ObjectId> have)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
- BitmapBuilder haveBitmap = bitmapWalker.findObjects(have, null);
+ BitmapBuilder haveBitmap = bitmapWalker.findObjects(have, null, true);
bitmapWalker.reset();
- BitmapBuilder wantBitmap = bitmapWalker.findObjects(want, haveBitmap);
+ BitmapBuilder wantBitmap = bitmapWalker.findObjects(want, haveBitmap,
+ false);
BitmapBuilder needBitmap = wantBitmap.andNot(haveBitmap);
if (useCachedPacks && reuseSupport != null
walker = bitmapPreparer.newBitmapWalker();
BitmapBuilder bitmap = walker.findObjects(
- Collections.singleton(cmit), null);
+ Collections.singleton(cmit), null, false);
if (last != null && cmit.isReuseWalker() && !bitmap.contains(last))
throw new IllegalStateException(MessageFormat.format(
this.pm = (pm == null) ? NullProgressMonitor.INSTANCE : pm;
}
- BitmapBuilder findObjects(Set<? extends ObjectId> start, BitmapBuilder seen)
+ BitmapBuilder findObjects(Set<? extends ObjectId> start, BitmapBuilder seen, boolean ignoreMissingStart)
throws MissingObjectException, IncorrectObjectTypeException,
IOException {
final BitmapBuilder bitmapResult = bitmapIndex.newBitmapBuilder();
boolean marked = false;
for (ObjectId obj : start) {
- if (!bitmapResult.contains(obj)) {
- walker.markStart(walker.parseAny(obj));
- marked = true;
+ try {
+ if (!bitmapResult.contains(obj)) {
+ walker.markStart(walker.parseAny(obj));
+ marked = true;
+ }
+ } catch (MissingObjectException e) {
+ if (ignoreMissingStart)
+ continue;
+ throw e;
}
}