RevWalkUtils: add progress callback to findBranchesReachableFrom

Offer a version of findBranchesReachableFrom method with progress
monitor callback. This is required to allow UI clients to cancel long
running operations and show progress.

Bug: 547642
Change-Id: I31d1de54dbaa6ffb11e03da4c447963e8defa1d0
Signed-off-by: Andrey Loskutov <loskutov@gmx.de>
This commit is contained in:
Andrey Loskutov 2019-05-25 09:53:47 +02:00
parent 76c867d62a
commit e57a37e767
3 changed files with 43 additions and 1 deletions

View File

@ -625,6 +625,7 @@ rewinding=Rewinding to commit {0}
s3ActionDeletion=Deletion
s3ActionReading=Reading
s3ActionWriting=Writing
searchForReachableBranches=Finding reachable branches
searchForReuse=Finding sources
searchForSizes=Getting sizes
secondsAgo={0} seconds ago

View File

@ -686,6 +686,7 @@ public static JGitText get() {
/***/ public String s3ActionDeletion;
/***/ public String s3ActionReading;
/***/ public String s3ActionWriting;
/***/ public String searchForReachableBranches;
/***/ public String searchForReuse;
/***/ public String searchForSizes;
/***/ public String secondsAgo;

View File

@ -50,6 +50,9 @@
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 static List<Ref> findBranchesReachableFrom(RevCommit commit,
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 static List<Ref> findBranchesReachableFrom(RevCommit commit,
if (revWalk.isMergedInto(commit, headCommit))
result.add(ref);
}
monitor.endTask();
return result;
}