/*
 * Copyright (C) 2017, Google Inc. 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
 * https://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.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 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.

Commits named in seen are considered already seen. If one is encountered, that commit and its parents will be marked with the SEEN flag to prevent the walk from visiting its ancestors.

/** * A RevFilter that adds the visited commits to {@code bitmap} as a side * effect. * <p> * When the walk hits a commit that 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. * <p> * Commits named in {@code seen} are considered already seen. If one is * encountered, that commit and its parents will be marked with the SEEN * flag to prevent the walk from visiting its ancestors. */
public class AddUnseenToBitmapFilter extends RevFilter { private final BitmapBuilder seen; private final BitmapBuilder bitmap;
Create a filter that adds visited commits to the given bitmap, but does not walk through the objects in seen.
Params:
  • seen – objects that are already seen
  • bitmap – bitmap to write visited commits to
/** * Create a filter that adds visited commits to the given bitmap, but does not walk * through the objects in {@code seen}. * * @param seen objects that are already seen * @param bitmap bitmap to write visited commits to */
public AddUnseenToBitmapFilter(BitmapBuilder seen, BitmapBuilder bitmap) { this.seen = seen; this.bitmap = bitmap; }
{@inheritDoc}
/** {@inheritDoc} */
@Override public final boolean include(RevWalk walker, RevCommit cmit) { Bitmap visitedBitmap; if (seen.contains(cmit) || bitmap.contains(cmit)) { // already seen or included } else if ((visitedBitmap = bitmap.getBitmapIndex() .getBitmap(cmit)) != null) { bitmap.or(visitedBitmap); } else { bitmap.addObject(cmit, Constants.OBJ_COMMIT); return true; } for (RevCommit p : cmit.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; } }