@ -50,6 +50,9 @@ import java.util.List;
import org.eclipse.jgit.errors.IncorrectObjectTypeException ;
import org.eclipse.jgit.errors.MissingObjectException ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.lib.NullProgressMonitor ;
import org.eclipse.jgit.lib.ProgressMonitor ;
import org.eclipse.jgit.lib.Ref ;
/ * *
@ -153,15 +156,51 @@ public final class RevWalkUtils {
RevWalk revWalk , Collection < Ref > refs )
throws MissingObjectException , IncorrectObjectTypeException ,
IOException {
return findBranchesReachableFrom ( commit , revWalk , refs ,
NullProgressMonitor . INSTANCE ) ;
}
/ * *
* Find the list of branches a given commit is reachable from when following
* parents .
* < p >
* Note that this method calls
* { @link org . eclipse . jgit . revwalk . RevWalk # reset ( ) } at the beginning .
* < p >
* In order to improve performance this method assumes clock skew among
* committers is never larger than 24 hours .
*
* @param commit
* the commit we are looking at
* @param revWalk
* The RevWalk to be used .
* @param refs
* the set of branches we want to see reachability from
* @param monitor
* the callback for progress and cancellation
* @return the list of branches a given commit is reachable from
* @throws org . eclipse . jgit . errors . MissingObjectException
* @throws org . eclipse . jgit . errors . IncorrectObjectTypeException
* @throws java . io . IOException
* @since 5 . 4
* /
public static List < Ref > findBranchesReachableFrom ( RevCommit commit ,
RevWalk revWalk , Collection < Ref > refs , ProgressMonitor monitor )
throws MissingObjectException , IncorrectObjectTypeException ,
IOException {
// Make sure commit is from the same RevWalk
commit = revWalk . parseCommit ( commit . getId ( ) ) ;
revWalk . reset ( ) ;
List < Ref > result = new ArrayList < > ( ) ;
monitor . beginTask ( JGitText . get ( ) . searchForReachableBranches ,
refs . size ( ) ) ;
final int SKEW = 24 * 3600 ; // one day clock skew
for ( Ref ref : refs ) {
if ( monitor . isCancelled ( ) )
return result ;
monitor . update ( 1 ) ;
RevObject maybehead = revWalk . parseAny ( ref . getObjectId ( ) ) ;
if ( ! ( maybehead instanceof RevCommit ) )
continue ;
@ -176,6 +215,7 @@ public final class RevWalkUtils {
if ( revWalk . isMergedInto ( commit , headCommit ) )
result . add ( ref ) ;
}
monitor . endTask ( ) ;
return result ;
}