/*
* Copyright (c) 2020, Google LLC and others
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Distribution License v. 1.0 which is available at
* http://www.eclipse.org/org/documents/edl-v10.php.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
package org.eclipse.jgit.internal.revwalk;
import org.eclipse.jgit.lib.BitmapIndex.Bitmap;
import org.eclipse.jgit.lib.BitmapIndex.BitmapBuilder;
import org.eclipse.jgit.lib.Constants;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.revwalk.filter.RevFilter;
import org.eclipse.jgit.revwalk.RevWalk;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.revwalk.RevFlag;
A RevFilter that adds the visited commits to bitmap
as a side effect. When the walk hits a commit that is the same as cachedCommit
or is part of bitmap
's BitmapIndex, that entire bitmap is ORed into bitmap
and the commit and its parents are marked as SEEN so that the walk does not have to visit its ancestors. This ensures the walk is very short if there is good bitmap coverage.
/**
* A RevFilter that adds the visited commits to {@code bitmap} as a side effect.
* <p>
* When the walk hits a commit that is the same as {@code cachedCommit} or is
* part of {@code bitmap}'s BitmapIndex, that entire bitmap is ORed into
* {@code bitmap} and the commit and its parents are marked as SEEN so that the
* walk does not have to visit its ancestors. This ensures the walk is very
* short if there is good bitmap coverage.
*/
public class AddToBitmapWithCacheFilter extends RevFilter {
private final AnyObjectId cachedCommit;
private final Bitmap cachedBitmap;
private final BitmapBuilder bitmap;
Create a filter with a cached BitmapCommit that adds visited commits to
the given bitmap.
Params: - cachedCommit –
the cached commit
- cachedBitmap – the bitmap corresponds to
cachedCommit
} - bitmap –
bitmap to write visited commits to
/**
* Create a filter with a cached BitmapCommit that adds visited commits to
* the given bitmap.
*
* @param cachedCommit
* the cached commit
* @param cachedBitmap
* the bitmap corresponds to {@code cachedCommit}}
* @param bitmap
* bitmap to write visited commits to
*/
public AddToBitmapWithCacheFilter(AnyObjectId cachedCommit,
Bitmap cachedBitmap,
BitmapBuilder bitmap) {
this.cachedCommit = cachedCommit;
this.cachedBitmap = cachedBitmap;
this.bitmap = bitmap;
}
{@inheritDoc} /** {@inheritDoc} */
@Override
public final boolean include(RevWalk rw, RevCommit c) {
Bitmap visitedBitmap;
if (bitmap.contains(c)) {
// already included
} else if ((visitedBitmap = bitmap.getBitmapIndex()
.getBitmap(c)) != null) {
bitmap.or(visitedBitmap);
} else if (cachedCommit.equals(c)) {
bitmap.or(cachedBitmap);
} else {
bitmap.addObject(c, Constants.OBJ_COMMIT);
return true;
}
for (RevCommit p : c.getParents()) {
p.add(RevFlag.SEEN);
}
return false;
}
{@inheritDoc} /** {@inheritDoc} */
@Override
public final RevFilter clone() {
throw new UnsupportedOperationException();
}
{@inheritDoc} /** {@inheritDoc} */
@Override
public final boolean requiresCommitBody() {
return false;
}
}