View Javadoc
1   /*
2    * Copyright (C) 2019, Google LLC. and others
3    *
4    * This program and the accompanying materials are made available under the
5    * terms of the Eclipse Distribution License v. 1.0 which is available at
6    * https://www.eclipse.org/org/documents/edl-v10.php.
7    *
8    * SPDX-License-Identifier: BSD-3-Clause
9    */
10  package org.eclipse.jgit.revwalk;
11  
12  import java.io.IOException;
13  import java.util.Collection;
14  import java.util.Optional;
15  import java.util.stream.Stream;
16  
17  import org.eclipse.jgit.errors.IncorrectObjectTypeException;
18  import org.eclipse.jgit.errors.MissingObjectException;
19  
20  /**
21   * Check if a commit is reachable from a collection of starting commits.
22   * <p>
23   * Note that this checks the reachability of commits (and tags). Trees, blobs or
24   * any other object will cause IncorrectObjectTypeException exceptions.
25   *
26   * @since 5.4
27   */
28  public interface ReachabilityChecker {
29  
30  	/**
31  	 * Check if all targets are reachable from the {@code starter} commits.
32  	 * <p>
33  	 * Caller should parse the objectIds (preferably with
34  	 * {@code walk.parseCommit()} and handle missing/incorrect type objects
35  	 * before calling this method.
36  	 *
37  	 * @param targets
38  	 *            commits to reach.
39  	 * @param starters
40  	 *            known starting points.
41  	 * @return An unreachable target if at least one of the targets is
42  	 *         unreachable. An empty optional if all targets are reachable from
43  	 *         the starters.
44  	 *
45  	 * @throws MissingObjectException
46  	 *             if any of the incoming objects doesn't exist in the
47  	 *             repository.
48  	 * @throws IncorrectObjectTypeException
49  	 *             if any of the incoming objects is not a commit or a tag.
50  	 * @throws IOException
51  	 *             if any of the underlying indexes or readers can not be
52  	 *             opened.
53  	 *
54  	 * @deprecated see {{@link #areAllReachable(Collection, Stream)}
55  	 */
56  	@Deprecated
57  	default Optional<RevCommit> areAllReachable(Collection<RevCommit> targets,
58                         Collection<RevCommit> starters) throws MissingObjectException,
59  			IncorrectObjectTypeException, IOException {
60  		return areAllReachable(targets, starters.stream());
61  	}
62  
63  	/**
64  	 * Check if all targets are reachable from the {@code starter} commits.
65  	 * <p>
66  	 * Caller should parse the objectIds (preferably with
67  	 * {@code walk.parseCommit()} and handle missing/incorrect type objects
68  	 * before calling this method.
69  	 *
70  	 * @param targets
71  	 *            commits to reach.
72  	 * @param starters
73  	 *            known starting points.
74  	 * @return An unreachable target if at least one of the targets is
75  	 *         unreachable. An empty optional if all targets are reachable from
76  	 *         the starters.
77  	 *
78  	 * @throws MissingObjectException
79  	 *             if any of the incoming objects doesn't exist in the
80  	 *             repository.
81  	 * @throws IncorrectObjectTypeException
82  	 *             if any of the incoming objects is not a commit or a tag.
83  	 * @throws IOException
84  	 *             if any of the underlying indexes or readers can not be
85  	 *             opened.
86  	 * @since 5.6
87  	 */
88  	Optional<RevCommit> areAllReachable(Collection<RevCommit> targets,
89  			Stream<RevCommit> starters)
90  			throws MissingObjectException, IncorrectObjectTypeException,
91  			IOException;
92  }