diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java index 6e02b36cc..742759825 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/pack/PackWriter.java @@ -68,6 +68,7 @@ import org.eclipse.jgit.lib.BatchingProgressMonitor; import org.eclipse.jgit.lib.BitmapIndex; import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder; +import org.eclipse.jgit.lib.BitmapIndex.BitmapLookupListener; import org.eclipse.jgit.lib.BitmapObject; import org.eclipse.jgit.lib.Constants; import org.eclipse.jgit.lib.NullProgressMonitor; @@ -2029,8 +2030,19 @@ private void findObjectsToPack(@NonNull ProgressMonitor countingMonitor, if (!shallowPack && useBitmaps) { BitmapIndex bitmapIndex = reader.getBitmapIndex(); if (bitmapIndex != null) { - BitmapWalker bitmapWalker = new BitmapWalker( - walker, bitmapIndex, countingMonitor); + bitmapIndex.addBitmapLookupListener(new BitmapLookupListener() { + @Override + public void onBitmapFound(AnyObjectId oid) { + stats.objectsWithBitmapsFound.add(oid); + } + + @Override + public void onBitmapNotFound(AnyObjectId oid) { + // Nothing to do + } + }); + BitmapWalker bitmapWalker = new BitmapWalker(walker, + bitmapIndex, countingMonitor); findObjectsToPackUsingBitmaps(bitmapWalker, want, have); endPhase(countingMonitor); stats.timeCounting = System.currentTimeMillis() - countingStart; diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java index 64a1eb2e1..7c8ed2433 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/storage/pack/PackStatistics.java @@ -48,13 +48,16 @@ import static org.eclipse.jgit.lib.Constants.OBJ_TREE; import java.text.MessageFormat; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.eclipse.jgit.internal.JGitText; import org.eclipse.jgit.internal.storage.pack.CachedPack; +import org.eclipse.jgit.lib.AnyObjectId; import org.eclipse.jgit.lib.ObjectId; /** @@ -232,6 +235,16 @@ public static class Accumulator { /** Commits with no parents. */ public Set rootCommits; + /** + * Set of objects with bitmap hit when finding objects to pack. + * + * The size of this set plus {@link #bitmapIndexMisses} should be the + * walked size of the graph + * + * @since 6.9 + */ + public Set objectsWithBitmapsFound = new HashSet<>(); + /** If a shallow pack, the depth in commits. */ public int depth; @@ -432,6 +445,18 @@ public Set getClientShallowCommits() { return statistics.clientShallowCommits; } + /** + * Get unmodifiable collection of objects walked in the request that had a + * bitmap. + * + * @return ummodifiable collection of objects that had a bitmap attached + * + * @since 6.9 + */ + public Set getObjectsWithBitmapsFound() { + return Collections.unmodifiableSet(statistics.objectsWithBitmapsFound); + } + /** * Get unmodifiable list of the cached packs that were reused in the output *