]> source.dussan.org Git - jgit.git/commitdiff
RevWalkUtils: add progress callback to findBranchesReachableFrom 77/142777/2
authorAndrey Loskutov <loskutov@gmx.de>
Sat, 25 May 2019 07:53:47 +0000 (09:53 +0200)
committerAndrey Loskutov <loskutov@gmx.de>
Sat, 25 May 2019 11:52:49 +0000 (13:52 +0200)
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>
org.eclipse.jgit/resources/org/eclipse/jgit/internal/JGitText.properties
org.eclipse.jgit/src/org/eclipse/jgit/internal/JGitText.java
org.eclipse.jgit/src/org/eclipse/jgit/revwalk/RevWalkUtils.java

index fc2a26f0d799ff8be868e7b5feff287bd848144e..6da6fee387c87262e1a00f4ea181b55a3b786996 100644 (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
index ca0024d1c93ff85d2475b9759d967981b7d2302d..7a5ef4b7e2554dc7dd850958816345e8b78913ca 100644 (file)
@@ -686,6 +686,7 @@ public class JGitText extends TranslationBundle {
        /***/ public String s3ActionDeletion;
        /***/ public String s3ActionReading;
        /***/ public String s3ActionWriting;
+       /***/ public String searchForReachableBranches;
        /***/ public String searchForReuse;
        /***/ public String searchForSizes;
        /***/ public String secondsAgo;
index fabf7075d5434f46080f4e7bc9d8f99bf0e3c7ff..2b721b8877eb52fc1c298ed37777a3c0a4b204a1 100644 (file)
@@ -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;
        }