/*
 * Copyright (C) 2010, Garmin International
 * Copyright (C) 2010, Matt Fischer <matt.fischer@garmin.com> 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.revwalk;

import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import org.eclipse.jgit.errors.IncorrectObjectTypeException;
import org.eclipse.jgit.errors.MissingObjectException;
import org.eclipse.jgit.lib.AnyObjectId;
import org.eclipse.jgit.lib.ObjectId;
import org.eclipse.jgit.lib.ObjectReader;
import org.eclipse.jgit.lib.Repository;

Interface for revision walkers that perform depth filtering.
/** * Interface for revision walkers that perform depth filtering. */
public interface DepthWalk {
Get depth to filter to.
Returns:Depth to filter to.
/** * Get depth to filter to. * * @return Depth to filter to. */
int getDepth();
Returns:the deepen-since value; if not 0, this walk only returns commits whose commit time is at or after this limit
Since:5.2
/** * @return the deepen-since value; if not 0, this walk only returns commits * whose commit time is at or after this limit * @since 5.2 */
default int getDeepenSince() { return 0; }
Returns:the objects specified by the client using --shallow-exclude
Since:5.2
/** * @return the objects specified by the client using --shallow-exclude * @since 5.2 */
default List<ObjectId> getDeepenNots() { return Collections.emptyList(); } /** @return flag marking commits that should become unshallow. */
Get flag marking commits that should become unshallow.
Returns:flag marking commits that should become unshallow.
/** * Get flag marking commits that should become unshallow. * * @return flag marking commits that should become unshallow. */
RevFlag getUnshallowFlag();
Get flag marking commits that are interesting again.
Returns:flag marking commits that are interesting again.
/** * Get flag marking commits that are interesting again. * * @return flag marking commits that are interesting again. */
RevFlag getReinterestingFlag();
Returns:flag marking commits that are to be excluded because of --shallow-exclude
Since:5.2
/** * @return flag marking commits that are to be excluded because of --shallow-exclude * @since 5.2 */
RevFlag getDeepenNotFlag();
RevCommit with a depth (in commits) from a root.
/** RevCommit with a depth (in commits) from a root. */
public static class Commit extends RevCommit {
Depth of this commit in the graph, via shortest path.
/** Depth of this commit in the graph, via shortest path. */
int depth; boolean isBoundary;
True if this commit was excluded due to a shallow fetch setting. All its children are thus boundary commits.
/** * True if this commit was excluded due to a shallow fetch * setting. All its children are thus boundary commits. */
boolean makesChildBoundary;
Returns:depth of this commit, as found by the shortest path.
/** @return depth of this commit, as found by the shortest path. */
public int getDepth() { return depth; }
Returns:true if at least one of this commit's parents was excluded due to a shallow fetch setting, false otherwise
Since:5.2
/** * @return true if at least one of this commit's parents was excluded * due to a shallow fetch setting, false otherwise * @since 5.2 */
public boolean isBoundary() { return isBoundary; }
Initialize a new commit.
Params:
  • id – object name for the commit.
/** * Initialize a new commit. * * @param id * object name for the commit. */
protected Commit(AnyObjectId id) { super(id); depth = -1; } }
Subclass of RevWalk that performs depth filtering.
/** Subclass of RevWalk that performs depth filtering. */
public class RevWalk extends org.eclipse.jgit.revwalk.RevWalk implements DepthWalk { private final int depth; private int deepenSince; private List<ObjectId> deepenNots; private final RevFlag UNSHALLOW; private final RevFlag REINTERESTING; private final RevFlag DEEPEN_NOT;
Params:
  • repo – Repository to walk
  • depth – Maximum depth to return
/** * @param repo Repository to walk * @param depth Maximum depth to return */
public RevWalk(Repository repo, int depth) { super(repo); this.depth = depth; this.deepenNots = Collections.emptyList(); this.UNSHALLOW = newFlag("UNSHALLOW"); //$NON-NLS-1$ this.REINTERESTING = newFlag("REINTERESTING"); //$NON-NLS-1$ this.DEEPEN_NOT = newFlag("DEEPEN_NOT"); //$NON-NLS-1$ }
Params:
  • or – ObjectReader to use
  • depth – Maximum depth to return
/** * @param or ObjectReader to use * @param depth Maximum depth to return */
public RevWalk(ObjectReader or, int depth) { super(or); this.depth = depth; this.deepenNots = Collections.emptyList(); this.UNSHALLOW = newFlag("UNSHALLOW"); //$NON-NLS-1$ this.REINTERESTING = newFlag("REINTERESTING"); //$NON-NLS-1$ this.DEEPEN_NOT = newFlag("DEEPEN_NOT"); //$NON-NLS-1$ }
Mark a root commit (i.e., one whose depth should be considered 0.)
Params:
  • c – Commit to mark
Throws:
/** * Mark a root commit (i.e., one whose depth should be considered 0.) * * @param c * Commit to mark * @throws IOException * @throws IncorrectObjectTypeException * @throws MissingObjectException */
public void markRoot(RevCommit c) throws MissingObjectException, IncorrectObjectTypeException, IOException { if (c instanceof Commit) ((Commit) c).depth = 0; super.markStart(c); } @Override protected RevCommit createCommit(AnyObjectId id) { return new Commit(id); } @Override public int getDepth() { return depth; } @Override public int getDeepenSince() { return deepenSince; }
Sets the deepen-since value.
Params:
  • limit – new deepen-since value
Since:5.2
/** * Sets the deepen-since value. * * @param limit * new deepen-since value * @since 5.2 */
public void setDeepenSince(int limit) { deepenSince = limit; } @Override public List<ObjectId> getDeepenNots() { return deepenNots; }
Mark objects that the client specified using --shallow-exclude. Objects that are not commits have no effect.
Params:
  • deepenNots – specified objects
Since:5.2
/** * Mark objects that the client specified using * --shallow-exclude. Objects that are not commits have no * effect. * * @param deepenNots specified objects * @since 5.2 */
public void setDeepenNots(List<ObjectId> deepenNots) { this.deepenNots = Objects.requireNonNull(deepenNots); } @Override public RevFlag getUnshallowFlag() { return UNSHALLOW; } @Override public RevFlag getReinterestingFlag() { return REINTERESTING; } @Override public RevFlag getDeepenNotFlag() { return DEEPEN_NOT; }
Since:4.5
/** * @since 4.5 */
@Override public ObjectWalk toObjectWalkWithSameObjects() { ObjectWalk ow = new ObjectWalk(reader, depth); ow.deepenSince = deepenSince; ow.deepenNots = deepenNots; ow.objects = objects; ow.freeFlags = freeFlags; return ow; } }
Subclass of ObjectWalk that performs depth filtering.
/** Subclass of ObjectWalk that performs depth filtering. */
public class ObjectWalk extends org.eclipse.jgit.revwalk.ObjectWalk implements DepthWalk { private final int depth; private int deepenSince; private List<ObjectId> deepenNots; private final RevFlag UNSHALLOW; private final RevFlag REINTERESTING; private final RevFlag DEEPEN_NOT;
Params:
  • repo – Repository to walk
  • depth – Maximum depth to return
/** * @param repo Repository to walk * @param depth Maximum depth to return */
public ObjectWalk(Repository repo, int depth) { super(repo); this.depth = depth; this.deepenNots = Collections.emptyList(); this.UNSHALLOW = newFlag("UNSHALLOW"); //$NON-NLS-1$ this.REINTERESTING = newFlag("REINTERESTING"); //$NON-NLS-1$ this.DEEPEN_NOT = newFlag("DEEPEN_NOT"); //$NON-NLS-1$ }
Params:
  • or – Object Reader
  • depth – Maximum depth to return
/** * @param or Object Reader * @param depth Maximum depth to return */
public ObjectWalk(ObjectReader or, int depth) { super(or); this.depth = depth; this.deepenNots = Collections.emptyList(); this.UNSHALLOW = newFlag("UNSHALLOW"); //$NON-NLS-1$ this.REINTERESTING = newFlag("REINTERESTING"); //$NON-NLS-1$ this.DEEPEN_NOT = newFlag("DEEPEN_NOT"); //$NON-NLS-1$ }
Mark a root commit (i.e., one whose depth should be considered 0.)
Params:
  • o – Commit to mark
Throws:
/** * Mark a root commit (i.e., one whose depth should be considered 0.) * * @param o * Commit to mark * @throws IOException * @throws IncorrectObjectTypeException * @throws MissingObjectException */
public void markRoot(RevObject o) throws MissingObjectException, IncorrectObjectTypeException, IOException { RevObject c = o; while (c instanceof RevTag) { c = ((RevTag) c).getObject(); parseHeaders(c); } if (c instanceof Commit) ((Commit) c).depth = 0; super.markStart(o); }
Mark an element which used to be shallow in the client, but which should now be considered a full commit. Any ancestors of this commit should be included in the walk, even if they are the ancestor of an uninteresting commit.
Params:
  • c – Commit to mark
Throws:
/** * Mark an element which used to be shallow in the client, but which * should now be considered a full commit. Any ancestors of this commit * should be included in the walk, even if they are the ancestor of an * uninteresting commit. * * @param c * Commit to mark * @throws MissingObjectException * @throws IncorrectObjectTypeException * @throws IOException */
public void markUnshallow(RevObject c) throws MissingObjectException, IncorrectObjectTypeException, IOException { if (c instanceof RevCommit) c.add(UNSHALLOW); super.markStart(c); } @Override protected RevCommit createCommit(AnyObjectId id) { return new Commit(id); } @Override public int getDepth() { return depth; } @Override public int getDeepenSince() { return deepenSince; } @Override public List<ObjectId> getDeepenNots() { return deepenNots; } @Override public RevFlag getUnshallowFlag() { return UNSHALLOW; } @Override public RevFlag getReinterestingFlag() { return REINTERESTING; } @Override public RevFlag getDeepenNotFlag() { return DEEPEN_NOT; } } }