Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Keppler2018-04-05 08:49:49 +0000
committerThomas Wolf2018-04-25 10:17:38 +0000
commitc134baf64aea3b7b4484a6350615f0607be176a1 (patch)
treed1bf63bd9689806c9e7d739ca207eb12b16ee928 /org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal
parent455a6c3648c9dbc04fe7c82b2bb8d3ef91797825 (diff)
downloadegit-c134baf64aea3b7b4484a6350615f0607be176a1.tar.gz
egit-c134baf64aea3b7b4484a6350615f0607be176a1.tar.xz
egit-c134baf64aea3b7b4484a6350615f0607be176a1.zip
Repositories view blocks Eclipse on startup
When asking the "Tags" node whether it has children or not, answer true, as long as the ref database has not been read, and start reading the database in a job. This avoids blocking the Eclipse UI for reading the ref database very early when creating the nodes in the repository tree view. Of course the blocking still happens if the user tries to expand the tags node immediately after that node became visible. Change-Id: I553db27d2bdd2571c6a713dabd6e68065873b98b Signed-off-by: Michael Keppler <Michael.Keppler@gmx.de> Bug: 533230
Diffstat (limited to 'org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal')
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java3
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoriesViewContentProvider.java49
-rw-r--r--org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties1
3 files changed, 47 insertions, 6 deletions
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java
index 62a19b7237..6ed4ad4edc 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/UIText.java
@@ -3649,6 +3649,9 @@ public class UIText extends NLS {
public static String RepositoriesViewContentProvider_ExceptionNodeText;
/** */
+ public static String RepositoriesViewContentProvider_ReadReferencesJob;
+
+ /** */
public static String RepositoriesViewLabelProvider_LocalNodetext;
/** */
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoriesViewContentProvider.java b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoriesViewContentProvider.java
index 98a63b0cbd..bd71f3a570 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoriesViewContentProvider.java
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/repository/RepositoriesViewContentProvider.java
@@ -30,8 +30,13 @@ import java.util.WeakHashMap;
import org.eclipse.core.commands.IStateListener;
import org.eclipse.core.commands.State;
import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Status;
import org.eclipse.egit.core.RepositoryCache;
import org.eclipse.egit.core.RepositoryUtil;
import org.eclipse.egit.ui.Activator;
@@ -41,7 +46,6 @@ import org.eclipse.egit.ui.internal.repository.tree.AdditionalRefNode;
import org.eclipse.egit.ui.internal.repository.tree.AdditionalRefsNode;
import org.eclipse.egit.ui.internal.repository.tree.BranchHierarchyNode;
import org.eclipse.egit.ui.internal.repository.tree.BranchesNode;
-import org.eclipse.egit.ui.internal.repository.tree.StashedCommitNode;
import org.eclipse.egit.ui.internal.repository.tree.ErrorNode;
import org.eclipse.egit.ui.internal.repository.tree.FetchNode;
import org.eclipse.egit.ui.internal.repository.tree.FileNode;
@@ -55,6 +59,7 @@ import org.eclipse.egit.ui.internal.repository.tree.RemotesNode;
import org.eclipse.egit.ui.internal.repository.tree.RepositoryNode;
import org.eclipse.egit.ui.internal.repository.tree.RepositoryTreeNode;
import org.eclipse.egit.ui.internal.repository.tree.StashNode;
+import org.eclipse.egit.ui.internal.repository.tree.StashedCommitNode;
import org.eclipse.egit.ui.internal.repository.tree.SubmodulesNode;
import org.eclipse.egit.ui.internal.repository.tree.TagNode;
import org.eclipse.egit.ui.internal.repository.tree.TagsNode;
@@ -559,11 +564,7 @@ public class RepositoriesViewContentProvider implements ITreeContentProvider,
case SUBMODULES:
return true;
case TAGS:
- try {
- return !getRefs(repo, Constants.R_TAGS).isEmpty();
- } catch (IOException e) {
- return true;
- }
+ return hasTagsChildren(repo);
case WORKINGDIR:
if (node.getRepository().isBare())
return false;
@@ -577,6 +578,42 @@ public class RepositoriesViewContentProvider implements ITreeContentProvider,
}
}
+ /**
+ * As long as the ref database has not been read, assume there are tags, and
+ * start reading the database in the background. This should avoid long
+ * blocking during startup.
+ *
+ * @param repo
+ * @return whether the tags node has children.
+ */
+ private boolean hasTagsChildren(Repository repo) {
+ try {
+ if (branchRefs.get(repo) == null) {
+ WorkspaceJob job = new WorkspaceJob(
+ UIText.RepositoriesViewContentProvider_ReadReferencesJob) {
+
+ @Override
+ public IStatus runInWorkspace(IProgressMonitor monitor)
+ throws CoreException {
+ try {
+ // trigger reading the reference database
+ getRefs(repo, Constants.R_TAGS);
+ } catch (IOException e) {
+ return Status.CANCEL_STATUS;
+ }
+ return Status.OK_STATUS;
+ }
+ };
+ job.setSystem(true);
+ job.schedule();
+ return true;
+ }
+ return !getRefs(repo, Constants.R_TAGS).isEmpty();
+ } catch (IOException e) {
+ return true;
+ }
+ }
+
@Override
public void handleStateChange(State state, Object oldValue) {
try {
diff --git a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties
index ca80b2d12a..4cf0758cf3 100644
--- a/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties
+++ b/org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal/uitext.properties
@@ -1293,6 +1293,7 @@ RepositoriesView_TagDeletionFailureMessage=Deletion of tags failed
RepositoriesView_WorkingDir_treenode=Working Tree
RepositoriesViewActionProvider_OpenWithMenu=Open Wit&h
RepositoriesViewContentProvider_ExceptionNodeText=Exception encountered while fetching children
+RepositoriesViewContentProvider_ReadReferencesJob=Reading repository references
RepositoriesViewLabelProvider_LocalNodetext=Local
RepositoriesViewLabelProvider_RemoteTrackingNodetext=Remote Tracking
RepositoriesViewLabelProvider_StashNodeText=Stashed Commits

Back to the top