diff options
author | Michael Keppler | 2018-04-05 08:49:49 +0000 |
---|---|---|
committer | Thomas Wolf | 2018-04-25 10:17:38 +0000 |
commit | c134baf64aea3b7b4484a6350615f0607be176a1 (patch) | |
tree | d1bf63bd9689806c9e7d739ca207eb12b16ee928 /org.eclipse.egit.ui/src/org/eclipse/egit/ui/internal | |
parent | 455a6c3648c9dbc04fe7c82b2bb8d3ef91797825 (diff) | |
download | egit-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')
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 |